From 3dbca97a46229f59ca9ff6b2594a639bf9481a93 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 06:51:20 -0400 Subject: [PATCH 01/18] Lab #1 --- .vscode/settings.json | 3 + eslint.config.js | 6 + nx.json | 5 + package-lock.json | 809 ++++++++++++++++++ package.json | 1 + tools/my-plugin/README.md | 11 + tools/my-plugin/eslint.config.js | 28 + tools/my-plugin/generators.json | 9 + tools/my-plugin/jest.config.ts | 9 + tools/my-plugin/package.json | 13 + tools/my-plugin/project.json | 48 ++ .../my-generator/files/src/index.ts.template | 1 + .../generators/my-generator/generator.spec.ts | 20 + .../src/generators/my-generator/generator.ts | 25 + .../src/generators/my-generator/schema.d.ts | 3 + .../src/generators/my-generator/schema.json | 18 + tools/my-plugin/src/index.ts | 0 tools/my-plugin/tsconfig.json | 16 + tools/my-plugin/tsconfig.lib.json | 10 + tools/my-plugin/tsconfig.spec.json | 14 + tsconfig.base.json | 4 +- 21 files changed, 1052 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100644 tools/my-plugin/README.md create mode 100644 tools/my-plugin/eslint.config.js create mode 100644 tools/my-plugin/generators.json create mode 100644 tools/my-plugin/jest.config.ts create mode 100644 tools/my-plugin/package.json create mode 100644 tools/my-plugin/project.json create mode 100644 tools/my-plugin/src/generators/my-generator/files/src/index.ts.template create mode 100644 tools/my-plugin/src/generators/my-generator/generator.spec.ts create mode 100644 tools/my-plugin/src/generators/my-generator/generator.ts create mode 100644 tools/my-plugin/src/generators/my-generator/schema.d.ts create mode 100644 tools/my-plugin/src/generators/my-generator/schema.json create mode 100644 tools/my-plugin/src/index.ts create mode 100644 tools/my-plugin/tsconfig.json create mode 100644 tools/my-plugin/tsconfig.lib.json create mode 100644 tools/my-plugin/tsconfig.spec.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1471fb9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "eslint.validate": ["json"] +} diff --git a/eslint.config.js b/eslint.config.js index 46a8005..769c668 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,6 +1,12 @@ const nx = require('@nx/eslint-plugin'); module.exports = [ + { + files: ['**/*.json'], + // Override or add rules here + rules: {}, + languageOptions: { parser: require('jsonc-eslint-parser') }, + }, ...nx.configs['flat/base'], ...nx.configs['flat/typescript'], ...nx.configs['flat/javascript'], diff --git a/nx.json b/nx.json index 0f24ed0..37b3c32 100644 --- a/nx.json +++ b/nx.json @@ -45,6 +45,11 @@ }, "e2e-ci--**/*": { "dependsOn": ["^build"] + }, + "@nx/js:tsc": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["production", "^production"] } }, "plugins": [ diff --git a/package-lock.json b/package-lock.json index fbf482e..4fb5737 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "@playwright/test": "^1.36.0", "@schematics/angular": "~18.2.0", "@swc-node/register": "~1.9.1", + "@swc/cli": "~0.3.12", "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", "@types/jest": "^29.5.12", @@ -5792,6 +5793,25 @@ "@module-federation/sdk": "0.6.9" } }, + "node_modules/@mole-inc/bin-wrapper": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", + "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", + "dev": true, + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^5.0.0", + "content-disposition": "^0.5.4", + "ext-name": "^5.0.0", + "file-type": "^17.1.6", + "filenamify": "^5.0.2", + "got": "^11.8.5", + "os-filter-obj": "^2.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", @@ -7494,6 +7514,18 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", @@ -7592,6 +7624,58 @@ "source-map": "^0.6.0" } }, + "node_modules/@swc/cli": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.3.14.tgz", + "integrity": "sha512-0vGqD6FSW67PaZUZABkA+ADKsX7OUY/PwNEz1SbQdCvVk/e4Z36Gwh7mFVBQH9RIsMonTyhV1RHkwkGnEfR3zQ==", + "dev": true, + "dependencies": { + "@mole-inc/bin-wrapper": "^8.0.1", + "@swc/counter": "^0.1.3", + "commander": "^8.3.0", + "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", + "piscina": "^4.3.0", + "semver": "^7.3.8", + "slash": "3.0.0", + "source-map": "^0.7.3" + }, + "bin": { + "spack": "bin/spack.js", + "swc": "bin/swc.js", + "swcx": "bin/swcx.js" + }, + "engines": { + "node": ">= 16.14.0" + }, + "peerDependencies": { + "@swc/core": "^1.2.66", + "chokidar": "^3.5.1" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@swc/cli/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@swc/cli/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@swc/core": { "version": "1.5.29", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.29.tgz", @@ -7814,6 +7898,24 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -7962,6 +8064,18 @@ "@types/node": "*" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -8032,6 +8146,12 @@ "@types/node": "*" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -8110,6 +8230,15 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -8158,6 +8287,15 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", @@ -8962,6 +9100,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -9466,6 +9624,157 @@ "node": "*" } }, + "node_modules/bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "dependencies": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/bin-check/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/bin-check/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/bin-version": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", + "integrity": "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "find-versions": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bin-version-check": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.1.0.tgz", + "integrity": "sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==", + "dev": true, + "dependencies": { + "bin-version": "^6.0.0", + "semver": "^7.5.3", + "semver-truncate": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -9761,6 +10070,48 @@ "node": ">= 6.0.0" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -10093,6 +10444,18 @@ "node": ">=0.10.0" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -10807,6 +11170,33 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -10894,6 +11284,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -11912,6 +12311,18 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -12012,6 +12423,31 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -12147,6 +12583,23 @@ "node": ">=16.0.0" } }, + "node_modules/file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "dev": true, + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -12168,6 +12621,35 @@ "node": ">=10" } }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filenamify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", + "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -12267,6 +12749,21 @@ "node": ">=8" } }, + "node_modules/find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "dev": true, + "dependencies": { + "semver-regex": "^4.0.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -12802,6 +13299,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -13197,6 +13719,19 @@ "node": ">=12" } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -15623,6 +16158,15 @@ "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", "dev": true }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -15860,6 +16404,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.4.7", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", @@ -16457,6 +17010,18 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-bundled": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", @@ -16807,6 +17372,18 @@ "integrity": "sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==", "dev": true }, + "node_modules/os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "dependencies": { + "arch": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -16816,6 +17393,24 @@ "node": ">=0.10.0" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -17119,6 +17714,19 @@ "node": ">=8" } }, + "node_modules/peek-readable": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.2.0.tgz", + "integrity": "sha512-U94a+eXHzct7vAd19GH3UQ2dH4Satbng0MyYTMaQatL0pvYYL5CTPR25HBhKtecl+4bfu1/i3vC6k0hydO5Vcw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", @@ -17958,12 +18566,28 @@ "dev": true, "optional": true }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -18030,6 +18654,18 @@ } ] }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/rambda": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.3.0.tgz", @@ -18098,6 +18734,22 @@ "node": ">= 6" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -18243,6 +18895,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -18326,6 +18984,18 @@ "node": ">=10" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -18699,6 +19369,33 @@ "node": ">=10" } }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-truncate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-3.0.0.tgz", + "integrity": "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -19062,6 +19759,39 @@ "node": ">= 14" } }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sorted-array-functions": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", @@ -19378,6 +20108,15 @@ "node": ">=4" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -19399,6 +20138,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", + "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -19416,6 +20167,23 @@ "node": ">=4" } }, + "node_modules/strtok3": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.1.1.tgz", + "integrity": "sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.1.3" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -19948,6 +20716,23 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -20009,6 +20794,30 @@ "tree-kill": "cli.js" } }, + "node_modules/trim-repeated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", diff --git a/package.json b/package.json index 2e79179..e9052a9 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "@playwright/test": "^1.36.0", "@schematics/angular": "~18.2.0", "@swc-node/register": "~1.9.1", + "@swc/cli": "~0.3.12", "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", "@types/jest": "^29.5.12", diff --git a/tools/my-plugin/README.md b/tools/my-plugin/README.md new file mode 100644 index 0000000..1771265 --- /dev/null +++ b/tools/my-plugin/README.md @@ -0,0 +1,11 @@ +# my-plugin + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build my-plugin` to build the library. + +## Running unit tests + +Run `nx test my-plugin` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/tools/my-plugin/eslint.config.js b/tools/my-plugin/eslint.config.js new file mode 100644 index 0000000..9327f3f --- /dev/null +++ b/tools/my-plugin/eslint.config.js @@ -0,0 +1,28 @@ +const baseConfig = require('../../eslint.config.js'); + +module.exports = [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'], + }, + ], + }, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, + { + files: ['**/package.json', '**/package.json', '**/generators.json'], + rules: { + '@nx/nx-plugin-checks': 'error', + }, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, +]; diff --git a/tools/my-plugin/generators.json b/tools/my-plugin/generators.json new file mode 100644 index 0000000..8959356 --- /dev/null +++ b/tools/my-plugin/generators.json @@ -0,0 +1,9 @@ +{ + "generators": { + "my-generator": { + "factory": "./src/generators/my-generator/generator", + "schema": "./src/generators/my-generator/schema.json", + "description": "my-generator generator" + } + } +} diff --git a/tools/my-plugin/jest.config.ts b/tools/my-plugin/jest.config.ts new file mode 100644 index 0000000..5f5ff6f --- /dev/null +++ b/tools/my-plugin/jest.config.ts @@ -0,0 +1,9 @@ +export default { + displayName: 'my-plugin', + preset: '../../jest.preset.js', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/tools/my-plugin', +}; diff --git a/tools/my-plugin/package.json b/tools/my-plugin/package.json new file mode 100644 index 0000000..e6877b0 --- /dev/null +++ b/tools/my-plugin/package.json @@ -0,0 +1,13 @@ +{ + "name": "@my-workspace/my-plugin", + "version": "0.0.1", + "dependencies": { + "@nx/devkit": "19.8.4", + "tslib": "^2.3.0" + }, + "type": "commonjs", + "main": "./src/index.js", + "typings": "./src/index.d.ts", + "private": true, + "generators": "./generators.json" +} diff --git a/tools/my-plugin/project.json b/tools/my-plugin/project.json new file mode 100644 index 0000000..29df8c6 --- /dev/null +++ b/tools/my-plugin/project.json @@ -0,0 +1,48 @@ +{ + "name": "my-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "tools/my-plugin/src", + "projectType": "library", + "tags": [], + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/tools/my-plugin", + "main": "tools/my-plugin/src/index.ts", + "tsConfig": "tools/my-plugin/tsconfig.lib.json", + "assets": [ + "tools/my-plugin/*.md", + { + "input": "./tools/my-plugin/src", + "glob": "**/!(*.ts)", + "output": "./src" + }, + { + "input": "./tools/my-plugin/src", + "glob": "**/*.d.ts", + "output": "./src" + }, + { + "input": "./tools/my-plugin", + "glob": "generators.json", + "output": "." + }, + { + "input": "./tools/my-plugin", + "glob": "executors.json", + "output": "." + } + ] + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "tools/my-plugin/jest.config.ts" + } + } + } +} diff --git a/tools/my-plugin/src/generators/my-generator/files/src/index.ts.template b/tools/my-plugin/src/generators/my-generator/files/src/index.ts.template new file mode 100644 index 0000000..877d430 --- /dev/null +++ b/tools/my-plugin/src/generators/my-generator/files/src/index.ts.template @@ -0,0 +1 @@ +const variable = "<%= name %>"; \ No newline at end of file diff --git a/tools/my-plugin/src/generators/my-generator/generator.spec.ts b/tools/my-plugin/src/generators/my-generator/generator.spec.ts new file mode 100644 index 0000000..1989922 --- /dev/null +++ b/tools/my-plugin/src/generators/my-generator/generator.spec.ts @@ -0,0 +1,20 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; + +import { myGeneratorGenerator } from './generator'; +import { MyGeneratorGeneratorSchema } from './schema'; + +describe('my-generator generator', () => { + let tree: Tree; + const options: MyGeneratorGeneratorSchema = { name: 'test' }; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should run successfully', async () => { + await myGeneratorGenerator(tree, options); + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); +}); diff --git a/tools/my-plugin/src/generators/my-generator/generator.ts b/tools/my-plugin/src/generators/my-generator/generator.ts new file mode 100644 index 0000000..64afd6d --- /dev/null +++ b/tools/my-plugin/src/generators/my-generator/generator.ts @@ -0,0 +1,25 @@ +import { + addProjectConfiguration, + formatFiles, + generateFiles, + Tree, +} from '@nx/devkit'; +import * as path from 'path'; +import { MyGeneratorGeneratorSchema } from './schema'; + +export async function myGeneratorGenerator( + tree: Tree, + options: MyGeneratorGeneratorSchema +) { + 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 myGeneratorGenerator; diff --git a/tools/my-plugin/src/generators/my-generator/schema.d.ts b/tools/my-plugin/src/generators/my-generator/schema.d.ts new file mode 100644 index 0000000..1ab8a57 --- /dev/null +++ b/tools/my-plugin/src/generators/my-generator/schema.d.ts @@ -0,0 +1,3 @@ +export interface MyGeneratorGeneratorSchema { + name: string; +} diff --git a/tools/my-plugin/src/generators/my-generator/schema.json b/tools/my-plugin/src/generators/my-generator/schema.json new file mode 100644 index 0000000..d1b65af --- /dev/null +++ b/tools/my-plugin/src/generators/my-generator/schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/schema", + "$id": "MyGenerator", + "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/tools/my-plugin/src/index.ts b/tools/my-plugin/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/tools/my-plugin/tsconfig.json b/tools/my-plugin/tsconfig.json new file mode 100644 index 0000000..19b9eec --- /dev/null +++ b/tools/my-plugin/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/tools/my-plugin/tsconfig.lib.json b/tools/my-plugin/tsconfig.lib.json new file mode 100644 index 0000000..33eca2c --- /dev/null +++ b/tools/my-plugin/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/tools/my-plugin/tsconfig.spec.json b/tools/my-plugin/tsconfig.spec.json new file mode 100644 index 0000000..9b2a121 --- /dev/null +++ b/tools/my-plugin/tsconfig.spec.json @@ -0,0 +1,14 @@ +{ + "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/tsconfig.base.json b/tsconfig.base.json index b73cce6..428f209 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -14,7 +14,9 @@ "skipLibCheck": true, "skipDefaultLibCheck": true, "baseUrl": ".", - "paths": {} + "paths": { + "@my-workspace/my-plugin": ["tools/my-plugin/src/index.ts"] + } }, "exclude": ["node_modules", "tmp"] } From 8e53154a160e4cab7fcd9dfc8bca77b10f0009b7 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 06:52:57 -0400 Subject: [PATCH 02/18] Lab #2 --- my-library/README.md | 7 ++++ my-library/eslint.config.js | 34 +++++++++++++++++++ my-library/jest.config.ts | 21 ++++++++++++ my-library/project.json | 20 +++++++++++ my-library/src/index.ts | 1 + .../lib/my-library/my-library.component.css | 0 .../lib/my-library/my-library.component.html | 1 + .../my-library/my-library.component.spec.ts | 21 ++++++++++++ .../lib/my-library/my-library.component.ts | 11 ++++++ my-library/src/test-setup.ts | 8 +++++ my-library/tsconfig.json | 28 +++++++++++++++ my-library/tsconfig.lib.json | 17 ++++++++++ my-library/tsconfig.spec.json | 16 +++++++++ nx.json | 7 ++++ tsconfig.base.json | 1 + 15 files changed, 193 insertions(+) create mode 100644 my-library/README.md create mode 100644 my-library/eslint.config.js create mode 100644 my-library/jest.config.ts create mode 100644 my-library/project.json create mode 100644 my-library/src/index.ts create mode 100644 my-library/src/lib/my-library/my-library.component.css create mode 100644 my-library/src/lib/my-library/my-library.component.html create mode 100644 my-library/src/lib/my-library/my-library.component.spec.ts create mode 100644 my-library/src/lib/my-library/my-library.component.ts create mode 100644 my-library/src/test-setup.ts create mode 100644 my-library/tsconfig.json create mode 100644 my-library/tsconfig.lib.json create mode 100644 my-library/tsconfig.spec.json diff --git a/my-library/README.md b/my-library/README.md new file mode 100644 index 0000000..a4853b1 --- /dev/null +++ b/my-library/README.md @@ -0,0 +1,7 @@ +# my-library + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test my-library` to execute the unit tests. diff --git a/my-library/eslint.config.js b/my-library/eslint.config.js new file mode 100644 index 0000000..67de88d --- /dev/null +++ b/my-library/eslint.config.js @@ -0,0 +1,34 @@ +const nx = require('@nx/eslint-plugin'); +const baseConfig = require('../eslint.config.js'); + +module.exports = [ + ...baseConfig, + ...nx.configs['flat/angular'], + ...nx.configs['flat/angular-template'], + { + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'lib', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'lib', + style: 'kebab-case', + }, + ], + }, + }, + { + files: ['**/*.html'], + // Override or add rules here + rules: {}, + }, +]; diff --git a/my-library/jest.config.ts b/my-library/jest.config.ts new file mode 100644 index 0000000..ae29d9f --- /dev/null +++ b/my-library/jest.config.ts @@ -0,0 +1,21 @@ +export default { + displayName: 'my-library', + preset: '../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../coverage/my-library', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/my-library/project.json b/my-library/project.json new file mode 100644 index 0000000..3a43a6d --- /dev/null +++ b/my-library/project.json @@ -0,0 +1,20 @@ +{ + "name": "my-library", + "$schema": "../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "my-library/src", + "prefix": "lib", + "projectType": "library", + "tags": [], + "targets": { + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "my-library/jest.config.ts" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/my-library/src/index.ts b/my-library/src/index.ts new file mode 100644 index 0000000..6b36f1a --- /dev/null +++ b/my-library/src/index.ts @@ -0,0 +1 @@ +export * from './lib/my-library/my-library.component'; diff --git a/my-library/src/lib/my-library/my-library.component.css b/my-library/src/lib/my-library/my-library.component.css new file mode 100644 index 0000000..e69de29 diff --git a/my-library/src/lib/my-library/my-library.component.html b/my-library/src/lib/my-library/my-library.component.html new file mode 100644 index 0000000..63437d7 --- /dev/null +++ b/my-library/src/lib/my-library/my-library.component.html @@ -0,0 +1 @@ +

