Browse Source

Merge pull request #5264 from abpframework/fix/5258

Remote service name is resolved from api-name parameter in proxy generation
pull/5268/head
Bunyamin Coskuner 6 years ago
committed by GitHub
parent
commit
235263f8cc
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      npm/ng-packs/packages/schematics/src/commands/api/index.ts
  2. 28
      npm/ng-packs/packages/schematics/src/commands/api/schema.json
  3. 16
      npm/ng-packs/packages/schematics/src/commands/proxy-add/schema.json
  4. 16
      npm/ng-packs/packages/schematics/src/commands/proxy-refresh/schema.json
  5. 16
      npm/ng-packs/packages/schematics/src/commands/proxy-remove/schema.json
  6. 4
      npm/ng-packs/packages/schematics/src/enums/exception.ts
  7. 5
      npm/ng-packs/packages/schematics/src/models/generate-proxy-schema.ts
  8. 52
      npm/ng-packs/packages/schematics/src/utils/source.ts

7
npm/ng-packs/packages/schematics/src/commands/api/index.ts

@ -19,10 +19,10 @@ import {
createImportRefToEnumMapper, createImportRefToEnumMapper,
createProxyConfigReader, createProxyConfigReader,
createProxyConfigWriterCreator, createProxyConfigWriterCreator,
createRootNamespaceGetter,
EnumGeneratorParams, EnumGeneratorParams,
generateProxyConfigJson, generateProxyConfigJson,
getEnumNamesFromImports, getEnumNamesFromImports,
getRootNamespace,
interpolate, interpolate,
ModelGeneratorParams, ModelGeneratorParams,
removeDefaultPlaceholders, removeDefaultPlaceholders,
@ -37,9 +37,10 @@ export default function(schema: GenerateProxySchema) {
return chain([ return chain([
async (tree: Tree, _context: SchematicContext) => { async (tree: Tree, _context: SchematicContext) => {
const source = await resolveProject(tree, params.source!); const getRootNamespace = createRootNamespaceGetter(params);
const solution = await getRootNamespace(tree);
const target = await resolveProject(tree, params.target!); const target = await resolveProject(tree, params.target!);
const solution = getRootNamespace(tree, source, moduleName);
const targetPath = buildDefaultPath(target.definition); const targetPath = buildDefaultPath(target.definition);
const readProxyConfig = createProxyConfigReader(targetPath); const readProxyConfig = createProxyConfigReader(targetPath);
const createProxyConfigWriter = createProxyConfigWriterCreator(targetPath); const createProxyConfigWriter = createProxyConfigWriterCreator(targetPath);

28
npm/ng-packs/packages/schematics/src/commands/api/schema.json

@ -5,34 +5,40 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m", "description": "Backend module name",
"description": "Backend module to generate code for",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 0 "index": 0
}, },
"x-prompt": "Please enter name of the backend module you wish to generate proxies for. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"source": { "api-name": {
"alias": "s", "description": "Backend api name, a.k.a. remoteServiceName",
"description": "Angular project to resolve root namespace & API definition URL from",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 1
}, },
"x-prompt": "Plese enter Angular project name to resolve root namespace & API definition URL from. (default: workspace \"defaultProject\")" "x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
}, },
"target": { "source": {
"alias": "t", "description": "Source Angular project for API definition URL & root namespace resolution",
"description": "Angular project to generate code in",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 2
}, },
"x-prompt": "Plese enter Angular project name to place generated code in. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
},
"target": {
"description": "Target Angular project to place the generated code",
"type": "string",
"$default": {
"$source": "argv",
"index": 3
},
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }
}, },
"required": [] "required": []

16
npm/ng-packs/packages/schematics/src/commands/proxy-add/schema.json

