From 012137a4853bfb8f04468bcdec82ae15d0590712 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 00:47:41 +0300 Subject: [PATCH 01/19] feat: add proxy config interface to schematics --- npm/ng-packs/packages/schematics/src/models/index.ts | 1 + npm/ng-packs/packages/schematics/src/models/proxy-config.ts | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 npm/ng-packs/packages/schematics/src/models/proxy-config.ts diff --git a/npm/ng-packs/packages/schematics/src/models/index.ts b/npm/ng-packs/packages/schematics/src/models/index.ts index 900b58b4f1..36eadc54d9 100644 --- a/npm/ng-packs/packages/schematics/src/models/index.ts +++ b/npm/ng-packs/packages/schematics/src/models/index.ts @@ -3,5 +3,6 @@ export * from './import'; export * from './method'; export * from './model'; export * from './project'; +export * from './proxy-config'; export * from './service'; export * from './util'; diff --git a/npm/ng-packs/packages/schematics/src/models/proxy-config.ts b/npm/ng-packs/packages/schematics/src/models/proxy-config.ts new file mode 100644 index 0000000000..226833da12 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/models/proxy-config.ts @@ -0,0 +1,5 @@ +import { ApiDefinition } from './api-definition'; + +export interface ProxyConfig extends ApiDefinition { + generated: string[]; +} From fa59ee8602532b2cb110a33729cdcf8f54949eea Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 00:48:37 +0300 Subject: [PATCH 02/19] feat: convert api definition reader to proxy config reader --- .../packages/schematics/src/utils/source.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts index 8a41776955..294b84e63e 100644 --- a/npm/ng-packs/packages/schematics/src/utils/source.ts +++ b/npm/ng-packs/packages/schematics/src/utils/source.ts @@ -1,7 +1,7 @@ import { SchematicsException, Tree } from '@angular-devkit/schematics'; import got from 'got'; import { Exception } from '../enums'; -import { ApiDefinition, Project } from '../models'; +import { ApiDefinition, Project, ProxyConfig } from '../models'; import { getAssignedPropertyFromObjectliteral } from './ast'; import { interpolate } from './common'; import { readEnvironment } from './workspace'; @@ -71,23 +71,28 @@ export function getSourceUrl(tree: Tree, project: Project, moduleName: string) { return assignment.replace(/[`'"]/g, ''); } -export function createApiDefinitionReader(targetPath: string) { +export function createProxyConfigReader(targetPath: string) { return (tree: Tree) => { try { const buffer = tree.read(targetPath); - const apiDefinition: ApiDefinition = JSON.parse(buffer!.toString()); - return apiDefinition; + return JSON.parse(buffer!.toString()) as ProxyConfig; } catch (_) {} throw new SchematicsException(interpolate(Exception.NoApiDefinition, targetPath)); }; } -export function createApiDefinitionSaver(apiDefinition: ApiDefinition, targetPath: string) { +export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: string) { + const readPreviousConfig = createProxyConfigReader(targetPath); + return (tree: Tree) => { - tree[tree.exists(targetPath) ? 'overwrite' : 'create']( - targetPath, - JSON.stringify(apiDefinition, null, 2), - ); + if (tree.exists(targetPath)) { + const generated: string[] = []; + try { + readPreviousConfig(tree).generated.forEach(m => generated.push(m)); + } catch (_) {} + + tree.overwrite(targetPath, JSON.stringify({ generated, ...apiDefinition }, null, 2)); + } else tree.create(targetPath, JSON.stringify(apiDefinition, null, 2)); }; } From eff4ad50f5cd37ae2a451a58858a137c0048cc9f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 00:49:22 +0300 Subject: [PATCH 03/19] feat: add constant for proxy-config.json path --- npm/ng-packs/packages/schematics/src/constants/index.ts | 1 + npm/ng-packs/packages/schematics/src/constants/proxy.ts | 1 + 2 files changed, 2 insertions(+) create mode 100644 npm/ng-packs/packages/schematics/src/constants/proxy.ts diff --git a/npm/ng-packs/packages/schematics/src/constants/index.ts b/npm/ng-packs/packages/schematics/src/constants/index.ts index 01053d9333..cd95fb5201 100644 --- a/npm/ng-packs/packages/schematics/src/constants/index.ts +++ b/npm/ng-packs/packages/schematics/src/constants/index.ts @@ -1,3 +1,4 @@ export * from './api'; +export * from './proxy'; export * from './system-types'; export * from './volo'; diff --git a/npm/ng-packs/packages/schematics/src/constants/proxy.ts b/npm/ng-packs/packages/schematics/src/constants/proxy.ts new file mode 100644 index 0000000000..a864da6f24 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/constants/proxy.ts @@ -0,0 +1 @@ +export const PROXY_CONFIG_PATH = '/proxy/proxy-config.json'; From a4d9df215c4e7728fe09dff2f3d7d011a6f05c50 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 00:50:11 +0300 Subject: [PATCH 04/19] feat: use proxy config reader and saver in commands --- .../packages/schematics/src/commands/api/index.ts | 9 +++++---- .../packages/schematics/src/commands/proxy/index.ts | 11 ++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/commands/api/index.ts b/npm/ng-packs/packages/schematics/src/commands/api/index.ts index 24e0f816af..9554c54506 100644 --- a/npm/ng-packs/packages/schematics/src/commands/api/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/api/index.ts @@ -9,15 +9,16 @@ import { Tree, url, } from '@angular-devkit/schematics'; +import { PROXY_CONFIG_PATH } from '../../constants'; import { Exception } from '../../enums'; import { ServiceGeneratorParams } from '../../models'; import { applyWithOverwrite, buildDefaultPath, - createApiDefinitionReader, createControllerToServiceMapper, createImportRefsToModelReducer, createImportRefToEnumMapper, + createProxyConfigReader, EnumGeneratorParams, getEnumNamesFromImports, getRootNamespace, @@ -40,9 +41,9 @@ export default function(schema: GenerateProxySchema) { const target = await resolveProject(tree, params.target!); const solution = getRootNamespace(tree, source, moduleName); const targetPath = buildDefaultPath(target.definition); - const definitionPath = `${targetPath}/shared/api-definition.json`; - const readApiDefinition = createApiDefinitionReader(definitionPath); - const data = readApiDefinition(tree); + const definitionPath = targetPath + PROXY_CONFIG_PATH; + const readProxyConfig = createProxyConfigReader(definitionPath); + const data = readProxyConfig(tree); const types = data.types; const modules = data.modules; if (!types || !modules) throw new SchematicsException(Exception.InvalidApiDefinition); 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 ddbbd68caa..fc405b5a58 100644 --- a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts @@ -6,11 +6,11 @@ import { SchematicContext, Tree, } from '@angular-devkit/schematics'; -import { API_DEFINITION_ENDPOINT } from '../../constants'; +import { API_DEFINITION_ENDPOINT, PROXY_CONFIG_PATH } from '../../constants'; import { ApiDefinition } from '../../models'; import { buildDefaultPath, - createApiDefinitionSaver, + createProxyConfigSaver, getApiDefinition, getSourceUrl, removeDefaultPlaceholders, @@ -30,13 +30,10 @@ export default function(schema: GenerateProxySchema) { const targetPath = buildDefaultPath(target.definition); const data: ApiDefinition = await getApiDefinition(sourceUrl + API_DEFINITION_ENDPOINT); - const saveApiDefinition = createApiDefinitionSaver( - data, - `${targetPath}/shared/api-definition.json`, - ); + const saveProxyConfig = createProxyConfigSaver(data, targetPath + PROXY_CONFIG_PATH); const createApi = schematic('api', schema); - return branchAndMerge(chain([saveApiDefinition, createApi])); + return branchAndMerge(chain([saveProxyConfig, createApi])); }, ]); } From 87e61eb268124e1aee4528186b15a571bd8d2f67 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 00:52:54 +0300 Subject: [PATCH 05/19] feat: rename shared directory as proxy in schametics --- .../enums/__namespace@dir__/__name@kebab__.ts.template | 0 .../{shared => proxy}/models/__namespace@dir__/index.ts.template | 0 .../services/__namespace@dir__/__name@kebab__.service.ts.template | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename npm/ng-packs/packages/schematics/src/commands/api/files-enum/{shared => proxy}/enums/__namespace@dir__/__name@kebab__.ts.template (100%) rename npm/ng-packs/packages/schematics/src/commands/api/files-model/{shared => proxy}/models/__namespace@dir__/index.ts.template (100%) rename npm/ng-packs/packages/schematics/src/commands/api/files-service/{shared => proxy}/services/__namespace@dir__/__name@kebab__.service.ts.template (100%) diff --git a/npm/ng-packs/packages/schematics/src/commands/api/files-enum/shared/enums/__namespace@dir__/__name@kebab__.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-enum/proxy/enums/__namespace@dir__/__name@kebab__.ts.template similarity index 100% rename from npm/ng-packs/packages/schematics/src/commands/api/files-enum/shared/enums/__namespace@dir__/__name@kebab__.ts.template rename to npm/ng-packs/packages/schematics/src/commands/api/files-enum/proxy/enums/__namespace@dir__/__name@kebab__.ts.template diff --git a/npm/ng-packs/packages/schematics/src/commands/api/files-model/shared/models/__namespace@dir__/index.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-model/proxy/models/__namespace@dir__/index.ts.template similarity index 100% rename from npm/ng-packs/packages/schematics/src/commands/api/files-model/shared/models/__namespace@dir__/index.ts.template rename to npm/ng-packs/packages/schematics/src/commands/api/files-model/proxy/models/__namespace@dir__/index.ts.template diff --git a/npm/ng-packs/packages/schematics/src/commands/api/files-service/shared/services/__namespace@dir__/__name@kebab__.service.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/services/__namespace@dir__/__name@kebab__.service.ts.template similarity index 100% rename from npm/ng-packs/packages/schematics/src/commands/api/files-service/shared/services/__namespace@dir__/__name@kebab__.service.ts.template rename to npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/services/__namespace@dir__/__name@kebab__.service.ts.template From 992932a8131b5efa22fab8347d74e3001126a068 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 01:17:10 +0300 Subject: [PATCH 06/19] feat: add file write exception in schematics --- npm/ng-packs/packages/schematics/src/enums/exception.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/npm/ng-packs/packages/schematics/src/enums/exception.ts b/npm/ng-packs/packages/schematics/src/enums/exception.ts index 6c2e635edf..40ef6487f5 100644 --- a/npm/ng-packs/packages/schematics/src/enums/exception.ts +++ b/npm/ng-packs/packages/schematics/src/enums/exception.ts @@ -1,5 +1,6 @@ export const enum Exception { FileNotFound = '[File Not Found] There is no file at "{0}" path.', + FileWriteFailed = '[File Write Failed] Cannot write file at "{0}".', InvalidModule = '[Invalid Module] Backend module "{0}" does not exist in API definition.', InvalidApiDefinition = '[Invalid API Definition] The provided API definition is invalid.', InvalidWorkspace = '[Invalid Workspace] The angular.json should be a valid JSON file.', From 3a8fba25e1a9d450a33dcff210b629385448bc98 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 01:17:35 +0300 Subject: [PATCH 07/19] feat: add type alias for file write operation --- npm/ng-packs/packages/schematics/src/models/index.ts | 1 + npm/ng-packs/packages/schematics/src/models/tree.ts | 1 + 2 files changed, 2 insertions(+) create mode 100644 npm/ng-packs/packages/schematics/src/models/tree.ts diff --git a/npm/ng-packs/packages/schematics/src/models/index.ts b/npm/ng-packs/packages/schematics/src/models/index.ts index 36eadc54d9..fb5e9f5639 100644 --- a/npm/ng-packs/packages/schematics/src/models/index.ts +++ b/npm/ng-packs/packages/schematics/src/models/index.ts @@ -5,4 +5,5 @@ export * from './model'; export * from './project'; export * from './proxy-config'; export * from './service'; +export * from './tree'; export * from './util'; diff --git a/npm/ng-packs/packages/schematics/src/models/tree.ts b/npm/ng-packs/packages/schematics/src/models/tree.ts new file mode 100644 index 0000000000..3c17cfcb10 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/models/tree.ts @@ -0,0 +1 @@ +export type WriteOp = 'create' | 'overwrite'; From 8870976ead658ee45b6f25726472ceb2596bbb90 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 01:17:41 +0300 Subject: [PATCH 08/19] feat: improve proxy config write op in schematics --- .../packages/schematics/src/utils/source.ts | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts index 294b84e63e..f6a9857866 100644 --- a/npm/ng-packs/packages/schematics/src/utils/source.ts +++ b/npm/ng-packs/packages/schematics/src/utils/source.ts @@ -1,7 +1,7 @@ import { SchematicsException, Tree } from '@angular-devkit/schematics'; import got from 'got'; import { Exception } from '../enums'; -import { ApiDefinition, Project, ProxyConfig } from '../models'; +import { ApiDefinition, Project, ProxyConfig, WriteOp } from '../models'; import { getAssignedPropertyFromObjectliteral } from './ast'; import { interpolate } from './common'; import { readEnvironment } from './workspace'; @@ -83,16 +83,37 @@ export function createProxyConfigReader(targetPath: string) { } export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: string) { + const createProxyConfigJson = createProxyConfigJsonCreator(apiDefinition); const readPreviousConfig = createProxyConfigReader(targetPath); + const writeNewConfig = createProxyConfigWriter(targetPath); return (tree: Tree) => { + const generated: string[] = []; + let op: WriteOp = 'create'; + if (tree.exists(targetPath)) { - const generated: string[] = []; + op = 'overwrite'; + try { readPreviousConfig(tree).generated.forEach(m => generated.push(m)); } catch (_) {} + } + + writeNewConfig(tree, op, createProxyConfigJson(generated)); + }; +} - tree.overwrite(targetPath, JSON.stringify({ generated, ...apiDefinition }, null, 2)); - } else tree.create(targetPath, JSON.stringify(apiDefinition, null, 2)); +export function createProxyConfigWriter(targetPath: string) { + return (tree: Tree, op: WriteOp, data: string) => { + try { + tree[op](targetPath, data); + return tree; + } catch (_) {} + + throw new SchematicsException(interpolate(Exception.FileWriteFailed, targetPath)); }; } + +function createProxyConfigJsonCreator(apiDefinition: ApiDefinition) { + return (generated: string[]) => JSON.stringify({ generated, ...apiDefinition }, null, 2); +} From fe3aa265eb2953ed181b1695d1f5289cc8be85d4 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 01:33:39 +0300 Subject: [PATCH 09/19] refactor: enable creating rule from proxy config writer --- .../packages/schematics/src/utils/source.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts index f6a9857866..3652836ed7 100644 --- a/npm/ng-packs/packages/schematics/src/utils/source.ts +++ b/npm/ng-packs/packages/schematics/src/utils/source.ts @@ -85,7 +85,7 @@ export function createProxyConfigReader(targetPath: string) { export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: string) { const createProxyConfigJson = createProxyConfigJsonCreator(apiDefinition); const readPreviousConfig = createProxyConfigReader(targetPath); - const writeNewConfig = createProxyConfigWriter(targetPath); + const createProxyConfigWriter = createProxyConfigWriterCreator(targetPath); return (tree: Tree) => { const generated: string[] = []; @@ -99,12 +99,16 @@ export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: } catch (_) {} } - writeNewConfig(tree, op, createProxyConfigJson(generated)); + const json = createProxyConfigJson(generated); + const writeProxyConfig = createProxyConfigWriter(op, json); + writeProxyConfig(tree); + + return tree; }; } -export function createProxyConfigWriter(targetPath: string) { - return (tree: Tree, op: WriteOp, data: string) => { +export function createProxyConfigWriterCreator(targetPath: string) { + return (op: WriteOp, data: string) => (tree: Tree) => { try { tree[op](targetPath, data); return tree; @@ -114,6 +118,10 @@ export function createProxyConfigWriter(targetPath: string) { }; } -function createProxyConfigJsonCreator(apiDefinition: ApiDefinition) { - return (generated: string[]) => JSON.stringify({ generated, ...apiDefinition }, null, 2); +export function createProxyConfigJsonCreator(apiDefinition: ApiDefinition) { + return (generated: string[]) => generateProxyConfigJson({ generated, ...apiDefinition }); +} + +export function generateProxyConfigJson(proxyConfig: ProxyConfig) { + return JSON.stringify(proxyConfig, null, 2); } From c0fd167c19b8c7aaed38cae9d44b05abff519ef6 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 01:35:16 +0300 Subject: [PATCH 10/19] feat: store generated module names in proxy config --- .../packages/schematics/src/commands/api/index.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/schematics/src/commands/api/index.ts b/npm/ng-packs/packages/schematics/src/commands/api/index.ts index 9554c54506..178c72f376 100644 --- a/npm/ng-packs/packages/schematics/src/commands/api/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/api/index.ts @@ -19,7 +19,9 @@ import { createImportRefsToModelReducer, createImportRefToEnumMapper, createProxyConfigReader, + createProxyConfigWriterCreator, EnumGeneratorParams, + generateProxyConfigJson, getEnumNamesFromImports, getRootNamespace, interpolate, @@ -43,6 +45,7 @@ export default function(schema: GenerateProxySchema) { const targetPath = buildDefaultPath(target.definition); const definitionPath = targetPath + PROXY_CONFIG_PATH; const readProxyConfig = createProxyConfigReader(definitionPath); + const createProxyConfigWriter = createProxyConfigWriterCreator(definitionPath); const data = readProxyConfig(tree); const types = data.types; const modules = data.modules; @@ -81,7 +84,14 @@ export default function(schema: GenerateProxySchema) { modelImports, }); - return branchAndMerge(chain([generateServices, generateModels, generateEnums])); + if (!data.generated.includes(moduleName)) data.generated.push(moduleName); + data.generated.sort(); + const json = generateProxyConfigJson(data); + const overwriteProxyConfig = createProxyConfigWriter('overwrite', json); + + return branchAndMerge( + chain([generateServices, generateModels, generateEnums, overwriteProxyConfig]), + ); }, ]); } From 738909c26b784637d96c2410c8565577a065b5ed Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 17:20:41 +0300 Subject: [PATCH 11/19] feat: add a shared GenerateProxySchema model --- .../src/models/generate-proxy-schema.ts | 16 ++++++++++++++++ .../packages/schematics/src/models/index.ts | 1 + 2 files changed, 17 insertions(+) create mode 100644 npm/ng-packs/packages/schematics/src/models/generate-proxy-schema.ts diff --git a/npm/ng-packs/packages/schematics/src/models/generate-proxy-schema.ts b/npm/ng-packs/packages/schematics/src/models/generate-proxy-schema.ts new file mode 100644 index 0000000000..59c4e6adab --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/models/generate-proxy-schema.ts @@ -0,0 +1,16 @@ +export interface GenerateProxySchema { + /** + * Backend module name + */ + module?: string; + + /** + * Source Angular project for API definition URL & root namespace resolution + */ + source?: string; + + /** + * Target Angular project to place the generated code + */ + target?: string; +} diff --git a/npm/ng-packs/packages/schematics/src/models/index.ts b/npm/ng-packs/packages/schematics/src/models/index.ts index fb5e9f5639..176c9c6617 100644 --- a/npm/ng-packs/packages/schematics/src/models/index.ts +++ b/npm/ng-packs/packages/schematics/src/models/index.ts @@ -1,4 +1,5 @@ export * from './api-definition'; +export * from './generate-proxy-schema'; export * from './import'; export * from './method'; export * from './model'; From 6789471bee4d0f3aee26682bedc146004a193487 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 17:21:30 +0300 Subject: [PATCH 12/19] feat: update proxy constants in schematics --- npm/ng-packs/packages/schematics/src/constants/proxy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/schematics/src/constants/proxy.ts b/npm/ng-packs/packages/schematics/src/constants/proxy.ts index a864da6f24..ee105029c4 100644 --- a/npm/ng-packs/packages/schematics/src/constants/proxy.ts +++ b/npm/ng-packs/packages/schematics/src/constants/proxy.ts @@ -1 +1,2 @@ -export const PROXY_CONFIG_PATH = '/proxy/proxy-config.json'; +export const PROXY_PATH = '/proxy'; +export const PROXY_CONFIG_PATH = `${PROXY_PATH}/generate-proxy.json`; From 70f80895a5101e6c8b5f97610e601d3698f21bad Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 17:21:46 +0300 Subject: [PATCH 13/19] feat: update exceptions in schematics --- npm/ng-packs/packages/schematics/src/enums/exception.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/schematics/src/enums/exception.ts b/npm/ng-packs/packages/schematics/src/enums/exception.ts index 40ef6487f5..98c92493d6 100644 --- a/npm/ng-packs/packages/schematics/src/enums/exception.ts +++ b/npm/ng-packs/packages/schematics/src/enums/exception.ts @@ -1,12 +1,13 @@ export const enum Exception { + DirRemoveFailed = '[Directory Remove Failed] Cannot remove "{0}".', FileNotFound = '[File Not Found] There is no file at "{0}" path.', FileWriteFailed = '[File Write Failed] Cannot write file at "{0}".', InvalidModule = '[Invalid Module] Backend module "{0}" does not exist in API definition.', InvalidApiDefinition = '[Invalid API Definition] The provided API definition is invalid.', InvalidWorkspace = '[Invalid Workspace] The angular.json should be a valid JSON file.', NoApi = '[API Not Available] Please double-check the URL in the source project environment and make sure your application is up and running.', - NoApiDefinition = '[API Definition Not Found] There is no API definition file at "{0}".', NoProject = '[Project Not Found] Either define a default project in your workspace or specify the project name in schematics options.', + NoProxyConfig = '[Proxy Config Not Found] There is no JSON file at "{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.', NoEnvironment = '[Environment Not Found] An environment file cannot be located in "{0}" project.', From f0146805fc43b26e7a2ed8d6c83781ab274753a2 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 17:24:19 +0300 Subject: [PATCH 14/19] feat: add utility fn for generating multiple APIs --- npm/ng-packs/packages/schematics/src/utils/api.ts | 11 +++++++++++ npm/ng-packs/packages/schematics/src/utils/index.ts | 1 + 2 files changed, 12 insertions(+) create mode 100644 npm/ng-packs/packages/schematics/src/utils/api.ts diff --git a/npm/ng-packs/packages/schematics/src/utils/api.ts b/npm/ng-packs/packages/schematics/src/utils/api.ts new file mode 100644 index 0000000000..f772666b4b --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/utils/api.ts @@ -0,0 +1,11 @@ +import { chain, schematic } from '@angular-devkit/schematics'; +import { GenerateProxySchema } from '../models'; + +export function createApisGenerator(schema: GenerateProxySchema, generated: string[]) { + return chain( + generated.map(m => { + const apiSchema = { ...schema, source: schema.target, module: m }; + return schematic('api', apiSchema); + }), + ); +} diff --git a/npm/ng-packs/packages/schematics/src/utils/index.ts b/npm/ng-packs/packages/schematics/src/utils/index.ts index badfaa79ee..304c2294b0 100644 --- a/npm/ng-packs/packages/schematics/src/utils/index.ts +++ b/npm/ng-packs/packages/schematics/src/utils/index.ts @@ -1,4 +1,5 @@ export * from './angular'; +export * from './api'; export * from './ast'; export * from './common'; export * from './enum'; From 722145cf072eb4041711c1a0799acc186c94b8cf Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 17:25:00 +0300 Subject: [PATCH 15/19] feat: add chainAndMerge utility rule creator --- npm/ng-packs/packages/schematics/src/utils/rule.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/npm/ng-packs/packages/schematics/src/utils/rule.ts b/npm/ng-packs/packages/schematics/src/utils/rule.ts index 6748f30fab..39b14cec78 100644 --- a/npm/ng-packs/packages/schematics/src/utils/rule.ts +++ b/npm/ng-packs/packages/schematics/src/utils/rule.ts @@ -1,6 +1,8 @@ import { apply, + chain, forEach, + MergeStrategy, mergeWith, Rule, SchematicContext, @@ -16,6 +18,14 @@ export function applyWithOverwrite(source: Source, rules: Rule[]): Rule { }; } +export function chainAndMerge(rules: Rule[]) { + return (host: Tree) => async (tree: Tree, context: SchematicContext) => + host.merge( + (await (chain(rules)(tree, context) as any).toPromise()) as Tree, + MergeStrategy.AllowDeleteConflict, + ); +} + export function overwriteFileIfExists(tree: Tree): Rule { return forEach(fileEntry => { if (!tree.exists(fileEntry.path)) return fileEntry; From 7dd5aa74ef8027feb3fc122dd543be88bc0da519 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 17:25:53 +0300 Subject: [PATCH 16/19] feat: create 3 separate commands for proxy generation --- .../packages/schematics/src/collection.json | 18 +++++-- .../schematics/src/commands/api/index.ts | 9 ++-- .../schematics/src/commands/api/schema.ts | 16 ------ .../src/commands/proxy-add/index.ts | 48 +++++++++++++++++ .../commands/{proxy => proxy-add}/schema.json | 12 ++--- .../src/commands/proxy-refresh/index.ts | 37 ++++++++++++++ .../src/commands/proxy-refresh/schema.json | 39 ++++++++++++++ .../src/commands/proxy-remove/index.ts | 43 ++++++++++++++++ .../src/commands/proxy-remove/schema.json | 39 ++++++++++++++ .../schematics/src/commands/proxy/index.ts | 39 -------------- .../schematics/src/commands/proxy/schema.ts | 16 ------ .../packages/schematics/src/utils/source.ts | 51 ++++++++++++++++--- 12 files changed, 273 insertions(+), 94 deletions(-) delete mode 100644 npm/ng-packs/packages/schematics/src/commands/api/schema.ts create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts rename npm/ng-packs/packages/schematics/src/commands/{proxy => proxy-add}/schema.json (50%) create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy-refresh/index.ts create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy-refresh/schema.json create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy-remove/index.ts create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy-remove/schema.json delete mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/index.ts delete mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts diff --git a/npm/ng-packs/packages/schematics/src/collection.json b/npm/ng-packs/packages/schematics/src/collection.json index 9b21d174ca..5c2df8ea36 100644 --- a/npm/ng-packs/packages/schematics/src/collection.json +++ b/npm/ng-packs/packages/schematics/src/collection.json @@ -1,9 +1,19 @@ { "schematics": { - "proxy": { - "description": "ABP Proxy Generator Schematics", - "factory": "./commands/proxy", - "schema": "./commands/proxy/schema.json" + "proxy-add": { + "description": "ABP Proxy Generator Add Schematics", + "factory": "./commands/proxy-add", + "schema": "./commands/proxy-add/schema.json" + }, + "proxy-refresh": { + "description": "ABP Proxy Generator Refresh Schematics", + "factory": "./commands/proxy-refresh", + "schema": "./commands/proxy-refresh/schema.json" + }, + "proxy-remove": { + "description": "ABP Proxy Generator Remove Schematics", + "factory": "./commands/proxy-remove", + "schema": "./commands/proxy-remove/schema.json" }, "api": { "description": "ABP API Generator Schematics", diff --git a/npm/ng-packs/packages/schematics/src/commands/api/index.ts b/npm/ng-packs/packages/schematics/src/commands/api/index.ts index 178c72f376..646f2170ea 100644 --- a/npm/ng-packs/packages/schematics/src/commands/api/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/api/index.ts @@ -9,9 +9,8 @@ import { Tree, url, } from '@angular-devkit/schematics'; -import { PROXY_CONFIG_PATH } from '../../constants'; import { Exception } from '../../enums'; -import { ServiceGeneratorParams } from '../../models'; +import { GenerateProxySchema, ServiceGeneratorParams } from '../../models'; import { applyWithOverwrite, buildDefaultPath, @@ -31,7 +30,6 @@ import { serializeParameters, } from '../../utils'; import * as cases from '../../utils/text'; -import { Schema as GenerateProxySchema } from './schema'; export default function(schema: GenerateProxySchema) { const params = removeDefaultPlaceholders(schema); @@ -43,9 +41,8 @@ export default function(schema: GenerateProxySchema) { const target = await resolveProject(tree, params.target!); const solution = getRootNamespace(tree, source, moduleName); const targetPath = buildDefaultPath(target.definition); - const definitionPath = targetPath + PROXY_CONFIG_PATH; - const readProxyConfig = createProxyConfigReader(definitionPath); - const createProxyConfigWriter = createProxyConfigWriterCreator(definitionPath); + const readProxyConfig = createProxyConfigReader(targetPath); + const createProxyConfigWriter = createProxyConfigWriterCreator(targetPath); const data = readProxyConfig(tree); const types = data.types; const modules = data.modules; diff --git a/npm/ng-packs/packages/schematics/src/commands/api/schema.ts b/npm/ng-packs/packages/schematics/src/commands/api/schema.ts deleted file mode 100644 index 0c26ce461f..0000000000 --- a/npm/ng-packs/packages/schematics/src/commands/api/schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface Schema { - /** - * Backend module to generate code for - */ - module?: string; - - /** - * Angular project to resolve root namespace & API definition URL from - */ - source?: string; - - /** - * Angular project to generate code in - */ - target?: string; -} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts new file mode 100644 index 0000000000..3ac5053851 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts @@ -0,0 +1,48 @@ +import { strings } from '@angular-devkit/core'; +import { chain, SchematicContext, Tree } from '@angular-devkit/schematics'; +import { GenerateProxySchema } from '../../models'; +import { + buildDefaultPath, + chainAndMerge, + createApiDefinitionGetter, + createApisGenerator, + createProxyClearer, + createProxyConfigReader, + createProxyConfigSaver, + removeDefaultPlaceholders, + resolveProject, +} from '../../utils'; + +export default function(schema: GenerateProxySchema) { + const params = removeDefaultPlaceholders(schema); + const moduleName = strings.camelize(params.module || 'app'); + + return chain([ + async (host: Tree, _context: SchematicContext) => { + const target = await resolveProject(host, params.target!); + const targetPath = buildDefaultPath(target.definition); + const readProxyConfig = createProxyConfigReader(targetPath); + let generated: string[] = []; + + try { + generated = readProxyConfig(host).generated; + const index = generated.findIndex(m => m === moduleName); + if (index < 0) generated.push(moduleName); + } catch (_) { + generated.push(moduleName); + } + + const getApiDefinition = createApiDefinitionGetter(params); + const data = { generated, ...(await getApiDefinition(host)) }; + data.generated = []; + + const clearProxy = createProxyClearer(targetPath); + + const saveProxyConfig = createProxyConfigSaver(data, targetPath); + + const generateApis = createApisGenerator(schema, generated); + + return chainAndMerge([clearProxy, saveProxyConfig, generateApis])(host); + }, + ]); +} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json b/npm/ng-packs/packages/schematics/src/commands/proxy-add/schema.json similarity index 50% rename from npm/ng-packs/packages/schematics/src/commands/proxy/schema.json rename to npm/ng-packs/packages/schematics/src/commands/proxy-add/schema.json index f0b76bbdf6..f9e762c597 100644 --- a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json +++ b/npm/ng-packs/packages/schematics/src/commands/proxy-add/schema.json @@ -6,33 +6,33 @@ "properties": { "module": { "alias": "m", - "description": "Backend module to generate code for", + "description": "Backend module 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 backend module name. (default: \"app\")" }, "source": { "alias": "s", - "description": "Angular project to resolve root namespace & API definition URL from", + "description": "Source Angular project for API definition URL & root namespace resolution", "type": "string", "$default": { "$source": "argv", "index": 1 }, - "x-prompt": "Plese enter Angular project name to resolve root namespace & API definition URL from. (default: workspace \"defaultProject\")" + "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" }, "target": { "alias": "t", - "description": "Angular project to generate code in", + "description": "Target Angular project to place the generated code", "type": "string", "$default": { "$source": "argv", "index": 2 }, - "x-prompt": "Plese enter Angular project name to place generated code in. (default: workspace \"defaultProject\")" + "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" } }, "required": [] diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy-refresh/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy-refresh/index.ts new file mode 100644 index 0000000000..2c4e20d7d2 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/proxy-refresh/index.ts @@ -0,0 +1,37 @@ +import { SchematicContext, Tree } from '@angular-devkit/schematics'; +import { GenerateProxySchema } from '../../models'; +import { + buildDefaultPath, + chainAndMerge, + createApiDefinitionGetter, + createApisGenerator, + createProxyClearer, + createProxyConfigReader, + createProxyConfigSaver, + removeDefaultPlaceholders, + resolveProject, +} from '../../utils'; + +export default function(schema: GenerateProxySchema) { + const params = removeDefaultPlaceholders(schema); + + return async (host: Tree, _context: SchematicContext) => { + const target = await resolveProject(host, params.target!); + const targetPath = buildDefaultPath(target.definition); + + const readProxyConfig = createProxyConfigReader(targetPath); + const { generated } = readProxyConfig(host); + + const getApiDefinition = createApiDefinitionGetter(params); + const data = { generated, ...(await getApiDefinition(host)) }; + data.generated = []; + + const clearProxy = createProxyClearer(targetPath); + + const saveProxyConfig = createProxyConfigSaver(data, targetPath); + + const generateApis = createApisGenerator(schema, generated); + + return chainAndMerge([clearProxy, saveProxyConfig, generateApis])(host); + }; +} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy-refresh/schema.json b/npm/ng-packs/packages/schematics/src/commands/proxy-refresh/schema.json new file mode 100644 index 0000000000..f9e762c597 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/proxy-refresh/schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/schema", + "id": "SchematicsAbpGenerateProxy", + "title": "ABP Generate Proxy Schema", + "type": "object", + "properties": { + "module": { + "alias": "m", + "description": "Backend module name", + "type": "string", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "Please enter backend module name. (default: \"app\")" + }, + "source": { + "alias": "s", + "description": "Source Angular project for API definition URL & root namespace resolution", + "type": "string", + "$default": { + "$source": "argv", + "index": 1 + }, + "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" + }, + "target": { + "alias": "t", + "description": "Target Angular project to place the generated code", + "type": "string", + "$default": { + "$source": "argv", + "index": 2 + }, + "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" + } + }, + "required": [] +} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy-remove/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy-remove/index.ts new file mode 100644 index 0000000000..83cc43c0b8 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/proxy-remove/index.ts @@ -0,0 +1,43 @@ +import { strings } from '@angular-devkit/core'; +import { SchematicContext, Tree } from '@angular-devkit/schematics'; +import { GenerateProxySchema } from '../../models'; +import { + buildDefaultPath, + chainAndMerge, + createApiDefinitionGetter, + createApisGenerator, + createProxyClearer, + createProxyConfigReader, + createProxyConfigSaver, + removeDefaultPlaceholders, + resolveProject, +} from '../../utils'; + +export default function(schema: GenerateProxySchema) { + const params = removeDefaultPlaceholders(schema); + const moduleName = strings.camelize(params.module || 'app'); + + return async (host: Tree, _context: SchematicContext) => { + const target = await resolveProject(host, params.target!); + const targetPath = buildDefaultPath(target.definition); + + const readProxyConfig = createProxyConfigReader(targetPath); + const { generated } = readProxyConfig(host); + + const index = generated.findIndex(m => m === moduleName); + if (index < 0) return host; + generated.splice(index, 1); + + const getApiDefinition = createApiDefinitionGetter(params); + const data = { generated, ...(await getApiDefinition(host)) }; + data.generated = []; + + const clearProxy = createProxyClearer(targetPath); + + const saveProxyConfig = createProxyConfigSaver(data, targetPath); + + const generateApis = createApisGenerator(schema, generated); + + return chainAndMerge([clearProxy, saveProxyConfig, generateApis])(host); + }; +} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy-remove/schema.json b/npm/ng-packs/packages/schematics/src/commands/proxy-remove/schema.json new file mode 100644 index 0000000000..f9e762c597 --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/commands/proxy-remove/schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/schema", + "id": "SchematicsAbpGenerateProxy", + "title": "ABP Generate Proxy Schema", + "type": "object", + "properties": { + "module": { + "alias": "m", + "description": "Backend module name", + "type": "string", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "Please enter backend module name. (default: \"app\")" + }, + "source": { + "alias": "s", + "description": "Source Angular project for API definition URL & root namespace resolution", + "type": "string", + "$default": { + "$source": "argv", + "index": 1 + }, + "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" + }, + "target": { + "alias": "t", + "description": "Target Angular project to place the generated code", + "type": "string", + "$default": { + "$source": "argv", + "index": 2 + }, + "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" + } + }, + "required": [] +} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts deleted file mode 100644 index fc405b5a58..0000000000 --- a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { strings } from '@angular-devkit/core'; -import { - branchAndMerge, - chain, - schematic, - SchematicContext, - Tree, -} from '@angular-devkit/schematics'; -import { API_DEFINITION_ENDPOINT, PROXY_CONFIG_PATH } from '../../constants'; -import { ApiDefinition } from '../../models'; -import { - buildDefaultPath, - createProxyConfigSaver, - getApiDefinition, - getSourceUrl, - removeDefaultPlaceholders, - resolveProject, -} from '../../utils'; -import { Schema as GenerateProxySchema } from './schema'; - -export default function(schema: GenerateProxySchema) { - const params = removeDefaultPlaceholders(schema); - const moduleName = strings.camelize(params.module || 'app'); - - return chain([ - async (tree: Tree, _context: SchematicContext) => { - const source = await resolveProject(tree, params.source!); - const target = await resolveProject(tree, params.target!); - const sourceUrl = getSourceUrl(tree, source, moduleName); - const targetPath = buildDefaultPath(target.definition); - const data: ApiDefinition = await getApiDefinition(sourceUrl + API_DEFINITION_ENDPOINT); - - const saveProxyConfig = createProxyConfigSaver(data, targetPath + PROXY_CONFIG_PATH); - const createApi = schematic('api', schema); - - return branchAndMerge(chain([saveProxyConfig, createApi])); - }, - ]); -} diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts deleted file mode 100644 index 0c26ce461f..0000000000 --- a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface Schema { - /** - * Backend module to generate code for - */ - module?: string; - - /** - * Angular project to resolve root namespace & API definition URL from - */ - source?: string; - - /** - * Angular project to generate code in - */ - target?: string; -} diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts index 3652836ed7..89d1fd17d8 100644 --- a/npm/ng-packs/packages/schematics/src/utils/source.ts +++ b/npm/ng-packs/packages/schematics/src/utils/source.ts @@ -1,13 +1,26 @@ +import { strings } from '@angular-devkit/core'; import { SchematicsException, Tree } from '@angular-devkit/schematics'; import got from 'got'; +import { API_DEFINITION_ENDPOINT, PROXY_CONFIG_PATH, PROXY_PATH } from '../constants'; import { Exception } from '../enums'; -import { ApiDefinition, Project, ProxyConfig, WriteOp } from '../models'; +import { ApiDefinition, GenerateProxySchema, Project, ProxyConfig, WriteOp } from '../models'; import { getAssignedPropertyFromObjectliteral } from './ast'; import { interpolate } from './common'; -import { readEnvironment } from './workspace'; +import { readEnvironment, resolveProject } from './workspace'; -export async function getApiDefinition(url: string) { - let body: any; +export function createApiDefinitionGetter(params: GenerateProxySchema) { + const moduleName = strings.camelize(params.module || 'app'); + + return async (host: Tree) => { + const source = await resolveProject(host, params.source!); + const sourceUrl = getSourceUrl(host, source, moduleName); + return await getApiDefinition(sourceUrl); + }; +} + +async function getApiDefinition(sourceUrl: string) { + const url = sourceUrl + API_DEFINITION_ENDPOINT; + let body: ApiDefinition; try { ({ body } = await got(url, { @@ -17,9 +30,10 @@ export async function getApiDefinition(url: string) { })); } catch ({ response }) { // handle redirects - if (response?.body && response.statusCode < 400) return response.body; + if (response.statusCode >= 400 || !response?.body) + throw new SchematicsException(Exception.NoApi); - throw new SchematicsException(Exception.NoApi); + body = response.body; } return body; @@ -72,13 +86,33 @@ export function getSourceUrl(tree: Tree, project: Project, moduleName: string) { } export function createProxyConfigReader(targetPath: string) { + targetPath += PROXY_CONFIG_PATH; + return (tree: Tree) => { try { const buffer = tree.read(targetPath); return JSON.parse(buffer!.toString()) as ProxyConfig; } catch (_) {} - throw new SchematicsException(interpolate(Exception.NoApiDefinition, targetPath)); + throw new SchematicsException(interpolate(Exception.NoProxyConfig, targetPath)); + }; +} + +export function createProxyClearer(targetPath: string) { + targetPath += PROXY_PATH; + + return (tree: Tree) => { + try { + tree.getDir(targetPath).subdirs.forEach(dirName => { + if (!['enums', 'models', 'services'].includes(dirName)) return; + + tree.delete(`${targetPath}/${dirName}`); + }); + + return tree; + } catch (_) { + throw new SchematicsException(interpolate(Exception.DirRemoveFailed, targetPath)); + } }; } @@ -86,6 +120,7 @@ export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: const createProxyConfigJson = createProxyConfigJsonCreator(apiDefinition); const readPreviousConfig = createProxyConfigReader(targetPath); const createProxyConfigWriter = createProxyConfigWriterCreator(targetPath); + targetPath += PROXY_CONFIG_PATH; return (tree: Tree) => { const generated: string[] = []; @@ -108,6 +143,8 @@ export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: } export function createProxyConfigWriterCreator(targetPath: string) { + targetPath += PROXY_CONFIG_PATH; + return (op: WriteOp, data: string) => (tree: Tree) => { try { tree[op](targetPath, data); From c91206de42f51953a8b823677fab9d0771d5cd3f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 17:26:19 +0300 Subject: [PATCH 17/19] build: update files to copy after schematics build --- npm/ng-packs/scripts/build-schematics.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/scripts/build-schematics.ts b/npm/ng-packs/scripts/build-schematics.ts index 5e95248415..3a14d2f03c 100644 --- a/npm/ng-packs/scripts/build-schematics.ts +++ b/npm/ng-packs/scripts/build-schematics.ts @@ -20,7 +20,9 @@ class FileCopy { const PACKAGE_TO_BUILD = 'schematics'; const FILES_TO_COPY_AFTER_BUILD: (FileCopy | string)[] = [ - { src: 'src/commands/proxy/schema.json', dest: 'commands/proxy/schema.json' }, + { src: 'src/commands/proxy-add/schema.json', dest: 'commands/proxy-add/schema.json' }, + { src: 'src/commands/proxy-refresh/schema.json', dest: 'commands/proxy-refresh/schema.json' }, + { src: 'src/commands/proxy-remove/schema.json', dest: 'commands/proxy-remove/schema.json' }, { src: 'src/commands/api/files-enum', dest: 'commands/api/files-enum' }, { src: 'src/commands/api/files-model', dest: 'commands/api/files-model' }, { src: 'src/commands/api/files-service', dest: 'commands/api/files-service' }, From 47b1aa13fb0595cabeac63e00c50eb172d8deaff Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 28 Aug 2020 18:05:46 +0300 Subject: [PATCH 18/19] feat: add a warning about generated proxies in markdown --- .../src/commands/proxy-add/index.ts | 5 +++- .../schematics/src/constants/proxy.ts | 16 ++++++++++++ .../packages/schematics/src/utils/source.ts | 25 ++++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts index 3ac5053851..1400cfca1c 100644 --- a/npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/proxy-add/index.ts @@ -9,6 +9,7 @@ import { createProxyClearer, createProxyConfigReader, createProxyConfigSaver, + createProxyWarningSaver, removeDefaultPlaceholders, resolveProject, } from '../../utils'; @@ -40,9 +41,11 @@ export default function(schema: GenerateProxySchema) { const saveProxyConfig = createProxyConfigSaver(data, targetPath); + const saveProxyWarning = createProxyWarningSaver(targetPath); + const generateApis = createApisGenerator(schema, generated); - return chainAndMerge([clearProxy, saveProxyConfig, generateApis])(host); + return chainAndMerge([clearProxy, saveProxyConfig, saveProxyWarning, generateApis])(host); }, ]); } diff --git a/npm/ng-packs/packages/schematics/src/constants/proxy.ts b/npm/ng-packs/packages/schematics/src/constants/proxy.ts index ee105029c4..fbf7f127bd 100644 --- a/npm/ng-packs/packages/schematics/src/constants/proxy.ts +++ b/npm/ng-packs/packages/schematics/src/constants/proxy.ts @@ -1,2 +1,18 @@ export const PROXY_PATH = '/proxy'; export const PROXY_CONFIG_PATH = `${PROXY_PATH}/generate-proxy.json`; +export const PROXY_WARNING_PATH = `${PROXY_PATH}/README.md`; + +export const PROXY_WARNING = `# Proxy Generation Output + +This directory includes the output of the latest proxy generation. +The \`services\`, \`models\`, and \`enums\` folders will be overwritten when proxy generation is run again. +Therefore, please do not place your own content in those folders. + +In addition, \`generate-proxy.json\` works like a lock file. +It includes information used by the proxy generator, so please do not delete or modify it. + +Finally, the name of this folder should not be changed for two reasons: +- Proxy generator will keep creating this folder and you will have multiple copies of the same content. +- ABP Suite generates imports from this folder and uses the path \`/proxy\` when doing so. + +`; diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts index 89d1fd17d8..b495e75c20 100644 --- a/npm/ng-packs/packages/schematics/src/utils/source.ts +++ b/npm/ng-packs/packages/schematics/src/utils/source.ts @@ -1,7 +1,13 @@ import { strings } from '@angular-devkit/core'; import { SchematicsException, Tree } from '@angular-devkit/schematics'; import got from 'got'; -import { API_DEFINITION_ENDPOINT, PROXY_CONFIG_PATH, PROXY_PATH } from '../constants'; +import { + API_DEFINITION_ENDPOINT, + PROXY_CONFIG_PATH, + PROXY_PATH, + PROXY_WARNING, + PROXY_WARNING_PATH, +} from '../constants'; import { Exception } from '../enums'; import { ApiDefinition, GenerateProxySchema, Project, ProxyConfig, WriteOp } from '../models'; import { getAssignedPropertyFromObjectliteral } from './ast'; @@ -116,6 +122,19 @@ export function createProxyClearer(targetPath: string) { }; } +export function createProxyWarningSaver(targetPath: string) { + targetPath += PROXY_WARNING_PATH; + const createFileWriter = createFileWriterCreator(targetPath); + + return (tree: Tree) => { + const op = tree.exists(targetPath) ? 'overwrite' : 'create'; + const writeWarningMD = createFileWriter(op, PROXY_WARNING); + writeWarningMD(tree); + + return tree; + }; +} + export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: string) { const createProxyConfigJson = createProxyConfigJsonCreator(apiDefinition); const readPreviousConfig = createProxyConfigReader(targetPath); @@ -145,6 +164,10 @@ export function createProxyConfigSaver(apiDefinition: ApiDefinition, targetPath: export function createProxyConfigWriterCreator(targetPath: string) { targetPath += PROXY_CONFIG_PATH; + return createFileWriterCreator(targetPath); +} + +export function createFileWriterCreator(targetPath: string) { return (op: WriteOp, data: string) => (tree: Tree) => { try { tree[op](targetPath, data); From 97027b170163876a550af3bcba105fdadeda26ec Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 31 Aug 2020 15:39:42 +0300 Subject: [PATCH 19/19] fix: remove source param overwrite in createApisGenerator --- npm/ng-packs/packages/schematics/src/utils/api.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/utils/api.ts b/npm/ng-packs/packages/schematics/src/utils/api.ts index f772666b4b..39483c2aa9 100644 --- a/npm/ng-packs/packages/schematics/src/utils/api.ts +++ b/npm/ng-packs/packages/schematics/src/utils/api.ts @@ -2,10 +2,5 @@ import { chain, schematic } from '@angular-devkit/schematics'; import { GenerateProxySchema } from '../models'; export function createApisGenerator(schema: GenerateProxySchema, generated: string[]) { - return chain( - generated.map(m => { - const apiSchema = { ...schema, source: schema.target, module: m }; - return schematic('api', apiSchema); - }), - ); + return chain(generated.map(m => schematic('api', { ...schema, module: m }))); }