From 656fade54868525259ab5cceb889a26006e02e56 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Fri, 26 May 2023 16:36:25 +0300 Subject: [PATCH 1/2] Create generator project --- npm/ng-packs/.eslintrc.json | 5 ++ npm/ng-packs/.vscode/settings.json | 3 +- npm/ng-packs/package.json | 18 +++-- .../packages/generators/.eslintrc.json | 25 +++++++ npm/ng-packs/packages/generators/README.md | 11 ++++ .../packages/generators/generators.json | 9 +++ .../packages/generators/jest.config.ts | 10 +++ npm/ng-packs/packages/generators/package.json | 6 ++ npm/ng-packs/packages/generators/project.json | 66 +++++++++++++++++++ .../files/src/index.ts.template | 1 + .../generate-proxy/generator.spec.ts | 20 ++++++ .../generators/generate-proxy/generator.ts | 17 +++++ .../src/generators/generate-proxy/schema.d.ts | 3 + .../src/generators/generate-proxy/schema.json | 18 +++++ npm/ng-packs/packages/generators/src/index.ts | 0 .../packages/generators/tsconfig.json | 16 +++++ .../packages/generators/tsconfig.lib.json | 10 +++ .../packages/generators/tsconfig.spec.json | 9 +++ npm/ng-packs/tsconfig.base.json | 1 + 19 files changed, 242 insertions(+), 6 deletions(-) create mode 100644 npm/ng-packs/packages/generators/.eslintrc.json create mode 100644 npm/ng-packs/packages/generators/README.md create mode 100644 npm/ng-packs/packages/generators/generators.json create mode 100644 npm/ng-packs/packages/generators/jest.config.ts create mode 100644 npm/ng-packs/packages/generators/package.json create mode 100644 npm/ng-packs/packages/generators/project.json create mode 100644 npm/ng-packs/packages/generators/src/generators/generate-proxy/files/src/index.ts.template create mode 100644 npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.spec.ts create mode 100644 npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts create mode 100644 npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts create mode 100644 npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json create mode 100644 npm/ng-packs/packages/generators/src/index.ts create mode 100644 npm/ng-packs/packages/generators/tsconfig.json create mode 100644 npm/ng-packs/packages/generators/tsconfig.lib.json create mode 100644 npm/ng-packs/packages/generators/tsconfig.spec.json diff --git a/npm/ng-packs/.eslintrc.json b/npm/ng-packs/.eslintrc.json index db77e663de..3a15786c57 100644 --- a/npm/ng-packs/.eslintrc.json +++ b/npm/ng-packs/.eslintrc.json @@ -34,6 +34,11 @@ "files": ["*.js", "*.jsx"], "extends": ["plugin:@nx/javascript"], "rules": {} + }, + { + "files": "*.json", + "parser": "jsonc-eslint-parser", + "rules": {} } ] } diff --git a/npm/ng-packs/.vscode/settings.json b/npm/ng-packs/.vscode/settings.json index 5125b157d6..de05b02679 100644 --- a/npm/ng-packs/.vscode/settings.json +++ b/npm/ng-packs/.vscode/settings.json @@ -38,5 +38,6 @@ "statusBarItem.hoverBackground": "#258ecd", "statusBar.foreground": "#e7e7e7" }, - "peacock.color": "#1D70A2" + "peacock.color": "#1D70A2", + "eslint.validate": ["json"] } diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 2ee851c483..cd51de99a8 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -80,13 +80,18 @@ "@ng-bootstrap/ng-bootstrap": "^14.0.0", "@ngneat/spectator": "^10.0.0", "@ngx-validate/core": "^0.2.0", + "@nx/angular": "16.1.4", "@nx/cypress": "16.1.4", "@nx/eslint-plugin": "16.1.4", - "@nx/jest": "16.1.4", + "@nx/jest": "16.2.2", + "@nx/js": "16.2.2", "@nx/linter": "16.1.4", "@nx/workspace": "16.1.4", "@popperjs/core": "~2.11.2", "@schematics/angular": "~16.0.1", + "@swc-node/register": "~1.4.2", + "@swc/cli": "~0.1.62", + "@swc/core": "~1.3.51", "@swimlane/ngx-datatable": "^20.0.0", "@types/jest": "29.4.4", "@types/node": "16.11.7", @@ -106,6 +111,7 @@ "jest-canvas-mock": "^2.3.1", "jest-environment-jsdom": "29.4.3", "jest-preset-angular": "13.1.0", + "jsonc-eslint-parser": "^2.1.0", "jsonc-parser": "^2.3.0", "just-clone": "^6.1.1", "just-compare": "^2.3.0", @@ -129,14 +135,16 @@ "tslib": "^2.3.0", "tslint": "~6.1.0", "typescript": "5.0.4", - "zone.js": "~0.13.0", - "@nx/angular": "16.1.4" + "zone.js": "~0.13.0" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,html,css,scss}": [ "npx prettier --write --config .prettierrc " ] }, - "dependencies": {} + "dependencies": { + "@nx/devkit": "16.2.2", + "@nx/plugin": "^16.2.2", + "@swc/helpers": "~0.5.0" + } } - diff --git a/npm/ng-packs/packages/generators/.eslintrc.json b/npm/ng-packs/packages/generators/.eslintrc.json new file mode 100644 index 0000000000..99664e583f --- /dev/null +++ b/npm/ng-packs/packages/generators/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["./package.json", "./generators.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/nx-plugin-checks": "error" + } + } + ] +} diff --git a/npm/ng-packs/packages/generators/README.md b/npm/ng-packs/packages/generators/README.md new file mode 100644 index 0000000000..7d8e5b9edf --- /dev/null +++ b/npm/ng-packs/packages/generators/README.md @@ -0,0 +1,11 @@ +# generators + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build generators` to build the library. + +## Running unit tests + +Run `nx test generators` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/npm/ng-packs/packages/generators/generators.json b/npm/ng-packs/packages/generators/generators.json new file mode 100644 index 0000000000..707e6af53f --- /dev/null +++ b/npm/ng-packs/packages/generators/generators.json @@ -0,0 +1,9 @@ +{ + "generators": { + "generate-proxy": { + "factory": "./src/generators/generate-proxy/generator", + "schema": "./src/generators/generate-proxy/schema.json", + "description": "generate-proxy generator" + } + } +} diff --git a/npm/ng-packs/packages/generators/jest.config.ts b/npm/ng-packs/packages/generators/jest.config.ts new file mode 100644 index 0000000000..c14fb75a03 --- /dev/null +++ b/npm/ng-packs/packages/generators/jest.config.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +export default { + displayName: 'generators', + preset: '../../jest.preset.js', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/packages/generators', +}; diff --git a/npm/ng-packs/packages/generators/package.json b/npm/ng-packs/packages/generators/package.json new file mode 100644 index 0000000000..a783ca11d2 --- /dev/null +++ b/npm/ng-packs/packages/generators/package.json @@ -0,0 +1,6 @@ +{ + "name": "@abp/generators", + "version": "0.0.1", + "type": "commonjs", + "generators": "./generators.json" +} diff --git a/npm/ng-packs/packages/generators/project.json b/npm/ng-packs/packages/generators/project.json new file mode 100644 index 0000000000..505cd53111 --- /dev/null +++ b/npm/ng-packs/packages/generators/project.json @@ -0,0 +1,66 @@ +{ + "name": "generators", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/generators/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/generators", + "main": "packages/generators/src/index.ts", + "tsConfig": "packages/generators/tsconfig.lib.json", + "assets": [ + "packages/generators/*.md", + { + "input": "./packages/generators/src", + "glob": "**/!(*.ts)", + "output": "./src" + }, + { + "input": "./packages/generators/src", + "glob": "**/*.d.ts", + "output": "./src" + }, + { + "input": "./packages/generators", + "glob": "generators.json", + "output": "." + }, + { + "input": "./packages/generators", + "glob": "executors.json", + "output": "." + } + ] + } + }, + "lint": { + "executor": "@nx/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": [ + "packages/generators/**/*.ts", + "packages/generators/package.json", + "packages/generators/generators.json" + ] + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/generators/jest.config.ts", + "passWithNoTests": true + }, + "configurations": { + "ci": { + "ci": true, + "codeCoverage": true + } + } + } + }, + "tags": [] +} diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/files/src/index.ts.template b/npm/ng-packs/packages/generators/src/generators/generate-proxy/files/src/index.ts.template new file mode 100644 index 0000000000..877d430279 --- /dev/null +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/files/src/index.ts.template @@ -0,0 +1 @@ +const variable = "<%= name %>"; \ No newline at end of file diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.spec.ts b/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.spec.ts new file mode 100644 index 0000000000..ea184bd015 --- /dev/null +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.spec.ts @@ -0,0 +1,20 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; + +import { generateProxyGenerator } from './generator'; +import { GenerateProxyGeneratorSchema } from './schema'; + +describe('generate-proxy generator', () => { + let tree: Tree; + const options: GenerateProxyGeneratorSchema = { name: 'test' }; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should run successfully', async () => { + await generateProxyGenerator(tree, options); + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); +}); diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts b/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts new file mode 100644 index 0000000000..7596a2db8d --- /dev/null +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts @@ -0,0 +1,17 @@ +import { addProjectConfiguration, formatFiles, generateFiles, Tree } from '@nx/devkit'; +import * as path from 'path'; +import { GenerateProxyGeneratorSchema } from './schema'; + +export async function generateProxyGenerator(tree: Tree, options: GenerateProxyGeneratorSchema) { + const projectRoot = `libs/${options.name}`; + addProjectConfiguration(tree, options.name, { + root: projectRoot, + projectType: 'library', + sourceRoot: `${projectRoot}/src`, + targets: {}, + }); + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options); + await formatFiles(tree); +} + +export default generateProxyGenerator; diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts new file mode 100644 index 0000000000..9ce9dc8761 --- /dev/null +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts @@ -0,0 +1,3 @@ +export interface GenerateProxyGeneratorSchema { + name: string; +} diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json new file mode 100644 index 0000000000..b04c23da0a --- /dev/null +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "GenerateProxy", + "title": "", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What name would you like to use?" + } + }, + "required": ["name"] +} diff --git a/npm/ng-packs/packages/generators/src/index.ts b/npm/ng-packs/packages/generators/src/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/npm/ng-packs/packages/generators/tsconfig.json b/npm/ng-packs/packages/generators/tsconfig.json new file mode 100644 index 0000000000..19b9eece4d --- /dev/null +++ b/npm/ng-packs/packages/generators/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs" + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/npm/ng-packs/packages/generators/tsconfig.lib.json b/npm/ng-packs/packages/generators/tsconfig.lib.json new file mode 100644 index 0000000000..33eca2c2cd --- /dev/null +++ b/npm/ng-packs/packages/generators/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/npm/ng-packs/packages/generators/tsconfig.spec.json b/npm/ng-packs/packages/generators/tsconfig.spec.json new file mode 100644 index 0000000000..f6d8ffcc9f --- /dev/null +++ b/npm/ng-packs/packages/generators/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/npm/ng-packs/tsconfig.base.json b/npm/ng-packs/tsconfig.base.json index 71e32f80ed..adb268ed8a 100644 --- a/npm/ng-packs/tsconfig.base.json +++ b/npm/ng-packs/tsconfig.base.json @@ -14,6 +14,7 @@ "baseUrl": "./", "allowSyntheticDefaultImports": true, "paths": { + "@abp/generators": ["packages/generators/src/index.ts"], "@abp/ng.account": ["packages/account/src/public-api.ts"], "@abp/ng.account.core": ["packages/account-core/src/public-api.ts"], "@abp/ng.account.core/proxy": ["packages/account-core/proxy/src/public-api.ts"], From ae7c383f45b437a92ca00b7fbc02a043b6748ce2 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Fri, 26 May 2023 17:55:31 +0300 Subject: [PATCH 2/2] add schematic wrapper for proxy-add --- .../generators/generate-proxy/generator.ts | 24 +++--- .../src/generators/generate-proxy/schema.d.ts | 8 +- .../src/generators/generate-proxy/schema.json | 86 +++++++++++++++++-- 3 files changed, 99 insertions(+), 19 deletions(-) diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts b/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts index 7596a2db8d..a12a59a82a 100644 --- a/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/generator.ts @@ -1,17 +1,15 @@ -import { addProjectConfiguration, formatFiles, generateFiles, Tree } from '@nx/devkit'; -import * as path from 'path'; import { GenerateProxyGeneratorSchema } from './schema'; +import { Tree } from '@nrwl/devkit'; +import { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter'; -export async function generateProxyGenerator(tree: Tree, options: GenerateProxyGeneratorSchema) { - const projectRoot = `libs/${options.name}`; - addProjectConfiguration(tree, options.name, { - root: projectRoot, - projectType: 'library', - sourceRoot: `${projectRoot}/src`, - targets: {}, +export default async function (host: Tree, schema: GenerateProxyGeneratorSchema) { + const runAngularLibrarySchematic = wrapAngularDevkitSchematic('@abp/ng.schematics', 'proxy-add'); + + await runAngularLibrarySchematic(host, { + ...schema, }); - generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options); - await formatFiles(tree); -} -export default generateProxyGenerator; + return () => { + console.log(`proxy added '${schema.target}`); + }; +} diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts index 9ce9dc8761..cbc2924c78 100644 --- a/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.d.ts @@ -1,3 +1,9 @@ export interface GenerateProxyGeneratorSchema { - name: string; + module: string; + apiName: string; + source: string; + target: string; + url: string; + serviceType: string; + entryPoint: string; } diff --git a/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json index b04c23da0a..51f3916848 100644 --- a/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json +++ b/npm/ng-packs/packages/generators/src/generators/generate-proxy/schema.json @@ -1,18 +1,94 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GenerateProxy", "title": "", "type": "object", "properties": { - "name": { + "module": { + "description": "Backend module name", "type": "string", - "description": "", "$default": { "$source": "argv", "index": 0 }, - "x-prompt": "What name would you like to use?" + "x-prompt": "Please enter backend module name. (default: \"app\")" + }, + "apiName": { + "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": { + "description": "Source Angular project for API definition URL & root namespace resolution", + "type": "string", + "$default": { + "$source": "argv", + "index": 2 + }, + "x-prompt": "Please 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": "Please enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" + }, + "url": { + "description": "Url for API definition", + "type": "string", + "$default": { + "$source": "argv", + "index": 4 + }, + "x-prompt": "Please enter URL for API definition (default: API Name's url in environment file)" + }, + "serviceType": { + "description": "Service type to the generated code", + "type": "string", + "$default": { + "$source": "argv", + "index": 5 + }, + "enum": [ + "application", + "integration", + "all" + ], + "x-prompt": { + "message": "Specifies the service type to generate. `application`, `integration` and `all`, Default value: `application`", + "type": "list", + "items": [ + { + "value": "all", + "label": "All" + }, + { + "value": "application", + "label": "Application" + }, + { + "value": "integration", + "label": "Integration" + } + ] + } + }, + "entryPoint": { + "description": "Target Angular project to place the generated code", + "type": "string", + "$default": { + "$source": "argv", + "index": 6 + }, + "x-prompt": "Please enter target entry point to place the generated code. (default: null)" } }, - "required": ["name"] + "required": [] }