@ -5,7 +5,6 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m",
"description": "Backend module name", "description": "Backend module name",
"type": "string", "type": "string",
"$default": { "$default": {
@ -14,23 +13,30 @@
}, },
"x-prompt": "Please enter backend module name. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"api-name": {
"description": "Backend api name, a.k.a. remoteServiceName",
"type": "string",
"$default": {
"$source": "argv",
"index": 1
},
"x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
},
"source": { "source": {
"alias": "s",
"description": "Source Angular project for API definition URL & root namespace resolution", "description": "Source Angular project for API definition URL & root namespace resolution",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 2
}, },
"x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
}, },
"target": { "target": {
"alias": "t",
"description": "Target Angular project to place the generated code", "description": "Target Angular project to place the generated code",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 3
}, },
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }

16
npm/ng-packs/packages/schematics/src/commands/proxy-refresh/schema.json

@ -5,7 +5,6 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m",
"description": "Backend module name", "description": "Backend module name",
"type": "string", "type": "string",
"$default": { "$default": {
@ -14,23 +13,30 @@
}, },
"x-prompt": "Please enter backend module name. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"api-name": {
"description": "Backend api name, a.k.a. remoteServiceName",
"type": "string",
"$default": {
"$source": "argv",
"index": 1
},
"x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
},
"source": { "source": {
"alias": "s",
"description": "Source Angular project for API definition URL & root namespace resolution", "description": "Source Angular project for API definition URL & root namespace resolution",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 2
}, },
"x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
}, },
"target": { "target": {
"alias": "t",
"description": "Target Angular project to place the generated code", "description": "Target Angular project to place the generated code",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 3
}, },
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }

16
npm/ng-packs/packages/schematics/src/commands/proxy-remove/schema.json

@ -5,7 +5,6 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m",
"description": "Backend module name", "description": "Backend module name",
"type": "string", "type": "string",
"$default": { "$default": {
@ -14,23 +13,30 @@
}, },
"x-prompt": "Please enter backend module name. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"api-name": {
"description": "Backend api name, a.k.a. remoteServiceName",
"type": "string",
"$default": {
"$source": "argv",
"index": 1
},
"x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
},
"source": { "source": {
"alias": "s",
"description": "Source Angular project for API definition URL & root namespace resolution", "description": "Source Angular project for API definition URL & root namespace resolution",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 2
}, },
"x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
}, },
"target": { "target": {
"alias": "t",
"description": "Target Angular project to place the generated code", "description": "Target Angular project to place the generated code",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 3
}, },
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }

4
npm/ng-packs/packages/schematics/src/enums/exception.ts

@ -11,6 +11,6 @@ export const enum Exception {
NoTypeDefinition = '[Type Definition Not Found] There is no type definition for "{0}".', NoTypeDefinition = '[Type Definition Not Found] There is no type definition for "{0}".',
NoWorkspace = '[Workspace Not Found] Make sure you are running schematics at the root directory of your workspace and it has an angular.json file.', NoWorkspace = '[Workspace Not Found] Make sure you are running schematics at the root directory of your workspace and it has an angular.json file.',
NoEnvironment = '[Environment Not Found] An environment file cannot be located in "{0}" project.', NoEnvironment = '[Environment Not Found] An environment file cannot be located in "{0}" project.',
NoApiUrl = '[API URL Not Found] Cannot resolve API URL for "{1}" module from "{0}" project.', NoApiUrl = '[API URL Not Found] Cannot resolve API URL for "{1}" remote service name from "{0}" project.',
NoRootNamespace = '[Root Namespace Not Found] Cannot resolve root namespace for "{1}" module from "{0}" project.', NoRootNamespace = '[Root Namespace Not Found] Cannot resolve root namespace for "{1}" api from "{0}" project.',
} }

5
npm/ng-packs/packages/schematics/src/models/generate-proxy-schema.ts

