From c7a25867d6343288f29c87955b3108c39037ff79 Mon Sep 17 00:00:00 2001 From: Kilian Panot Date: Fri, 29 Mar 2024 16:05:50 +0900 Subject: [PATCH] fix(ama-sdk): support of URL as spec-path input --- .yarnrc.yml | 1 - packages/@ama-sdk/create/src/index.ts | 7 +- packages/@ama-sdk/schematics/README.md | 59 +++-- .../code-generator/code-generator.ts | 8 +- .../schematics/typescript/core/index.spec.ts | 22 ++ .../schematics/typescript/core/index.ts | 72 ++++-- .../templates/base/openapitools.json.template | 2 +- .../schematics/testing/MOCK_swagger.json | 209 ++++++++++++++++++ yarn.lock | 168 +++++++++++++- 9 files changed, 501 insertions(+), 47 deletions(-) create mode 100644 packages/@ama-sdk/schematics/testing/MOCK_swagger.json diff --git a/.yarnrc.yml b/.yarnrc.yml index bef24c8025..90bd70dbac 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -59,6 +59,5 @@ packageExtensions: probot@*: dependencies: body-parser: ^1.20.2 - bottleneck: ^2.19.5 yarnPath: .yarn/releases/yarn-4.1.1.cjs diff --git a/packages/@ama-sdk/create/src/index.ts b/packages/@ama-sdk/create/src/index.ts index 57d328420a..4b3c276ec5 100644 --- a/packages/@ama-sdk/create/src/index.ts +++ b/packages/@ama-sdk/create/src/index.ts @@ -2,8 +2,7 @@ /* eslint-disable no-console */ import { execSync, spawnSync } from 'node:child_process'; -import * as url from 'node:url'; -import { dirname, join, relative, resolve } from 'node:path'; +import { dirname, join, parse, relative, resolve } from 'node:path'; import * as minimist from 'minimist'; const packageManagerEnv = process.env.npm_config_user_agent?.split('/')[0]; @@ -74,7 +73,7 @@ const schematicArgs = [ const resolveTargetDirectory = resolve(process.cwd(), targetDirectory); const run = () => { - const isSpecPathUrl = url.URL.canParse(argv['spec-path']); + const isSpecRelativePath = !!argv['spec-path'] && !parse(argv['spec-path']).root; const runner = process.platform === 'win32' ? `${packageManager}.cmd` : packageManager; const steps: { args: string[]; cwd?: string; runner?: string }[] = [ @@ -89,7 +88,7 @@ const run = () => { binPath, `${schematicsPackage}:typescript-core`, ...schematicArgs, - '--spec-path', isSpecPathUrl ? argv['spec-path'] : relative(resolveTargetDirectory, resolve(process.cwd(), argv['spec-path'])) + '--spec-path', isSpecRelativePath ? relative(resolveTargetDirectory, resolve(process.cwd(), argv['spec-path'])) : argv['spec-path'] ], cwd: resolveTargetDirectory }] : []) diff --git a/packages/@ama-sdk/schematics/README.md b/packages/@ama-sdk/schematics/README.md index c5d3dfa3c4..9a5c7b93e1 100644 --- a/packages/@ama-sdk/schematics/README.md +++ b/packages/@ama-sdk/schematics/README.md @@ -64,27 +64,53 @@ npx -p @angular/cli ng add @ama-sdk/core ### How to use? -The typescript generator provides 2 generators: +The typescript generator provides 3 generators: - **shell**: To generate the "shell" of an SDK package -- **core**: To (re)generate the SDK based on a specified Swagger spec +- **core**: To (re)generate the SDK based on a specified OpenApi specification - **create**: To create a new SDK from scratch (i.e. chain **shell** and **core**) -To generate the `shell` you can run: +You can generate the `shell` in an existing monorepo with the command: ```shell -yarn schematics @ama-sdk/schematics:typescript-shell +#Monorepo with Otter: +yarn ng g sdk sdkName + +# Monorepo without Otter; +yarn schematics @o3r/workspace:sdk sdkName +``` + +or from scratch, with the NPM initializer: + +```shell +npm create @ama-sdk typescript ``` -If you use `Yarn2+`, you can use the following `scripts` in `package.json`: +The generated package comes with the following script in the package.json: -```json - "resolve": "node -e 'process.stdout.write(require.resolve(process.argv[1]));'", - "generate": "yarn schematics @ama-sdk/schematics:typescript-core --spec-path ./swagger-spec.yaml", - "upgrade:repository": "yarn schematics @ama-sdk/schematics:typescript-shell", +```json5 +{ + // ... + "generate": "yarn schematics @ama-sdk/schematics:typescript-core --spec-path ./openapi-spec.yaml", + "upgrade:repository": "yarn schematics @ama-sdk/schematics:typescript-shell" +} ``` -Use `generate` to (re)generate your SDK based on the content of `./swagger-spec.yaml` (make sure you have this file at the root of your project) and `upgrade:repository` to regenerate the structure of your project. +> [!NOTE] +> Use `generate` to (re)generate your SDK based on the content of `./openapi-spec.yaml` (make sure you have this file at the root of your project) and `upgrade:repository` to regenerate the structure of your project. + +> [!TIP] +> The `--spec-path` parameter supports YAML and JSON file formats based on the file system path or remote URL. + +If you use `Yarn2+` with PnP, you can modify the following `scripts` in `package.json` to generate the SDK based on specifications in a dependency package: + +```json5 +{ + // ... + "resolve": "node -e 'process.stdout.write(require.resolve(process.argv[1]));'", + "generate": "yarn schematics @ama-sdk/schematics:typescript-core --spec-path $(yarn resolve @my/dep/spec-file.yaml)", +} +``` #### Light SDK @@ -130,14 +156,15 @@ yarn schematics @ama-sdk/schematics:typescript-core --spec-path ./swagger-spec.y It is possible to configure the SDK code generation by passing parameters to the generator command line to override the default configuration values. The available parameters are: + - `--spec-path`: Path to the swagger specification used to generate the SDK - `--spec-config-path`: Path to the spec generation configuration - `--global-property`: Comma separated string of options to give to the openapi-generator-cli - `--output-path`: Output path for the generated SDK - `--generator-custom-path`: Path to a custom generator -Also, another parameter is available called OpenAPI Normalizer which transforms the input OpenAPI specification (which may not perfectly conform) to make it workable -with OpenAPI Generator. There are several rules that are supported which can be found [here](https://openapi-generator.tech/docs/customization/#openapi-normalizer). +Also, another parameter is available called OpenAPI Normalizer which transforms the input OpenAPI specification (which may not perfectly conform) to make it workable +with OpenAPI Generator. There are several rules that are supported which can be found [here](https://openapi-generator.tech/docs/customization/#openapi-normalizer). This parameter can be passed with `--openapi-normalizer` followed by the rules to be enabled in OpenAPI normalizer in the form of `RULE_1=true,RULE_2=original`. @@ -157,7 +184,7 @@ There is also a possibility to configure the SDK code generation in `openapitool "example-sdk": { // any name you like (can be referenced using --generator-key) "generatorName": "typescriptFetch", "output": ".", - "inputSpec": "./swagger-spec.yaml" + "inputSpec": "./swagger-spec.yaml" // supports YAML and JSON formats, based on the file system path or remote URL } } } @@ -174,7 +201,7 @@ The properties `generatorName`, `output`, and `inputSpec` are required and addit [here](https://github.com/OpenAPITools/openapi-generator-cli/blob/master/apps/generator-cli/src/config.schema.json)). For example, we can add the previously described global properties `stringifyDate` and `allowModelExtension`: -```json +```json5 { "$schema": "https://raw.githubusercontent.com/OpenAPITools/openapi-generator-cli/master/apps/generator-cli/src/config.schema.json", "generator-cli": { @@ -184,7 +211,7 @@ described global properties `stringifyDate` and `allowModelExtension`: "example-sdk": { "generatorName": "typescriptFetch", "output": ".", - "inputSpec": "./swagger-spec.yaml", + "inputSpec": "./openapi-spec.yaml", // or "./openapi-spec.json" according to the specification format "globalProperty": { "stringifyDate": true, "allowModelExtension": true @@ -228,7 +255,7 @@ You can use global property options to pass one or both of the following options Example: ```shell -yarn schematics @ama-sdk/schematics:typescript-core --spec-path ./swagger-spec.yaml --global-property debugModels,debugOperations +yarn schematics @ama-sdk/schematics:typescript-core --spec-path ./openapi-spec.yaml --global-property debugModels,debugOperations ``` You can also use npx instead of yarn in the command. diff --git a/packages/@ama-sdk/schematics/schematics/code-generator/code-generator.ts b/packages/@ama-sdk/schematics/schematics/code-generator/code-generator.ts index 334520be3e..9980ab01cd 100644 --- a/packages/@ama-sdk/schematics/schematics/code-generator/code-generator.ts +++ b/packages/@ama-sdk/schematics/schematics/code-generator/code-generator.ts @@ -27,11 +27,11 @@ export type CodegenTaskOptions = { * As is, the CodeGenerator does not implement any actual code generation and needs to be extended to be functional * @see {@link OpenApiCliGenerator} */ -export class CodeGenerator { +export abstract class CodeGenerator { /** * Refers to the name the {@link Task} will be identified in a {@link Rule} ${@link SchematicContext} */ - protected generatorName = ''; + protected abstract generatorName: string; /** * Configure the code generation task @@ -73,9 +73,7 @@ export class CodeGenerator { /** * Returns the generator specific default options */ - protected getDefaultOptions(): T { - throw new Error('No implementation, please target an implementation'); - } + protected abstract getDefaultOptions(): T; /** * Returns the schematic that will run the code generator diff --git a/packages/@ama-sdk/schematics/schematics/typescript/core/index.spec.ts b/packages/@ama-sdk/schematics/schematics/typescript/core/index.spec.ts index d0fdcef16c..7628e47ee9 100644 --- a/packages/@ama-sdk/schematics/schematics/typescript/core/index.spec.ts +++ b/packages/@ama-sdk/schematics/schematics/typescript/core/index.spec.ts @@ -27,6 +27,28 @@ describe('Typescript Core Generator', () => { expect(tree.readContent('/readme.md')).toContain('Based on OpenAPI spec 1.0.0'); }); + it('should update openapitools file with yaml', async () => { + const runner = new SchematicTestRunner('@ama-sdk/schematics', collectionPath); + const tree = await runner.runSchematic('typescript-core', { + specPath: path.join(__dirname, '..', '..', '..', 'testing', 'MOCK_swagger.yaml') + }, baseTree); + const content: any = tree.readJson('/openapitools.json'); + + expect(content['generator-cli'].generators['test-sdk-sdk'].inputSpec.endsWith('openapi.yaml')).toBe(true); + expect(tree.exists('/openapi.yaml')).toBe(true); + }); + + it('should update openapitools file with json', async () => { + const runner = new SchematicTestRunner('@ama-sdk/schematics', collectionPath); + const tree = await runner.runSchematic('typescript-core', { + specPath: path.join(__dirname, '..', '..', '..', 'testing', 'MOCK_swagger.json') + }, baseTree); + const content: any = tree.readJson('/openapitools.json'); + + expect(content['generator-cli'].generators['test-sdk-sdk'].inputSpec.endsWith('openapi.json')).toBe(true); + expect(tree.exists('/openapi.json')).toBe(true); + }); + it('should clean previous install', async () => { baseTree.create('/src/api/my-apy/test.ts', 'fake module'); const runner = new SchematicTestRunner('@ama-sdk/schematics', collectionPath); diff --git a/packages/@ama-sdk/schematics/schematics/typescript/core/index.ts b/packages/@ama-sdk/schematics/schematics/typescript/core/index.ts index 2eef899ffe..b98c9afba9 100644 --- a/packages/@ama-sdk/schematics/schematics/typescript/core/index.ts +++ b/packages/@ama-sdk/schematics/schematics/typescript/core/index.ts @@ -12,8 +12,9 @@ import { url } from '@angular-devkit/schematics'; import type { Operation, PathObject } from '@ama-sdk/core'; -import { readFileSync } from 'node:fs'; +import { existsSync, readFileSync } from 'node:fs'; import * as path from 'node:path'; +import { URL } from 'node:url'; import * as semver from 'semver'; import * as sway from 'sway'; @@ -24,6 +25,7 @@ import { OpenApiCliGenerator } from '../../code-generator/open-api-cli-generator const JAVA_OPTIONS = ['specPath', 'specConfigPath', 'globalProperty', 'outputPath']; const OPEN_API_TOOLS_OPTIONS = ['generatorName', 'output', 'inputSpec', 'config', 'globalProperty']; +const LOCAL_SPEC_FILENAME = 'openapi'; interface OpenApiToolsGenerator { /** Location of the OpenAPI spec, as URL or file */ @@ -166,14 +168,41 @@ const getGeneratorOptions = (tree: Tree, context: SchematicContext, options: NgG */ function ngGenerateTypescriptSDKFn(options: NgGenerateTypescriptSDKCoreSchematicsSchema): Rule { - return (tree, context) => { + return async (tree, context) => { const targetPath = options.directory || ''; const generatorOptions = getGeneratorOptions(tree, context, options); + let isJson = false; + let specDefaultPath = path.posix.join(targetPath, `${LOCAL_SPEC_FILENAME}.json`); + specDefaultPath = existsSync(specDefaultPath) ? specDefaultPath : path.posix.join(targetPath, `${LOCAL_SPEC_FILENAME}.yaml`); + generatorOptions.specPath ||= specDefaultPath; + + let specContent!: string; + if (URL.canParse(generatorOptions.specPath) && (new URL(generatorOptions.specPath)).protocol.startsWith('http')) { + specContent = await (await fetch(generatorOptions.specPath)).text(); + } else { + specContent = readFileSync(generatorOptions.specPath, {encoding: 'utf-8'}).toString(); + } + + try { + JSON.parse(specContent); + isJson = true; + } catch (e) { + isJson = false; + } + const defaultFileName = `${LOCAL_SPEC_FILENAME}.${isJson ? 'json' : 'yaml'}`; + specDefaultPath = path.posix.join(targetPath, defaultFileName); + generatorOptions.specPath = specDefaultPath; + + if (tree.exists(specDefaultPath)) { + tree.overwrite(specDefaultPath, specContent); + } else { + tree.create(specDefaultPath, specContent); + } /** * rule to clear previous SDK generation */ - const clearGeneratedCode = () => { + const clearGeneratedCode: Rule = () => { treeGlob(tree, path.posix.join(targetPath, 'src', 'api', '**', '*.ts')).forEach((file) => tree.delete(file)); treeGlob(tree, path.posix.join(targetPath, 'src', 'models', 'base', '**', '!(index).ts')).forEach((file) => tree.delete(file)); treeGlob(tree, path.posix.join(targetPath, 'src', 'spec', '!(operation-adapter|index).ts')).forEach((file) => tree.delete(file)); @@ -181,9 +210,8 @@ function ngGenerateTypescriptSDKFn(options: NgGenerateTypescriptSDKCoreSchematic }; const generateOperationFinder = async (): Promise => { - const swayOptions = { - definition: path.resolve(generatorOptions.specPath!) - }; + const definition: any = isJson ? tree.readJson(specDefaultPath) : (await import('js-yaml')).load(tree.readText(specDefaultPath)); + const swayOptions = { definition }; const swayApi = await sway.create(swayOptions); const extraction = swayApi.getPaths().map((obj) => ({ path: obj.path, @@ -196,7 +224,7 @@ function ngGenerateTypescriptSDKFn(options: NgGenerateTypescriptSDKCoreSchematic /** * rule to update readme and generate mandatory code source */ - const generateSource = async () => { + const generateSource: Rule = async () => { const pathObjects = await generateOperationFinder(); const swayOperationAdapter = `[${pathObjects.map((pathObj) => getPathObjectTemplate(pathObj)).join(',')}]`; @@ -212,30 +240,35 @@ function ngGenerateTypescriptSDKFn(options: NgGenerateTypescriptSDKCoreSchematic }; /** - * Update local swagger spec file + * Update readme version */ - const updateSpec = () => { + const updateSpecVersion: Rule = () => { const readmeFile = path.posix.join(targetPath, 'readme.md'); - const specContent = readFileSync(generatorOptions.specPath!).toString(); if (tree.exists(readmeFile)) { const specVersion = /version: *([0-9]+\.[0-9]+\.[0-9]+(?:-[^ ]+)?)/.exec(specContent); if (specVersion) { const readmeContent = tree.read(readmeFile)!.toString('utf8'); - tree.overwrite(readmeFile, readmeContent.replace(/Based on (OpenAPI|Swagger) spec .*/i, `Based on $1 spec ${specVersion[1]}`)); + tree.overwrite(readmeFile, readmeContent.replace(/Based on (.+) spec .*/i, `Based on $1 spec ${specVersion[1]}`)); } } + return tree; + }; - if (tree.exists(path.posix.join(targetPath, 'swagger-spec.yaml'))) { - tree.overwrite(path.posix.join(targetPath, 'swagger-spec.yaml'), specContent); - } else { - tree.create(path.posix.join(targetPath, 'swagger-spec.yaml'), specContent); + const adaptDefaultFile: Rule = () => { + const openApiToolsPath = path.posix.join(targetPath, 'openapitools.json'); + if (tree.exists(openApiToolsPath)) { + const openApiTools: any = tree.readJson(openApiToolsPath); + Object.keys(openApiTools['generator-cli']?.generators) + .filter((key) => !openApiTools['generator-cli'].generators[key].inputSpec) + .forEach((key) => openApiTools['generator-cli'].generators[key].inputSpec = `./${defaultFileName}`); + tree.overwrite(openApiToolsPath, JSON.stringify(openApiTools, null, 2)); } - return () => tree; + return tree; }; - const runGeneratorRule = () => { - return () => (new OpenApiCliGenerator(options)).getGeneratorRunSchematic( + const runGeneratorRule: Rule = () => { + return (new OpenApiCliGenerator(options)).getGeneratorRunSchematic( (options.generatorKey && JAVA_OPTIONS.every((optionName) => options[optionName] === undefined)) ? { generatorKey: options.generatorKey, @@ -249,7 +282,8 @@ function ngGenerateTypescriptSDKFn(options: NgGenerateTypescriptSDKCoreSchematic return chain([ clearGeneratedCode, generateSource, - updateSpec, + updateSpecVersion, + adaptDefaultFile, runGeneratorRule ]); }; diff --git a/packages/@ama-sdk/schematics/schematics/typescript/shell/templates/base/openapitools.json.template b/packages/@ama-sdk/schematics/schematics/typescript/shell/templates/base/openapitools.json.template index 4ea672f898..5ea87905b0 100644 --- a/packages/@ama-sdk/schematics/schematics/typescript/shell/templates/base/openapitools.json.template +++ b/packages/@ama-sdk/schematics/schematics/typescript/shell/templates/base/openapitools.json.template @@ -8,7 +8,7 @@ "<%=projectName%>-<%=projectPackageName%>": { "generatorName": "typescriptFetch", "output": ".", - "inputSpec": "./swagger-spec.yaml" + "inputSpec": "" } } } diff --git a/packages/@ama-sdk/schematics/testing/MOCK_swagger.json b/packages/@ama-sdk/schematics/testing/MOCK_swagger.json new file mode 100644 index 0000000000..17440f68ab --- /dev/null +++ b/packages/@ama-sdk/schematics/testing/MOCK_swagger.json @@ -0,0 +1,209 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "Swagger Petstore", + "license": { + "name": "MIT" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v1", + "schemes": [ + "http" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/pets": { + "get": { + "summary": "List all pets", + "operationId": "listPets", + "tags": [ + "pets" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "description": "How many items to return at one time (max 100)", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "A paged array of pets", + "headers": { + "x-next": { + "type": "string", + "description": "A link to the next page of responses" + } + }, + "schema": { + "$ref": "#/definitions/Pets" + } + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + }, + "post": { + "summary": "Create a pet", + "operationId": "createPets", + "tags": [ + "pets" + ], + "responses": { + "200": { + "description": "The created pet", + "schema": { + "$ref": "#/definitions/Pet" + } + }, + "204": { + "description": "Null response" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + }, + "put": { + "summary": "Invalid verb", + "operationId": "createPetsIncorrectly", + "tags": [ + "pets" + ], + "responses": { + "404": { + "description": "error", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + } + }, + "/pets/{petId}": { + "get": { + "summary": "Info for a specific pet", + "operationId": "showPetById", + "tags": [ + "pets" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "required": true, + "description": "The id of the pet to retrieve", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Expected response to a valid request", + "schema": { + "$ref": "#/definitions/Pets" + } + }, + "201": { + "description": "Expected response to a valid request", + "schema": { + "$ref": "#/definitions/Pets" + } + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + }, + "delete": { + "summary": "delete a specific pet", + "operationId": "deletePetById", + "tags": [ + "pets" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "required": true, + "description": "The id of the pet to retrieve", + "type": "string" + } + ], + "responses": { + "204": { + "description": "Null response" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + } + } + }, + "definitions": { + "Pet": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "Pets": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + }, + "Error": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + } +} diff --git a/yarn.lock b/yarn.lock index 9c34b04ebf..329c28ba75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5911,6 +5911,18 @@ __metadata: languageName: node linkType: hard +"@nrwl/tao@npm:18.2.4": + version: 18.2.4 + resolution: "@nrwl/tao@npm:18.2.4" + dependencies: + nx: "npm:18.2.4" + tslib: "npm:^2.3.0" + bin: + tao: index.js + checksum: 10/f376cca29d0cfd302f70b339414e93c0a72833b66d6660ecf23eb646cfe55f33b83cc977f56a700209084a432c710693e46c1f04cdbd018624271617477766b8 + languageName: node + linkType: hard + "@nrwl/web@npm:18.2.3": version: 18.2.3 resolution: "@nrwl/web@npm:18.2.3" @@ -6131,6 +6143,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-darwin-arm64@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-darwin-arm64@npm:18.2.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@nx/nx-darwin-x64@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-darwin-x64@npm:18.2.3" @@ -6138,6 +6157,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-darwin-x64@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-darwin-x64@npm:18.2.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@nx/nx-freebsd-x64@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-freebsd-x64@npm:18.2.3" @@ -6145,6 +6171,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-freebsd-x64@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-freebsd-x64@npm:18.2.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@nx/nx-linux-arm-gnueabihf@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-linux-arm-gnueabihf@npm:18.2.3" @@ -6152,6 +6185,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-linux-arm-gnueabihf@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-linux-arm-gnueabihf@npm:18.2.4" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@nx/nx-linux-arm64-gnu@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-linux-arm64-gnu@npm:18.2.3" @@ -6159,6 +6199,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-linux-arm64-gnu@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-linux-arm64-gnu@npm:18.2.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@nx/nx-linux-arm64-musl@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-linux-arm64-musl@npm:18.2.3" @@ -6166,6 +6213,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-linux-arm64-musl@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-linux-arm64-musl@npm:18.2.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@nx/nx-linux-x64-gnu@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-linux-x64-gnu@npm:18.2.3" @@ -6173,6 +6227,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-linux-x64-gnu@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-linux-x64-gnu@npm:18.2.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@nx/nx-linux-x64-musl@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-linux-x64-musl@npm:18.2.3" @@ -6180,6 +6241,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-linux-x64-musl@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-linux-x64-musl@npm:18.2.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@nx/nx-win32-arm64-msvc@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-win32-arm64-msvc@npm:18.2.3" @@ -6187,6 +6255,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-win32-arm64-msvc@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-win32-arm64-msvc@npm:18.2.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@nx/nx-win32-x64-msvc@npm:18.2.3": version: 18.2.3 resolution: "@nx/nx-win32-x64-msvc@npm:18.2.3" @@ -6194,6 +6269,13 @@ __metadata: languageName: node linkType: hard +"@nx/nx-win32-x64-msvc@npm:18.2.4": + version: 18.2.4 + resolution: "@nx/nx-win32-x64-msvc@npm:18.2.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@nx/web@npm:18.2.3": version: 18.2.3 resolution: "@nx/web@npm:18.2.3" @@ -24451,7 +24533,7 @@ __metadata: languageName: node linkType: hard -"nx@npm:18.2.3, nx@npm:~18.2.0": +"nx@npm:18.2.3": version: 18.2.3 resolution: "nx@npm:18.2.3" dependencies: @@ -24535,6 +24617,90 @@ __metadata: languageName: node linkType: hard +"nx@npm:18.2.4, nx@npm:~18.2.0": + version: 18.2.4 + resolution: "nx@npm:18.2.4" + dependencies: + "@nrwl/tao": "npm:18.2.4" + "@nx/nx-darwin-arm64": "npm:18.2.4" + "@nx/nx-darwin-x64": "npm:18.2.4" + "@nx/nx-freebsd-x64": "npm:18.2.4" + "@nx/nx-linux-arm-gnueabihf": "npm:18.2.4" + "@nx/nx-linux-arm64-gnu": "npm:18.2.4" + "@nx/nx-linux-arm64-musl": "npm:18.2.4" + "@nx/nx-linux-x64-gnu": "npm:18.2.4" + "@nx/nx-linux-x64-musl": "npm:18.2.4" + "@nx/nx-win32-arm64-msvc": "npm:18.2.4" + "@nx/nx-win32-x64-msvc": "npm:18.2.4" + "@yarnpkg/lockfile": "npm:^1.1.0" + "@yarnpkg/parsers": "npm:3.0.0-rc.46" + "@zkochan/js-yaml": "npm:0.0.6" + axios: "npm:^1.6.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:3.1.0" + cli-spinners: "npm:2.6.1" + cliui: "npm:^8.0.1" + dotenv: "npm:~16.3.1" + dotenv-expand: "npm:~10.0.0" + enquirer: "npm:~2.3.6" + figures: "npm:3.2.0" + flat: "npm:^5.0.2" + fs-extra: "npm:^11.1.0" + ignore: "npm:^5.0.4" + jest-diff: "npm:^29.4.1" + js-yaml: "npm:4.1.0" + jsonc-parser: "npm:3.2.0" + lines-and-columns: "npm:~2.0.3" + minimatch: "npm:9.0.3" + node-machine-id: "npm:1.1.12" + npm-run-path: "npm:^4.0.1" + open: "npm:^8.4.0" + ora: "npm:5.3.0" + semver: "npm:^7.5.3" + string-width: "npm:^4.2.3" + strong-log-transformer: "npm:^2.1.0" + tar-stream: "npm:~2.2.0" + tmp: "npm:~0.2.1" + tsconfig-paths: "npm:^4.1.2" + tslib: "npm:^2.3.0" + yargs: "npm:^17.6.2" + yargs-parser: "npm:21.1.1" + peerDependencies: + "@swc-node/register": ^1.8.0 + "@swc/core": ^1.3.85 + dependenciesMeta: + "@nx/nx-darwin-arm64": + optional: true + "@nx/nx-darwin-x64": + optional: true + "@nx/nx-freebsd-x64": + optional: true + "@nx/nx-linux-arm-gnueabihf": + optional: true + "@nx/nx-linux-arm64-gnu": + optional: true + "@nx/nx-linux-arm64-musl": + optional: true + "@nx/nx-linux-x64-gnu": + optional: true + "@nx/nx-linux-x64-musl": + optional: true + "@nx/nx-win32-arm64-msvc": + optional: true + "@nx/nx-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc-node/register": + optional: true + "@swc/core": + optional: true + bin: + nx: bin/nx.js + nx-cloud: bin/nx-cloud.js + checksum: 10/20a95b02b165d08d61870b6e1a05e54d989d74c576ad002b16bfaaf13f058ef899971279ce81b07d92fe1a6923584867b444592f36030de92de85202462c9868 + languageName: node + linkType: hard + "nypm@npm:^0.3.8": version: 0.3.8 resolution: "nypm@npm:0.3.8"