my-library works!

diff --git a/my-library/src/lib/my-library/my-library.component.spec.ts b/my-library/src/lib/my-library/my-library.component.spec.ts new file mode 100644 index 0000000..eb6e257 --- /dev/null +++ b/my-library/src/lib/my-library/my-library.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MyLibraryComponent } from './my-library.component'; + +describe('MyLibraryComponent', () => { + let component: MyLibraryComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MyLibraryComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(MyLibraryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/my-library/src/lib/my-library/my-library.component.ts b/my-library/src/lib/my-library/my-library.component.ts new file mode 100644 index 0000000..92536aa --- /dev/null +++ b/my-library/src/lib/my-library/my-library.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'lib-my-library', + standalone: true, + imports: [CommonModule], + templateUrl: './my-library.component.html', + styleUrl: './my-library.component.css', +}) +export class MyLibraryComponent {} diff --git a/my-library/src/test-setup.ts b/my-library/src/test-setup.ts new file mode 100644 index 0000000..ab1eeeb --- /dev/null +++ b/my-library/src/test-setup.ts @@ -0,0 +1,8 @@ +// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment +globalThis.ngJest = { + testEnvironmentOptions: { + errorOnUnknownElements: true, + errorOnUnknownProperties: true, + }, +}; +import 'jest-preset-angular/setup-jest'; diff --git a/my-library/tsconfig.json b/my-library/tsconfig.json new file mode 100644 index 0000000..74c8f45 --- /dev/null +++ b/my-library/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "es2022", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "extends": "../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/my-library/tsconfig.lib.json b/my-library/tsconfig.lib.json new file mode 100644 index 0000000..64216c9 --- /dev/null +++ b/my-library/tsconfig.lib.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": [ + "src/**/*.spec.ts", + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" + ], + "include": ["src/**/*.ts"] +} diff --git a/my-library/tsconfig.spec.json b/my-library/tsconfig.spec.json new file mode 100644 index 0000000..2894252 --- /dev/null +++ b/my-library/tsconfig.spec.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "module": "commonjs", + "target": "es2016", + "types": ["jest", "node"] + }, + "files": ["src/test-setup.ts"], + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/nx.json b/nx.json index 37b3c32..3a2f654 100644 --- a/nx.json +++ b/nx.json @@ -72,6 +72,13 @@ "linter": "eslint", "style": "css", "unitTestRunner": "jest" + }, + "@nx/angular:library": { + "linter": "eslint", + "unitTestRunner": "jest" + }, + "@nx/angular:component": { + "style": "css" } } } diff --git a/tsconfig.base.json b/tsconfig.base.json index 428f209..686d7c1 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -15,6 +15,7 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { + "@my-workspace/my-library": ["my-library/src/index.ts"], "@my-workspace/my-plugin": ["tools/my-plugin/src/index.ts"] } }, From d4dd64c1d642e3e246571592b445df35e1edd3e3 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 06:58:47 -0400 Subject: [PATCH 03/18] Lab #3 --- .../src/generators/my-generator/generator.ts | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/tools/my-plugin/src/generators/my-generator/generator.ts b/tools/my-plugin/src/generators/my-generator/generator.ts index 64afd6d..8b2f346 100644 --- a/tools/my-plugin/src/generators/my-generator/generator.ts +++ b/tools/my-plugin/src/generators/my-generator/generator.ts @@ -1,25 +1,17 @@ -import { - addProjectConfiguration, - formatFiles, - generateFiles, - Tree, -} from '@nx/devkit'; -import * as path from 'path'; +import { applicationGenerator } from '@nx/angular/generators'; +import { Tree } from '@nx/devkit'; import { MyGeneratorGeneratorSchema } from './schema'; export async function myGeneratorGenerator( tree: Tree, options: MyGeneratorGeneratorSchema ) { - const projectRoot = `libs/${options.name}`; - addProjectConfiguration(tree, options.name, { - root: projectRoot, - projectType: 'library', - sourceRoot: `${projectRoot}/src`, - targets: {}, + await applicationGenerator(tree, { + name: options.name, + routing: true, + prefix: options.name, + style: 'scss', }); - generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options); - await formatFiles(tree); } export default myGeneratorGenerator; From ebbb780fec746921ff7a67159759e7c4570d8a79 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 07:13:43 -0400 Subject: [PATCH 04/18] Lab #5 --- .../src/generators/my-generator/files/app.workflow.ts | 1 + .../generators/my-generator/files/src/index.ts.template | 1 - tools/my-plugin/src/generators/my-generator/generator.ts | 7 ++++++- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 tools/my-plugin/src/generators/my-generator/files/app.workflow.ts delete mode 100644 tools/my-plugin/src/generators/my-generator/files/src/index.ts.template diff --git a/tools/my-plugin/src/generators/my-generator/files/app.workflow.ts b/tools/my-plugin/src/generators/my-generator/files/app.workflow.ts new file mode 100644 index 0000000..b6eb765 --- /dev/null +++ b/tools/my-plugin/src/generators/my-generator/files/app.workflow.ts @@ -0,0 +1 @@ +export const loginSteps = []; diff --git a/tools/my-plugin/src/generators/my-generator/files/src/index.ts.template b/tools/my-plugin/src/generators/my-generator/files/src/index.ts.template deleted file mode 100644 index 877d430..0000000 --- a/tools/my-plugin/src/generators/my-generator/files/src/index.ts.template +++ /dev/null @@ -1 +0,0 @@ -const variable = "<%= name %>"; \ No newline at end of file diff --git a/tools/my-plugin/src/generators/my-generator/generator.ts b/tools/my-plugin/src/generators/my-generator/generator.ts index 8b2f346..2c4298c 100644 --- a/tools/my-plugin/src/generators/my-generator/generator.ts +++ b/tools/my-plugin/src/generators/my-generator/generator.ts @@ -1,5 +1,5 @@ import { applicationGenerator } from '@nx/angular/generators'; -import { Tree } from '@nx/devkit'; +import { generateFiles, joinPathFragments, readProjectConfiguration, Tree } from '@nx/devkit'; import { MyGeneratorGeneratorSchema } from './schema'; export async function myGeneratorGenerator( @@ -12,6 +12,11 @@ export async function myGeneratorGenerator( prefix: options.name, style: 'scss', }); + + const sourceDir = joinPathFragments(__dirname, 'files'); + const projectDir = readProjectConfiguration(tree, options.name).root; + const destinationDir = joinPathFragments(projectDir, 'src', 'app'); + generateFiles(tree, sourceDir, destinationDir, {}); } export default myGeneratorGenerator; From 4986cf1d2d9edc5f0948143317a37cd106ec00e3 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 07:37:15 -0400 Subject: [PATCH 05/18] Lab #6 --- .../files/{app.workflow.ts => app.workflow.ts.template} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tools/my-plugin/src/generators/my-generator/files/{app.workflow.ts => app.workflow.ts.template} (100%) diff --git a/tools/my-plugin/src/generators/my-generator/files/app.workflow.ts b/tools/my-plugin/src/generators/my-generator/files/app.workflow.ts.template similarity index 100% rename from tools/my-plugin/src/generators/my-generator/files/app.workflow.ts rename to tools/my-plugin/src/generators/my-generator/files/app.workflow.ts.template From e5f7782c68c395c5325aa3f36ab388ecd5b82d5f Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 08:03:00 -0400 Subject: [PATCH 06/18] Lab #7 --- tools/my-plugin/src/generators/utils/get-source-file.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tools/my-plugin/src/generators/utils/get-source-file.ts diff --git a/tools/my-plugin/src/generators/utils/get-source-file.ts b/tools/my-plugin/src/generators/utils/get-source-file.ts new file mode 100644 index 0000000..a6b3bc0 --- /dev/null +++ b/tools/my-plugin/src/generators/utils/get-source-file.ts @@ -0,0 +1,7 @@ +import { Tree } from '@nx/devkit'; +import { createSourceFile, ScriptTarget } from 'typescript'; + +export function getSourceFile(tree: Tree, filePath: string) { + const moduleSrc = tree.read(filePath, 'utf-8'); + return createSourceFile(filePath, moduleSrc, ScriptTarget.Latest, true); +} From e071839c96d4261081253b0b646fd674547d9fe7 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 08:10:02 -0400 Subject: [PATCH 07/18] Lab #8 --- tools/my-plugin/src/generators/my-generator/generator.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/my-plugin/src/generators/my-generator/generator.ts b/tools/my-plugin/src/generators/my-generator/generator.ts index 2c4298c..6819140 100644 --- a/tools/my-plugin/src/generators/my-generator/generator.ts +++ b/tools/my-plugin/src/generators/my-generator/generator.ts @@ -1,5 +1,8 @@ import { applicationGenerator } from '@nx/angular/generators'; +import { addImportToComponent } from '@nx/angular/src/utils'; import { generateFiles, joinPathFragments, readProjectConfiguration, Tree } from '@nx/devkit'; +import { insertImport } from '@nx/js'; +import { getSourceFile } from '../utils/get-source-file'; import { MyGeneratorGeneratorSchema } from './schema'; export async function myGeneratorGenerator( @@ -17,6 +20,10 @@ export async function myGeneratorGenerator( const projectDir = readProjectConfiguration(tree, options.name).root; const destinationDir = joinPathFragments(projectDir, 'src', 'app'); generateFiles(tree, sourceDir, destinationDir, {}); + + const appComponentPath = joinPathFragments(destinationDir, 'app.component.ts'); + addImportToComponent(tree, getSourceFile(tree, appComponentPath), appComponentPath, 'MyLibraryComponent'); + insertImport(tree, getSourceFile(tree, appComponentPath), appComponentPath, 'MyLibraryComponent', '@my-workspace/my-library'); } export default myGeneratorGenerator; From 04d715eb08e9ec88c2d629589c9e47511b1a3b4b Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 08:28:43 -0400 Subject: [PATCH 08/18] Lab #9 --- tools/my-plugin/generators.json | 5 +++++ .../my-step/files/src/index.ts.template | 1 + .../src/generators/my-step/generator.spec.ts | 20 +++++++++++++++++ .../src/generators/my-step/generator.ts | 20 +++++++++++++++++ .../src/generators/my-step/schema.d.ts | 4 ++++ .../src/generators/my-step/schema.json | 22 +++++++++++++++++++ 6 files changed, 72 insertions(+) create mode 100644 tools/my-plugin/src/generators/my-step/files/src/index.ts.template create mode 100644 tools/my-plugin/src/generators/my-step/generator.spec.ts create mode 100644 tools/my-plugin/src/generators/my-step/generator.ts create mode 100644 tools/my-plugin/src/generators/my-step/schema.d.ts create mode 100644 tools/my-plugin/src/generators/my-step/schema.json diff --git a/tools/my-plugin/generators.json b/tools/my-plugin/generators.json index 8959356..6c3ecdd 100644 --- a/tools/my-plugin/generators.json +++ b/tools/my-plugin/generators.json @@ -4,6 +4,11 @@ "factory": "./src/generators/my-generator/generator", "schema": "./src/generators/my-generator/schema.json", "description": "my-generator generator" + }, + "my-step": { + "factory": "./src/generators/my-step/generator", + "schema": "./src/generators/my-step/schema.json", + "description": "my-step generator" } } } diff --git a/tools/my-plugin/src/generators/my-step/files/src/index.ts.template b/tools/my-plugin/src/generators/my-step/files/src/index.ts.template new file mode 100644 index 0000000..877d430 --- /dev/null +++ b/tools/my-plugin/src/generators/my-step/files/src/index.ts.template @@ -0,0 +1 @@ +const variable = "<%= name %>"; \ No newline at end of file diff --git a/tools/my-plugin/src/generators/my-step/generator.spec.ts b/tools/my-plugin/src/generators/my-step/generator.spec.ts new file mode 100644 index 0000000..c398745 --- /dev/null +++ b/tools/my-plugin/src/generators/my-step/generator.spec.ts @@ -0,0 +1,20 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; + +import { myStepGenerator } from './generator'; +import { MyStepGeneratorSchema } from './schema'; + +describe('my-step generator', () => { + let tree: Tree; + const options: MyStepGeneratorSchema = { name: 'test' }; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should run successfully', async () => { + await myStepGenerator(tree, options); + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); +}); diff --git a/tools/my-plugin/src/generators/my-step/generator.ts b/tools/my-plugin/src/generators/my-step/generator.ts new file mode 100644 index 0000000..5b142b1 --- /dev/null +++ b/tools/my-plugin/src/generators/my-step/generator.ts @@ -0,0 +1,20 @@ +import { Tree } from '@nx/devkit'; +import { dasherize } from '@nx/devkit/src/utils/string-utils'; +import { wrapAngularDevkitSchematic } from 'nx/src/adapter/ngcli-adapter'; +import { MyStepGeneratorSchema } from './schema'; + +export async function myStepGenerator( + tree: Tree, + options: MyStepGeneratorSchema +) { + const componentSchematic = wrapAngularDevkitSchematic( + '@schematics/angular', + 'component' + ); + await componentSchematic(tree, { + name: dasherize(options.name), + project: options.project, + }); +} + +export default myStepGenerator; diff --git a/tools/my-plugin/src/generators/my-step/schema.d.ts b/tools/my-plugin/src/generators/my-step/schema.d.ts new file mode 100644 index 0000000..a7bde10 --- /dev/null +++ b/tools/my-plugin/src/generators/my-step/schema.d.ts @@ -0,0 +1,4 @@ +export interface MyStepGeneratorSchema { + name: string; + project: string; +} diff --git a/tools/my-plugin/src/generators/my-step/schema.json b/tools/my-plugin/src/generators/my-step/schema.json new file mode 100644 index 0000000..5cd2bc6 --- /dev/null +++ b/tools/my-plugin/src/generators/my-step/schema.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json-schema.org/schema", + "$id": "MyStep", + "title": "", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What name would you like to use?" + }, + "project": { + "type": "string", + "description": "Target project" + } + }, + "required": ["name"] +} From 2f49f6fa6c2ea0b7812f98cfb76eb5e05bd9a96b Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 08:43:21 -0400 Subject: [PATCH 09/18] Lab #10 --- .../src/generators/my-step/generator.ts | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/tools/my-plugin/src/generators/my-step/generator.ts b/tools/my-plugin/src/generators/my-step/generator.ts index 5b142b1..fbe8e4e 100644 --- a/tools/my-plugin/src/generators/my-step/generator.ts +++ b/tools/my-plugin/src/generators/my-step/generator.ts @@ -1,6 +1,8 @@ -import { Tree } from '@nx/devkit'; -import { dasherize } from '@nx/devkit/src/utils/string-utils'; +import { applyChangesToString, ChangeType, joinPathFragments, readProjectConfiguration, Tree } from '@nx/devkit'; +import { classify, dasherize } from '@nx/devkit/src/utils/string-utils'; import { wrapAngularDevkitSchematic } from 'nx/src/adapter/ngcli-adapter'; +import { Identifier, isIdentifier, isVariableStatement } from 'typescript'; +import { getSourceFile } from '../utils/get-source-file'; import { MyStepGeneratorSchema } from './schema'; export async function myStepGenerator( @@ -15,6 +17,24 @@ export async function myStepGenerator( name: dasherize(options.name), project: options.project, }); + + const projectDir = readProjectConfiguration(tree, options.project).root; + const workflowFileName = joinPathFragments(projectDir, 'src', 'app', 'app.workflow.ts'); + const sourceFile = getSourceFile(tree, workflowFileName); + + const stepsDeclaration = sourceFile.statements + .filter(isVariableStatement) + .map(s => s.declarationList.declarations[0]) + .filter(d => isIdentifier(d.name)) + .find(d => (d.name as Identifier).escapedText === 'loginSteps'); + + const stepToAdd = `"${classify(options.name)}",`; + const newContents = applyChangesToString(sourceFile.text, [{ + type: ChangeType.Insert, + index: stepsDeclaration.end - 1, + text: stepToAdd + }]); + tree.write(workflowFileName, newContents); } export default myStepGenerator; From 0b31755620c4d8c0917641ea0d8040e572c3883b Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 09:12:11 -0400 Subject: [PATCH 10/18] Lab #11 --- .../generators/my-generator/generator.spec.ts | 5 +++++ .../src/generators/my-step/generator.spec.ts | 20 ------------------- 2 files changed, 5 insertions(+), 20 deletions(-) delete mode 100644 tools/my-plugin/src/generators/my-step/generator.spec.ts diff --git a/tools/my-plugin/src/generators/my-generator/generator.spec.ts b/tools/my-plugin/src/generators/my-generator/generator.spec.ts index 1989922..30e6824 100644 --- a/tools/my-plugin/src/generators/my-generator/generator.spec.ts +++ b/tools/my-plugin/src/generators/my-generator/generator.spec.ts @@ -17,4 +17,9 @@ describe('my-generator generator', () => { const config = readProjectConfiguration(tree, 'test'); expect(config).toBeDefined(); }); + + it('should create workflow file', async () => { + await myGeneratorGenerator(tree, options); + expect(tree.exists('test/src/app/app.workflow.ts')).toBeTruthy(); + }); }); diff --git a/tools/my-plugin/src/generators/my-step/generator.spec.ts b/tools/my-plugin/src/generators/my-step/generator.spec.ts deleted file mode 100644 index c398745..0000000 --- a/tools/my-plugin/src/generators/my-step/generator.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { Tree, readProjectConfiguration } from '@nx/devkit'; - -import { myStepGenerator } from './generator'; -import { MyStepGeneratorSchema } from './schema'; - -describe('my-step generator', () => { - let tree: Tree; - const options: MyStepGeneratorSchema = { name: 'test' }; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); - }); - - it('should run successfully', async () => { - await myStepGenerator(tree, options); - const config = readProjectConfiguration(tree, 'test'); - expect(config).toBeDefined(); - }); -}); From 6ed8a702215bedb106de4f3ffd6b5c97d5ed6832 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 13:43:43 -0400 Subject: [PATCH 11/18] Lab #13 --- apps/my-workspace/project.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/my-workspace/project.json b/apps/my-workspace/project.json index db49611..168e603 100644 --- a/apps/my-workspace/project.json +++ b/apps/my-workspace/project.json @@ -6,6 +6,9 @@ "sourceRoot": "apps/my-workspace/src", "tags": [], "targets": { + "echo": { + "command": "echo 'hello world'" + }, "build": { "executor": "@angular-devkit/build-angular:application", "outputs": ["{options.outputPath}"], From 25fa4823a8ce9de2e6c4512f9640f1af3438fe38 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 13:49:34 -0400 Subject: [PATCH 12/18] Lab #14 --- tools/my-plugin/eslint.config.js | 8 +++++++- tools/my-plugin/executors.json | 9 +++++++++ tools/my-plugin/package.json | 3 ++- .../src/executors/echo/executor.spec.ts | 18 ++++++++++++++++++ tools/my-plugin/src/executors/echo/executor.ts | 11 +++++++++++ tools/my-plugin/src/executors/echo/schema.d.ts | 1 + tools/my-plugin/src/executors/echo/schema.json | 9 +++++++++ 7 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 tools/my-plugin/executors.json create mode 100644 tools/my-plugin/src/executors/echo/executor.spec.ts create mode 100644 tools/my-plugin/src/executors/echo/executor.ts create mode 100644 tools/my-plugin/src/executors/echo/schema.d.ts create mode 100644 tools/my-plugin/src/executors/echo/schema.json diff --git a/tools/my-plugin/eslint.config.js b/tools/my-plugin/eslint.config.js index 9327f3f..3214ee8 100644 --- a/tools/my-plugin/eslint.config.js +++ b/tools/my-plugin/eslint.config.js @@ -17,7 +17,13 @@ module.exports = [ }, }, { - files: ['**/package.json', '**/package.json', '**/generators.json'], + files: [ + '**/package.json', + '**/generators.json', + '**/package.json', + '**/generators.json', + '**/executors.json', + ], rules: { '@nx/nx-plugin-checks': 'error', }, diff --git a/tools/my-plugin/executors.json b/tools/my-plugin/executors.json new file mode 100644 index 0000000..ca10686 --- /dev/null +++ b/tools/my-plugin/executors.json @@ -0,0 +1,9 @@ +{ + "executors": { + "echo": { + "implementation": "./src/executors/echo/executor", + "schema": "./src/executors/echo/schema.json", + "description": "echo executor" + } + } +} diff --git a/tools/my-plugin/package.json b/tools/my-plugin/package.json index e6877b0..6944c93 100644 --- a/tools/my-plugin/package.json +++ b/tools/my-plugin/package.json @@ -9,5 +9,6 @@ "main": "./src/index.js", "typings": "./src/index.d.ts", "private": true, - "generators": "./generators.json" + "generators": "./generators.json", + "executors": "./executors.json" } diff --git a/tools/my-plugin/src/executors/echo/executor.spec.ts b/tools/my-plugin/src/executors/echo/executor.spec.ts new file mode 100644 index 0000000..f2d18b8 --- /dev/null +++ b/tools/my-plugin/src/executors/echo/executor.spec.ts @@ -0,0 +1,18 @@ +import { ExecutorContext } from '@nx/devkit'; + +import { EchoExecutorSchema } from './schema'; +import executor from './executor'; + +const options: EchoExecutorSchema = {}; +const context: ExecutorContext = { + root: '', + cwd: process.cwd(), + isVerbose: false, +}; + +describe('Echo Executor', () => { + it('can run', async () => { + const output = await executor(options, context); + expect(output.success).toBe(true); + }); +}); diff --git a/tools/my-plugin/src/executors/echo/executor.ts b/tools/my-plugin/src/executors/echo/executor.ts new file mode 100644 index 0000000..15ef7dc --- /dev/null +++ b/tools/my-plugin/src/executors/echo/executor.ts @@ -0,0 +1,11 @@ +import { PromiseExecutor } from '@nx/devkit'; +import { EchoExecutorSchema } from './schema'; + +const runExecutor: PromiseExecutor = async (options) => { + console.log('Executor ran for Echo', options); + return { + success: true, + }; +}; + +export default runExecutor; diff --git a/tools/my-plugin/src/executors/echo/schema.d.ts b/tools/my-plugin/src/executors/echo/schema.d.ts new file mode 100644 index 0000000..b845654 --- /dev/null +++ b/tools/my-plugin/src/executors/echo/schema.d.ts @@ -0,0 +1 @@ +export interface EchoExecutorSchema {} // eslint-disable-line diff --git a/tools/my-plugin/src/executors/echo/schema.json b/tools/my-plugin/src/executors/echo/schema.json new file mode 100644 index 0000000..7f53ae3 --- /dev/null +++ b/tools/my-plugin/src/executors/echo/schema.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json-schema.org/schema", + "version": 2, + "title": "Echo executor", + "description": "", + "type": "object", + "properties": {}, + "required": [] +} From 0acb22af95e4b02dd152b53e28a362bd085b9219 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 15:14:44 -0400 Subject: [PATCH 13/18] Lab #15 --- tools/my-plugin/src/executors/echo/executor.ts | 2 +- tools/my-plugin/src/executors/echo/schema.d.ts | 4 +++- tools/my-plugin/src/executors/echo/schema.json | 11 ++++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tools/my-plugin/src/executors/echo/executor.ts b/tools/my-plugin/src/executors/echo/executor.ts index 15ef7dc..68609d8 100644 --- a/tools/my-plugin/src/executors/echo/executor.ts +++ b/tools/my-plugin/src/executors/echo/executor.ts @@ -2,7 +2,7 @@ import { PromiseExecutor } from '@nx/devkit'; import { EchoExecutorSchema } from './schema'; const runExecutor: PromiseExecutor = async (options) => { - console.log('Executor ran for Echo', options); + console.log(options.value); return { success: true, }; diff --git a/tools/my-plugin/src/executors/echo/schema.d.ts b/tools/my-plugin/src/executors/echo/schema.d.ts index b845654..b134ed9 100644 --- a/tools/my-plugin/src/executors/echo/schema.d.ts +++ b/tools/my-plugin/src/executors/echo/schema.d.ts @@ -1 +1,3 @@ -export interface EchoExecutorSchema {} // eslint-disable-line +export interface EchoExecutorSchema { + value: string; +} diff --git a/tools/my-plugin/src/executors/echo/schema.json b/tools/my-plugin/src/executors/echo/schema.json index 7f53ae3..056c434 100644 --- a/tools/my-plugin/src/executors/echo/schema.json +++ b/tools/my-plugin/src/executors/echo/schema.json @@ -4,6 +4,15 @@ "title": "Echo executor", "description": "", "type": "object", - "properties": {}, + "properties": { + "value": { + "type": "string", + "description": "The value to echo.", + "$default": { + "$source": "argv", + "index": 0 + } + } + }, "required": [] } From 5ff85ed1787bfbf82e33ebab2cead4dff1995000 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Sun, 6 Oct 2024 15:14:47 -0400 Subject: [PATCH 14/18] Lab #16 --- apps/my-workspace/project.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/my-workspace/project.json b/apps/my-workspace/project.json index 168e603..978198f 100644 --- a/apps/my-workspace/project.json +++ b/apps/my-workspace/project.json @@ -7,7 +7,8 @@ "tags": [], "targets": { "echo": { - "command": "echo 'hello world'" + "executor": "@my-workspace/my-plugin:echo", + "options": {} }, "build": { "executor": "@angular-devkit/build-angular:application", From ff115388e561851851bbe03e1c7602b55262bc58 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Mon, 7 Oct 2024 04:54:31 -0400 Subject: [PATCH 15/18] Lab #17 --- tools/my-plugin/src/executors/echo/executor.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tools/my-plugin/src/executors/echo/executor.ts b/tools/my-plugin/src/executors/echo/executor.ts index 68609d8..addef44 100644 --- a/tools/my-plugin/src/executors/echo/executor.ts +++ b/tools/my-plugin/src/executors/echo/executor.ts @@ -1,8 +1,19 @@ -import { PromiseExecutor } from '@nx/devkit'; +import { PromiseExecutor, runExecutor as run } from '@nx/devkit'; import { EchoExecutorSchema } from './schema'; -const runExecutor: PromiseExecutor = async (options) => { +const runExecutor: PromiseExecutor = async (options, context) => { console.log(options.value); + + const result = await run({ + target: 'build', + project: context.projectName, + configuration: 'production' + }, {}, context); + + for await (const res of result) { + if (!res.success) return res; + } + return { success: true, }; From 632070f5cc6bbb5216a6a89a0c4cfa9ccd246d38 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Mon, 7 Oct 2024 05:05:08 -0400 Subject: [PATCH 16/18] Lab #18 --- tools/my-plugin/src/executors/echo/executor.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/my-plugin/src/executors/echo/executor.ts b/tools/my-plugin/src/executors/echo/executor.ts index addef44..97da5b8 100644 --- a/tools/my-plugin/src/executors/echo/executor.ts +++ b/tools/my-plugin/src/executors/echo/executor.ts @@ -1,5 +1,8 @@ -import { PromiseExecutor, runExecutor as run } from '@nx/devkit'; +import { joinPathFragments, PromiseExecutor, runExecutor as run } from '@nx/devkit'; import { EchoExecutorSchema } from './schema'; +import { promisify } from 'util'; +import { exec } from 'child_process'; +import { writeFile } from 'fs/promises'; const runExecutor: PromiseExecutor = async (options, context) => { console.log(options.value); @@ -14,6 +17,12 @@ const runExecutor: PromiseExecutor = async (options, context if (!res.success) return res; } + const execPromise = promisify(exec); + const execResult = await execPromise('git rev-parse HEAD'); + + const path = joinPathFragments(context.root, 'dist', 'apps', context.projectName, 'browser', 'hash.txt'); + await writeFile(path, execResult.stdout); + return { success: true, }; From 59317e21ed3278d6440f98966f6b7d9e651a34a1 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Mon, 7 Oct 2024 05:40:16 -0400 Subject: [PATCH 17/18] Lab #19 --- apps/my-workspace/project.json | 13 ++++++++++++- tools/my-plugin/src/executors/echo/executor.ts | 10 ++++++---- tools/my-plugin/src/executors/echo/schema.d.ts | 1 + tools/my-plugin/src/executors/echo/schema.json | 5 +++++ 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/apps/my-workspace/project.json b/apps/my-workspace/project.json index 978198f..74b0312 100644 --- a/apps/my-workspace/project.json +++ b/apps/my-workspace/project.json @@ -8,7 +8,18 @@ "targets": { "echo": { "executor": "@my-workspace/my-plugin:echo", - "options": {} + "options": { + "value": "Hello from options" + }, + "configurations": { + "dev": { + "value": "Hello from dev" + }, + "ci": { + "createGitHash": true + } + }, + "defaultConfiguration": "dev" }, "build": { "executor": "@angular-devkit/build-angular:application", diff --git a/tools/my-plugin/src/executors/echo/executor.ts b/tools/my-plugin/src/executors/echo/executor.ts index 97da5b8..276646e 100644 --- a/tools/my-plugin/src/executors/echo/executor.ts +++ b/tools/my-plugin/src/executors/echo/executor.ts @@ -17,11 +17,13 @@ const runExecutor: PromiseExecutor = async (options, context if (!res.success) return res; } - const execPromise = promisify(exec); - const execResult = await execPromise('git rev-parse HEAD'); + if (options.createGitHash) { + const execPromise = promisify(exec); + const execResult = await execPromise('git rev-parse HEAD'); - const path = joinPathFragments(context.root, 'dist', 'apps', context.projectName, 'browser', 'hash.txt'); - await writeFile(path, execResult.stdout); + const path = joinPathFragments(context.root, 'dist', 'apps', context.projectName, 'browser', 'hash.txt'); + await writeFile(path, execResult.stdout); + } return { success: true, diff --git a/tools/my-plugin/src/executors/echo/schema.d.ts b/tools/my-plugin/src/executors/echo/schema.d.ts index b134ed9..4b911aa 100644 --- a/tools/my-plugin/src/executors/echo/schema.d.ts +++ b/tools/my-plugin/src/executors/echo/schema.d.ts @@ -1,3 +1,4 @@ export interface EchoExecutorSchema { value: string; + createGitHash: boolean; } diff --git a/tools/my-plugin/src/executors/echo/schema.json b/tools/my-plugin/src/executors/echo/schema.json index 056c434..4ae8956 100644 --- a/tools/my-plugin/src/executors/echo/schema.json +++ b/tools/my-plugin/src/executors/echo/schema.json @@ -12,6 +12,11 @@ "$source": "argv", "index": 0 } + }, + "createGitHash": { + "type": "boolean", + "description": "Create a git hash.", + "default": false } }, "required": [] From 660624c3d6d2256229adc8e63f998aade38673f4 Mon Sep 17 00:00:00 2001 From: Christian Liebel Date: Mon, 7 Oct 2024 06:04:18 -0400 Subject: [PATCH 18/18] Lab #20 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b9c063f..4ddf8f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,3 +27,4 @@ jobs: - run: npm ci --legacy-peer-deps - uses: nrwl/nx-set-shas@v4 + - run: npx nx echo my-workspace --configuration=ci