@ -4,6 +4,11 @@ export interface GenerateProxySchema {
*/ */
module?: string; module?: string;
/**
* Backend api name, a.k.a. remoteServiceName
*/
['api-name']?: string;
/** /**
* Source Angular project for API definition URL & root namespace resolution * Source Angular project for API definition URL & root namespace resolution
*/ */

52
npm/ng-packs/packages/schematics/src/utils/source.ts

@ -1,4 +1,3 @@
import { strings } from '@angular-devkit/core';
import { SchematicsException, Tree } from '@angular-devkit/schematics'; import { SchematicsException, Tree } from '@angular-devkit/schematics';
import got from 'got'; import got from 'got';
import { import {
@ -15,11 +14,11 @@ import { interpolate } from './common';
import { readEnvironment, resolveProject } from './workspace'; import { readEnvironment, resolveProject } from './workspace';
export function createApiDefinitionGetter(params: GenerateProxySchema) { export function createApiDefinitionGetter(params: GenerateProxySchema) {
const moduleName = strings.camelize(params.module || 'app'); const apiName = params['api-name'] || 'default';
return async (host: Tree) => { return async (host: Tree) => {
const source = await resolveProject(host, params.source!); const source = await resolveProject(host, params.source!);
const sourceUrl = getSourceUrl(host, source, moduleName); const sourceUrl = getSourceUrl(host, source, apiName);
return await getApiDefinition(sourceUrl); return await getApiDefinition(sourceUrl);
}; };
} }
@ -36,7 +35,7 @@ async function getApiDefinition(sourceUrl: string) {
})); }));
} catch ({ response }) { } catch ({ response }) {
// handle redirects // handle redirects
if (response.statusCode >= 400 || !response?.body) if (!response?.body || response.statusCode >= 400)
throw new SchematicsException(Exception.NoApi); throw new SchematicsException(Exception.NoApi);
body = response.body; body = response.body;
@ -45,48 +44,49 @@ async function getApiDefinition(sourceUrl: string) {
return body; return body;
} }
export function getRootNamespace(tree: Tree, project: Project, moduleName: string) { export function createRootNamespaceGetter(params: GenerateProxySchema) {
const environmentExpr = readEnvironment(tree, project.definition); const apiName = params['api-name'] || 'default';
if (!environmentExpr) return async (tree: Tree) => {
throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name)); const project = await resolveProject(tree, params.source!);
const environmentExpr = readEnvironment(tree, project.definition);
let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [ if (!environmentExpr)
'apis', throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name));
moduleName,
'rootNamespace',
]);
if (!assignment) let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [
assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [
'apis', 'apis',
'default', apiName,
'rootNamespace', 'rootNamespace',
]); ]);
if (!assignment) if (!assignment)
throw new SchematicsException(interpolate(Exception.NoRootNamespace, project.name, moduleName)); assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [
'apis',
'default',
'rootNamespace',
]);
return assignment.replace(/[`'"]/g, ''); if (!assignment)
throw new SchematicsException(interpolate(Exception.NoRootNamespace, project.name, apiName));
return assignment.replace(/[`'"]/g, '');
};
} }
export function getSourceUrl(tree: Tree, project: Project, moduleName: string) { export function getSourceUrl(tree: Tree, project: Project, apiName: string) {
const environmentExpr = readEnvironment(tree, project.definition); const environmentExpr = readEnvironment(tree, project.definition);
if (!environmentExpr) if (!environmentExpr)
throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name)); throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name));
let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [ let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, ['apis', apiName, 'url']);
'apis',
moduleName,
'url',
]);
if (!assignment) if (!assignment)
assignment = getAssignedPropertyFromObjectliteral(environmentExpr, ['apis', 'default', 'url']); assignment = getAssignedPropertyFromObjectliteral(environmentExpr, ['apis', 'default', 'url']);
if (!assignment) if (!assignment)
throw new SchematicsException(interpolate(Exception.NoApiUrl, project.name, moduleName)); throw new SchematicsException(interpolate(Exception.NoApiUrl, project.name, apiName));
return assignment.replace(/[`'"]/g, ''); return assignment.replace(/[`'"]/g, '');
} }

Loading…
Cancel
Save