From 1e41f48c5aa5e08088e96e3a517a78b70ed469a3 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 17 Aug 2020 23:02:23 +0300 Subject: [PATCH] feat: divide proxy schematics into two steps --- .../packages/schematics/src/collection.json | 5 ++ .../__name@kebab__.ts.template | 0 .../__namespace@dir__/index.ts.template} | 0 .../__name@kebab__.service.ts.template | 0 .../schematics/src/commands/api/index.ts | 48 +++++++++++++++++++ .../schematics/src/commands/api/schema.json | 39 +++++++++++++++ .../schematics/src/commands/api/schema.ts | 16 +++++++ .../schematics/src/commands/proxy/index.ts | 35 +++----------- .../schematics/src/commands/proxy/schema.json | 30 ++++++++---- .../schematics/src/commands/proxy/schema.ts | 11 +++-- 10 files changed, 145 insertions(+), 39 deletions(-) rename npm/ng-packs/packages/schematics/src/commands/{proxy/files-enum/__namespacePath__/enums => api/files-enum/shared/enums/__namespace@dir__}/__name@kebab__.ts.template (100%) rename npm/ng-packs/packages/schematics/src/commands/{proxy/files-model/__sharedPath__/models/__name@kebab__.ts.template => api/files-model/shared/models/__namespace@dir__/index.ts.template} (100%) rename npm/ng-packs/packages/schematics/src/commands/{proxy/files-service/__sharedPath__/services => api/files-service/shared/services/__namespace@dir__}/__name@kebab__.service.ts.template (100%) create mode 100644 npm/ng-packs/packages/schematics/src/commands/api/index.ts create mode 100644 npm/ng-packs/packages/schematics/src/commands/api/schema.json create mode 100644 npm/ng-packs/packages/schematics/src/commands/api/schema.ts diff --git a/npm/ng-packs/packages/schematics/src/collection.json b/npm/ng-packs/packages/schematics/src/collection.json index 6cfecd4d4a..9b21d174ca 100644 --- a/npm/ng-packs/packages/schematics/src/collection.json +++ b/npm/ng-packs/packages/schematics/src/collection.json @@ -4,6 +4,11 @@ "description": "ABP Proxy Generator Schematics", "factory": "./commands/proxy", "schema": "./commands/proxy/schema.json" + }, + "api": { + "description": "ABP API Generator Schematics", + "factory": "./commands/api", + "schema": "./commands/api/schema.json" } } } diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/files-enum/__namespacePath__/enums/__name@kebab__.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-enum/shared/enums/__namespace@dir__/__name@kebab__.ts.template similarity index 100% rename from npm/ng-packs/packages/schematics/src/commands/proxy/files-enum/__namespacePath__/enums/__name@kebab__.ts.template rename to npm/ng-packs/packages/schematics/src/commands/api/files-enum/shared/enums/__namespace@dir__/__name@kebab__.ts.template diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/files-model/__sharedPath__/models/__name@kebab__.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-model/shared/models/__namespace@dir__/index.ts.template similarity index 100% rename from npm/ng-packs/packages/schematics/src/commands/proxy/files-model/__sharedPath__/models/__name@kebab__.ts.template rename to npm/ng-packs/packages/schematics/src/commands/api/files-model/shared/models/__namespace@dir__/index.ts.template diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/files-service/__sharedPath__/services/__name@kebab__.service.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-service/shared/services/__namespace@dir__/__name@kebab__.service.ts.template similarity index 100% rename from npm/ng-packs/packages/schematics/src/commands/proxy/files-service/__sharedPath__/services/__name@kebab__.service.ts.template rename to npm/ng-packs/packages/schematics/src/commands/api/files-service/shared/services/__namespace@dir__/__name@kebab__.service.ts.template diff --git a/npm/ng-packs/packages/schematics/src/commands/api/index.ts b/npm/ng-packs/packages/schematics/src/commands/api/index.ts new file mode 100644 index 0000000000..49da9787d4 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/api/index.ts @@ -0,0 +1,48 @@ +import { normalize, strings } from '@angular-devkit/core'; +import { applyTemplates, branchAndMerge, chain, move, SchematicContext, Tree, url } from '@angular-devkit/schematics'; +import app from '../../mocks/app.gitignore'; +import { applyWithOverwrite, buildDefaultPath, createApiDefinitionReader, resolveProject } from '../../utils'; +import * as cases from '../../utils/text'; +import type { Schema as GenerateProxySchema } from './schema'; + +export default function(params: GenerateProxySchema) { + const solution = params.solution; + const moduleName = strings.camelize(params.module || 'app'); + + return chain([ + async (tree: Tree, _context: SchematicContext) => { + const target = await resolveProject(tree, params.target!); + const targetPath = buildDefaultPath(target.definition); + const readApiDefinition = createApiDefinitionReader(`${targetPath}/shared/api-definition.json`); + const data = readApiDefinition(tree); + data.modules.app = app; + + const controllers = Object.values(data.modules[moduleName]?.controllers || {}); + + const createServiceFiles = chain( + controllers.map(controller => { + const {controllerName: name, type, actions, interfaces} = controller; + const namespaceRegex = new RegExp('^' + solution + '\.(Controllers\.)?'); + const namespace = type.replace(namespaceRegex, '').split('.').slice(0, -1).join('.'); + + return applyWithOverwrite(url('./files-service'), [ + applyTemplates({ + ...cases, + solution, + namespace, + name, + apiName: data.modules[moduleName].remoteServiceName, + apiUrl: controller.actions[0]?.url, + actions, + interfaces, + }), + move(normalize(targetPath)), + ]); + } + ), + ); + + return branchAndMerge(chain([createServiceFiles])); + }, + ]); +} diff --git a/npm/ng-packs/packages/schematics/src/commands/api/schema.json b/npm/ng-packs/packages/schematics/src/commands/api/schema.json new file mode 100644 index 0000000000..afed78c2ca --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/api/schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/schema", + "id": "SchematicsAbpGenerateAPI", + "title": "ABP Generate API Schema", + "type": "object", + "properties": { + "solution": { + "alias": "x", + "description": "Solution name", + "type": "string", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "Please enter the solution name. (case-sensitive, eg. Acme.BookStore)" + }, + "target": { + "alias": "t", + "description": "Angular project to generate code in", + "type": "string", + "$default": { + "$source": "argv", + "index": 1 + }, + "x-prompt": "Plese enter Angular project name to place generated code in. (default: workspace \"defaultProject\")" + }, + "module": { + "alias": "m", + "description": "Backend module to generate code for", + "type": "string", + "$default": { + "$source": "argv", + "index": 2 + }, + "x-prompt": "Please enter name of the backend module you wish to generate proxies for. (default: \"app\")" + } + }, + "required": ["solution"] +} diff --git a/npm/ng-packs/packages/schematics/src/commands/api/schema.ts b/npm/ng-packs/packages/schematics/src/commands/api/schema.ts new file mode 100644 index 0000000000..32e316cf53 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/api/schema.ts @@ -0,0 +1,16 @@ +export interface Schema { + /** + * Solution name + */ + solution: string; + + /** + * Angular project to generate code in + */ + target?: string; + + /** + * Backend module to generate code for + */ + module?: string; +} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts index b5591431ae..24fcb91d24 100644 --- a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts @@ -1,9 +1,8 @@ -import { normalize, strings } from '@angular-devkit/core'; -import { applyTemplates, branchAndMerge, chain, move, SchematicContext, Tree, url } from '@angular-devkit/schematics'; +import { strings } from '@angular-devkit/core'; +import { branchAndMerge, chain, schematic, SchematicContext, Tree } from '@angular-devkit/schematics'; import { API_DEFINITION_ENDPOINT } from '../../constants'; import { ApiDefinition } from '../../models'; -import { applyWithOverwrite, buildDefaultPath, getSourceJson, getSourceUrl, isLibrary, resolveProject } from '../../utils'; -import * as cases from '../../utils/text'; +import { buildDefaultPath, createApiDefinitionSaver, getApiDefinition, getSourceUrl, resolveProject } from '../../utils'; import type { Schema as GenerateProxySchema } from './schema'; export default function(params: GenerateProxySchema) { @@ -13,34 +12,14 @@ export default function(params: GenerateProxySchema) { async (tree: Tree, _context: SchematicContext) => { const source = await resolveProject(tree, params.source!); const target = await resolveProject(tree, params.target!); - const isModule = isLibrary(target.definition); const sourceUrl = getSourceUrl(tree, source, moduleName); const targetPath = buildDefaultPath(target.definition); - const data: ApiDefinition = await getSourceJson(sourceUrl + API_DEFINITION_ENDPOINT); + const data: ApiDefinition = await getApiDefinition(sourceUrl + API_DEFINITION_ENDPOINT); - const controllers = Object.values(data.modules[moduleName]?.controllers || {}); + const saveApiDefinition = createApiDefinitionSaver(data, `${targetPath}/shared/api-definition.json`) + const createApi = schematic('api', params); - const createServiceFiles = chain( - controllers.map(controller => { - const {type} = controller; - const [namespace] = type.replace(/^Volo\.(Abp\.)?/, '').split('.'); - - return applyWithOverwrite(url('./files-service'), [ - applyTemplates({ - ...cases, - name: controller.type.split('.').pop()!.replace('Controller', ''), - sharedPath: 'shared/' + strings.dasherize(namespace), - controller, - }), - move(normalize(targetPath)), - ]); - } - ), - ); - - console.log(isModule); - - return branchAndMerge(chain([createServiceFiles])); + return branchAndMerge(chain([saveApiDefinition, createApi])); }, ]); } diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json index bbf899956a..7e4c0fc88e 100644 --- a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json +++ b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json @@ -1,18 +1,18 @@ { "$schema": "http://json-schema.org/schema", - "id": "SchematicsAbpEntityModule", - "title": "ABP Entity Module Schema", + "id": "SchematicsAbpGenerateProxy", + "title": "ABP Generate Proxy Schema", "type": "object", "properties": { - "module": { - "alias": "m", - "description": "The name of the backend module to generate code for", + "solution": { + "alias": "x", + "description": "Solution name", "type": "string", "$default": { "$source": "argv", "index": 0 }, - "x-prompt": "Please enter name of the backend module you wish to generate proxies for. (default: \"app\")" + "x-prompt": "Please enter the solution name. (case-sensitive, eg. Acme.BookStore)" }, "source": { "alias": "s", @@ -26,10 +26,24 @@ }, "target": { "alias": "t", - "description": "Angular project to place the generated code in", + "description": "Angular project to generate code in", "type": "string", + "$default": { + "$source": "argv", + "index": 2 + }, "x-prompt": "Plese enter Angular project name to place generated code in. (default: workspace \"defaultProject\")" + }, + "module": { + "alias": "m", + "description": "Backend module to generate code for", + "type": "string", + "$default": { + "$source": "argv", + "index": 3 + }, + "x-prompt": "Please enter name of the backend module you wish to generate proxies for. (default: \"app\")" } }, - "required": [] + "required": ["solution"] } diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts index bb54317d68..54f11b2da8 100644 --- a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts +++ b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts @@ -1,8 +1,8 @@ export interface Schema { /** - * The name of the backend module to generate code for + * Solution name */ - module?: string; + solution: string; /** * Angular project to resolve API definition URL from @@ -10,7 +10,12 @@ export interface Schema { source?: string; /** - * Angular project to place the generated code in + * Angular project to generate code in */ target?: string; + + /** + * Backend module to generate code for + */ + module?: string; }