diff --git a/.gitignore b/.gitignore index 50bfd9a4..73d77179 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,8 @@ testing/ **/testing*/ packages/cli samples/todo - - -.nx/cache \ No newline at end of file + + +.nx/cache + +dist/ \ No newline at end of file diff --git a/package.json b/package.json index 2c720254..7ff06809 100644 --- a/package.json +++ b/package.json @@ -21,33 +21,36 @@ "@swc/helpers": "~0.5.2", "fs-extra": "^11.2.0", "lodash": "^4.17.21", - "prettier": "^2.7.1", + "passport-jwt": "^4.0.1", + "prettier": "^2.8.8", "triple-beam": "^1.4.1", - "tslib": "^2.3.0", - "typescript": "^4.8.3" + "tslib": "^2.6.2", + "type-fest": "^4.10.2", + "typescript": "^5.3.3" }, "devDependencies": { "@commitlint/cli": "^17.1.2", "@commitlint/config-conventional": "^17.1.0", - "@nestjs/common": "^9.1.2", - "@nestjs/core": "^9.1.2", - "@nestjs/testing": "^9.1.2", + "@nestjs/common": "^10.3.3", + "@nestjs/core": "^10.3.3", + "@nestjs/testing": "^10.3.3", "@nx/jest": "17.2.8", "@nx/js": "17.2.8", + "@nx/nest": "^17.2.8", "@swc-node/register": "~1.6.7", "@swc/cli": "~0.1.62", "@swc/core": "~1.3.85", "@types/jest": "^29.4.0", - "@types/js-yaml": "^4.0.5", - "@types/lodash": "^4.14.185", - "@types/node": "18.16.9", + "@types/js-yaml": "^4.0.9", + "@types/lodash": "^4.14.202", + "@types/node": "20.11.19", "@types/nodemailer": "^6.4.6", "@types/pluralize": "^0.0.33", - "@types/prettier": "^2.7.1", - "@typescript-eslint/eslint-plugin": "^5.38.0", + "@types/prettier": "^2.7.3", + "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.38.0", "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", + "class-validator": "^0.14.1", "commitizen": "^4.2.4", "cz-conventional-changelog": "3.3.0", "eslint": "^8.24.0", @@ -59,11 +62,11 @@ "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", "lerna": "^5.5.2", - "nx": "17.2.6", + "nx": "~17.2.8", "reflect-metadata": "^0.1.13", "rxjs": "^7.5.7", - "ts-jest": "^29.1.0", - "ts-node": "10.9.1", + "ts-jest": "^29.1.2", + "ts-node": "10.9.2", "typeorm": "^0.3.10", "zx": "^7.0.8" }, diff --git a/packages/schematics/.eslintignore b/packages/schematics/.eslintignore index 98f28ec8..2e81010b 100644 --- a/packages/schematics/.eslintignore +++ b/packages/schematics/.eslintignore @@ -1,4 +1,6 @@ src/lib/**/files/**/* **/src/lib/**/files/**/* +src/generators/**/files/**/* +**/src/generators/**/files/**/* *.d.ts **/*.d.ts diff --git a/packages/schematics/.eslintrc.json b/packages/schematics/.eslintrc.json new file mode 100644 index 00000000..a226e814 --- /dev/null +++ b/packages/schematics/.eslintrc.json @@ -0,0 +1,32 @@ +{ + "extends": ["../../.eslintrc.js"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": "error" + } + }, + { + "files": ["./package.json", "./generators.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/nx-plugin-checks": "error" + } + } + ] +} diff --git a/packages/schematics/.gitignore b/packages/schematics/.gitignore index 931bbae8..48039653 100644 --- a/packages/schematics/.gitignore +++ b/packages/schematics/.gitignore @@ -6,6 +6,7 @@ src/**/*.js !src/**/.eslintrc.js src/**/*.js.map src/**/*.d.ts +!src/generators/**/schema.d.ts # IDEs .idea/ diff --git a/packages/schematics/generators.json b/packages/schematics/generators.json new file mode 100644 index 00000000..ff5fa9b4 --- /dev/null +++ b/packages/schematics/generators.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/schema", + "name": "@devon4ts_node/schematics", + "version": "6.0.0", + "generators": { + "typeorm": { + "description": "Initialice typeorm into your current project in a correct way.", + "factory": "./src/generators/init-typeorm/generator", + "schema": "./src/generators/init-typeorm/schema.json" + }, + "entity": { + "description": "Add a TypeOrm entity to your project", + "factory": "./src/generators/entity/generator", + "schema": "./src/generators/entity/schema.json" + }, + "convict": { + "description": "Initialize convict to manage the configuration into the project.", + "factory": "./src/generators/convict/generator", + "schema": "./src/generators/convict/schema.json" + }, + "mailer": { + "description": "Add @devon4ts_node/mailer module to project.", + "factory": "./src/generators/mailer/generator", + "schema": "./src/generators/mailer/schema.json" + }, + "swagger": { + "description": "Add swagger module to project.", + "factory": "./src/generators/swagger/generator", + "schema": "./src/generators/swagger/schema.json" + }, + "auth-jwt": { + "description": "Add the auth JWT module to the project.", + "factory": "./src/generators/auth-jwt/generator", + "schema": "./src/generators/auth-jwt/schema.json" + }, + "security": { + "description": "Add cors and helmet to your project.", + "factory": "./src/generators/security/generator", + "schema": "./src/generators/security/schema.json" + }, + "application": { + "description": "Generates a basic NestJS application using Devonfw Architecture", + "factory": "./src/generators/application/generator", + "schema": "./src/generators/application/schema.json" + } + } +} diff --git a/packages/schematics/jest.config.ts b/packages/schematics/jest.config.ts new file mode 100644 index 00000000..937668fd --- /dev/null +++ b/packages/schematics/jest.config.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +export default { + displayName: 'schematics', + preset: '../../jest.preset.js', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/packages/schematics', +}; diff --git a/packages/schematics/package.json b/packages/schematics/package.json index aa9567ee..1d79760e 100644 --- a/packages/schematics/package.json +++ b/packages/schematics/package.json @@ -24,32 +24,14 @@ "license": "Apache-2.0", "schematics": "./src/collection.json", "dependencies": { - "@angular-devkit/core": "^14.0.2", - "@angular-devkit/schematics": "^14.0.2", - "@nestjs/schematics": "^9.0.0", - "@schematics/angular": "^14.0.2", - "js-yaml": "^4.1.0", + "@nx/devkit": "17.2.8", + "@nx/nest": "17.2.8", + "@nestjs/schematics": "^10.1.1", "lodash": "^4.17.21", "pluralize": "^8.0.0", - "prettier": "^2.7.1", - "ts-morph": "^15.1.0", - "typescript": "^4.7.4" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "roots": [ - "src" - ], - "testRegex": "_spec.ts$", - "transform": { - "^.+\\.ts$": "ts-jest" - }, - "coverageDirectory": "./coverage", - "testEnvironment": "node" + "prettier": "^3.2.5", + "ts-morph": "^21.0.1", + "typescript": "^5.3.3" }, "gitHead": "1f351bcc0fbad70f9c25fa73a398a538ca0c8e55" -} \ No newline at end of file +} diff --git a/packages/schematics/project.json b/packages/schematics/project.json new file mode 100644 index 00000000..d9af640a --- /dev/null +++ b/packages/schematics/project.json @@ -0,0 +1,52 @@ +{ + "name": "schematics", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/schematics/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/schematics", + "main": "packages/schematics/src/index.ts", + "tsConfig": "packages/schematics/tsconfig.lib.json", + "assets": [ + "packages/schematics/*.md", + { + "input": "./packages/schematics/src", + "glob": "**/!(*.ts)", + "output": "./src" + }, + { + "input": "./packages/schematics/src", + "glob": "**/*.d.ts", + "output": "./src" + }, + { + "input": "./packages/schematics", + "glob": "generators.json", + "output": "." + }, + { + "input": "./packages/schematics", + "glob": "executors.json", + "output": "." + } + ] + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"] + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/schematics/jest.config.ts" + } + } + }, + "tags": [] +} diff --git a/packages/schematics/src/collection.json b/packages/schematics/src/collection.json index edf9dfab..5406e7de 100644 --- a/packages/schematics/src/collection.json +++ b/packages/schematics/src/collection.json @@ -1,96 +1,44 @@ { - "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json", - "extends": "@nestjs/schematics", - "schematics": { - "application": { - "description": "Create a devon4ts_node application.", - "factory": "./lib/devon4ts_node-application/devon4ts_node-application.factory#devon4ts_nodeApplication", - "schema": "./lib/devon4ts_node-application/schema.json" - }, + "generators": { "typeorm": { "description": "Initialice typeorm into your current project in a correct way.", - "factory": "./lib/init-typeorm/init-typeorm.factory#initTypeorm", - "schema": "./lib/init-typeorm/schema.json" + "factory": "./generators/init-typeorm/generator", + "schema": "./generators/init-typeorm/schema.json" }, "entity": { "description": "Add a TypeOrm entity to your project", - "factory": "./lib/entity/entity.factory#main", - "schema": "./lib/entity/schema.json" + "factory": "./generators/entity/generator", + "schema": "./generators/entity/schema.json" }, "convict": { - "description": "Initialize convict to manage the configuration into the project.", - "factory": "./lib/convict/convict.factory#initConvict", - "schema": "./lib/convict/schema.json" + "description": "Initialize convict to manage the configuration into the project.", + "factory": "./generators/convict/generator", + "schema": "./generators/convict/schema.json" }, "mailer": { "description": "Add @devon4ts_node/mailer module to project.", - "factory": "./lib/mailer/mailer.factory#mailer", - "schema": "./lib/mailer/schema.json" + "factory": "./generators/mailer/generator", + "schema": "./generators/mailer/schema.json" }, "swagger": { "description": "Add swagger module to project.", - "factory": "./lib/swagger/swagger.factory#swagger", - "schema": "./lib/swagger/schema.json" + "factory": "./generators/swagger/generator", + "schema": "./generators/swagger/schema.json" }, "auth-jwt": { "description": "Add the auth JWT module to the project.", - "factory": "./lib/auth-jwt/auth.factory#authJWT", - "schema": "./lib/auth-jwt/schema.json" + "factory": "./generators/auth-jwt/generator", + "schema": "./generators/auth-jwt/schema.json" }, "security": { "description": "Add cors and helmet to your project.", - "factory": "./lib/security/security.factory#security", - "schema": "./lib/security/schema.json" - }, - "repository": { - "factory": "./lib/repository/repository.factory#main", - "description": "Create a TypeORM custom repository.", - "schema": "./lib/repository/schema.json" - }, - "controller": { - "factory": "./lib/controller/controller.factory#main", - "description": "Create a Nest controller.", - "schema": "./lib/controller/schema.json" - }, - "module": { - "factory": "./lib/module/module.factory#main", - "description": "Create a Nest module.", - "schema": "./lib/module/schema.json" - }, - "service": { - "factory": "./lib/service/service.factory#main", - "description": "Create a Nest service.", - "schema": "./lib/service/schema.json" + "factory": "./generators/security/generator", + "schema": "./generators/security/schema.json" }, - "filter": { - "factory": "./lib/filter/filter.factory#main", - "description": "Create a Nest filter.", - "schema": "./lib/filter/schema.json" - }, - "guard": { - "factory": "./lib/guard/guard.factory#main", - "description": "Create a Nest guard.", - "schema": "./lib/guard/schema.json" - }, - "interceptor": { - "factory": "./lib/interceptor/interceptor.factory#main", - "description": "Create a Nest interceptor.", - "schema": "./lib/interceptor/schema.json" - }, - "middleware": { - "factory": "./lib/middleware/middleware.factory#main", - "description": "Create a Nest middleware.", - "schema": "./lib/middleware/schema.json" - }, - "pipe": { - "factory": "./lib/pipe/pipe.factory#main", - "description": "Create a Nest pipe.", - "schema": "./lib/pipe/schema.json" - }, - "resource": { - "factory": "./lib/resource/resource.factory#main", - "description": "Create a Nest resource.", - "schema": "./lib/resource/schema.json" + "application": { + "factory": "./src/generators/application/generator", + "schema": "./src/generators/application/schema.json", + "description": "Generates a basic NestJS application using Devonfw Architecture" } } -} \ No newline at end of file +} diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/.eslintrc.js b/packages/schematics/src/generators/application/files/.eslintrc.js.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/.eslintrc.js rename to packages/schematics/src/generators/application/files/.eslintrc.js.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/.husky/.gitignore b/packages/schematics/src/generators/application/files/.husky/.gitignore.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/.husky/.gitignore rename to packages/schematics/src/generators/application/files/.husky/.gitignore.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/.husky/pre-commit b/packages/schematics/src/generators/application/files/.husky/pre-commit.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/.husky/pre-commit rename to packages/schematics/src/generators/application/files/.husky/pre-commit.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/.prettierrc b/packages/schematics/src/generators/application/files/.prettierrc.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/.prettierrc rename to packages/schematics/src/generators/application/files/.prettierrc.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/.vscode/extensions.json b/packages/schematics/src/generators/application/files/.vscode/extensions.json.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/.vscode/extensions.json rename to packages/schematics/src/generators/application/files/.vscode/extensions.json.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/.vscode/settings.json b/packages/schematics/src/generators/application/files/.vscode/settings.json.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/.vscode/settings.json rename to packages/schematics/src/generators/application/files/.vscode/settings.json.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/src/app/core/core.module.ts b/packages/schematics/src/generators/application/files/src/app/core/core.module.ts.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/src/app/core/core.module.ts rename to packages/schematics/src/generators/application/files/src/app/core/core.module.ts.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/src/app/shared/exceptions/entity-not-found.exception.ts b/packages/schematics/src/generators/application/files/src/app/shared/exceptions/entity-not-found.exception.ts.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/src/app/shared/exceptions/entity-not-found.exception.ts rename to packages/schematics/src/generators/application/files/src/app/shared/exceptions/entity-not-found.exception.ts.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/src/app/shared/filters/entity-not-found.filter.ts b/packages/schematics/src/generators/application/files/src/app/shared/filters/entity-not-found.filter.ts.template similarity index 100% rename from packages/schematics/src/lib/devon4ts_node-application/files/src/app/shared/filters/entity-not-found.filter.ts rename to packages/schematics/src/generators/application/files/src/app/shared/filters/entity-not-found.filter.ts.template diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/src/app/shared/logger/winston.logger.ts b/packages/schematics/src/generators/application/files/src/app/shared/logger/winston.logger.ts.template similarity index 95% rename from packages/schematics/src/lib/devon4ts_node-application/files/src/app/shared/logger/winston.logger.ts rename to packages/schematics/src/generators/application/files/src/app/shared/logger/winston.logger.ts.template index 077312f8..2c85207f 100644 --- a/packages/schematics/src/lib/devon4ts_node-application/files/src/app/shared/logger/winston.logger.ts +++ b/packages/schematics/src/generators/application/files/src/app/shared/logger/winston.logger.ts.template @@ -1,4 +1,3 @@ -/* istanbul ignore file */ import { Inject, Injectable, LoggerService, Scope } from '@nestjs/common'; import { INQUIRER } from '@nestjs/core'; import * as winston from 'winston'; diff --git a/packages/schematics/src/generators/application/generator.spec.ts b/packages/schematics/src/generators/application/generator.spec.ts new file mode 100644 index 00000000..60d0a30f --- /dev/null +++ b/packages/schematics/src/generators/application/generator.spec.ts @@ -0,0 +1,79 @@ +import { Tree, readJson, readProjectConfiguration } from '@nx/devkit'; +import { ApplicationGeneratorSchema } from './schema'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import applicationGenerator from './generator'; + +describe('application generator', () => { + let tree: Tree; + const options: ApplicationGeneratorSchema = { projectName: 'test' }; + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + }, 60000); + + it('should run successfully', async () => { + const config = readProjectConfiguration(tree, options.projectName); + expect(config).toBeDefined(); + }); + + it('should generate main.ts and other application specific files', async () => { + expect(tree.exists(`apps/${options.projectName}/src/main.ts`)).toBeTruthy(); + expect(tree.exists(`apps/${options.projectName}/src/app/app.module.ts`)).toBeTruthy(); + expect(tree.exists(`apps/${options.projectName}/src/app/app.controller.ts`)).toBeTruthy(); + expect(tree.exists(`apps/${options.projectName}/src/app/app.service.ts`)).toBeTruthy(); + expect(tree.exists(`apps/${options.projectName}/src/app/app.controller.spec.ts`)).toBeTruthy(); + expect(tree.exists(`apps/${options.projectName}/src/app/app.service.spec.ts`)).toBeTruthy(); + }); + + it('should add dependencies to package.json', async () => { + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"devDependencies": {(.|\n)*"husky":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"winston":/g); + }); + + it('should delete .eslintrc.json and create .eslintrc.js', async () => { + expect(tree.exists(`./apps/${options.projectName}/.eslintrc.json`)).toBeFalsy(); + expect(tree.exists(`./apps/${options.projectName}/.eslintrc.js`)).toBeTruthy(); + }); + + it('should update tsconfig.json', async () => { + expect(tree.exists(`./apps/${options.projectName}/tsconfig.json`)).toBeTruthy(); + const fileContent = readJson(tree, `./apps/${options.projectName}/tsconfig.json`); + expect(fileContent.compilerOptions).toEqual({ + strictNullChecks: true, + noImplicitAny: true, + strictBindCallApply: true, + forceConsistentCasingInFileNames: true, + noFallthroughCasesInSwitch: true, + strict: true, + skipDefaultLibCheck: true, + noUnusedLocals: true, + noUnusedParameters: true, + skipLibCheck: true, + allowSyntheticDefaultImports: true, + }); + }); + + it('should generate core module and shared files', async () => { + expect(tree.exists(`./apps/${options.projectName}/.prettierrc`)).toBeTruthy(); + expect(tree.exists(`./apps/${options.projectName}/src/app/core/core.module.ts`)).toBeTruthy(); + expect( + tree.exists(`./apps/${options.projectName}/src/app/shared/exceptions/entity-not-found.exception.ts`), + ).toBeTruthy(); + expect(tree.exists(`./apps/${options.projectName}/src/app/shared/filters/entity-not-found.filter.ts`)).toBeTruthy(); + expect(tree.exists(`./apps/${options.projectName}/src/app/shared/logger/winston.logger.ts`)).toBeTruthy(); + }); + + it('should update main.ts', async () => { + const fileContent = tree.read(`./apps/${options.projectName}/src/main.ts`)?.toString('utf-8'); + expect(fileContent).toContain('WinstonLogger'); + expect(fileContent).toContain('app.useLogger(logger);'); + expect(fileContent).toContain('app.useGlobalFilters(new EntityNotFoundFilter(logger));'); + }); + + it('should add core module declaration to app module', async () => { + const fileContent = tree.read(`./apps/${options.projectName}/src/app/app.module.ts`)?.toString('utf-8'); + expect(fileContent).toContain('CoreModule'); + }); +}); diff --git a/packages/schematics/src/generators/application/generator.ts b/packages/schematics/src/generators/application/generator.ts new file mode 100644 index 00000000..45797841 --- /dev/null +++ b/packages/schematics/src/generators/application/generator.ts @@ -0,0 +1,166 @@ +import { + addDependenciesToPackageJson, + formatFiles, + generateFiles, + installPackagesTask, + Tree, + updateJson, +} from '@nx/devkit'; +import * as path from 'path'; +import { ApplicationGeneratorSchema } from './schema'; +import { ASTFileBuilder } from '../../utils/ast-file-builder'; +import { stdout } from 'process'; +import { packagesVersion } from '../packagesVersion'; +import { applicationGenerator as nestApplicationGenerator } from '@nx/nest'; +import { stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; + +export async function applicationGenerator(tree: Tree, options: ApplicationGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + const projectRoot = `apps/${options.projectName}`; + if (tree.exists(projectRoot)) { + throw new Error(`Application with name "${options.projectName}" already exists`); + } + try { + await nestApplicationGenerator(tree, { + name: options.projectName, + directory: `apps/`, + }); + } catch (error) { + throw new Error(`An error ocurred while trying to create the app.`); + } + if (tree.exists(path.join(projectRoot, '.eslintrc.json'))) { + tree.delete(path.join(projectRoot, '.eslintrc.json')); + } + addDependenciesToPackageJson( + tree, + { + [packagesVersion['express'].name]: packagesVersion['express'].version, + [packagesVersion['typeFest'].name]: packagesVersion['typeFest'].version, + [packagesVersion['winston'].name]: packagesVersion['winston'].version, + [packagesVersion['classTransformer'].name]: packagesVersion['classTransformer'].version, + [packagesVersion['classValidator'].name]: packagesVersion['classValidator'].version, + }, + { + [packagesVersion['husky'].name]: packagesVersion['husky'].version, + [packagesVersion['prettyQuick'].name]: packagesVersion['prettyQuick'].version, + [packagesVersion['typesExpress'].name]: packagesVersion['typesExpress'].version, + [packagesVersion['eslintPluginPrettier'].name]: packagesVersion['eslintPluginPrettier'].version, + }, + ); + updatePackageJson(tree, options.projectName); + updateTsconfigJson(tree, projectRoot); + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options); + updateMain(tree, projectRoot); + addDeclarationToModule(tree, projectRoot); + await formatFiles(tree); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + stdout.write(`NestJS app generated successfully!`); + }; +} + +export default applicationGenerator; + +function updatePackageJson(tree: Tree, projectName: string): void { + // Update scripts from package.json at root directory + if (tree.exists('package.json')) { + updateJson(tree, 'package.json', pkgJson => { + // if scripts is undefined, set it to an empty object + pkgJson.scripts = pkgJson.scripts ?? {}; + pkgJson.scripts.lint = 'eslint {apps,packages}/{src,apps,libs,test}/**/*.ts --fix'; + pkgJson.scripts.prepare = 'husky'; + // if jest is undefined, set it to an empty object + pkgJson.jest = pkgJson.jest ?? {}; + pkgJson.jest.coverageDirectory = `./apps/${projectName}/coverage`; + // return modified JSON object + return pkgJson; + }); + } else { + stdout.write('File named package.json at root directory was not found. Skipping task.'); + } +} +function updateTsconfigJson(tree: Tree, projectRoot: string): void { + // Update compilerOptions from tsconfig.json at application directory + if (tree.exists(`${projectRoot}/tsconfig.json`)) { + updateJson(tree, `${projectRoot}/tsconfig.json`, tsconfigJson => { + tsconfigJson.compilerOptions = { + strictNullChecks: true, + noImplicitAny: true, + strictBindCallApply: true, + forceConsistentCasingInFileNames: true, + noFallthroughCasesInSwitch: true, + strict: true, + skipDefaultLibCheck: true, + noUnusedLocals: true, + noUnusedParameters: true, + skipLibCheck: true, + allowSyntheticDefaultImports: true, + }; + return tsconfigJson; + }); + } else { + stdout.write(`File at ${projectRoot}/tsconfig.json was not found. Skipping task.`); + } +} + +function updateMain(tree: Tree, projectRoot: string): void { + const mainPath = path.join(projectRoot, 'src/main.ts'); + if (!tree.exists(mainPath)) { + return; + } + + let mainContent = tree.read(mainPath)!.toString('utf-8'); + mainContent = mainContent.replace( + 'NestFactory.create(AppModule)', + `NestFactory.create(AppModule, { bufferLogs: true }); + + const logger = await app.resolve(WinstonLogger); + app.useLogger(logger); + + `, + ); + mainContent = new ASTFileBuilder(mainContent) + .insertLinesToFunctionBefore( + 'bootstrap', + 'app.listen', + `app.useGlobalPipes( + new ValidationPipe({ + transform: true, + transformOptions: { + excludeExtraneousValues: true, + }, + }), + ); + app.useGlobalFilters(new EntityNotFoundFilter(logger));`, + ) + .insertLinesToFunctionBefore( + 'bootstrap', + 'app.listen', + `app.enableVersioning({ + type: VersioningType.URI, + defaultVersion: '1', + });`, + ) + .addImports('WinstonLogger', './app/shared/logger/winston.logger') + .addImports('ValidationPipe', '@nestjs/common') + .addImports('VersioningType', '@nestjs/common') + .addImports('EntityNotFoundFilter', './app/shared/filters/entity-not-found.filter') + .addReturnTypeToFunction('bootstrap', 'Promise') + .build(); + tree.write(mainPath, mainContent); +} + +function addDeclarationToModule(tree: Tree, projectRoot: string): void { + const appModulePath = path.join(projectRoot, 'src/app/app.module.ts'); + if (!tree.exists(appModulePath)) { + return; + } + + const fileContent = new ASTFileBuilder(tree.read(appModulePath)!.toString('utf-8')) + .addImports('CoreModule', './core/core.module') + .addToModuleDecorator('AppModule', 'CoreModule', 'imports'); + + if (fileContent) { + tree.write(appModulePath, fileContent.build()); + } +} diff --git a/packages/schematics/src/generators/application/schema.d.ts b/packages/schematics/src/generators/application/schema.d.ts new file mode 100644 index 00000000..ed3d0c7b --- /dev/null +++ b/packages/schematics/src/generators/application/schema.d.ts @@ -0,0 +1,3 @@ +export interface ApplicationGeneratorSchema { + projectName: string; +} diff --git a/packages/schematics/src/generators/application/schema.json b/packages/schematics/src/generators/application/schema.json new file mode 100644 index 00000000..2e9fa109 --- /dev/null +++ b/packages/schematics/src/generators/application/schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/schema", + "$id": "Application", + "title": "", + "type": "object", + "properties": { + "projectName": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What name would you like to use for the application?" + } + }, + "required": ["projectName"] +} diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/auth.module.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/auth.module.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/auth.module.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/auth.module.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/controllers/auth.controller.spec.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/controllers/auth.controller.spec.ts.template similarity index 85% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/controllers/auth.controller.spec.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/controllers/auth.controller.spec.ts.template index dcf4dad1..abbbf3de 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/controllers/auth.controller.spec.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/controllers/auth.controller.spec.ts.template @@ -1,5 +1,5 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { AuthServiceMock } from '../../../../../test/auth/auth.service.mock'; +import { AuthServiceMock } from '../../../test/auth/auth.service.mock'; import { AuthService } from '../services/auth.service'; import { AuthController } from './auth.controller'; import { PassportModule } from '@nestjs/passport'; @@ -39,14 +39,17 @@ describe('Auth Controller', () => { }; const mockResponse: any = { // eslint-disable-next-line @typescript-eslint/no-unused-vars - status: jest.fn().mockImplementation(_x => sendMock), + status: jest.fn().mockImplementation((_x) => sendMock), setHeader: jest.fn(), }; const value = await controller.login(user, mockResponse); expect(value).toBeUndefined(); - expect(mockResponse.status).toBeCalledWith(200); - expect(sendMock.send).toBeCalledWith(); - expect(mockResponse.setHeader).toBeCalledWith('Authorization', 'Bearer THISISNOTAJWTTOKEN'); + expect(mockResponse.status).toHaveBeenCalledWith(200); + expect(sendMock.send).toHaveBeenCalledWith(); + expect(mockResponse.setHeader).toHaveBeenCalledWith( + 'Authorization', + 'Bearer THISISNOTAJWTTOKEN' + ); }); it('should throw an error when the username or password are not correct', async () => { await expect( @@ -56,8 +59,8 @@ describe('Auth Controller', () => { password: 'user1', }, // response not needed - {} as any, - ), + {} as any + ) ).rejects.toThrow(UnauthorizedException); }); }); @@ -69,7 +72,7 @@ describe('Auth Controller', () => { username: 'user2', password: 'user2', role: 1, - } as any), + } as any) ).resolves.toEqual({ username: 'user2', role: 1 }); }); it('should throw an error when user already exists', async () => { @@ -78,7 +81,7 @@ describe('Auth Controller', () => { username: 'user1', password: 'user1', role: 1, - } as any), + } as any) ).rejects.toThrow(BadRequestException); }); }); diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/controllers/auth.controller.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/controllers/auth.controller.ts.template similarity index 83% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/controllers/auth.controller.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/controllers/auth.controller.ts.template index 1e74ff4d..fa2fec5a 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/controllers/auth.controller.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/controllers/auth.controller.ts.template @@ -1,4 +1,13 @@ -import { BadRequestException, Body, Controller, Get, HttpCode, Post, Response, UseGuards } from '@nestjs/common'; +import { + BadRequestException, + Body, + Controller, + Get, + HttpCode, + Post, + Response, + UseGuards, +} from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { ApiBearerAuth } from '@nestjs/swagger'; import { Response as eResponse } from 'express'; @@ -13,7 +22,10 @@ export class AuthController { constructor(private readonly authService: AuthService) {} @Post('login') @HttpCode(200) - async login(@Body() login: LoginDTO, @Response() res: eResponse): Promise { + async login( + @Body() login: LoginDTO, + @Response() res: eResponse + ): Promise { const token = await this.authService.login(login); res.setHeader('Authorization', 'Bearer ' + token); res.status(200).send(); diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/decorators/get-user.decorator.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/decorators/get-user.decorator.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/decorators/get-user.decorator.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/decorators/get-user.decorator.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.spec.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.spec.ts.template similarity index 73% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.spec.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.spec.ts.template index a62b4c46..1f775ea0 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.spec.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.spec.ts.template @@ -16,9 +16,14 @@ describe('Roles', () => { it('should reflect metadata in the class and methods', () => { const reflector = new Reflector(); - expect(reflector.get('roles', RolesTest)).toStrictEqual([roles.USER, roles.ADMIN]); + expect(reflector.get('roles', RolesTest)).toStrictEqual([ + roles.USER, + roles.ADMIN, + ]); expect(reflector.get('roles', RolesTest)).not.toStrictEqual([roles.USER]); expect(reflector.get('roles', RolesTest)).not.toStrictEqual([roles.ADMIN]); - expect(reflector.get('roles', RolesTest.prototype.oneHandler)).toStrictEqual([roles.ADMIN]); + expect( + reflector.get('roles', RolesTest.prototype.oneHandler) + ).toStrictEqual([roles.ADMIN]); }); }); diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/decorators/roles.decorator.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/guards/roles.guard.spec.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/guards/roles.guard.spec.ts.template similarity index 91% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/guards/roles.guard.spec.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/guards/roles.guard.spec.ts.template index 245c4a2d..9f467015 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/guards/roles.guard.spec.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/guards/roles.guard.spec.ts.template @@ -25,7 +25,7 @@ describe('RolesGuard', () => { let guard: RolesGuard; beforeEach(async () => { const reflector = new Reflector(); - // tslint:disable-next-line: variable-name + //lint:disable-next-line: variable-name jest .spyOn(reflector, 'get') .mockImplementationOnce(() => [roles.USER]) @@ -35,19 +35,25 @@ describe('RolesGuard', () => { guard = new RolesGuard(reflector); }); it('should return true when the role of the user is in the roles array reflected by the handler or class', () => { - const mockExecutionContext: any = generateMockExecutionContext(roles.USER); + const mockExecutionContext: any = generateMockExecutionContext( + roles.USER + ); expect(guard.canActivate(mockExecutionContext as any)).toBe(true); expect(guard.canActivate(mockExecutionContext as any)).toBe(false); expect(guard.canActivate(mockExecutionContext as any)).toBe(true); }); it('should return false when the role of the user is not in the roles array reflected by the handler or class', () => { - const mockExecutionContext: any = generateMockExecutionContext(roles.ADMIN); + const mockExecutionContext: any = generateMockExecutionContext( + roles.ADMIN + ); expect(guard.canActivate(mockExecutionContext as any)).toBe(false); expect(guard.canActivate(mockExecutionContext as any)).toBe(true); expect(guard.canActivate(mockExecutionContext as any)).toBe(true); }); it('should return true if no role metadata is defined', () => { - const mockExecutionContext: any = generateMockExecutionContext(roles.ADMIN); + const mockExecutionContext: any = generateMockExecutionContext( + roles.ADMIN + ); guard.canActivate(mockExecutionContext as any); guard.canActivate(mockExecutionContext as any); guard.canActivate(mockExecutionContext as any); diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/guards/roles.guard.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/guards/roles.guard.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/guards/roles.guard.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/guards/roles.guard.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/model/login.dto.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/model/login.dto.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/model/login.dto.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/model/login.dto.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/model/roles.enum.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/model/roles.enum.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/model/roles.enum.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/model/roles.enum.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/model/user-request.interface.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/model/user-request.interface.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/model/user-request.interface.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/model/user-request.interface.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/services/auth.service.spec.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/services/auth.service.spec.ts.template similarity index 78% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/services/auth.service.spec.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/services/auth.service.spec.ts.template index 0b3dd396..c007af05 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/services/auth.service.spec.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/services/auth.service.spec.ts.template @@ -39,24 +39,34 @@ describe('AuthService', () => { describe('validateUser', () => { it('should validate that the user and return it when the user exists and password match.', async () => { - await expect(authService.validateUser('user1', 'user1')).resolves.toStrictEqual({ + await expect( + authService.validateUser('user1', 'user1') + ).resolves.toStrictEqual({ id: 1, username: 'user1', // password: 'user1', - password: '$2b$12$KgUSTFUTjRqQD7U7tuV9quheR4L.LOAT.GhmTjBIXsgLMhBXjfhYq', + password: + '$2b$12$KgUSTFUTjRqQD7U7tuV9quheR4L.LOAT.GhmTjBIXsgLMhBXjfhYq', role: 0, }); - await expect(authService.validateUser('user2', 'user2')).resolves.toStrictEqual({ + await expect( + authService.validateUser('user2', 'user2') + ).resolves.toStrictEqual({ id: 2, username: 'user2', // password: 'user2', - password: '$2b$12$jDy/bJV0p6mYRlEjZL5t0OX9jinlfEiQDfuApJJGSVW6Ca/hiVbBW', + password: + '$2b$12$jDy/bJV0p6mYRlEjZL5t0OX9jinlfEiQDfuApJJGSVW6Ca/hiVbBW', role: 1, }); }); it('should return undefined when the user does not exists or password does not match.', async () => { - await expect(authService.validateUser('test', 'user1')).resolves.toBeUndefined(); - await expect(authService.validateUser('user1', 'test')).resolves.toBeUndefined(); + await expect( + authService.validateUser('test', 'user1') + ).resolves.toBeUndefined(); + await expect( + authService.validateUser('user1', 'test') + ).resolves.toBeUndefined(); }); }); @@ -75,7 +85,7 @@ describe('AuthService', () => { authService.login({ username: 'user1', password: 'user2', - } as any), + } as any) ).rejects.toThrow(UnauthorizedException); }); }); @@ -99,7 +109,9 @@ describe('AuthService', () => { password: 'user3', }; - await expect(authService.register(newUser)).rejects.toThrow('User already exists'); + await expect(authService.register(newUser)).rejects.toThrow( + 'User already exists' + ); }); }); }); diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/services/auth.service.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/services/auth.service.ts.template similarity index 75% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/services/auth.service.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/services/auth.service.ts.template index 51a8550b..61f9a22a 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/services/auth.service.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/services/auth.service.ts.template @@ -1,7 +1,7 @@ import { Injectable, UnauthorizedException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { compare } from 'bcrypt'; -import { classToPlain, plainToClass } from 'class-transformer'; +import { instanceToPlain, plainToClass } from 'class-transformer'; import { UserService } from '../../user/services/user.service'; import { User } from '../../user/model/entities/user.entity'; import { LoginDTO } from '../model/login.dto'; @@ -9,12 +9,18 @@ import { CreateUserDto } from '../../user/model/dto/create-user.dto'; @Injectable() export class AuthService { - constructor(private readonly usersService: UserService, private readonly jwtService: JwtService) {} + constructor( + private readonly usersService: UserService, + private readonly jwtService: JwtService + ) {} - async validateUser(username: string, pass: string): Promise { + async validateUser( + username: string, + pass: string + ): Promise { const user = await this.usersService.findOne(username); if (user && (await compare(pass, user.password!))) { - return classToPlain(user) as User; + return instanceToPlain(user) as User; } return undefined; } diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.spec.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.spec.ts.template similarity index 76% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.spec.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.spec.ts.template index 6d049794..8f85b408 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.spec.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.spec.ts.template @@ -4,10 +4,14 @@ import { UserPayload } from '../../user/model/dto/user-payload.dto'; describe('JwtStrategy', () => { describe('validate', () => { it('should validate the payload received in the JWT token and should return it', () => { - const jwtStrategy = new JwtStrategy({ jwt: { secret: 'secret', expiration: '60s' } }); + const jwtStrategy = new JwtStrategy({ + jwt: { secret: 'secret', expiration: '60s' }, + }); const inputPayload: UserPayload = { id: 0, username: 'test', role: 0 }; - expect(jwtStrategy.validate(inputPayload)).resolves.toStrictEqual(inputPayload); + expect(jwtStrategy.validate(inputPayload)).resolves.toStrictEqual( + inputPayload + ); expect(jwtStrategy.validate(inputPayload)).resolves.not.toStrictEqual({ id: 1, }); diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.ts.template similarity index 84% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.ts.template index 0ab1eeb0..38f63442 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/auth/strategies/jwt.strategy.ts.template @@ -1,8 +1,10 @@ import { Inject, Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; -<% if (config) { %>import { AppConfig } from '../../../shared/app-config'; -import { CONFIG_PROVIDER } from '../../../shared/dependency-injection.constants';<% } %> +<% if (config) { %> +import { AppConfig } from '../../../shared/app-config'; +import { CONFIG_PROVIDER } from '../../../shared/dependency-injection.constants'; +<% } %> @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/model/dto/create-user.dto.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/model/dto/create-user.dto.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/user/model/dto/create-user.dto.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/user/model/dto/create-user.dto.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/model/dto/user-payload.dto.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/model/dto/user-payload.dto.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/user/model/dto/user-payload.dto.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/user/model/dto/user-payload.dto.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/model/entities/user.entity.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/model/entities/user.entity.ts.template similarity index 80% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/user/model/entities/user.entity.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/user/model/entities/user.entity.ts.template index de8bfeb3..e85abe08 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/model/entities/user.entity.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/model/entities/user.entity.ts.template @@ -1,6 +1,6 @@ import { Exclude } from 'class-transformer'; import { Column, Entity } from 'typeorm'; -import { BaseEntity } from '../../../../shared/model/entities/base.entity'; +import { BaseEntity } from '../../../../../../init-typeorm/files/src/app/shared/model/entities/base.entity'; import { roles } from '../../../auth/model/roles.enum'; @Entity() diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/services/user.service.spec.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/services/user.service.spec.ts.template similarity index 88% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/user/services/user.service.spec.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/user/services/user.service.spec.ts.template index 8935f3c5..2556bc54 100644 --- a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/services/user.service.spec.ts +++ b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/services/user.service.spec.ts.template @@ -34,7 +34,8 @@ describe('UserService', () => { id: 1, username: 'user1', // password: 'user1', - password: '$2b$12$KgUSTFUTjRqQD7U7tuV9quheR4L.LOAT.GhmTjBIXsgLMhBXjfhYq', + password: + '$2b$12$KgUSTFUTjRqQD7U7tuV9quheR4L.LOAT.GhmTjBIXsgLMhBXjfhYq', role: 0, }); }); @@ -52,7 +53,9 @@ describe('UserService', () => { }; const userRegistered = await service.registerUser(userToAdd); - expect(userRegistered).toStrictEqual(plainToClass(User, repository.users[2])); + expect(userRegistered).toStrictEqual( + plainToClass(User, repository.users[2]) + ); }); it('should throw an Error when user already exists', async () => { @@ -60,7 +63,9 @@ describe('UserService', () => { username: 'user3', password: 'user3', }; - await expect(service.registerUser(userToAdd)).rejects.toThrowError('User already exists'); + await expect(service.registerUser(userToAdd)).rejects.toThrow( + 'User already exists' + ); }); }); }); diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/services/user.service.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/services/user.service.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/user/services/user.service.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/user/services/user.service.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/src/app/core/user/user.module.ts b/packages/schematics/src/generators/auth-jwt/files/src/app/core/user/user.module.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/src/app/core/user/user.module.ts rename to packages/schematics/src/generators/auth-jwt/files/src/app/core/user/user.module.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/test/auth/auth.service.mock.ts b/packages/schematics/src/generators/auth-jwt/files/test/auth/auth.service.mock.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/test/auth/auth.service.mock.ts rename to packages/schematics/src/generators/auth-jwt/files/test/auth/auth.service.mock.ts.template diff --git a/packages/schematics/src/lib/auth-jwt/files/test/user/user.repository.mock.ts b/packages/schematics/src/generators/auth-jwt/files/test/user/user.repository.mock.ts.template similarity index 100% rename from packages/schematics/src/lib/auth-jwt/files/test/user/user.repository.mock.ts rename to packages/schematics/src/generators/auth-jwt/files/test/user/user.repository.mock.ts.template diff --git a/packages/schematics/src/generators/auth-jwt/generator.spec.ts b/packages/schematics/src/generators/auth-jwt/generator.spec.ts new file mode 100644 index 00000000..3b22a248 --- /dev/null +++ b/packages/schematics/src/generators/auth-jwt/generator.spec.ts @@ -0,0 +1,127 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; +import { authJwtGenerator } from './generator'; +import { AuthJwtGeneratorSchema } from './schema'; +import applicationGenerator from '../application/generator'; +import convictGenerator from '../convict/generator'; + +describe('auth-jwt generator', () => { + let tree: Tree; + const options: AuthJwtGeneratorSchema = { projectName: 'test' }; + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + jest.clearAllMocks(); + }, 60000); + + it('should run successfully', async () => { + await authJwtGenerator(tree, options); + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); + it('should add dependencies to package.json', async () => { + await authJwtGenerator(tree, options); + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"devDependencies": {(.|\n)*"@types\/passport":/g); + expect(fileContent).toMatch(/"devDependencies": {(.|\n)*"@types\/passport-jwt":/g); + expect(fileContent).toMatch(/"devDependencies": {(.|\n)*"@types\/bcrypt":/g); + expect(fileContent).toMatch(/"devDependencies": {(.|\n)*"@types\/lodash":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"bcrypt":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"passport":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"passport-jwt":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"lodash":/g); + }); + + it('should create test files and core modules', async () => { + await authJwtGenerator(tree, options); + expect(tree.exists(`./apps/${options.projectName}/test/auth/auth.service.mock.ts`)).toBeTruthy(); + expect(tree.exists(`./apps/${options.projectName}/test/user/user.repository.mock.ts`)).toBeTruthy(); + expect(tree.exists(`./apps/${options.projectName}/src/app/core/auth/auth.module.ts`)).toBeTruthy(); + expect(tree.exists(`./apps/${options.projectName}/src/app/core/user/user.module.ts`)).toBeTruthy(); + }); + + it('should add auth and user modules to core module', async () => { + await authJwtGenerator(tree, options); + const fileContent = tree.read(`./apps/${options.projectName}/src/app/core/core.module.ts`)?.toString('utf-8'); + expect(fileContent).toContain('AuthModule'); + expect(fileContent).toContain('UserModule'); + }); + + describe('auth-jwt generator without convict configuration', () => { + beforeAll(async () => { + await authJwtGenerator(tree, options); + jest.clearAllMocks(); + }, 60000); + it('should not have configuration files', async () => { + expect(tree.exists(`./apps/${options.projectName}/config/prod.json`)).toBeFalsy(); + expect(tree.exists(`./apps/${options.projectName}/config/develop.json`)).toBeFalsy(); + }); + + it('should not have convict files', async () => { + expect(tree.exists(`./apps/${options.projectName}/src/config.ts`)).toBeFalsy(); + expect(tree.exists(`./apps/${options.projectName}/src/app/shared/app-config.ts`)).toBeFalsy(); + }); + + it('should not include config imports', async () => { + const fileContent = tree + .read(`./apps/${options.projectName}/src/app/core/auth/auth.module.ts`) + ?.toString('utf-8'); + expect(fileContent).not.toContain('import config'); + expect(fileContent).not.toContain('secret: config.jwt.secret,'); + expect(fileContent).not.toContain('signOptions: { expiresIn: config.jwt.expiration },'); + + expect(fileContent).toContain("secret: 'SECRET'"); + expect(fileContent).toContain("signOptions: { expiresIn: '60s' },"); + }); + }); + + describe('auth-jwt generator with convict configuration', () => { + beforeAll(async () => { + await convictGenerator(tree, options); + await authJwtGenerator(tree, options); + jest.clearAllMocks(); + }, 60000); + + it('should add JWT configuration if convict is present', async () => { + if (tree.exists(`./apps/${options.projectName}/src/config.ts`)) { + const fileContent = tree.read(`./apps/${options.projectName}/src/config.ts`)?.toString(); + // expect(fileContent).toContain({ + // jwt: { + // secret: { + // doc: 'JWT secret', + // format: String, + // default: 'SECRET', + // env: 'JWT_SECRET', + // arg: 'jwtSecret', + // secret: true, + // }, + // expiration: { + // doc: 'Token expiration time', + // default: '24h', + // format: String, + // env: 'JWT_EXPIRATION', + // }, + // }, + // }); + expect(fileContent).toContain('jwt: {'); + expect(fileContent).toContain('secret: {'); + expect(fileContent).toContain('expiration: {'); + + const typesContent = tree.read(`./apps/${options.projectName}/src/app/shared/app-config.ts`)?.toString('utf-8'); + expect(typesContent).toContain('jwt'); + } + }); + it('should include config imports', async () => { + const fileContent = tree + .read(`./apps/${options.projectName}/src/app/core/auth/auth.module.ts`) + ?.toString('utf-8'); + expect(fileContent).toContain('import config'); + expect(fileContent).toContain('secret: config.jwt.secret,'); + expect(fileContent).toContain('signOptions: { expiresIn: config.jwt.expiration },'); + + expect(fileContent).not.toContain("secret: 'SECRET'"); + expect(fileContent).not.toContain("signOptions: { expiresIn: '60s' },"); + }); + }); +}); diff --git a/packages/schematics/src/generators/auth-jwt/generator.ts b/packages/schematics/src/generators/auth-jwt/generator.ts new file mode 100644 index 00000000..29f8db76 --- /dev/null +++ b/packages/schematics/src/generators/auth-jwt/generator.ts @@ -0,0 +1,157 @@ +import { + formatFiles, + generateFiles, + installPackagesTask, + Tree, + addDependenciesToPackageJson, + updateJson, +} from '@nx/devkit'; +import * as path from 'path'; +import { AuthJwtGeneratorSchema } from './schema'; +import { existsConvictConfig, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; +import { ASTFileBuilder } from '../../utils/ast-file-builder'; +import { packagesVersion } from '../packagesVersion'; + +export async function authJwtGenerator(tree: Tree, options: AuthJwtGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + const projectRoot = `apps/${options.projectName}`; + addDependenciesToPackageJson( + tree, + { + [packagesVersion['typeorm'].name]: packagesVersion['typeorm'].version, + [packagesVersion['bcrypt'].name]: packagesVersion['bcrypt'].version, + [packagesVersion['nestjsTypeorm'].name]: packagesVersion['nestjsTypeorm'].version, + [packagesVersion['nestjsPassport'].name]: packagesVersion['nestjsPassport'].version, + [packagesVersion['nestjsSwagger'].name]: packagesVersion['nestjsSwagger'].version, + [packagesVersion['lodash'].name]: packagesVersion['lodash'].version, + [packagesVersion['passport'].name]: packagesVersion['passport'].version, + [packagesVersion['passportJwt'].name]: packagesVersion['passportJwt'].version, + }, + { + [packagesVersion['typesBcrypt'].name]: packagesVersion['typesBcrypt'].version, + [packagesVersion['typesLodash'].name]: packagesVersion['typesLodash'].version, + [packagesVersion['typesPassport'].name]: packagesVersion['typesPassport'].version, + [packagesVersion['typesPassportJwt'].name]: packagesVersion['typesPassportJwt'].version, + }, + ); + const config: boolean = existsConvictConfig(tree, options.projectName); + if (!config) { + deleteConfigFiles(tree, projectRoot); + } else { + updateConfigFiles(tree, projectRoot); + addJWTConfiguration(tree, projectRoot); + } + addAuthToCoreModule(tree, projectRoot); + addUserEntityToDatasource(tree, projectRoot); + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, { + ...options, + config, + }); + await formatFiles(tree); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + }; +} + +export default authJwtGenerator; + +function updateConfigFiles(tree: Tree, projectRoot: string): void { + const prodPath = path.join(projectRoot, 'src/config/prod.json'); + const developPath = path.join(projectRoot, 'src/config/develop.json'); + + updateJson(tree, prodPath, content => { + content.jwt = { + secret: 'SECRET', + expiration: '24h', + }; + return content; + }); + + updateJson(tree, developPath, content => { + content.jwt = { + secret: 'SECRET', + expiration: '24h', + }; + return content; + }); +} + +function deleteConfigFiles(tree: Tree, projectRoot: string): void { + const prodPath = path.join(projectRoot, 'src/config/prod.json'); + const developPath = path.join(projectRoot, 'src/config/develop.json'); + if (tree.exists(prodPath)) { + tree.delete(prodPath); + } + if (tree.exists(developPath)) { + tree.delete(developPath); + } +} + +function addAuthToCoreModule(tree: Tree, projectRoot: string): void { + const corePath = path.join(projectRoot, 'src/app/core/core.module.ts'); + if (!tree.exists(corePath)) { + return; + } + + const fileContent = new ASTFileBuilder(tree.read(corePath)!.toString('utf-8')) + .addImports('AuthModule', './auth/auth.module') + .addImports('UserModule', './user/user.module') + .addToModuleDecorator('CoreModule', 'AuthModule', 'imports') + ?.addToModuleDecorator('CoreModule', 'AuthModule', 'exports') + ?.addToModuleDecorator('CoreModule', 'UserModule', 'imports') + ?.addToModuleDecorator('CoreModule', 'UserModule', 'exports') + ?.build(); + + if (fileContent) { + tree.write(corePath, fileContent); + } +} + +function addJWTConfiguration(tree: Tree, projectRoot: string): void { + const configFile = path.join(projectRoot, 'src/config.ts'); + const configFileContent = new ASTFileBuilder(tree.read(configFile)!.toString('utf-8')) + .addPropertyToObjectLiteralParam( + 'config', + 0, + 'jwt', + `{ + secret: { + doc: 'JWT secret', + format: String, + default: 'SECRET', + env: 'JWT_SECRET', + arg: 'jwtSecret', + secret: true, + }, + expiration: { + doc: 'Token expiration time', + default: '24h', + format: String, + env: 'JWT_EXPIRATION', + } + }`, + ) + .build(); + tree.write(configFile, configFileContent); + + const typesFile = path.join(projectRoot, 'src/app/shared/app-config.ts'); + const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')) + .addPropToInterface('AppConfig', 'jwt', `{secret: string; expiration: string;}`) + .build(); + tree.write(typesFile, typesFileContent); +} + +function addUserEntityToDatasource(tree: Tree, projectRoot: string): void { + const filePath = path.join(projectRoot, 'src/app/shared/database/main-data-source.ts'); + const dataSourceContent = tree.read(filePath)?.toString('utf-8'); + if (!dataSourceContent) { + return; + } + const updatedDataSource = new ASTFileBuilder(dataSourceContent) + .addImports('User', '../../core/user/model/entities/user.entity') + .addPropertyToObjectLiteralParam('AppDataSource', 0, 'entities', ['User']) + .build(); + if (updatedDataSource) { + tree.write(filePath, updatedDataSource); + } +} diff --git a/packages/schematics/src/generators/auth-jwt/schema.d.ts b/packages/schematics/src/generators/auth-jwt/schema.d.ts new file mode 100644 index 00000000..216c5acb --- /dev/null +++ b/packages/schematics/src/generators/auth-jwt/schema.d.ts @@ -0,0 +1,3 @@ +export interface AuthJwtGeneratorSchema { + projectName: string; +} diff --git a/packages/schematics/src/generators/auth-jwt/schema.json b/packages/schematics/src/generators/auth-jwt/schema.json new file mode 100644 index 00000000..41dc2b3f --- /dev/null +++ b/packages/schematics/src/generators/auth-jwt/schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/schema", + "$id": "AuthJwt", + "title": "", + "type": "object", + "properties": { + "projectName": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What name would you like to use?" + } + }, + "required": ["projectName"] +} diff --git a/packages/schematics/src/lib/convict/files/src/app/shared/app-config.ts b/packages/schematics/src/generators/convict/files/app/shared/app-config.ts.template similarity index 100% rename from packages/schematics/src/lib/convict/files/src/app/shared/app-config.ts rename to packages/schematics/src/generators/convict/files/app/shared/app-config.ts.template diff --git a/packages/schematics/src/lib/convict/files/src/app/shared/dependency-injection.constants.ts b/packages/schematics/src/generators/convict/files/app/shared/dependency-injection.constants.ts.template similarity index 100% rename from packages/schematics/src/lib/convict/files/src/app/shared/dependency-injection.constants.ts rename to packages/schematics/src/generators/convict/files/app/shared/dependency-injection.constants.ts.template diff --git a/packages/schematics/src/lib/convict/files/src/config.ts b/packages/schematics/src/generators/convict/files/config.ts.template similarity index 97% rename from packages/schematics/src/lib/convict/files/src/config.ts rename to packages/schematics/src/generators/convict/files/config.ts.template index 5caedd11..5efc6a3e 100644 --- a/packages/schematics/src/lib/convict/files/src/config.ts +++ b/packages/schematics/src/generators/convict/files/config.ts.template @@ -1,4 +1,4 @@ -import * as convict from 'convict'; +import convict from 'convict'; import { existsSync } from 'fs'; import { AppConfig } from './app/shared/app-config'; diff --git a/packages/schematics/src/lib/convict/files/config/develop.json b/packages/schematics/src/generators/convict/files/config/develop.json.template similarity index 100% rename from packages/schematics/src/lib/convict/files/config/develop.json rename to packages/schematics/src/generators/convict/files/config/develop.json.template diff --git a/packages/schematics/src/lib/convict/files/config/prod.json b/packages/schematics/src/generators/convict/files/config/prod.json.template similarity index 100% rename from packages/schematics/src/lib/convict/files/config/prod.json rename to packages/schematics/src/generators/convict/files/config/prod.json.template diff --git a/packages/schematics/src/generators/convict/generator.spec.ts b/packages/schematics/src/generators/convict/generator.spec.ts new file mode 100644 index 00000000..e67932c8 --- /dev/null +++ b/packages/schematics/src/generators/convict/generator.spec.ts @@ -0,0 +1,44 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; +import { convictGenerator } from './generator'; +import { ConvictGeneratorSchema } from './schema'; +import applicationGenerator from '../application/generator'; + +describe('convict generator', () => { + let tree: Tree; + const options: ConvictGeneratorSchema = { projectName: 'test' }; + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + await convictGenerator(tree, options); + jest.clearAllMocks(); + }, 60000); + + it('should run successfully', async () => { + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); + + it('should add dependencies to package.json', async () => { + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"convict":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"@types\/convict":/g); + }); + + it('should add convict configuration to main.ts', async () => { + const fileContent = tree.read(`./apps/${options.projectName}/src/main.ts`)?.toString('utf-8'); + expect(fileContent).toContain(`import config from './config'`); + expect(fileContent).toContain('await app.listen(port);'); + }); + + it('should update winston configuration', async () => { + const filePath = `./apps/${options.projectName}/src/app/shared/logger/winston.logger.ts`; + if (tree.exists(filePath)) { + const fileContent = tree.read(filePath)?.toString('utf-8'); + expect(fileContent).toContain('level: config.logger.loggerLevel'); + } else { + expect(tree.exists(filePath)).toBeFalsy(); + } + }); +}); diff --git a/packages/schematics/src/generators/convict/generator.ts b/packages/schematics/src/generators/convict/generator.ts new file mode 100644 index 00000000..feff0862 --- /dev/null +++ b/packages/schematics/src/generators/convict/generator.ts @@ -0,0 +1,93 @@ +import { addDependenciesToPackageJson, formatFiles, generateFiles, installPackagesTask, Tree } from '@nx/devkit'; +import * as path from 'path'; +import { ConvictGeneratorSchema } from './schema'; +import { ASTFileBuilder } from '../../utils/ast-file-builder'; +import { packagesVersion } from '../packagesVersion'; +import { stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; + +export async function convictGenerator(tree: Tree, options: ConvictGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + addDependenciesToPackageJson( + tree, + { [packagesVersion['convict'].name]: packagesVersion['convict'].version }, + { [packagesVersion['typesConvict'].name]: packagesVersion['typesConvict'].version }, + ); + const projectRoot = `apps/${options.projectName}/src`; + addConvictToMain(tree, projectRoot); + updateLogger(tree, projectRoot); + addConfigToCoreModule(tree, projectRoot); + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options); + await formatFiles(tree); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + }; +} + +export default convictGenerator; + +function addConvictToMain(tree: Tree, projectRoot: string): void { + const mainPath = path.join(projectRoot, 'main.ts'); + let content = tree.read(mainPath)?.toString('utf-8'); + + if (!content) { + return; + } + + content = content.replace('await app.listen(3000);', 'await app.listen(config.port);'); + content = content.replace("defaultVersion: '1',", 'defaultVersion: config.defaultVersion,'); + content = new ASTFileBuilder(content).addDefaultImports('config', './config').build(); + + if (content) { + tree.write(mainPath, content); + } +} + +function updateLogger(tree: Tree, projectRoot: string): void { + const loggerPath = path.join(projectRoot, 'app/shared/logger/winston.logger.ts'); + let content = tree.read(loggerPath)?.toString('utf-8'); + + if (!content) { + return; + } + + content = content.replace(/oneLineStack\(\w*\),/g, 'oneLineStack(config.logger.oneLineStack),'); + content = content.replace(/colorize\(\w*\),/g, 'colorize(config.logger.color),'); + content = content.replace(/level:.*,/g, 'level: config.logger.loggerLevel,'); + + content = new ASTFileBuilder(content).addDefaultImports('config', '../../../config').build(); + + if (content) { + tree.write(loggerPath, content); + } +} + +function addConfigToCoreModule(tree: Tree, projectRoot: string): void { + const module = path.join(projectRoot, '/app/core/core.module.ts'); + if (!tree.exists(module)) { + return; + } + + let fileContent: ASTFileBuilder | undefined = new ASTFileBuilder(tree.read(module)!.toString('utf-8')); + + if (fileContent.build().includes('provide: CONFIG_PROVIDER')) { + return; + } + + fileContent = fileContent + .addImports('CONFIG_PROVIDER', '../shared/dependency-injection.constants') + .addDefaultImports('config', '../../config') + .addToModuleDecorator( + 'CoreModule', + `{ + provide: CONFIG_PROVIDER, + useValue: config, + }`, + 'providers', + ); + + fileContent?.addToModuleDecorator('CoreModule', 'CONFIG_PROVIDER', 'exports'); + + if (fileContent) { + tree.write(module, fileContent.build()); + } +} diff --git a/packages/schematics/src/generators/convict/schema.d.ts b/packages/schematics/src/generators/convict/schema.d.ts new file mode 100644 index 00000000..32208664 --- /dev/null +++ b/packages/schematics/src/generators/convict/schema.d.ts @@ -0,0 +1,3 @@ +export interface ConvictGeneratorSchema { + projectName: string; +} diff --git a/packages/schematics/src/lib/convict/schema.json b/packages/schematics/src/generators/convict/schema.json similarity index 100% rename from packages/schematics/src/lib/convict/schema.json rename to packages/schematics/src/generators/convict/schema.json diff --git a/packages/schematics/src/generators/entity/files/__name__.entity.ts.template b/packages/schematics/src/generators/entity/files/__name__.entity.ts.template new file mode 100644 index 00000000..31249187 --- /dev/null +++ b/packages/schematics/src/generators/entity/files/__name__.entity.ts.template @@ -0,0 +1,10 @@ +import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +export class <%= classify(name) %> { + @PrimaryGeneratedColumn() + id: number; + + @Column() + name: string; +} diff --git a/packages/schematics/src/generators/entity/generator.spec.ts b/packages/schematics/src/generators/entity/generator.spec.ts new file mode 100644 index 00000000..a0dba974 --- /dev/null +++ b/packages/schematics/src/generators/entity/generator.spec.ts @@ -0,0 +1,34 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; +import { entityGenerator } from './generator'; +import { EntityGeneratorSchema } from './schema'; +import applicationGenerator from '../application/generator'; + +describe('entity generator', () => { + let tree: Tree; + const options: EntityGeneratorSchema = { name: 'test', projectName: 'test' }; + const plural = jest.fn(() => 'tests'); + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + await entityGenerator(tree, options); + }, 60000); + + it('should run successfully', async () => { + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); + + it('should add dependencies to package.json', async () => { + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"typeorm":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"mysql2":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"@nestjs\/typeorm":/g); + }); + + it('should create a new entity file', async () => { + const projectRoot = `apps/${options.projectName}/src/app/${plural()}/entities/${options.name}.entity.ts`; + expect(tree.exists(projectRoot)).toBeTruthy(); + }); +}); diff --git a/packages/schematics/src/generators/entity/generator.ts b/packages/schematics/src/generators/entity/generator.ts new file mode 100644 index 00000000..970c313c --- /dev/null +++ b/packages/schematics/src/generators/entity/generator.ts @@ -0,0 +1,31 @@ +import { addDependenciesToPackageJson, formatFiles, generateFiles, installPackagesTask, Tree } from '@nx/devkit'; +import * as path from 'path'; +import { EntityGeneratorSchema } from './schema'; +import { classify } from '../../utils'; +import { plural } from 'pluralize'; +import { packagesVersion } from '../packagesVersion'; +import { stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; + +export async function entityGenerator(tree: Tree, options: EntityGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + addDependenciesToPackageJson( + tree, + { + [packagesVersion['typeorm'].name]: packagesVersion['typeorm'].version, + [packagesVersion['nestjsTypeorm'].name]: packagesVersion['nestjsTypeorm'].version, + [packagesVersion['mysql2'].name]: packagesVersion['mysql2'].version, + }, + {}, + ); + const projectRoot = `apps/${options.projectName}/src/app/${plural(options.name)}/entities`; + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, { + classify, + ...options, + }); + await formatFiles(tree); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + }; +} + +export default entityGenerator; diff --git a/packages/schematics/src/generators/entity/schema.d.ts b/packages/schematics/src/generators/entity/schema.d.ts new file mode 100644 index 00000000..175bae3d --- /dev/null +++ b/packages/schematics/src/generators/entity/schema.d.ts @@ -0,0 +1,4 @@ +export interface EntityGeneratorSchema { + name: string; + projectName: string; +} diff --git a/packages/schematics/src/generators/entity/schema.json b/packages/schematics/src/generators/entity/schema.json new file mode 100644 index 00000000..a1f1c0a8 --- /dev/null +++ b/packages/schematics/src/generators/entity/schema.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/schema", + "$id": "Entity", + "title": "", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What name would you like to use?" + }, + "projectName": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "In which project would you like to add the entity?" + } + }, + "required": ["name", "projectName"] +} diff --git a/packages/schematics/src/generators/init-typeorm/convictOptions.ts b/packages/schematics/src/generators/init-typeorm/convictOptions.ts new file mode 100644 index 00000000..b4c9de6d --- /dev/null +++ b/packages/schematics/src/generators/init-typeorm/convictOptions.ts @@ -0,0 +1,162 @@ +export const databaseConvictOptions: Record = { + mysql: `${printType('mysql')} + ${printHost('localhost')} + ${printPort(3306)} + ${printUsername('test')} + ${printPassword('test')} + ${printDatabase('test')}`, + mariadb: `${printType('mariadb')} + ${printHost('localhost')} + ${printPort(3306)} + ${printUsername('test')} + ${printPassword('test')} + ${printDatabase('test')}`, + sqlite: `${printType('sqlite')} ${printDatabase(':memory:')}`, + postgres: `${printType('postgres')} + ${printHost('localhost')} + ${printPort(5432)} + ${printUsername('test')} + ${printPassword('test')} + ${printDatabase('test')}`, + cockroachdb: `${printType('cockroachdb')} + ${printHost('localhost')} + ${printPort(2625)}, + ${printUsername('root')} + ${printPassword('')} + ${printDatabase('defaultdb')}`, + mssql: `${printType('mssql')} + ${printHost('localhost')} + ${printUsername('sa')} + ${printPassword('Admin12345')} + ${printDatabase('tempdb')}`, + oracle: `${printType('oracle')} + ${printHost('localhost')} + ${printPort(1521)} + ${printUsername('system')} + ${printPassword('oracle')} + ${printSID('xe.oracle.docker')}`, + mongodb: `${printType('mongodb')} ${printDatabase('test')}`, +}; + +export const defaultDatabaseConvictOptions = `synchronize: { + doc: 'Do you want to synchronize database tables with you entities?', + default: false, + format: Boolean, + }, + migrationsRun: { + doc: 'Do you want to execute the migrations at application start?', + default: true, + format: Boolean, + }, + logging: { doc: 'Do you want to log all database queries?', default: true, format: Boolean }`; + +export const databaseConvictTypes: Record = { + mysql: `type: string; + host: string; + port: number; + username: string; + password: string; + database: string;`, + mariadb: `type: string; + host: string; + port: number; + username: string; + password: string; + database: string;`, + sqlite: `type: string; database: string;`, + postgres: `type: string; + host: string; + port: number; + username: string; + password: string; + database: string;`, + cockroachdb: `type: string; + host: string; + port: number; + username: string; + password: string; + database: string;`, + mssql: `type: string; + host: string; + username: string; + password: string; + database: string;`, + oracle: `type: string; + host: string; + port: number; + username: string; + password: string; + sid: string;`, + mongodb: `type: string; database: string;`, +}; + +function printType(type: string): string { + return `type: { + doc: 'Database provider type', + default: '${type}', + format: ['postgres', 'cockroachdb', 'mariadb', 'mysql', 'sqlite', 'oracle', 'mssql', 'mongodb'], + env: 'DATABASE_TYPE', + arg: 'databaseType', + },`; +} + +function printHost(host: string): string { + return `host: { + doc: 'Database host URL', + default: '${host}', + format: String, + env: 'DATABASE_HOST', + arg: 'databaseHost', + },`; +} + +function printPort(port: number): string { + return `port: { + doc: 'Database port', + default: ${port}, + format: 'port', + env: 'DATABASE_PORT', + arg: 'databasePort', + },`; +} + +function printUsername(username: string): string { + return `username: { + doc: 'Database connection username', + default: '${username}', + format: String, + env: 'DATABASE_USERNAME', + arg: 'databaseUsername', + },`; +} + +function printPassword(password: string): string { + return `password: { + doc: 'Database connection password', + default: '${password}', + format: String, + secret: true, + env: 'DATABASE_PASSWORD', + arg: 'databasePassword', + },`; +} + +function printDatabase(database: string): string { + return `database: { + doc: 'Database connection schema', + default: '${database}', + format: String, + env: 'DATABASE_DATABASE', + arg: 'databaseDatabase', + },`; +} + +function printSID(sid: string): string { + return `sid: { + doc: 'Database connection SID', + default: '${sid}', + format: String, + env: 'DATABASE_SID', + arg: 'databaseSid', + },`; +} diff --git a/packages/schematics/src/lib/init-typeorm/files/src/app/shared/database/main-data-source.ts b/packages/schematics/src/generators/init-typeorm/files/src/app/shared/database/main-data-source.ts.template similarity index 100% rename from packages/schematics/src/lib/init-typeorm/files/src/app/shared/database/main-data-source.ts rename to packages/schematics/src/generators/init-typeorm/files/src/app/shared/database/main-data-source.ts.template diff --git a/packages/schematics/src/lib/init-typeorm/files/src/app/shared/model/entities/base.entity.ts b/packages/schematics/src/generators/init-typeorm/files/src/app/shared/model/entities/base.entity.ts.template similarity index 100% rename from packages/schematics/src/lib/init-typeorm/files/src/app/shared/model/entities/base.entity.ts rename to packages/schematics/src/generators/init-typeorm/files/src/app/shared/model/entities/base.entity.ts.template diff --git a/packages/schematics/src/generators/init-typeorm/generator.spec.ts b/packages/schematics/src/generators/init-typeorm/generator.spec.ts new file mode 100644 index 00000000..e9ce15f5 --- /dev/null +++ b/packages/schematics/src/generators/init-typeorm/generator.spec.ts @@ -0,0 +1,86 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; +import { initTypeormGenerator } from './generator'; +import { InitTypeormGeneratorSchema } from './schema'; +import applicationGenerator from '../application/generator'; +import convictGenerator from '../convict/generator'; + +describe('init-typeorm generator', () => { + let tree: Tree; + const options: InitTypeormGeneratorSchema = { projectName: 'test', db: 'mysql' }; + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + }, 60000); + + it('should run successfully', async () => { + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); + + it('should add dependencies to package.json', async () => { + await initTypeormGenerator(tree, options); + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"typeorm":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"@nestjs\/typeorm":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"class-transformer":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"class-validator":/g); + }); + + it('should add TypeOrmModule to core.module', async () => { + await initTypeormGenerator(tree, options); + const fileContent = tree.read(`./apps/${options.projectName}/src/app/core/core.module.ts`)?.toString('utf-8'); + if (fileContent) { + expect(fileContent).toContain('TypeOrmModule.forRootAsync'); + } else { + expect(fileContent).toBeUndefined(); + } + }); + + describe('init-typeorm generator without convict configuration', () => { + beforeAll(async () => { + await initTypeormGenerator(tree, options); + }); + + it('should add database properties to config.ts', async () => { + const filePath = `./apps/${options.projectName}/src/config.ts`; + if (tree.exists(filePath)) { + const fileContent = tree.read(filePath)?.toString('utf-8'); + expect(fileContent).toContain('database'); + } else { + expect(tree.exists(filePath)).toBeFalsy(); + } + }); + + it('should update config type file', async () => { + const filePath = `./apps/${options.projectName}/src/app/shared/app-config.ts`; + if (tree.exists(filePath)) { + const fileContent = tree.read(filePath)?.toString('utf-8'); + expect(fileContent).toContain('database'); + } else { + expect(tree.exists(filePath)).toBeFalsy(); + } + }); + + it('should not have convict files', async () => { + const filePath = `./apps/${options.projectName}/src/config/develop.json`; + const prodPath = `./apps/${options.projectName}/src/config/prod.json`; + const configPath = `./apps/${options.projectName}/src/config.ts`; + expect(tree.exists(filePath)).toBeFalsy(); + expect(tree.exists(prodPath)).toBeFalsy(); + expect(tree.exists(configPath)).toBeFalsy(); + }); + }); + + describe('init-typeorm generator with convict configuration', () => { + beforeAll(async () => { + await convictGenerator(tree, options); + await initTypeormGenerator(tree, options); + }); + it('should update config json files if convict is present', async () => { + const filePath = `./apps/${options.projectName}/src/config/develop.json`; + expect(tree.exists(filePath)).toBeTruthy(); + }); + }); +}); diff --git a/packages/schematics/src/generators/init-typeorm/generator.ts b/packages/schematics/src/generators/init-typeorm/generator.ts new file mode 100644 index 00000000..1d220aeb --- /dev/null +++ b/packages/schematics/src/generators/init-typeorm/generator.ts @@ -0,0 +1,228 @@ +import { + addDependenciesToPackageJson, + formatFiles, + generateFiles, + installPackagesTask, + Tree, + updateJson, +} from '@nx/devkit'; +import * as path from 'path'; +import { InitTypeormGeneratorSchema } from './schema'; +import { existsConvictConfig, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; +import { databaseConvictOptions, databaseConvictTypes, defaultDatabaseConvictOptions } from './convictOptions'; +import { ASTFileBuilder } from '../../utils/ast-file-builder'; +import { packagesVersion } from '../packagesVersion'; + +export async function initTypeormGenerator(tree: Tree, options: InitTypeormGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + addDependenciesToPackageJson( + tree, + { + [packagesVersion['typeorm'].name]: packagesVersion['typeorm'].version, + [packagesVersion['nestjsTypeorm'].name]: packagesVersion['nestjsTypeorm'].version, + [packagesVersion['classTransformer'].name]: packagesVersion['classTransformer'].version, + [packagesVersion['classValidator'].name]: packagesVersion['classValidator'].version, + }, + {}, + ); + const projectRoot = `apps/${options.projectName}`; + addTypeormToCoreModule(tree, projectRoot); + addDatabaseConfiguration(tree, options, projectRoot); + + const config = existsConvictConfig(tree, options.projectName); + if (config) { + addOrUpdateConfigJson(tree, projectRoot, options); + } + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, { + ...options, + config, + }); + + await formatFiles(tree); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + }; +} + +export default initTypeormGenerator; + +function addTypeormToCoreModule(tree: Tree, projectRoot: string): void { + const corePath = path.join(projectRoot, 'src/app/core/core.module.ts'); + if (!tree.exists(corePath)) { + return; + } + + let fileContent: ASTFileBuilder | undefined = new ASTFileBuilder(tree.read(corePath)!.toString('utf-8')); + + if (fileContent.build().includes('TypeOrmModule.forRoot')) { + return; + } + + fileContent = fileContent + .addImports('AppDataSource', '../shared/database/main-data-source') + .addImports('TypeOrmModule', '@nestjs/typeorm') + .addToModuleDecorator( + 'CoreModule', + `TypeOrmModule.forRootAsync({ + useFactory: () => ({}), + dataSourceFactory: async () => AppDataSource, + })`, + 'imports', + ); + + if (fileContent) { + tree.write(corePath, fileContent.build()); + } +} + +function addDatabaseConfiguration(tree: Tree, options: InitTypeormGeneratorSchema, projectRoot: string): void { + const config = existsConvictConfig(tree, options.projectName); + if (!config) { + return; + } + updateConfigFile(tree, options.db, projectRoot); + updateConfigTypeFile(tree, options.db, projectRoot); +} + +function updateConfigFile(tree: Tree, database: string, projectRoot: string): void { + const typesFile = path.join(projectRoot, 'src/config.ts'); + + const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')) + .addPropertyToObjectLiteralParam( + 'config', + 0, + 'database', + `{ + ${databaseConvictOptions[database]} + ${defaultDatabaseConvictOptions}, + }`, + ) + .build(); + + tree.write(typesFile, typesFileContent); +} + +function updateConfigTypeFile(tree: Tree, database: string, projectRoot: string): void { + const typesFile = path.join(projectRoot, 'src/app/shared/app-config.ts'); + + const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')) + .addPropToInterface( + 'AppConfig', + 'database', + `{ + ${databaseConvictTypes[database]} + synchronize: boolean; + migrationsRun: boolean; + logging: boolean; + }`, + ) + .build(); + + tree.write(typesFile, typesFileContent); +} +function addOrUpdateConfigJson(tree: Tree, projectRoot: string, options: InitTypeormGeneratorSchema): void { + const developPath = path.join(projectRoot, 'src/config/develop.json'); + const prodPath = path.join(projectRoot, 'src/config/prod.json'); + const contentToWrite = getDb(options.db); + if (tree.exists(developPath)) { + // Update + updateJson(tree, developPath, content => { + content.database = contentToWrite; + return content; + }); + } else { + // Create + tree.write(developPath, JSON.stringify(contentToWrite)); + } + if (tree.exists(prodPath)) { + // Update + updateJson(tree, prodPath, content => { + content.database = contentToWrite; + return content; + }); + } else { + // Create + tree.write(prodPath, JSON.stringify(contentToWrite)); + } +} + +function getDb(db: string): object { + const config = { + database: ((): object => { + if (db === 'mysql') { + return { + type: 'mysql', + host: 'localhost', + port: 3306, + username: 'test', + password: 'test', + database: 'test', + }; + } else if (db === 'mariadb') { + return { + type: 'mariadb', + host: 'localhost', + port: 3306, + username: 'test', + password: 'test', + database: 'test', + }; + } else if (db === 'sqlite') { + return { + type: 'sqlite', + database: ':memory:', + }; + } else if (db === 'postgres') { + return { + type: 'postgres', + host: 'localhost', + port: 5432, + username: 'test', + password: 'test', + database: 'test', + }; + } else if (db === 'cockroachdb') { + return { + type: 'cockroachdb', + host: 'localhost', + port: 26257, + username: 'root', + password: '', + database: 'defaultdb', + }; + } else if (db === 'mssql') { + return { + type: 'mssql', + host: 'localhost', + username: 'sa', + password: 'Admin12345', + database: 'tempdb', + }; + } else if (db === 'oracle') { + return { + type: 'oracle', + host: 'localhost', + port: 1521, + username: 'system', + password: 'oracle', + sid: 'xe.oracle.docker', + }; + } else if (db === 'mongodb') { + return { + type: 'mongodb', + database: 'test', + }; + } else { + // Default configuration + return { + type: 'unknown', + message: 'Database type not recognized', + }; + } + })(), + synchronize: false, + migrationsRun: true, + logging: true, + }; + return config; +} diff --git a/packages/schematics/src/generators/init-typeorm/schema.d.ts b/packages/schematics/src/generators/init-typeorm/schema.d.ts new file mode 100644 index 00000000..cb41c167 --- /dev/null +++ b/packages/schematics/src/generators/init-typeorm/schema.d.ts @@ -0,0 +1,4 @@ +export interface InitTypeormGeneratorSchema { + projectName: string; + db: string; +} diff --git a/packages/schematics/src/generators/init-typeorm/schema.json b/packages/schematics/src/generators/init-typeorm/schema.json new file mode 100644 index 00000000..ee4bcefc --- /dev/null +++ b/packages/schematics/src/generators/init-typeorm/schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "InitTypeormSchematic", + "title": "Init Typeorm Schema", + "type": "object", + "properties": { + "db": { + "type": "string", + "enum": ["postgres", "cockroachdb", "mariadb", "mysql", "sqlite", "oracle", "mssql", "mongodb"], + "x-prompt": "What kind of database do you want to use?" + }, + "projectName": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "In which project would you like to add typeorm configuration?" + } + }, + "required": ["db", "projectName"] +} diff --git a/packages/schematics/src/generators/mailer/configvalues.ts b/packages/schematics/src/generators/mailer/configvalues.ts new file mode 100644 index 00000000..287002f4 --- /dev/null +++ b/packages/schematics/src/generators/mailer/configvalues.ts @@ -0,0 +1,81 @@ +export const defaultMailerValues = `{ + mailOptions: { + host: 'localhost', + port: 1025, + secure: false, + tls: { + rejectUnauthorized: false, + }, + }, + emailFrom: 'noreply@example.com', + hbsOptions: { + templatesDir: join(__dirname, '../..', 'templates/views'), + partialsDir: join(__dirname, '../..', 'templates/partials'), + helpers: [], + }, +}`; + +export const mailerValuesFromConfig = `{ + mailOptions: { + host: config.mailer.mailOptions.host, + port: config.mailer.mailOptions.port, + secure: config.mailer.mailOptions.secure, + tls: { + rejectUnauthorized: config.mailer.mailOptions.tlsRejectUnauthorized, + }, + }, + emailFrom: config.mailer.emailFrom, + hbsOptions: { + templatesDir: join(__dirname, '../..', config.mailer.hbsOptions.templatesDir), + partialsDir: join(__dirname, '../..', config.mailer.hbsOptions.partialsDir), + helpers: [], + }, +}`; + +export const mailerConfigType = `{ + mailOptions: { + host: { + doc: 'Mail server host URL', + default: 'localhost', + format: String, + env: 'MAILER_HOST', + }, + port: { + doc: 'Mail server port', + default: 1025, + format: 'port', + env: 'MAILER_PORT', + }, + secure: { + doc: 'Is the mailer server secured?', + default: false, + format: Boolean, + env: 'MAILER_SECURE', + }, + tlsRejectUnauthorized: { + doc: 'Reject unauthorized TLS connections?', + default: false, + format: Boolean, + env: 'MAILER_TLS_REJECT_UNAUTHORIZED', + }, + }, + emailFrom: { + doc: 'Email that will be used as sender', + default: 'noreply@example.com', + format: String, + env: 'MAILER_EMAIL_FROM', + arg: 'emailFrom', + }, + hbsOptions: { + templatesDir: { + doc: 'Relative path to handlebars views folder', + default: 'templates/views', + format: String, + }, + partialsDir: { + doc: 'Relative path to handlebars partials folder', + default: 'templates/partials', + format: String, + }, + }, +}`; diff --git a/packages/schematics/src/lib/mailer/files/docker-compose.yml b/packages/schematics/src/generators/mailer/files/docker-compose.yml.template similarity index 100% rename from packages/schematics/src/lib/mailer/files/docker-compose.yml rename to packages/schematics/src/generators/mailer/files/docker-compose.yml.template diff --git a/packages/schematics/src/lib/mailer/files/templates/partials/layout.handlebars b/packages/schematics/src/generators/mailer/files/templates/partials/layout.handlebars.template similarity index 100% rename from packages/schematics/src/lib/mailer/files/templates/partials/layout.handlebars rename to packages/schematics/src/generators/mailer/files/templates/partials/layout.handlebars.template diff --git a/packages/schematics/src/lib/mailer/files/templates/views/example.handlebars b/packages/schematics/src/generators/mailer/files/templates/views/example.handlebars.template similarity index 100% rename from packages/schematics/src/lib/mailer/files/templates/views/example.handlebars rename to packages/schematics/src/generators/mailer/files/templates/views/example.handlebars.template diff --git a/packages/schematics/src/generators/mailer/generator.spec.ts b/packages/schematics/src/generators/mailer/generator.spec.ts new file mode 100644 index 00000000..decb49b9 --- /dev/null +++ b/packages/schematics/src/generators/mailer/generator.spec.ts @@ -0,0 +1,36 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; +import { mailerGenerator } from './generator'; +import { MailerGeneratorSchema } from './schema'; +import applicationGenerator from '../application/generator'; + +describe('mailer generator', () => { + let tree: Tree; + const options: MailerGeneratorSchema = { projectName: 'test' }; + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + await mailerGenerator(tree, options); + jest.clearAllMocks(); + }, 60000); + + it('should run successfully', async () => { + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); + it('should add dependencies to package.json', async () => { + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"handlebars\":/g); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"@devon4ts_node\/mailer\":/g); + }); + + it('should add MailerModule to core.module', async () => { + const fileContent = tree.read(`./apps/${options.projectName}/src/app/core/core.module.ts`)?.toString('utf-8'); + if (fileContent) { + expect(fileContent).toContain('MailerModule'); + } else { + expect(fileContent).toBeUndefined(); + } + }); +}); diff --git a/packages/schematics/src/generators/mailer/generator.ts b/packages/schematics/src/generators/mailer/generator.ts new file mode 100644 index 00000000..7de35cce --- /dev/null +++ b/packages/schematics/src/generators/mailer/generator.ts @@ -0,0 +1,74 @@ +import { addDependenciesToPackageJson, installPackagesTask, Tree, generateFiles } from '@nx/devkit'; +import * as path from 'path'; +import { MailerGeneratorSchema } from './schema'; +import { existsConvictConfig, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; +import { ASTFileBuilder } from '../../utils/ast-file-builder'; +import { defaultMailerValues, mailerConfigType, mailerValuesFromConfig } from './configvalues'; +import { packagesVersion } from '../packagesVersion'; + +export async function mailerGenerator(tree: Tree, options: MailerGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + addDependenciesToPackageJson( + tree, + { + [packagesVersion['devon4ts_nodeMailer'].name]: packagesVersion['devon4ts_nodeMailer'].version, + [packagesVersion['handlebars'].name]: packagesVersion['handlebars'].version, + }, + {}, + ); + const projectRoot = `apps/${options.projectName}/src`; + addMailerToProject(tree, options, projectRoot); + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + }; +} + +export default mailerGenerator; + +function addMailerToCoreModule(tree: Tree, existsConfig: boolean, projectRoot: string): void { + const corePath = `${projectRoot}/app/core/core.module.ts`; + if (!tree.exists(corePath)) { + return; + } + + const coreContent = new ASTFileBuilder(tree.read(corePath)!.toString()); + + if (coreContent.build().includes('MailerModule')) { + return; + } + + coreContent + .addImports('MailerModule', '@devon4ts_node/mailer') + .addImports('join', 'path') + .addToModuleDecorator( + 'CoreModule', + 'MailerModule.register(' + (existsConfig ? mailerValuesFromConfig : defaultMailerValues) + ')', + 'imports', + ) + ?.addToModuleDecorator('CoreModule', 'MailerModule', 'exports'); + + if (coreContent) { + tree.write(corePath, coreContent.build()); + } +} + +function addMailerToProject(tree: Tree, options: MailerGeneratorSchema, projectRoot: string): Tree { + const config = existsConvictConfig(tree, options.projectName); + + if (!config) { + addMailerToCoreModule(tree, false, projectRoot); + return tree; + } + + addMailerToCoreModule(tree, true, projectRoot); + const typesFile = `${projectRoot}/config.ts`; + + const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')) + .addPropertyToObjectLiteralParam('config', 0, 'mailer', mailerConfigType) + .build(); + + tree.write(typesFile, typesFileContent); + + return tree; +} diff --git a/packages/schematics/src/generators/mailer/schema.d.ts b/packages/schematics/src/generators/mailer/schema.d.ts new file mode 100644 index 00000000..a7e23556 --- /dev/null +++ b/packages/schematics/src/generators/mailer/schema.d.ts @@ -0,0 +1,3 @@ +export interface MailerGeneratorSchema { + projectName: string; +} diff --git a/packages/schematics/src/generators/mailer/schema.json b/packages/schematics/src/generators/mailer/schema.json new file mode 100644 index 00000000..d56fdc9b --- /dev/null +++ b/packages/schematics/src/generators/mailer/schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "MailerSchematic", + "title": "Mailer Schema", + "type": "object", + "properties": { + "projectName": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + + "x-prompt": "In which project would you like to add the mailer?" + } + }, + "required": ["projectName"] +} diff --git a/packages/schematics/src/generators/packagesVersion.ts b/packages/schematics/src/generators/packagesVersion.ts new file mode 100644 index 00000000..96fd4895 --- /dev/null +++ b/packages/schematics/src/generators/packagesVersion.ts @@ -0,0 +1,42 @@ +export const packagesVersion: { [k: string]: { name: string; version: string } } = { + bcrypt: { name: 'bcrypt', version: '^5.1.1' }, + classTransformer: { name: 'class-transformer', version: '^0.5.1' }, + classValidator: { name: 'class-validator', version: '^0.14.1' }, + cockroachdb: { name: 'pg', version: '^8.11.3' }, + convict: { name: 'convict', version: '^6.2.4' }, + express: { name: 'express', version: '^4.18.2' }, + devon4ts_nodeCommon: { name: '@devon4ts_node/common', version: '^5.0.1' }, + devon4ts_nodeLogform: { name: '@devon4ts_node/logform', version: '^5.0.1' }, + devon4ts_nodeMailer: { name: '@devon4ts_node/mailer', version: 'latest' }, + devon4ts_nodeSchematics: { name: '@devon4ts_node/schematics', version: '^5.0.1' }, + eslintPluginPrettier: { name: 'eslint-plugin-prettier', version: '^5.1.3' }, + handlebars: { name: 'handlebars', version: '^4.7.8' }, + helmet: { name: 'helmet', version: '^7.1.0' }, + husky: { name: 'husky', version: '^9.0.9' }, + lodash: { name: 'lodash', version: '^4.17.21' }, + mariadb: { name: 'mysql', version: '^2.18.1' }, + mongodb: { name: 'mongodb', version: '^6.3.0' }, + mssql: { name: 'mssql', version: '^10.0.2' }, + mysql: { name: 'mysql', version: '^2.18.1' }, + mysql2: { name: 'mysql2', version: '^3.9.1' }, + nestjsJwt: { name: '@nestjs/jwt', version: '^10.2.0' }, + nestjsMappedTypes: { name: '@nestjs/mapped-types', version: '^2.0.4' }, + nestjsPassport: { name: '@nestjs/passport', version: '^10.0.3' }, + nestjsSwagger: { name: '@nestjs/swagger', version: '^7.2.0' }, + nestjsTypeorm: { name: '@nestjs/typeorm', version: '10.0.1' }, + oracle: { name: 'oracledb', version: '^6.3.0' }, + passport: { name: 'passport', version: '^0.7.0' }, + passportJwt: { name: 'passport-jwt', version: '^4.0.1' }, + postgres: { name: 'pg', version: '^8.11.3' }, + prettyQuick: { name: 'pretty-quick', version: '^4.0.0' }, + sqlite: { name: 'sqlite3', version: '^5.1.7' }, + typeFest: { name: 'type-fest', version: '^4.10.2' }, + typeorm: { name: 'typeorm', version: '^0.3.20' }, + typesBcrypt: { name: '@types/bcrypt', version: '^5.0.2' }, + typesConvict: { name: '@types/convict', version: '^6.1.6' }, + typesLodash: { name: '@types/lodash', version: '^4.14.202' }, + typesPassport: { name: '@types/passport', version: '^1.0.16' }, + typesPassportJwt: { name: '@types/passport-jwt', version: '^4.0.1' }, + typesExpress: { name: '@types/express', version: '^4.17.21' }, + winston: { name: 'winston', version: '^3.11.0' }, +}; diff --git a/packages/schematics/src/generators/security/generator.spec.ts b/packages/schematics/src/generators/security/generator.spec.ts new file mode 100644 index 00000000..635e99ea --- /dev/null +++ b/packages/schematics/src/generators/security/generator.spec.ts @@ -0,0 +1,32 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; +import { securityGenerator } from './generator'; +import { SecurityGeneratorSchema } from './schema'; +import applicationGenerator from '../application/generator'; + +describe('Security Generator', () => { + let tree: Tree; + const options: SecurityGeneratorSchema = { projectName: 'test' }; + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + await securityGenerator(tree, options); + }, 60000); + + it('should run successfully', async () => { + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); + + it('should add dependencies to package.json', async () => { + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"helmet":/g); + }); + + it('should add CORS and helmet to main.ts', async () => { + const fileContent = tree.read(`./apps/${options.projectName}/src/main.ts`)?.toString('utf-8'); + expect(fileContent).toContain('app.enableCors'); + expect(fileContent).toContain(`import helmet from 'helmet'`); + }); +}); diff --git a/packages/schematics/src/generators/security/generator.ts b/packages/schematics/src/generators/security/generator.ts new file mode 100644 index 00000000..876c2afd --- /dev/null +++ b/packages/schematics/src/generators/security/generator.ts @@ -0,0 +1,30 @@ +import { addDependenciesToPackageJson, formatFiles, installPackagesTask, Tree } from '@nx/devkit'; +import { SecurityGeneratorSchema } from './schema'; +import { ASTFileBuilder } from '../../utils/ast-file-builder'; +import { packagesVersion } from '../packagesVersion'; +import { stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; + +export async function securityGenerator(tree: Tree, options: SecurityGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + addDependenciesToPackageJson(tree, { [packagesVersion['helmet'].name]: packagesVersion['helmet'].version }, {}); + const projectRoot = `apps/${options.projectName}/src/main.ts`; + const content = new ASTFileBuilder(tree.read(projectRoot)!.toString('utf-8')) + .addDefaultImports('helmet', 'helmet') + .insertLinesToFunctionBefore('bootstrap', 'app.listen', 'app.use(helmet());') + .insertLinesToFunctionBefore( + 'bootstrap', + 'app.listen', + `app.enableCors({ origin: '*', credentials: true, exposedHeaders: 'Authorization', allowedHeaders: 'authorization, content-type',});`, + ) + .build(); + + if (content) { + tree.write(projectRoot, content); + } + await formatFiles(tree); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + }; +} + +export default securityGenerator; diff --git a/packages/schematics/src/generators/security/schema.d.ts b/packages/schematics/src/generators/security/schema.d.ts new file mode 100644 index 00000000..5f50908a --- /dev/null +++ b/packages/schematics/src/generators/security/schema.d.ts @@ -0,0 +1,3 @@ +export interface SecurityGeneratorSchema { + projectName: string; +} diff --git a/packages/schematics/src/generators/security/schema.json b/packages/schematics/src/generators/security/schema.json new file mode 100644 index 00000000..8d58daeb --- /dev/null +++ b/packages/schematics/src/generators/security/schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/schema", + "$id": "Security", + "title": "", + "type": "object", + "properties": { + "projectName": { + "type": "string", + "description": "", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "In which project would you like to add security?" + } + }, + "required": ["projectName"] +} diff --git a/packages/schematics/src/generators/swagger/configvalue.ts b/packages/schematics/src/generators/swagger/configvalue.ts new file mode 100644 index 00000000..466aeeca --- /dev/null +++ b/packages/schematics/src/generators/swagger/configvalue.ts @@ -0,0 +1,47 @@ +export const swaggerTemplateWithConfig = `if (config.isDev) { + const options = new DocumentBuilder() + .setTitle(config.swagger?.title ?? 'NestJS application') + .setDescription(config.swagger?.description ?? '') + .setVersion(config.swagger?.version ?? '0.0.1') + .addBearerAuth() + .build(); + + const swaggerDoc = SwaggerModule.createDocument(app, options); + SwaggerModule.setup('v' + (config.defaultVersion) + '/api', app, swaggerDoc); + }`; + +export const swaggerTemplate = `if (process.env.NODE_ENV === 'develop') { + const options = new DocumentBuilder() + .setTitle('NestJS application') + .setDescription('') + .setVersion('0.0.1') + .addBearerAuth() + .build(); + + const swaggerDoc = SwaggerModule.createDocument(app, options); + SwaggerModule.setup('v1/api', app, swaggerDoc); + }`; + +export const defaultSwaggerConfig = `{ + title: { + doc: 'Swagger documentation title', + default: 'NestJS Application', + format: String, + }, + description: { + doc: 'Swagger documentation description', + default: 'API Documentation', + format: String, + }, + version: { + doc: 'Swagger documentation version', + default: '0.0.1', + format: String, + }, + },`; + +export const defaultSwaggerConfigType = `{ + title: string; + description: string; + version: string; + }`; diff --git a/packages/schematics/src/lib/swagger/files/config/develop.json b/packages/schematics/src/generators/swagger/files/config/develop.json.template similarity index 100% rename from packages/schematics/src/lib/swagger/files/config/develop.json rename to packages/schematics/src/generators/swagger/files/config/develop.json.template diff --git a/packages/schematics/src/lib/swagger/files/config/prod.json b/packages/schematics/src/generators/swagger/files/config/prod.json.template similarity index 100% rename from packages/schematics/src/lib/swagger/files/config/prod.json rename to packages/schematics/src/generators/swagger/files/config/prod.json.template diff --git a/packages/schematics/src/generators/swagger/generator.spec.ts b/packages/schematics/src/generators/swagger/generator.spec.ts new file mode 100644 index 00000000..40d4ca92 --- /dev/null +++ b/packages/schematics/src/generators/swagger/generator.spec.ts @@ -0,0 +1,75 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, readProjectConfiguration } from '@nx/devkit'; +import { swaggerGenerator } from './generator'; +import { SwaggerGeneratorSchema } from './schema'; +import applicationGenerator from '../application/generator'; +import initTypeormGenerator from '../init-typeorm/generator'; +import convictGenerator from '../convict/generator'; + +describe('swagger generator', () => { + let tree: Tree; + const options: SwaggerGeneratorSchema = { projectName: 'test' }; + + beforeAll(async () => { + tree = createTreeWithEmptyWorkspace(); + await applicationGenerator(tree, options); + }, 60000); + + it('should run successfully', async () => { + const config = readProjectConfiguration(tree, 'test'); + expect(config).toBeDefined(); + }); + + describe('common swagger generator tasks', () => { + beforeAll(async () => { + await swaggerGenerator(tree, options); + }, 60000); + + it('should add dependencies to package.json', async () => { + const fileContent = tree.read('package.json')?.toString('utf-8'); + expect(fileContent).toMatch(/"dependencies": {(.|\n)*"@nestjs\/swagger":/g); + }); + + it('should add Swagger configuration to main.ts', async () => { + const fileContent = tree.read(`./apps/${options.projectName}/src/main.ts`)?.toString('utf-8'); + expect(fileContent).toContain('SwaggerModule.setup'); + }); + + it('should not have BaseEntity model', async () => { + const filePath = `./apps/${options.projectName}/src/app/shared/model/entities/base.entity.ts`; + expect(tree.exists(filePath)).toBeFalsy(); + }); + + it('should not have config.ts', async () => { + const filePath = `./apps/${options.projectName}/src/config.ts`; + expect(tree.exists(filePath)).toBeFalsy(); + }); + }); + + describe('swagger generator with init-typeorm', () => { + beforeAll(async () => { + await initTypeormGenerator(tree, { ...options, db: 'mysql' }); + await swaggerGenerator(tree, options); + }, 60000); + + it('should update BaseEntity.ts configuration', async () => { + const filePath = `./apps/${options.projectName}/src/app/shared/model/entities/base.entity.ts`; + const fileContent = tree.read(filePath)?.toString('utf-8'); + expect(fileContent).toContain('ApiHideProperty'); + expect(fileContent).toContain('@nestjs/swagger'); + }); + }); + + describe('swagger generator with convict', () => { + beforeAll(async () => { + await convictGenerator(tree, options); + await swaggerGenerator(tree, options); + }, 60000); + + it('should add Swagger properties to config.ts', async () => { + const filePath = `./apps/${options.projectName}/src/config.ts`; + const fileContent = tree.read(filePath)?.toString('utf-8'); + expect(fileContent).toContain('swagger'); + }); + }); +}); diff --git a/packages/schematics/src/generators/swagger/generator.ts b/packages/schematics/src/generators/swagger/generator.ts new file mode 100644 index 00000000..577ee67b --- /dev/null +++ b/packages/schematics/src/generators/swagger/generator.ts @@ -0,0 +1,108 @@ +import { formatFiles, generateFiles, Tree, addDependenciesToPackageJson, installPackagesTask } from '@nx/devkit'; +import * as path from 'path'; +import { SwaggerGeneratorSchema } from './schema'; +import { ASTFileBuilder } from '../../utils/ast-file-builder'; +import { existsConvictConfig, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; +import { + defaultSwaggerConfig, + defaultSwaggerConfigType, + swaggerTemplate, + swaggerTemplateWithConfig, +} from './configvalue'; +import { packagesVersion } from '../packagesVersion'; + +export async function swaggerGenerator(tree: Tree, options: SwaggerGeneratorSchema): Promise<() => void> { + stopExecutionIfNotRunningAtRootFolder(tree); + addDependenciesToPackageJson( + tree, + { [packagesVersion['nestjsSwagger'].name]: packagesVersion['nestjsSwagger'].version }, + {}, + ); + const projectRoot = `apps/${options.projectName}/src`; + addSwaggerToMain(tree, projectRoot, options); + updateBaseEntity(tree, projectRoot); + generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options); + await formatFiles(tree); + return () => { + installPackagesTask(tree, false, '', 'pnpm'); + }; +} + +export default swaggerGenerator; + +function addSwaggerToMain(tree: Tree, projectRoot: string, options: SwaggerGeneratorSchema): void { + const mainPath = path.join(projectRoot, 'main.ts'); + + const content = new ASTFileBuilder(tree.read(mainPath)!.toString('utf-8')) + .addImports('DocumentBuilder', '@nestjs/swagger') + .addImports('SwaggerModule', '@nestjs/swagger'); + if (existsConvictConfig(tree, options.projectName)) { + updateConfigTypeFile(tree, projectRoot); + updateConfigFile(tree, projectRoot); + content + .addDefaultImports('config', 'config') + .insertLinesToFunctionBefore('bootstrap', 'app.listen', swaggerTemplateWithConfig); + } else { + content.insertLinesToFunctionBefore('bootstrap', 'app.listen', swaggerTemplate); + } + + if (content) { + tree.write(mainPath, content.build()); + } +} + +function updateConfigFile(tree: Tree, projectRoot: string): void { + const typesFile = path.join(projectRoot, 'config.ts'); + + let typesFileContent = tree.read(typesFile)!.toString('utf-8'); + typesFileContent = new ASTFileBuilder(typesFileContent) + .addPropertyToObjectLiteralParam('config', 0, 'swagger', defaultSwaggerConfig) + .build(); + + tree.write(typesFile, typesFileContent); +} + +function updateConfigTypeFile(tree: Tree, projectRoot: string): void { + const typesFile = path.join(projectRoot, 'app/shared/app-config.ts'); + + let typesFileContent = tree.read(typesFile)!.toString('utf-8'); + typesFileContent = new ASTFileBuilder(typesFileContent) + .addPropToInterface('AppConfig', 'swagger', defaultSwaggerConfigType) + .build(); + + tree.write(typesFile, typesFileContent); +} + +function updateBaseEntity(tree: Tree, projectRoot: string): void { + const baseEntityPath = path.join(projectRoot, 'app/shared/model/entities/base.entity.ts'); + + if (!tree.exists(baseEntityPath)) { + return; + } + + const fileContent = new ASTFileBuilder(tree.read(baseEntityPath)!.toString('utf-8')) + .addImports('ApiHideProperty', '@nestjs/swagger') + .addDecoratorToClassProp('BaseEntity', 'version', [ + { + name: 'ApiHideProperty', + arguments: [], + }, + ]) + .addDecoratorToClassProp('BaseEntity', 'createdAt', [ + { + name: 'ApiHideProperty', + arguments: [], + }, + ]) + .addDecoratorToClassProp('BaseEntity', 'updatedAt', [ + { + name: 'ApiHideProperty', + arguments: [], + }, + ]) + .build(); + + if (fileContent) { + tree.write(baseEntityPath, fileContent); + } +} diff --git a/packages/schematics/src/generators/swagger/schema.d.ts b/packages/schematics/src/generators/swagger/schema.d.ts new file mode 100644 index 00000000..1e85535b --- /dev/null +++ b/packages/schematics/src/generators/swagger/schema.d.ts @@ -0,0 +1,3 @@ +export interface SwaggerGeneratorSchema { + projectName: string; +} diff --git a/packages/schematics/src/generators/swagger/schema.json b/packages/schematics/src/generators/swagger/schema.json new file mode 100644 index 00000000..7e426f97 --- /dev/null +++ b/packages/schematics/src/generators/swagger/schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "SwaggerSchematic", + "title": "Swagger Schema", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "Target application where Swagger config is going to be created.", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What application would you like to modify?" + } + }, + "required": ["project"] +} diff --git a/packages/schematics/src/lib/auth-jwt/auth.factory.ts b/packages/schematics/src/lib/auth-jwt/auth.factory.ts deleted file mode 100644 index 1a07b41f..00000000 --- a/packages/schematics/src/lib/auth-jwt/auth.factory.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { Path, strings } from '@angular-devkit/core'; -import { apply, chain, mergeWith, Rule, template, Tree, url } from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import { noop } from 'rxjs'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { mergeFiles } from '../../utils/merge'; -import { - existsConvictConfig, - formatTsFile, - formatTsFiles, - installNodePackages, - stopExecutionIfNotRunningAtRootFolder, -} from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; - -function addAuthToCoreModule(): Rule { - return (tree: Tree): Tree => { - const module = new ModuleFinder(tree).find({ - name: 'core', - path: 'src/app/core/' as Path, - }); - if (!module) { - return tree; - } - - const fileContent = new ASTFileBuilder(tree.read(module)!.toString('utf-8')) - .addImports('AuthModule', './auth/auth.module') - .addImports('UserModule', './user/user.module') - .addToModuleDecorator('CoreModule', 'AuthModule', 'imports') - ?.addToModuleDecorator('CoreModule', 'AuthModule', 'exports') - ?.addToModuleDecorator('CoreModule', 'UserModule', 'imports') - ?.addToModuleDecorator('CoreModule', 'UserModule', 'exports') - ?.build(); - - if (fileContent) { - tree.overwrite(module, formatTsFile(fileContent)); - } - - return tree; - }; -} - -function updateConfigFile(tree: Tree): void { - const typesFile: Path = 'src/config.ts' as Path; - - const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')) - .addPropertyToObjectLiteralParam( - 'config', - 0, - 'jwt', - `{ - secret: { - doc: 'JWT secret', - format: String, - default: 'SECRET', - env: 'JWT_SECRET', - arg: 'jwtSecret', - secret: true, - }, - expiration: { - doc: 'Token expiration time', - default: '24h', - format: String, - env: 'JWT_EXPIRATION', - } - }`, - ) - .build(); - - tree.overwrite(typesFile, formatTsFile(typesFileContent)); -} - -function updateConfigTypeFile(tree: Tree): void { - const typesFile: Path = 'src/app/shared/app-config.ts' as Path; - - const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')) - .addPropToInterface('AppConfig', 'jwt', `{secret: string; expiration: string;}`) - .build(); - - tree.overwrite(typesFile, formatTsFile(typesFileContent)); -} - -function addJWTConfiguration(): Rule { - return (tree: Tree): Tree => { - updateConfigFile(tree); - updateConfigTypeFile(tree); - - return tree; - }; -} - -function deleteConfigFiles(): Rule { - return (tree: Tree) => { - tree.delete('config/develop.json'); - tree.delete('config/prod.json'); - - return tree; - }; -} - -function addUserEntityToDatasource(): Rule { - return tree => { - const filePath = 'src/app/shared/database/main-data-source.ts'; - const dataSourceContent = tree.read(filePath)?.toString(); - - if (!dataSourceContent) { - return tree; - } - - const updatedDataSource = new ASTFileBuilder(dataSourceContent) - .addImports('User', '../../core/user/model/entities/user.entity') - .addPropertyToObjectLiteralParam('AppDataSource', 0, 'entities', ['User']) - .build(); - - if (updatedDataSource) { - tree.overwrite(filePath, updatedDataSource); - } - - return tree; - }; -} - -export function authJWT(): Rule { - return (tree: Tree): Rule => { - const config: boolean = existsConvictConfig(tree); - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - mergeWith( - apply(url('./files'), [ - template({ - ...strings, - config, - packagesVersion, - }), - formatTsFiles(), - !config ? deleteConfigFiles() : noop, - mergeFiles(tree), - ]), - ), - addAuthToCoreModule(), - config ? addJWTConfiguration() : noop, - addUserEntityToDatasource(), - installNodePackages(), - ]); - }; -} diff --git a/packages/schematics/src/lib/auth-jwt/auth.factory_spec.ts b/packages/schematics/src/lib/auth-jwt/auth.factory_spec.ts deleted file mode 100644 index 8d87f4f8..00000000 --- a/packages/schematics/src/lib/auth-jwt/auth.factory_spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; -import { Idevon4ts_nodeApplicationOptions } from '../devon4ts_node-application/devon4ts_node-application.factory'; - -describe('Auth Factory', () => { - const runner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - const appOptions: Idevon4ts_nodeApplicationOptions = { - name: '', - }; - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('auth-jwt', {}).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate all files required for auth with JWT', async () => { - let tree = await runner.runSchematicAsync('application', appOptions).toPromise(); - tree = await runner.runSchematicAsync('auth-jwt', {}, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/core/auth/controllers/auth.controller.ts', - '/src/app/core/auth/controllers/auth.controller.spec.ts', - '/src/app/core/auth/decorators/get-user.decorator.ts', - '/src/app/core/auth/decorators/roles.decorator.ts', - '/src/app/core/auth/decorators/roles.decorator.spec.ts', - '/src/app/core/auth/guards/roles.guard.ts', - '/src/app/core/auth/guards/roles.guard.spec.ts', - '/src/app/core/auth/model/login.dto.ts', - '/src/app/core/auth/model/roles.enum.ts', - '/src/app/core/auth/model/user-request.interface.ts', - '/src/app/core/auth/services/auth.service.ts', - '/src/app/core/auth/services/auth.service.spec.ts', - '/src/app/core/auth/strategies/jwt.strategy.ts', - '/src/app/core/auth/strategies/jwt.strategy.spec.ts', - '/src/app/core/auth/auth.module.ts', - '/src/app/core/user/model/dto/user-payload.dto.ts', - '/src/app/core/user/model/dto/create-user.dto.ts', - '/src/app/core/user/model/entities/user.entity.ts', - '/src/app/core/user/services/user.service.ts', - '/src/app/core/user/services/user.service.spec.ts', - '/src/app/core/user/user.module.ts', - ]), - ); - }); - - it('should generate and merge config files if convict is present in the project', async () => { - let tree = await runner.runSchematicAsync('application', appOptions).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - tree = await runner.runSchematicAsync('auth-jwt', {}, tree).toPromise(); - - expect(tree.files).toEqual(expect.arrayContaining(['/config/develop.json', '/config/prod.json'])); - expect(tree.readContent('/config/develop.json')).toContain(`"jwt": { - "secret": "SECRET", - "expiration": "24h" - }`); - expect(tree.readContent('/config/prod.json')).toContain(`"jwt": { - "secret": "SECRET", - "expiration": "24h" - }`); - }); - - it('should update config properties if convict is present in the project', async () => { - let tree = await runner.runSchematicAsync('application', appOptions).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - tree = await runner.runSchematicAsync('auth-jwt', {}, tree).toPromise(); - - expect(tree.readContent('/src/config.ts')).toContain(`jwt: { - secret: { - doc: 'JWT secret', - format: String, - default: 'SECRET', - env: 'JWT_SECRET', - arg: 'jwtSecret', - secret: true, - }, - expiration: { - doc: 'Token expiration time', - default: '24h', - format: String, - env: 'JWT_EXPIRATION', - }, - }`); - }); - - it('should import AuthModule and UserModule in CoreModule', async () => { - let tree = await runner.runSchematicAsync('application', appOptions).toPromise(); - tree = await runner.runSchematicAsync('auth-jwt', {}, tree).toPromise(); - - const files: string[] = tree.files; - expect(files.find(filename => filename === '/src/app/core/core.module.ts')).toBeDefined(); - expect(tree.readContent('/src/app/core/core.module.ts')).toContain( - "import { AuthModule } from './auth/auth.module';", - ); - expect(tree.readContent('/src/app/core/core.module.ts')).toContain( - "import { UserModule } from './user/user.module';", - ); - expect(tree.readContent('/src/app/core/core.module.ts')).toMatch( - /imports: \[(.|\n)*(UserModule|AuthModule)(.|\n)*(UserModule|AuthModule)(.|\n)*\],/g, - ); - }); - - it('should add User entity to the main data source', async () => { - let tree = await runner.runSchematicAsync('application', appOptions).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'sqlite' }, tree).toPromise(); - tree = await runner.runSchematicAsync('auth-jwt', {}, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toMatch( - /entities: \[(.|\n)*User(.|\n)*\],/g, - ); - }); -}); diff --git a/packages/schematics/src/lib/auth-jwt/files/config/develop.json b/packages/schematics/src/lib/auth-jwt/files/config/develop.json deleted file mode 100644 index eafd273c..00000000 --- a/packages/schematics/src/lib/auth-jwt/files/config/develop.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "jwt": { - "secret": "SECRET", - "expiration": "24h" - } -} diff --git a/packages/schematics/src/lib/auth-jwt/files/config/prod.json b/packages/schematics/src/lib/auth-jwt/files/config/prod.json deleted file mode 100644 index eafd273c..00000000 --- a/packages/schematics/src/lib/auth-jwt/files/config/prod.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "jwt": { - "secret": "SECRET", - "expiration": "24h" - } -} diff --git a/packages/schematics/src/lib/auth-jwt/files/package.json b/packages/schematics/src/lib/auth-jwt/files/package.json deleted file mode 100644 index 870a7cd0..00000000 --- a/packages/schematics/src/lib/auth-jwt/files/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "dependencies": { - "<%= packagesVersion.nestjsPassport.packageName %>": "<%= packagesVersion.nestjsPassport.packageVersion %>", - "<%= packagesVersion.nestjsJwt.packageName %>": "<%= packagesVersion.nestjsJwt.packageVersion %>", - "<%= packagesVersion.passportJwt.packageName %>": "<%= packagesVersion.passportJwt.packageVersion %>", - "<%= packagesVersion.bcrypt.packageName %>": "<%= packagesVersion.bcrypt.packageVersion %>", - "<%= packagesVersion.passport.packageName %>": "<%= packagesVersion.passport.packageVersion %>", - "<%= packagesVersion.lodash.packageName %>": "<%= packagesVersion.lodash.packageVersion %>" - }, - "devDependencies": { - "<%= packagesVersion.typesPassportJwt.packageName %>": "<%= packagesVersion.typesPassportJwt.packageVersion %>", - "<%= packagesVersion.typesBcrypt.packageName %>": "<%= packagesVersion.typesBcrypt.packageVersion %>", - "<%= packagesVersion.typesLodash.packageName %>": "<%= packagesVersion.typesLodash.packageVersion %>" - } -} diff --git a/packages/schematics/src/lib/auth-jwt/schema.json b/packages/schematics/src/lib/auth-jwt/schema.json deleted file mode 100644 index b7cec387..00000000 --- a/packages/schematics/src/lib/auth-jwt/schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "AuthSchematic", - "title": "Auth JWT Schema", - "type": "object", - "properties": {} -} diff --git a/packages/schematics/src/lib/controller/controller.factory.ts b/packages/schematics/src/lib/controller/controller.factory.ts deleted file mode 100644 index f65a17c5..00000000 --- a/packages/schematics/src/lib/controller/controller.factory.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { basename, join, normalize, Path, strings } from '@angular-devkit/core'; -import { apply, chain, filter, mergeWith, move, noop, Rule, template, Tree, url } from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import { formatTsFile, formatTsFiles, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; -import * as pluralize from 'pluralize'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; - -export interface IControllerOptions { - name: string; - spec?: boolean; -} - -function updateModule(controllerName: string, modulePath: Path) { - return (tree: Tree): Tree => { - const moduleName = strings.classify(basename(modulePath as Path) + '-module'); - const module = new ModuleFinder(tree).find({ - name: basename(modulePath as Path), - path: modulePath as Path, - }); - if (!module) { - return tree; - } - - const fileContent = new ASTFileBuilder(tree.read(module)!.toString('utf-8')) - .addImports(strings.classify(controllerName) + 'Controller', './controllers/' + controllerName + '.controller') - .addToModuleDecorator(moduleName, strings.classify(controllerName) + 'Controller', 'controllers'); - - if (fileContent) { - tree.overwrite(module, formatTsFile(fileContent.build())); - } - - return tree; - }; -} - -export function main(options: IControllerOptions): Rule { - const name = pluralize(strings.dasherize(basename(options.name as Path))); - const path: Path = normalize(join('src/app' as Path, strings.dasherize(options.name), '..')); - - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - mergeWith( - apply(url('./files'), [ - options.spec ? noop() : filter(p => !p.endsWith('.spec.ts')), - template({ - ...strings, - name, - }), - move(path), - formatTsFiles(), - ]), - ), - updateModule(name, path), - ]); -} diff --git a/packages/schematics/src/lib/controller/controller.factory_spec.ts b/packages/schematics/src/lib/controller/controller.factory_spec.ts deleted file mode 100644 index d49328a0..00000000 --- a/packages/schematics/src/lib/controller/controller.factory_spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { normalize } from '@angular-devkit/core'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import { join } from 'path'; -import { IControllerOptions } from './controller.factory'; - -describe('Controller Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('controller', { name: 'controller' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate the controller files the current app', async () => { - const optionsApp: IControllerOptions = { - name: 'project', - }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('controller', optionsApp, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/controllers/projects.controller.ts', - '/src/app/controllers/projects.controller.spec.ts', - ]), - ); - }); - - it("shouldn't generate the spec if spec option is false", async () => { - const optionsApp: IControllerOptions = { - name: 'project', - spec: false, - }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('controller', optionsApp, tree).toPromise(); - - expect(tree.files).not.toContain('/src/app/controllers/projects.controller.spec.ts'); - }); - - it('should generate the controller at the specified module', async () => { - const optionsApp: IControllerOptions = { - name: 'fooBar/fooBar', - }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('controller', optionsApp, tree).toPromise(); - tree = await runner.runSchematicAsync('module', { name: 'fooBar' }, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/foo-bar/controllers/foo-bars.controller.ts', - '/src/app/foo-bar/controllers/foo-bars.controller.spec.ts', - ]), - ); - }); - - it('should add the controllers to its module', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('module', { name: 'foo' }, tree).toPromise(); - tree = await runner.runSchematicAsync('controller', { name: 'foo/foo' }, tree).toPromise(); - - const fooModuleContent = tree.readContent(normalize('/src/app/foo/foo.module.ts')); - expect(fooModuleContent).toContain("import { FoosController } from './controllers/foos.controller';"); - expect(fooModuleContent).toMatch(/controllers: \[(.|\n)*FoosController(.|\n)*\]/g); - }); - - it('should add the controllers to app module if no other module is specified', async () => { - const optionsApp: IControllerOptions = { - name: '', - }; - const optionsModule: IControllerOptions = { - name: 'foo', - }; - let tree = await runner.runSchematicAsync('application', optionsApp).toPromise(); - tree = await runner.runSchematicAsync('controller', optionsModule, tree).toPromise(); - - const fooModuleContent = tree.readContent(normalize('/src/app/app.module.ts')); - expect(fooModuleContent).toContain("import { FoosController } from './controllers/foos.controller';"); - expect(fooModuleContent).toMatch(/controllers: \[(.|\n)*FoosController(.|\n)*\]/g); - }); -}); diff --git a/packages/schematics/src/lib/controller/files/controllers/__name__.controller.spec.ts b/packages/schematics/src/lib/controller/files/controllers/__name__.controller.spec.ts deleted file mode 100644 index 0575ada6..00000000 --- a/packages/schematics/src/lib/controller/files/controllers/__name__.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { <%= classify(name) %>Controller } from './<%= name %>.controller'; - -describe('<%= classify(name) %>Controller', () => { - let controller: <%= classify(name) %>Controller; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [<%= classify(name) %>Controller], - }).compile(); - - controller = module.get<<%= classify(name) %>Controller>(<%= classify(name) %>Controller); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/packages/schematics/src/lib/controller/files/controllers/__name__.controller.ts b/packages/schematics/src/lib/controller/files/controllers/__name__.controller.ts deleted file mode 100644 index 0d0c7ade..00000000 --- a/packages/schematics/src/lib/controller/files/controllers/__name__.controller.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Controller } from '@nestjs/common'; - -@Controller('<%=name%>') -export class <%=classify(name)%>Controller {} diff --git a/packages/schematics/src/lib/controller/schema.json b/packages/schematics/src/lib/controller/schema.json deleted file mode 100644 index f1ab4226..00000000 --- a/packages/schematics/src/lib/controller/schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "ControllerSchema", - "title": "Controller Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the controller.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the controller?" - }, - "spec": { - "default": true, - "type": "boolean", - "description": "Specifies if a spec file is generated." - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/convict/convict.facotry_spec.ts b/packages/schematics/src/lib/convict/convict.facotry_spec.ts deleted file mode 100644 index db8f7a58..00000000 --- a/packages/schematics/src/lib/convict/convict.facotry_spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import { join } from 'path'; - -describe('Convict Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('convict', {}).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate all files to configure convict in the project', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - - expect(tree.files).toEqual(expect.arrayContaining(['/src/config.ts', '/config/develop.json', '/config/prod.json'])); - }); - - it('should update the main in order to use properties from config', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - - const mainContent = tree.readContent('/src/main.ts'); - expect(mainContent).toContain('await app.listen(config.port);'); - expect(mainContent).toContain('defaultVersion: config.defaultVersion,'); - }); - - it('should update the logger in order to use properties from config', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - - const mainContent = tree.readContent('/src/app/shared/logger/winston.logger.ts'); - expect(mainContent).toContain('oneLineStack(config.logger.oneLineStack),'); - expect(mainContent).toContain('colorize(config.logger.color),'); - expect(mainContent).toContain('level: config.logger.loggerLevel,'); - }); -}); diff --git a/packages/schematics/src/lib/convict/convict.factory.ts b/packages/schematics/src/lib/convict/convict.factory.ts deleted file mode 100644 index 0adc397e..00000000 --- a/packages/schematics/src/lib/convict/convict.factory.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Path } from '@angular-devkit/core'; -import { apply, chain, mergeWith, Rule, strings, template, Tree, url } from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { mergeFiles } from '../../utils/merge'; -import { - formatTsFile, - formatTsFiles, - installNodePackages, - stopExecutionIfNotRunningAtRootFolder, -} from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; - -function updateMain(): Rule { - return (tree: Tree): Tree => { - let content = tree.read('/src/main.ts')?.toString('utf-8'); - - if (!content) { - return tree; - } - - content = content.replace('await app.listen(3000);', 'await app.listen(config.port);'); - content = content.replace("defaultVersion: '1',", 'defaultVersion: config.defaultVersion,'); - - content = new ASTFileBuilder(content).addDefaultImports('config', './config').build(); - - if (content) { - tree.overwrite('/src/main.ts', formatTsFile(content)); - } - return tree; - }; -} - -function updateLogger(): Rule { - return (tree: Tree): Tree => { - let content = tree.read('/src/app/shared/logger/winston.logger.ts')?.toString('utf-8'); - - if (!content) { - return tree; - } - - content = content.replace(/oneLineStack\(\w*\),/g, 'oneLineStack(config.logger.oneLineStack),'); - content = content.replace(/colorize\(\w*\),/g, 'colorize(config.logger.color),'); - content = content.replace(/level:.*,/g, 'level: config.logger.loggerLevel,'); - - content = new ASTFileBuilder(content).addDefaultImports('config', '../../../config').build(); - - if (content) { - tree.overwrite('/src/app/shared/logger/winston.logger.ts', formatTsFile(content)); - } - - return tree; - }; -} - -function addConfigToCoreModule(): Rule { - return (tree: Tree): Tree => { - const module = new ModuleFinder(tree).find({ - name: 'core', - path: 'src/app/core/' as Path, - }); - if (!module) { - return tree; - } - - let fileContent: ASTFileBuilder | undefined = new ASTFileBuilder(tree.read(module)!.toString('utf-8')); - - if (fileContent.build().includes('provide: CONFIG_PROVIDER')) { - return tree; - } - - fileContent = fileContent - .addImports('CONFIG_PROVIDER', '../shared/dependency-injection.constants') - .addDefaultImports('config', '../../config') - .addToModuleDecorator( - 'CoreModule', - `{ - provide: CONFIG_PROVIDER, - useValue: config, - }`, - 'providers', - ); - - fileContent?.addToModuleDecorator('CoreModule', 'CONFIG_PROVIDER', 'exports'); - - if (fileContent) { - tree.overwrite(module, formatTsFile(fileContent.build())); - } - - return tree; - }; -} - -export function initConvict(): Rule { - return (host: Tree): Rule => { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - mergeWith( - apply(url('./files'), [ - template({ - ...strings, - ...packagesVersion, - }), - formatTsFiles(), - mergeFiles(host), - ]), - ), - updateMain(), - updateLogger(), - addConfigToCoreModule(), - installNodePackages(), - ]); - }; -} diff --git a/packages/schematics/src/lib/convict/files/package.json b/packages/schematics/src/lib/convict/files/package.json deleted file mode 100644 index 19e5efe5..00000000 --- a/packages/schematics/src/lib/convict/files/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "dependencies": { - "<%= convict.packageName %>": "<%= convict.packageVersion %>" - }, - "devDependencies": { - "<%= typesConvict.packageName %>": "<%= typesConvict.packageVersion %>" - } -} diff --git a/packages/schematics/src/lib/devon4ts_node-application/devon4ts_node-application.factory.ts b/packages/schematics/src/lib/devon4ts_node-application/devon4ts_node-application.factory.ts deleted file mode 100644 index 4105ad18..00000000 --- a/packages/schematics/src/lib/devon4ts_node-application/devon4ts_node-application.factory.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { join, Path, strings } from '@angular-devkit/core'; -import { - apply, - chain, - externalSchematic, - mergeWith, - move, - Rule, - template, - Tree, - url, -} from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { mergeFiles } from '../../utils/merge'; -import { formatTsFile } from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; - -export interface Idevon4ts_nodeApplicationOptions { - name: string; -} - -function updateMain(project: string) { - return (host: Tree): Tree => { - let mainFile = host.read(join(project as Path, 'src/main.ts'))!.toString('utf-8'); - - mainFile = mainFile.replace('./app.module', './app/app.module'); - mainFile = mainFile.replace( - 'NestFactory.create(AppModule)', - `NestFactory.create(AppModule, { bufferLogs: true }); - - const logger = await app.resolve(WinstonLogger); - app.useLogger(logger); - - `, - ); - - mainFile = new ASTFileBuilder(mainFile) - .insertLinesToFunctionBefore( - 'bootstrap', - 'app.listen', - `app.useGlobalPipes( - new ValidationPipe({ - transform: true, - transformOptions: { - excludeExtraneousValues: true, - }, - }), - ); - app.useGlobalFilters(new EntityNotFoundFilter(logger));`, - ) - .insertLinesToFunctionBefore( - 'bootstrap', - 'app.listen', - `app.enableVersioning({ - type: VersioningType.URI, - defaultVersion: '1', - });`, - ) - .addImports('WinstonLogger', './app/shared/logger/winston.logger') - .addImports('ValidationPipe', '@nestjs/common') - .addImports('VersioningType', '@nestjs/common') - .addImports('EntityNotFoundFilter', './app/shared/filters/entity-not-found.filter') - .addReturnTypeToFunction('bootstrap', 'Promise') - .build(); - host.overwrite(join(project as Path, 'src/main.ts'), formatTsFile(mainFile)); - - return host; - }; -} - -function addDeclarationToModule(project: string): Rule { - return (tree: Tree): Tree => { - const module = new ModuleFinder(tree).find({ - name: 'app', - path: (project + '/src/app/') as Path, - }); - if (!module) { - return tree; - } - - const fileContent = new ASTFileBuilder(tree.read(module)!.toString('utf-8')) - .addImports('CoreModule', './core/core.module') - .addToModuleDecorator('AppModule', 'CoreModule', 'imports'); - - if (fileContent) { - tree.overwrite(module, formatTsFile(fileContent.build())); - } - - return tree; - }; -} - -// You don't have to export the function as default. You can also have more than one rule factory -// per file. -export function devon4ts_nodeApplication(options: Idevon4ts_nodeApplicationOptions): Rule { - const formattedOptions = { ...options }; - formattedOptions.name = strings.dasherize(formattedOptions.name); - const name = formattedOptions.name; - - return chain([ - externalSchematic('@nestjs/schematics', 'application', formattedOptions), - move(`./${name}/src/app.controller.spec.ts`, `./${name}/src/app/app.controller.spec.ts`), - move(`./${name}/src/app.controller.ts`, `./${name}/src/app/app.controller.ts`), - move(`./${name}/src/app.module.ts`, `./${name}/src/app/app.module.ts`), - move(`./${name}/src/app.service.ts`, `./${name}/src/app/app.service.ts`), - (tree: Tree): Tree => { - if (tree.exists(join(name as Path, '.eslintrc.js'))) { - tree.delete(join(name as Path, '.eslintrc.js')); - } - - return tree; - }, - (tree: Tree): Rule => { - return mergeWith( - apply(url('./files'), [ - template({ - ...strings, - ...formattedOptions, - ...packagesVersion, - }), - move(name), - mergeFiles(tree), - ]), - ); - }, - addDeclarationToModule(name), - updateMain(name), - ]); -} diff --git a/packages/schematics/src/lib/devon4ts_node-application/devon4ts_node-application.factory_spec.ts b/packages/schematics/src/lib/devon4ts_node-application/devon4ts_node-application.factory_spec.ts deleted file mode 100644 index 8ed98407..00000000 --- a/packages/schematics/src/lib/devon4ts_node-application/devon4ts_node-application.factory_spec.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import { readFile } from 'fs/promises'; -import * as path from 'path'; -import { join } from 'path'; - -describe('Application Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - const defaultOptions: Record = { - name: 'project', - }; - - it('should generate all NestJS and devon4ts_node files', done => { - runner.runSchematicAsync('application', defaultOptions).subscribe(tree => { - const files: string[] = tree.files; - expect(files).toEqual([ - '/project/.prettierrc', - '/project/README.md', - '/project/nest-cli.json', - '/project/package.json', - '/project/tsconfig.build.json', - '/project/tsconfig.json', - '/project/.eslintrc.js', - '/project/src/main.ts', - '/project/src/app/app.controller.spec.ts', - '/project/src/app/app.controller.ts', - '/project/src/app/app.module.ts', - '/project/src/app/app.service.ts', - '/project/src/app/core/core.module.ts', - '/project/src/app/shared/exceptions/entity-not-found.exception.ts', - '/project/src/app/shared/filters/entity-not-found.filter.ts', - '/project/src/app/shared/logger/winston.logger.ts', - '/project/test/app.e2e-spec.ts', - '/project/test/jest-e2e.json', - '/project/.husky/.gitignore', - '/project/.husky/pre-commit', - '/project/.vscode/extensions.json', - '/project/.vscode/settings.json', - ]); - done(); - }); - }); - - it('should dasherize the application name', done => { - const options: Record = { - name: 'dasherizeProject', - }; - runner.runSchematicAsync('application', options).subscribe(tree => { - const files: string[] = tree.files; - expect( - files.map(elem => elem.startsWith('/dasherize-project/')).reduce((prev, curr) => prev && curr, true), - ).toBeTruthy(); - done(); - }); - }); - - it('should override .prettierrc content', done => { - readFile(join(__dirname, './files/.prettierrc')) - .then(buffer => buffer.toString()) - .then(content => { - runner.runSchematicAsync('application', defaultOptions).subscribe(tree => { - expect(tree.readContent('/project/.prettierrc').trimEnd()).toStrictEqual(content.trimEnd()); - done(); - }); - }); - }); - - it('should add CoreModule to AppModule imports', done => { - runner.runSchematicAsync('application', defaultOptions).subscribe(tree => { - const appModuleContent = tree.readContent('/project/src/app/app.module.ts'); - expect(appModuleContent).toContain("import { CoreModule } from './core/core.module'"); - - expect(appModuleContent).toMatch(/[.\n]*imports: \[.*CoreModule.*\][.\n]*/); - done(); - }); - }); - - it('should update main.ts to add versioning, logger and validation pipe', done => { - runner.runSchematicAsync('application', defaultOptions).subscribe(tree => { - const appModuleContent = tree.readContent('/project/src/main.ts'); - expect(appModuleContent).toContain("import { WinstonLogger } from './app/shared/logger/winston.logger'"); - expect(appModuleContent).toContain( - "import { EntityNotFoundFilter } from './app/shared/filters/entity-not-found.filter'", - ); - expect(appModuleContent).toMatch( - /[.\n]*import {.*(ValidationPipe|VersioningType).*(ValidationPipe|VersioningType).*} from '@nestjs\/common';[.\n]*/, - ); - expect(appModuleContent).toContain('app.enableVersioning'); - expect(appModuleContent).toContain(`NestFactory.create(AppModule, { bufferLogs: true }); - - const logger = await app.resolve(WinstonLogger); - app.useLogger(logger);`); - expect(appModuleContent).toContain(`app.useGlobalPipes( - new ValidationPipe({ - transform: true, - transformOptions: { - excludeExtraneousValues: true, - }, - }), - ); - app.useGlobalFilters(new EntityNotFoundFilter(logger));`); - done(); - }); - }); -}); diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/nest-cli.json b/packages/schematics/src/lib/devon4ts_node-application/files/nest-cli.json deleted file mode 100644 index 2faf1218..00000000 --- a/packages/schematics/src/lib/devon4ts_node-application/files/nest-cli.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "collection": "@devon4ts_node/schematics" -} \ No newline at end of file diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/package.json b/packages/schematics/src/lib/devon4ts_node-application/files/package.json deleted file mode 100644 index 2969af14..00000000 --- a/packages/schematics/src/lib/devon4ts_node-application/files/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "scripts": { - "lint": "eslint {src,apps,libs,test}/**/*.ts --fix", - "prepare": "husky install" - }, - "dependencies": { - "<%= winston.packageName %>": "<%= winston.packageVersion %>", - "<%= classTransformer.packageName %>": "<%= classTransformer.packageVersion %>", - "<%= classValidator.packageName %>": "<%= classValidator.packageVersion %>", - "<%= devon4ts_nodeCommon.packageName %>": "<%= devon4ts_nodeCommon.packageVersion %>", - "<%= devon4ts_nodeLogform.packageName %>": "<%= devon4ts_nodeLogform.packageVersion %>" - }, - "devDependencies": { - "<%= devon4ts_nodeSchematics.packageName %>": "<%= devon4ts_nodeSchematics.packageVersion %>", - "<%= husky.packageName %>": "<%= husky.packageVersion %>", - "<%= prettyQuick.packageName %>": "<%= prettyQuick.packageVersion %>", - "<%= eslintPluginPrettier.packageName %>": "<%= eslintPluginPrettier.packageVersion %>" - }, - "jest": { - "coverageDirectory": "../coverage" - } -} \ No newline at end of file diff --git a/packages/schematics/src/lib/devon4ts_node-application/files/tsconfig.json b/packages/schematics/src/lib/devon4ts_node-application/files/tsconfig.json deleted file mode 100644 index 936d1938..00000000 --- a/packages/schematics/src/lib/devon4ts_node-application/files/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "strictNullChecks": true, - "noImplicitAny": true, - "strictBindCallApply": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "strict": true, - "skipDefaultLibCheck": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "skipLibCheck": true, - "allowSyntheticDefaultImports": true - } -} diff --git a/packages/schematics/src/lib/devon4ts_node-application/schema.json b/packages/schematics/src/lib/devon4ts_node-application/schema.json deleted file mode 100644 index a0390ea7..00000000 --- a/packages/schematics/src/lib/devon4ts_node-application/schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "devon4ts_nodeApplicationSchema", - "title": "devon4ts_node-application Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "x-prompt": "What is the name of your application?" - } - }, - "required": [ - "name" - ] -} \ No newline at end of file diff --git a/packages/schematics/src/lib/entity/entity.factory.ts b/packages/schematics/src/lib/entity/entity.factory.ts deleted file mode 100644 index 2a44a40b..00000000 --- a/packages/schematics/src/lib/entity/entity.factory.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { dirname, join, Path, strings } from '@angular-devkit/core'; -import { apply, chain, MergeStrategy, mergeWith, move, Rule, template, Tree, url } from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import { basename, normalize } from 'path'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { formatTsFile, formatTsFiles, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; - -interface IEntityOptions { - name: string; - module?: string; - overwrite?: boolean; -} - -function transform(options: IEntityOptions): IEntityOptions { - const newOptions = Object.assign({}, options); - - newOptions.name = strings.dasherize(basename(options.name)); - newOptions.module = options.name.includes('/') ? dirname(options.name as Path) : undefined; - - return newOptions; -} - -function addEntityToModule(options: IEntityOptions, className: string): Rule { - return (tree: Tree): Tree => { - const modulePosiblePath = join('src/app' as Path, options.module ?? '.'); - const moduleName = strings.classify((options.module ?? 'app') + '-module'); - - const module = new ModuleFinder(tree).find({ - name: moduleName, - path: modulePosiblePath, - }); - if (!module) { - return tree; - } - - const content = new ASTFileBuilder(tree.read(module)!.toString()) - .addImports(className, './model/entities/' + options.name + '.entity') - .addImports('TypeOrmModule', '@nestjs/typeorm') - .addTypeormFeatureToModule(moduleName, className); - - tree.overwrite(module, formatTsFile(content.build())); - - return tree; - }; -} - -function addEntityToDataSource(options: IEntityOptions, className: string, fileName: string): Rule { - return tree => { - const filePath = 'src/app/shared/database/main-data-source.ts'; - const dataSourceContent = tree.read(filePath)?.toString(); - - if (!dataSourceContent) { - return tree; - } - - const updatedDataSource = new ASTFileBuilder(dataSourceContent) - .addImports(className, join('../../' as Path, options.module ?? '.', 'model/entities', fileName)) - .addPropertyToObjectLiteralParam('AppDataSource', 0, 'entities', [className]) - .build(); - - if (updatedDataSource) { - tree.overwrite(filePath, updatedDataSource); - } - - return tree; - }; -} - -export function main(options: IEntityOptions): Rule { - options = transform(options); - - const className = strings.classify(options.name); - const fileName = options.name + '.entity'; - - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - mergeWith( - apply(url('./files'), [ - template({ - ...strings, - ...options, - }), - formatTsFiles(), - move(strings.dasherize(normalize('/' + join('src/app/' as Path, options.module ?? '.', './model/entities')))), - ]), - options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Default, - ), - addEntityToModule(options, className), - addEntityToDataSource(options, className, fileName), - ]); -} diff --git a/packages/schematics/src/lib/entity/entity.factory_spec.ts b/packages/schematics/src/lib/entity/entity.factory_spec.ts deleted file mode 100644 index d2a8c50e..00000000 --- a/packages/schematics/src/lib/entity/entity.factory_spec.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { EmptyTree } from '@angular-devkit/schematics'; -import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Entity Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('entity', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate the entity at root level if no module is provided', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('entity', { name: 'foo' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/model/entities/foo.entity.ts'); - expect(tree.readContent('/src/app/model/entities/foo.entity.ts')).toContain('class Foo '); - }); - - it('should dasherize the entity file name', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('entity', { name: 'fooBar' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/model/entities/foo-bar.entity.ts'); - expect(tree.readContent('/src/app/model/entities/foo-bar.entity.ts')).toContain('class FooBar '); - }); - - it('should generate the entity at the provided module', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('entity', { name: 'foo/bar' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/foo/model/entities/bar.entity.ts'); - expect(tree.readContent('/src/app/foo/model/entities/bar.entity.ts')).toContain('class Bar '); - }); - - it('should add the entity to AppModule as TypeOrmModule.forFeature', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('entity', { name: 'foo' }, tree).toPromise(); - - const moduleContent = tree.readContent('/src/app/app.module.ts'); - expect(moduleContent).toContain("import { Foo } from './model/entities/foo.entity'"); - expect(moduleContent).toContain("import { TypeOrmModule } from '@nestjs/typeorm'"); - expect(moduleContent).toMatch(/imports: \[(.|\n)*TypeOrmModule.forFeature\(\[(.|\n)*Foo(.|\n)*\]\)(.|\n)*\],/g); - }); - - it('should add the entity to the specified module as TypeOrmModule.forFeature', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('module', { name: 'foo' }, tree).toPromise(); - tree = await runner.runSchematicAsync('entity', { name: 'foo/bar' }, tree).toPromise(); - - const moduleContent = tree.readContent('/src/app/foo/foo.module.ts'); - expect(moduleContent).toContain("import { Bar } from './model/entities/bar.entity'"); - expect(moduleContent).toContain("import { TypeOrmModule } from '@nestjs/typeorm'"); - expect(moduleContent).toMatch(/imports: \[(.|\n)*TypeOrmModule.forFeature\(\[(.|\n)*Bar(.|\n)*\]\)(.|\n)*\],/g); - }); - - it('should overwrite previous entity if overwrite option is true', async () => { - const fakeTree: UnitTestTree = new UnitTestTree(new EmptyTree()); - const fakeEntityContent = 'FAKE ENTITY'; - const entityPath = '/src/app/model/entities/foo.entity.ts'; - - fakeTree.create(entityPath, fakeEntityContent); - - let tree = await runner.runSchematicAsync('application', { name: '' }, fakeTree).toPromise(); - tree = await runner.runSchematicAsync('entity', { name: 'foo', overwrite: true }, tree).toPromise(); - - const entityContent = tree.readContent(entityPath); - expect(entityContent).not.toContain(fakeEntityContent); - expect(entityContent).toContain('class Foo '); - }); - - it('should add the entity to main data source', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'postgres' }, tree).toPromise(); - tree = await runner.runSchematicAsync('entity', { name: 'foo', overwrite: true }, tree).toPromise(); - - const mainDataSource = tree.readContent('/src/app/shared/database/main-data-source.ts'); - expect(mainDataSource).toMatch(/entities: \[(.|\n)*Foo(.|\n)*\]/g); - expect(mainDataSource).toContain(`import { Foo } from '../../model/entities/foo.entity'`); - }); -}); diff --git a/packages/schematics/src/lib/entity/files/__name__.entity.ts b/packages/schematics/src/lib/entity/files/__name__.entity.ts deleted file mode 100644 index 466defe1..00000000 --- a/packages/schematics/src/lib/entity/files/__name__.entity.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Entity } from 'typeorm'; -import { BaseEntity } from '../../../shared/model/entities/base.entity'; - -@Entity() -export class <%= classify(name) %> extends BaseEntity { - -} diff --git a/packages/schematics/src/lib/entity/schema.json b/packages/schematics/src/lib/entity/schema.json deleted file mode 100644 index 111ef521..00000000 --- a/packages/schematics/src/lib/entity/schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "EntitySchematic", - "title": "Entity Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The entity name. To create a entity with name Banana in the module fruits you need to introduce fruits/banana", - "x-prompt": "Introduce the entity name" - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/filter/filter.factory.ts b/packages/schematics/src/lib/filter/filter.factory.ts deleted file mode 100644 index 2a9714af..00000000 --- a/packages/schematics/src/lib/filter/filter.factory.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { chain, externalSchematic, Rule } from '@angular-devkit/schematics'; -import { - BaseNestOptions, - transformOptionsToNestJS, - stopExecutionIfNotRunningAtRootFolder, -} from '../../utils/tree-utils'; - -export function main(options: BaseNestOptions): Rule { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - transformOptionsToNestJS(options, 'filters'), - externalSchematic('@nestjs/schematics', 'filter', options), - ]); -} diff --git a/packages/schematics/src/lib/filter/filter.factory_spec.ts b/packages/schematics/src/lib/filter/filter.factory_spec.ts deleted file mode 100644 index 457386bd..00000000 --- a/packages/schematics/src/lib/filter/filter.factory_spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Filter Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('filter', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should not generate spec if spec param is false', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('filter', { name: 'filter', spec: false }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/filters/filter.filter.ts'); - expect(tree.files).not.toContain('/src/app/filters/filter.filter.spec.ts'); - }); - - it('should create the filter inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('filter', { name: 'filter' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/filters/filter.filter.ts'); - expect(tree.files).toContain('/src/app/filters/filter.filter.spec.ts'); - }); - - it('should create the filter at specified module inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('filter', { name: 'module/filter' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/filters/filter.filter.ts'); - expect(tree.files).toContain('/src/app/module/filters/filter.filter.spec.ts'); - }); -}); diff --git a/packages/schematics/src/lib/filter/schema.json b/packages/schematics/src/lib/filter/schema.json deleted file mode 100644 index 93a0ccf3..00000000 --- a/packages/schematics/src/lib/filter/schema.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SchematicsNestFilter", - "title": "Nest Filter Options Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the filter.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the filter?" - }, - "spec": { - "default": true, - "description": "Specifies if a spec file is generated." - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/guard/guard.factory.ts b/packages/schematics/src/lib/guard/guard.factory.ts deleted file mode 100644 index d6fbe571..00000000 --- a/packages/schematics/src/lib/guard/guard.factory.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { chain, externalSchematic, Rule } from '@angular-devkit/schematics'; -import { - BaseNestOptions, - stopExecutionIfNotRunningAtRootFolder, - transformOptionsToNestJS, -} from '../../utils/tree-utils'; - -export function main(options: BaseNestOptions): Rule { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - transformOptionsToNestJS(options, 'guards'), - externalSchematic('@nestjs/schematics', 'guard', options), - ]); -} diff --git a/packages/schematics/src/lib/guard/guard.factory_spec.ts b/packages/schematics/src/lib/guard/guard.factory_spec.ts deleted file mode 100644 index be668e3b..00000000 --- a/packages/schematics/src/lib/guard/guard.factory_spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Guard Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('guard', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should create the guard inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('guard', { name: 'guard' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/guards/guard.guard.ts'); - expect(tree.files).toContain('/src/app/guards/guard.guard.spec.ts'); - }); - - it('should not generate spec if spec param is false', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('guard', { name: 'guard', spec: false }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/guards/guard.guard.ts'); - expect(tree.files).not.toContain('/src/app/guards/guard.guard.spec.ts'); - }); - - it('should create the guard at specified module inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('guard', { name: 'module/guard' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/guards/guard.guard.ts'); - expect(tree.files).toContain('/src/app/module/guards/guard.guard.spec.ts'); - }); -}); diff --git a/packages/schematics/src/lib/guard/schema.json b/packages/schematics/src/lib/guard/schema.json deleted file mode 100644 index a1d66a78..00000000 --- a/packages/schematics/src/lib/guard/schema.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SchematicsNestGuard", - "title": "Nest Guard Options Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the guard.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the guard?" - }, - "spec": { - "default": true, - "description": "Specifies if a spec file is generated." - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/init-typeorm/files/config/develop.json b/packages/schematics/src/lib/init-typeorm/files/config/develop.json deleted file mode 100644 index fb0a4b45..00000000 --- a/packages/schematics/src/lib/init-typeorm/files/config/develop.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "database": { <% if (db === 'mysql') { %> - "type": "mysql", - "host": "localhost", - "port": 3306, - "username": "test", - "password": "test", - "database": "test",<% - } %><% if (db === 'mariadb') { %> - "type": "mariadb", - "host": "localhost", - "port": 3306, - "username": "test", - "password": "test", - "database": "test",<% - } %><% if (db === 'sqlite') { %> - "type": "sqlite", - "database": ":memory:",<% - } %><% if (db === 'postgres') { %> - "type": "postgres", - "host": "localhost", - "port": 5432, - "username": "test", - "password": "test", - "database": "test",<% - } %><% if (db === 'cockroachdb') { %> - "type": "cockroachdb", - "host": "localhost", - "port": 26257, - "username": "root", - "password": "", - "database": "defaultdb",<% - } %><% if (db === 'mssql') { %> - "type": "mssql", - "host": "localhost", - "username": "sa", - "password": "Admin12345", - "database": "tempdb",<% - } %><% if (db === 'oracle') { %> - "type": "oracle", - "host": "localhost", - "port": 1521, - "username": "system", - "password": "oracle", - "sid": "xe.oracle.docker",<% - } %><% if (db === 'mongodb') { %> - "type": "mongodb", - "database": "test", <% - } %> - "synchronize": false, - "migrationsRun": true, - "logging": true - } -} diff --git a/packages/schematics/src/lib/init-typeorm/files/config/prod.json b/packages/schematics/src/lib/init-typeorm/files/config/prod.json deleted file mode 100644 index 9f206fe0..00000000 --- a/packages/schematics/src/lib/init-typeorm/files/config/prod.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "database": {<% if (db === 'mysql') { %> - "type": "mysql", - "host": "localhost", - "port": 3306, - "username": "test", - "password": "test", - "database": "test",<% - } %><% if (db === 'mariadb') { %> - "type": "mariadb", - "host": "localhost", - "port": 3306, - "username": "test", - "password": "test", - "database": "test",<% - } %><% if (db === 'sqlite') { %> - "type": "sqlite", - "database": ":memory:",<% - } %><% if (db === 'postgres') { %> - "type": "postgres", - "host": "localhost", - "port": 5432, - "username": "test", - "password": "test", - "database": "test",<% - } %><% if (db === 'cockroachdb') { %> - "type": "cockroachdb", - "host": "localhost", - "port": 26257, - "username": "root", - "password": "", - "database": "defaultdb",<% - } %><% if (db === 'mssql') { %> - "type": "mssql", - "host": "localhost", - "username": "sa", - "password": "Admin12345", - "database": "tempdb",<% - } %><% if (db === 'oracle') { %> - "type": "oracle", - "host": "localhost", - "port": 1521, - "username": "system", - "password": "oracle", - "sid": "xe.oracle.docker",<% - } %><% if (db === 'mongodb') { %> - "type": "mongodb", - "database": "test", <% - } %> - "synchronize": false, - "migrationsRun": true, - "logging": true - } -} diff --git a/packages/schematics/src/lib/init-typeorm/files/docker-compose.yml b/packages/schematics/src/lib/init-typeorm/files/docker-compose.yml deleted file mode 100644 index fe184c99..00000000 --- a/packages/schematics/src/lib/init-typeorm/files/docker-compose.yml +++ /dev/null @@ -1,45 +0,0 @@ -version: '3' -services:<% if (db === 'mysql') { %> - mysql: - image: 'mysql:5.7.10' - ports: - - '3306:3306' - environment: - MYSQL_ROOT_PASSWORD: 'admin' - MYSQL_USER: 'test' - MYSQL_PASSWORD: 'test' - MYSQL_DATABASE: 'test'<% } %><% if (db === 'mariadb') { %> - mariadb: - image: 'mariadb:10.1.16' - ports: - - '3306:3306' - environment: - MYSQL_ROOT_PASSWORD: 'admin' - MYSQL_USER: 'test' - MYSQL_PASSWORD: 'test' - MYSQL_DATABASE: 'test'<% } %><% if (db === 'postgres') { %> - postgres: - image: "postgres:9.6.1" - ports: - - "5432:5432" - environment: - POSTGRES_USER: "test" - POSTGRES_PASSWORD: "test" - POSTGRES_DB: "test"<% } %><% if (db === 'cockroachdb') { %> - cockroachdb: - image: "cockroachdb/cockroach:v2.1.4" - command: start --insecure - ports: - - "26257:26257"<% } %><% if (db === 'mssql') { %> - mssql: - image: 'microsoft/mssql-server-linux:rc2' - ports: - - '1433:1433' - environment: - SA_PASSWORD: 'Admin12345' - ACCEPT_EULA: 'Y'<% } %><% if (db === 'mongodb') { %> - mongodb: - image: 'mongo:4.0.6' - container_name: 'typeorm-mongodb' - ports: - - '27017:27017'<% } %> diff --git a/packages/schematics/src/lib/init-typeorm/files/package.json b/packages/schematics/src/lib/init-typeorm/files/package.json deleted file mode 100644 index 8c112ce0..00000000 --- a/packages/schematics/src/lib/init-typeorm/files/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "scripts": { - "typeorm": "node_modules/.bin/typeorm-ts-node-commonjs", - "typeorm:datasource": "node_modules/.bin/typeorm-ts-node-commonjs -d ./src/app/shared/database/main-data-source.ts" - }, - "dependencies": { - "<%= packagesVersion.nestjsTypeorm.packageName %>": "<%= packagesVersion.nestjsTypeorm.packageVersion %>", - "<%= packagesVersion.typeorm.packageName %>": "<%= packagesVersion.typeorm.packageVersion %>", - "<%= packagesVersion[db].packageName %>": "<%= packagesVersion[db].packageVersion %>" - } -} diff --git a/packages/schematics/src/lib/init-typeorm/init-typeorm.factory.ts b/packages/schematics/src/lib/init-typeorm/init-typeorm.factory.ts deleted file mode 100644 index 467b93e0..00000000 --- a/packages/schematics/src/lib/init-typeorm/init-typeorm.factory.ts +++ /dev/null @@ -1,291 +0,0 @@ -import { join, Path } from '@angular-devkit/core'; -import { apply, chain, filter, mergeWith, noop, Rule, template, Tree, url } from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { mergeFiles } from '../../utils/merge'; -import { - existsConvictConfig, - formatTsFile, - formatTsFiles, - installNodePackages, - runningAtRootFolder, -} from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; - -const databaseConvictOptions: Record = { - mysql: `${printType('mysql')} - ${printHost('localhost')} - ${printPort(3306)} - ${printUsername('test')} - ${printPassword('test')} - ${printDatabase('test')}`, - mariadb: `${printType('mariadb')} - ${printHost('localhost')} - ${printPort(3306)} - ${printUsername('test')} - ${printPassword('test')} - ${printDatabase('test')}`, - sqlite: `${printType('sqlite')} ${printDatabase(':memory:')}`, - postgres: `${printType('postgres')} - ${printHost('localhost')} - ${printPort(5432)} - ${printUsername('test')} - ${printPassword('test')} - ${printDatabase('test')}`, - cockroachdb: `${printType('cockroachdb')} - ${printHost('localhost')} - ${printPort(2625)}, - ${printUsername('root')} - ${printPassword('')} - ${printDatabase('defaultdb')}`, - mssql: `${printType('mssql')} - ${printHost('localhost')} - ${printUsername('sa')} - ${printPassword('Admin12345')} - ${printDatabase('tempdb')}`, - oracle: `${printType('oracle')} - ${printHost('localhost')} - ${printPort(1521)} - ${printUsername('system')} - ${printPassword('oracle')} - ${printSID('xe.oracle.docker')}`, - mongodb: `${printType('mongodb')} ${printDatabase('test')}`, -}; - -const databaseConvictTypes: Record = { - mysql: `type: string; - host: string; - port: number; - username: string; - password: string; - database: string;`, - mariadb: `type: string; - host: string; - port: number; - username: string; - password: string; - database: string;`, - sqlite: `type: string; database: string;`, - postgres: `type: string; - host: string; - port: number; - username: string; - password: string; - database: string;`, - cockroachdb: `type: string; - host: string; - port: number; - username: string; - password: string; - database: string;`, - mssql: `type: string; - host: string; - username: string; - password: string; - database: string;`, - oracle: `type: string; - host: string; - port: number; - username: string; - password: string; - sid: string;`, - mongodb: `type: string; database: string;`, -}; - -const defaultDatabaseConvictOptions = `synchronize: { - doc: 'Do you want to synchronize database tables with you entities?', - default: false, - format: Boolean, - }, - migrationsRun: { - doc: 'Do you want to execute the migrations at application start?', - default: true, - format: Boolean, - }, - logging: { doc: 'Do you want to log all database queries?', default: true, format: Boolean }`; - -export interface ITypeormOptions { - db: 'postgres' | 'cockroachdb' | 'mariadb' | 'mysql' | 'sqlite' | 'oracle' | 'mssql' | 'mongodb'; -} - -function printType(type: string): string { - return `type: { - doc: 'Database provider type', - default: '${type}', - format: ['postgres', 'cockroachdb', 'mariadb', 'mysql', 'sqlite', 'oracle', 'mssql', 'mongodb'], - env: 'DATABASE_TYPE', - arg: 'databaseType', - },`; -} - -function printHost(host: string): string { - return `host: { - doc: 'Database host URL', - default: '${host}', - format: String, - env: 'DATABASE_HOST', - arg: 'databaseHost', - },`; -} - -function printPort(port: number): string { - return `port: { - doc: 'Database port', - default: ${port}, - format: 'port', - env: 'DATABASE_PORT', - arg: 'databasePort', - },`; -} - -function printUsername(username: string): string { - return `username: { - doc: 'Database connection username', - default: '${username}', - format: String, - env: 'DATABASE_USERNAME', - arg: 'databaseUsername', - },`; -} - -function printPassword(password: string): string { - return `password: { - doc: 'Database connection password', - default: '${password}', - format: String, - secret: true, - env: 'DATABASE_PASSWORD', - arg: 'databasePassword', - },`; -} - -function printDatabase(database: string): string { - return `database: { - doc: 'Database connection schema', - default: '${database}', - format: String, - env: 'DATABASE_DATABASE', - arg: 'databaseDatabase', - },`; -} - -function printSID(sid: string): string { - return `sid: { - doc: 'Database connection SID', - default: '${sid}', - format: String, - env: 'DATABASE_SID', - arg: 'databaseSid', - },`; -} - -function addTypeormToCoreModule(): Rule { - return (tree: Tree): Tree => { - const module = new ModuleFinder(tree).find({ - name: 'core', - path: 'src/app/core/' as Path, - }); - if (!module) { - return tree; - } - - let fileContent: ASTFileBuilder | undefined = new ASTFileBuilder(tree.read(module)!.toString('utf-8')); - - if (fileContent.build().includes('TypeOrmModule.forRoot')) { - return tree; - } - - fileContent = fileContent - .addImports('AppDataSource', '../shared/database/main-data-source') - .addImports('TypeOrmModule', '@nestjs/typeorm') - .addToModuleDecorator( - 'CoreModule', - `TypeOrmModule.forRootAsync({ - useFactory: () => ({}), - dataSourceFactory: async () => AppDataSource, - })`, - 'imports', - ); - - if (fileContent) { - tree.overwrite(module, formatTsFile(fileContent.build())); - } - - return tree; - }; -} - -function updateConfigFile(tree: Tree, database: string, project?: string): void { - const typesFile: Path = join((project || '.') as Path, 'src/config.ts'); - - const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')).addPropertyToObjectLiteralParam( - 'config', - 0, - 'database', - `{ - ${databaseConvictOptions[database]} - ${defaultDatabaseConvictOptions}, - }`, - ); - - tree.overwrite(typesFile, formatTsFile(typesFileContent.build())); -} - -function updateConfigTypeFile(tree: Tree, database: string, project?: string): void { - const typesFile: Path = join((project || '.') as Path, 'src/app/shared/app-config.ts'); - - const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')).addPropToInterface( - 'AppConfig', - 'database', - `{ - ${databaseConvictTypes[database]} - synchronize: boolean; - migrationsRun: boolean; - logging: boolean; - }`, - ); - - tree.overwrite(typesFile, formatTsFile(typesFileContent.build())); -} - -function addDatabaseConfiguration(database: string, project?: string): Rule { - return (tree: Tree): Tree => { - const config = existsConvictConfig(tree); - if (!config) { - return tree; - } - - updateConfigFile(tree, database, project); - updateConfigTypeFile(tree, database, project); - - return tree; - }; -} - -export function initTypeorm(options: ITypeormOptions): Rule { - return (tree: Tree): Rule => { - if (!runningAtRootFolder(tree)) { - return noop(); - } - - const config = existsConvictConfig(tree); - - return chain([ - mergeWith( - apply(url('./files'), [ - config ? noop() : filter(filePath => !filePath.startsWith('/config')), - template({ - ...options, - packagesVersion, - config, - }), - formatTsFiles(), - mergeFiles(tree), - ]), - ), - addTypeormToCoreModule(), - addDatabaseConfiguration(options.db), - installNodePackages(), - ]); - }; -} diff --git a/packages/schematics/src/lib/init-typeorm/init-typeorm.factory_spec.ts b/packages/schematics/src/lib/init-typeorm/init-typeorm.factory_spec.ts deleted file mode 100644 index 62592d0d..00000000 --- a/packages/schematics/src/lib/init-typeorm/init-typeorm.factory_spec.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Typeorm Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - const dataSource = (content: string, config?: boolean): string => `import 'reflect-metadata'; -import { DataSource } from 'typeorm'; -${config ? "import config from '../../../config';\n" : ''} -export const AppDataSource = new DataSource({ - ${content} - entities: [], - migrations: [], - subscribers: [], -}); -`; - - it('should do nothing if not running at root folder', done => { - runner.runSchematicAsync('typeorm', { db: 'mysql' }).subscribe(tree => { - expect(tree.files).toStrictEqual([]); - done(); - }); - }); - - it('should generate all files if it is running at root folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'mysql' }, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/package.json', - '/docker-compose.yml', - '/config/prod.json', - '/config/develop.json', - '/src/app/shared/database/main-data-source.ts', - '/src/app/shared/model/entities/base.entity.ts', - ]), - ); - }); - - it('should do not generate config files if convict is not present in the project', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'mysql' }, tree).toPromise(); - - expect(tree.files).toEqual(expect.not.arrayContaining(['/config/prod.json', '/config/develop.json'])); - expect(tree.files).toEqual( - expect.arrayContaining([ - '/package.json', - '/docker-compose.yml', - '/src/app/shared/database/main-data-source.ts', - '/src/app/shared/model/entities/base.entity.ts', - ]), - ); - }); - - it('should be imported at CoreModule', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'mysql' }, tree).toPromise(); - - const coreModule = tree.readContent('/src/app/core/core.module.ts'); - expect(coreModule).toContain("import { AppDataSource } from '../shared/database/main-data-source'"); - expect(coreModule).toContain("import { TypeOrmModule } from '@nestjs/typeorm'"); - expect(coreModule).toMatch(/imports: \[(.|\n)*TypeOrmModule.forRootAsync/g); - }); - - it('should configure the datasource using the config', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'postgres' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource( - `...config.database, - type: 'postgres',`, - true, - ), - ); - }); - - describe('postgres', () => { - it('should configure the datasource for postgres', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'postgres' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'postgres', - host: 'localhost', - port: 5432, - username: 'test', - password: 'test', - database: 'test',`), - ); - }); - }); - - describe('cockroachdb', () => { - it('should configure the datasource for cockroachdb', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'cockroachdb' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'cockroachdb', - host: 'localhost', - port: 26257, - username: 'root', - password: '', - database: 'defaultdb',`), - ); - }); - }); - - describe('mariadb', () => { - it('should configure the datasource for mariadb', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'mariadb' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'mariadb', - host: 'localhost', - port: 3306, - username: 'test', - password: 'test', - database: 'test',`), - ); - }); - }); - - describe('mysql', () => { - it('should configure the datasource for mysql', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'mysql' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'mysql', - host: 'localhost', - port: 3306, - username: 'test', - password: 'test', - database: 'test',`), - ); - }); - }); - - describe('sqlite', () => { - it('should configure the datasource for sqlite', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'sqlite' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'sqlite', - database: ':memory:',`), - ); - }); - }); - - describe('oracle', () => { - it('should configure the datasource for oracle', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'oracle' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'oracle', - host: 'localhost', - port: 1521, - username: 'system', - password: 'oracle', - sid: 'xe.oracle.docker',`), - ); - }); - }); - - describe('mssql', () => { - it('should configure the datasource for mssql', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'mssql' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'mssql', - host: 'localhost', - username: 'sa', - password: 'Admin12345', - database: 'tempdb',`), - ); - }); - }); - - describe('mongodb', () => { - it('should configure the datasource for mongodb', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'mongodb' }, tree).toPromise(); - - expect(tree.readContent('/src/app/shared/database/main-data-source.ts')).toStrictEqual( - dataSource(`type: 'mongodb', - database: 'test',`), - ); - }); - }); -}); diff --git a/packages/schematics/src/lib/init-typeorm/schema.json b/packages/schematics/src/lib/init-typeorm/schema.json deleted file mode 100644 index 4af91533..00000000 --- a/packages/schematics/src/lib/init-typeorm/schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "InitTypeormSchematic", - "title": "Init Typeorm Schema", - "type": "object", - "properties": { - "db": { - "type": "string", - "enum": [ - "postgres", - "cockroachdb", - "mariadb", - "mysql", - "sqlite", - "oracle", - "mssql", - "mongodb" - ], - "x-prompt": "What kind of database do you want to use?" - } - }, - "required": [ - "db" - ] -} diff --git a/packages/schematics/src/lib/interceptor/interceptor.factory.ts b/packages/schematics/src/lib/interceptor/interceptor.factory.ts deleted file mode 100644 index 50e9d2ca..00000000 --- a/packages/schematics/src/lib/interceptor/interceptor.factory.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { chain, externalSchematic, Rule } from '@angular-devkit/schematics'; -import { - BaseNestOptions, - stopExecutionIfNotRunningAtRootFolder, - transformOptionsToNestJS, -} from '../../utils/tree-utils'; - -export function main(options: BaseNestOptions): Rule { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - transformOptionsToNestJS(options, 'interceptors'), - externalSchematic('@nestjs/schematics', 'interceptor', options), - ]); -} diff --git a/packages/schematics/src/lib/interceptor/interceptor.factory_spec.ts b/packages/schematics/src/lib/interceptor/interceptor.factory_spec.ts deleted file mode 100644 index 213ca491..00000000 --- a/packages/schematics/src/lib/interceptor/interceptor.factory_spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Interceptor Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('interceptor', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should create the interceptor inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('interceptor', { name: 'interceptor' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/interceptors/interceptor.interceptor.ts'); - expect(tree.files).toContain('/src/app/interceptors/interceptor.interceptor.spec.ts'); - }); - - it('should not generate spec if spec param is false', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('interceptor', { name: 'interceptor', spec: false }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/interceptors/interceptor.interceptor.ts'); - expect(tree.files).not.toContain('/src/app/interceptors/interceptor.interceptor.spec.ts'); - }); - - it('should create the interceptor at specified module inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('interceptor', { name: 'module/interceptor' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/interceptors/interceptor.interceptor.ts'); - expect(tree.files).toContain('/src/app/module/interceptors/interceptor.interceptor.spec.ts'); - }); -}); diff --git a/packages/schematics/src/lib/interceptor/schema.json b/packages/schematics/src/lib/interceptor/schema.json deleted file mode 100644 index d220549a..00000000 --- a/packages/schematics/src/lib/interceptor/schema.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SchematicsNestInterceptor", - "title": "Nest Interceptor Options Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the interceptor.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the interceptor?" - }, - "spec": { - "default": true, - "description": "Specifies if a spec file is generated." - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/mailer/files/package.json b/packages/schematics/src/lib/mailer/files/package.json deleted file mode 100644 index a3335cd4..00000000 --- a/packages/schematics/src/lib/mailer/files/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": { - "<%= packagesVersion.devon4ts_nodeMailer.packageName %>": "<%= packagesVersion.devon4ts_nodeMailer.packageVersion %>", - "<%= packagesVersion.handlebars.packageName %>": "<%= packagesVersion.handlebars.packageVersion %>" - } -} \ No newline at end of file diff --git a/packages/schematics/src/lib/mailer/mailer.factory.ts b/packages/schematics/src/lib/mailer/mailer.factory.ts deleted file mode 100644 index 6e2541f5..00000000 --- a/packages/schematics/src/lib/mailer/mailer.factory.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { Path } from '@angular-devkit/core'; -import { apply, chain, mergeWith, Rule, template, Tree, url } from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { mergeFiles } from '../../utils/merge'; -import { - existsConvictConfig, - formatTsFile, - installNodePackages, - stopExecutionIfNotRunningAtRootFolder, -} from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; - -const defaultMailerValues = `{ - mailOptions: { - host: 'localhost', - port: 1025, - secure: false, - tls: { - rejectUnauthorized: false, - }, - }, - emailFrom: 'noreply@example.com', - hbsOptions: { - templatesDir: join(__dirname, '../../..', 'templates/views'), - partialsDir: join(__dirname, '../../..', 'templates/partials'), - helpers: [], - }, -}`; - -const mailerValuesFromConfig = `{ - mailOptions: { - host: config.mailer.mailOptions.host, - port: config.mailer.mailOptions.port, - secure: config.mailer.mailOptions.secure, - tls: { - rejectUnauthorized: config.mailer.mailOptions.tlsRejectUnauthorized, - }, - }, - emailFrom: config.mailer.emailFrom, - hbsOptions: { - templatesDir: join(__dirname, '../../..', config.mailer.hbsOptions.templatesDir), - partialsDir: join(__dirname, '../../..', config.mailer.hbsOptions.partialsDir), - helpers: [], - }, -}`; - -const mailerConfigType = `{ - mailOptions: { - host: { - doc: 'Mail server host URL', - default: 'localhost', - format: String, - env: 'MAILER_HOST', - }, - port: { - doc: 'Mail server port', - default: 1025, - format: 'port', - env: 'MAILER_PORT', - }, - secure: { - doc: 'Is the mailer server secured?', - default: false, - format: Boolean, - env: 'MAILER_SECURE', - }, - tlsRejectUnauthorized: { - doc: 'Reject unauthorized TLS connections?', - default: false, - format: Boolean, - env: 'MAILER_TLS_REJECT_UNAUTHORIZED', - }, - }, - emailFrom: { - doc: 'Email that will be used as sender', - default: 'noreply@example.com', - format: String, - env: 'MAILER_EMAIL_FROM', - arg: 'emailFrom', - }, - hbsOptions: { - templatesDir: { - doc: 'Relative path to handlebars views folder', - default: 'templates/views', - format: String, - }, - partialsDir: { - doc: 'Relative path to handlebars partials folder', - default: 'templates/partials', - format: String, - }, - }, -}`; - -function addMailerToCoreModule(tree: Tree, existsConfig: boolean): void { - const core = new ModuleFinder(tree).find({ - name: 'core', - path: 'src/app/core' as Path, - }); - if (!core) { - return; - } - - const coreContent: ASTFileBuilder | undefined = new ASTFileBuilder(tree.read(core)!.toString()); - - if (coreContent.build().includes('MailerModule')) { - return; - } - - coreContent - .addImports('MailerModule', '@devon4ts_node/mailer') - .addImports('join', 'path') - .addToModuleDecorator( - 'CoreModule', - 'MailerModule.register(' + (existsConfig ? mailerValuesFromConfig : defaultMailerValues) + ')', - 'imports', - ) - ?.addToModuleDecorator('CoreModule', 'MailerModule', 'exports'); - - if (coreContent) { - tree.overwrite(core, formatTsFile(coreContent.build())); - } -} - -function updateConfigTypeFile(tree: Tree): void { - const typesFile: Path = 'src/config.ts' as Path; - - const typesFileContent = new ASTFileBuilder(tree.read(typesFile)!.toString('utf-8')) - .addPropertyToObjectLiteralParam('config', 0, 'mailer', mailerConfigType) - .build(); - - tree.overwrite(typesFile, formatTsFile(typesFileContent)); -} - -function addMailerToProject(): Rule { - return (tree: Tree): Tree => { - const config = existsConvictConfig(tree); - if (!config) { - addMailerToCoreModule(tree, false); - return tree; - } - - addMailerToCoreModule(tree, true); - updateConfigTypeFile(tree); - - return tree; - }; -} - -export function mailer(): Rule { - return (host: Tree): Rule => { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - mergeWith( - apply(url('./files'), [ - template({ - packagesVersion, - }), - mergeFiles(host), - ]), - ), - addMailerToProject(), - installNodePackages(), - ]); - }; -} diff --git a/packages/schematics/src/lib/mailer/mailer.factory_spec.ts b/packages/schematics/src/lib/mailer/mailer.factory_spec.ts deleted file mode 100644 index 77b904a8..00000000 --- a/packages/schematics/src/lib/mailer/mailer.factory_spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; -import { packagesVersion } from '../packagesVersion'; - -describe('Mailer Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should generate the files required for mailer functionality', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('mailer', {}, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/package.json', - '/docker-compose.yml', - '/templates/partials/layout.handlebars', - '/templates/views/example.handlebars', - ]), - ); - }); - - it('should merge the json and yaml files', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('mailer', {}, tree).toPromise(); - - const packageJson = tree.readContent('/package.json'); - const dockerCompose = tree.readContent('/docker-compose.yml'); - - expect(packageJson).toContain(packagesVersion.devon4ts_nodeMailer.packageName); - expect(packageJson).toContain(packagesVersion.handlebars.packageName); - expect(dockerCompose).toContain(`maildev: - image: 'djfarrelly/maildev'`); - }); - - it('should add mailer module to the core module', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('mailer', {}, tree).toPromise(); - - const coreModule = tree.readContent('/src/app/core/core.module.ts'); - - expect(coreModule).toMatch(/imports: \[(\n|.)*MailerModule.register(\n|.)*\]/g); - }); - - it('should add configuration to global config definition', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - tree = await runner.runSchematicAsync('mailer', {}, tree).toPromise(); - - const config = tree.readContent('/src/config.ts'); - - expect(config).toMatch(/const config(.|\n)*mailer:(.|\n)*/g); - }); -}); diff --git a/packages/schematics/src/lib/mailer/schema.json b/packages/schematics/src/lib/mailer/schema.json deleted file mode 100644 index 4cc8f07e..00000000 --- a/packages/schematics/src/lib/mailer/schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "MailerSchematic", - "title": "Mailer Schema", - "type": "object", - "properties": {} -} diff --git a/packages/schematics/src/lib/middleware/middleware.factory.ts b/packages/schematics/src/lib/middleware/middleware.factory.ts deleted file mode 100644 index ad6d6d72..00000000 --- a/packages/schematics/src/lib/middleware/middleware.factory.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { chain, externalSchematic, Rule } from '@angular-devkit/schematics'; -import { - BaseNestOptions, - transformOptionsToNestJS, - stopExecutionIfNotRunningAtRootFolder, -} from '../../utils/tree-utils'; - -export function main(options: BaseNestOptions): Rule { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - transformOptionsToNestJS(options, './'), - externalSchematic('@nestjs/schematics', 'middleware', options), - ]); -} diff --git a/packages/schematics/src/lib/middleware/middleware.factory_spec.ts b/packages/schematics/src/lib/middleware/middleware.factory_spec.ts deleted file mode 100644 index 02d71ff3..00000000 --- a/packages/schematics/src/lib/middleware/middleware.factory_spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Middleware Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('middleware', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should create the middleware inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('middleware', { name: 'test' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/test.middleware.ts'); - expect(tree.files).toContain('/src/app/test.middleware.spec.ts'); - }); - - it('should not generate spec if spec param is false', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('middleware', { name: 'test', spec: false }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/test.middleware.ts'); - expect(tree.files).not.toContain('/src/app/test.middleware.spec.ts'); - }); - - it('should create the middleware at specified module inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('middleware', { name: 'module/test' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/test.middleware.ts'); - expect(tree.files).toContain('/src/app/module/test.middleware.spec.ts'); - }); -}); diff --git a/packages/schematics/src/lib/middleware/schema.json b/packages/schematics/src/lib/middleware/schema.json deleted file mode 100644 index 2064d872..00000000 --- a/packages/schematics/src/lib/middleware/schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SchematicsNestMiddleware", - "title": "Nest Middleware Options Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the middleware.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the middleware?" - }, - "spec": { - "default": true, - "description": "Specifies if a spec file is generated." - } - }, - "required": ["name"] -} diff --git a/packages/schematics/src/lib/module/module.factory.ts b/packages/schematics/src/lib/module/module.factory.ts deleted file mode 100644 index f32d50d0..00000000 --- a/packages/schematics/src/lib/module/module.factory.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Path } from '@angular-devkit/core'; -import { chain, externalSchematic, Rule } from '@angular-devkit/schematics'; -import { transformOptionsToNestJS, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; - -export interface IModuleOptions { - name: string; - path?: string; - module?: Path; - skipImport?: boolean; - metadata?: string; - type?: string; - language?: string; - sourceRoot?: string; - flat?: boolean; -} - -export function main(options: IModuleOptions): Rule { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - transformOptionsToNestJS(options, './', false), - externalSchematic('@nestjs/schematics', 'module', options), - ]); -} diff --git a/packages/schematics/src/lib/module/module.factory_spec.ts b/packages/schematics/src/lib/module/module.factory_spec.ts deleted file mode 100644 index c8d8e950..00000000 --- a/packages/schematics/src/lib/module/module.factory_spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Module Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('module', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should create the module inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('module', { name: 'test' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/test/test.module.ts'); - }); - - it('should create the module at specified module inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('module', { name: 'module/test' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/test/test.module.ts'); - }); -}); diff --git a/packages/schematics/src/lib/module/schema.json b/packages/schematics/src/lib/module/schema.json deleted file mode 100644 index 4898c3b3..00000000 --- a/packages/schematics/src/lib/module/schema.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SchematicsNestModule", - "title": "Nest Module Options Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the module.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the module?" - }, - "path": { - "type": "string", - "format": "path", - "description": "The path to create the module." - }, - "module": { - "type": "string", - "format": "path", - "description": "The path to import the module." - }, - "language": { - "type": "string", - "description": "Nest module language (ts/js)." - }, - "sourceRoot": { - "type": "string", - "description": "Nest module source root directory." - }, - "skipImport": { - "description": "Flag to skip the module import.", - "default": false - }, - "flat": { - "default": false, - "description": "Flag to indicate if a directory is created." - } - }, - "required": ["name"] -} diff --git a/packages/schematics/src/lib/packagesVersion.ts b/packages/schematics/src/lib/packagesVersion.ts deleted file mode 100644 index a8772ada..00000000 --- a/packages/schematics/src/lib/packagesVersion.ts +++ /dev/null @@ -1,39 +0,0 @@ -export const packagesVersion: { [k: string]: { packageName: string; packageVersion: string } } = { - bcrypt: { packageName: 'bcrypt', packageVersion: '^5.0.1' }, - classTransformer: { packageName: 'class-transformer', packageVersion: '^0.5.1' }, - classValidator: { packageName: 'class-validator', packageVersion: '^0.13.2' }, - cockroachdb: { packageName: 'pg', packageVersion: '^8.8.0' }, - convict: { packageName: 'convict', packageVersion: '^6.2.3' }, - devon4ts_nodeCommon: { packageName: '@devon4ts_node/common', packageVersion: '^5.0.0' }, - devon4ts_nodeLogform: { packageName: '@devon4ts_node/logform', packageVersion: '^5.0.0' }, - devon4ts_nodeMailer: { packageName: '@devon4ts_node/mailer', packageVersion: '^5.0.0' }, - devon4ts_nodeSchematics: { packageName: '@devon4ts_node/schematics', packageVersion: '^5.0.0' }, - eslintPluginPrettier: { packageName: 'eslint-plugin-prettier', packageVersion: '^4.0.0' }, - handlebars: { packageName: 'handlebars', packageVersion: '^4.7.7' }, - helmet: { packageName: 'helmet', packageVersion: '^6.0.0' }, - husky: { packageName: 'husky', packageVersion: '^8.0.1' }, - lodash: { packageName: 'lodash', packageVersion: '^4.17.21' }, - mariadb: { packageName: 'mysql', packageVersion: '^2.18.1' }, - mongodb: { packageName: 'mongodb', packageVersion: '^4.10.0' }, - mssql: { packageName: 'mssql', packageVersion: '^9.0.1' }, - mysql: { packageName: 'mysql', packageVersion: '^2.18.1' }, - nestjsJwt: { packageName: '@nestjs/jwt', packageVersion: '^9.0.0' }, - nestjsMappedTypes: { packageName: '@nestjs/mapped-types', packageVersion: '^1.1.0' }, - nestjsPassport: { packageName: '@nestjs/passport', packageVersion: '^9.0.0' }, - nestjsSwagger: { packageName: '@nestjs/swagger', packageVersion: '^6.1.2' }, - nestjsTypeorm: { packageName: '@nestjs/typeorm', packageVersion: '^9.0.1' }, - oracle: { packageName: 'oracledb', packageVersion: '^5.5.0' }, - passport: { packageName: 'passport', packageVersion: '^0.6.0' }, - passportJwt: { packageName: 'passport-jwt', packageVersion: '^4.0.0' }, - postgres: { packageName: 'pg', packageVersion: '^8.8.0' }, - prettyQuick: { packageName: 'pretty-quick', packageVersion: '^3.1.3' }, - sqlite: { packageName: 'sqlite3', packageVersion: '^5.1.1' }, - typeFest: { packageName: 'type-fest', packageVersion: '^3.0.0' }, - typeorm: { packageName: 'typeorm', packageVersion: '^0.3.10' }, - typesBcrypt: { packageName: '@types/bcrypt', packageVersion: '^5.0.0' }, - typesConvict: { packageName: '@types/convict', packageVersion: '^6.1.1' }, - typesHelmet: { packageName: '@types/helmet', packageVersion: '^4.0.0' }, - typesLodash: { packageName: '@types/lodash', packageVersion: '^4.14.185' }, - typesPassportJwt: { packageName: '@types/passport-jwt', packageVersion: '^3.0.6' }, - winston: { packageName: 'winston', packageVersion: '^3.8.2' }, -}; diff --git a/packages/schematics/src/lib/pipe/pipe.factory.ts b/packages/schematics/src/lib/pipe/pipe.factory.ts deleted file mode 100644 index ec1fe585..00000000 --- a/packages/schematics/src/lib/pipe/pipe.factory.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { chain, externalSchematic, Rule } from '@angular-devkit/schematics'; -import { - BaseNestOptions, - transformOptionsToNestJS, - stopExecutionIfNotRunningAtRootFolder, -} from '../../utils/tree-utils'; - -export function main(options: BaseNestOptions): Rule { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - transformOptionsToNestJS(options, 'pipes'), - externalSchematic('@nestjs/schematics', 'pipe', options), - ]); -} diff --git a/packages/schematics/src/lib/pipe/pipe.factory_spec.ts b/packages/schematics/src/lib/pipe/pipe.factory_spec.ts deleted file mode 100644 index ae558b4d..00000000 --- a/packages/schematics/src/lib/pipe/pipe.factory_spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Pipe Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('pipe', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should create the pipe inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('pipe', { name: 'pipe' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/pipes/pipe.pipe.ts'); - expect(tree.files).toContain('/src/app/pipes/pipe.pipe.spec.ts'); - }); - - it('should not generate spec if spec param is false', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('pipe', { name: 'pipe', spec: false }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/pipes/pipe.pipe.ts'); - expect(tree.files).not.toContain('/src/app/pipes/pipe.pipe.spec.ts'); - }); - - it('should create the pipe at specified module inside src/app folder', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('pipe', { name: 'module/pipe' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/pipes/pipe.pipe.ts'); - expect(tree.files).toContain('/src/app/module/pipes/pipe.pipe.spec.ts'); - }); -}); diff --git a/packages/schematics/src/lib/pipe/schema.json b/packages/schematics/src/lib/pipe/schema.json deleted file mode 100644 index b65a041a..00000000 --- a/packages/schematics/src/lib/pipe/schema.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SchematicsNestPipe", - "title": "Nest Pipe Options Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the pipe.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the pipe?" - }, - "spec": { - "default": true, - "description": "Specifies if a spec file is generated." - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/repository/files/__name__.repository.ts b/packages/schematics/src/lib/repository/files/__name__.repository.ts deleted file mode 100644 index 6d3b04fc..00000000 --- a/packages/schematics/src/lib/repository/files/__name__.repository.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { <%= classify(name) %> } from '../model/entities/<%= name %>.entity'; -import { Repository, EntityRepository } from 'typeorm'; - -@EntityRepository(<%= classify(name) %>) -export class <%= classify(name) %>Repository extends Repository<<%= classify(name) %>> {} diff --git a/packages/schematics/src/lib/repository/repository.factory.ts b/packages/schematics/src/lib/repository/repository.factory.ts deleted file mode 100644 index add2ae53..00000000 --- a/packages/schematics/src/lib/repository/repository.factory.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { basename, join, normalize, Path, strings } from '@angular-devkit/core'; -import { apply, chain, mergeWith, move, noop, Rule, schematic, template, Tree, url } from '@angular-devkit/schematics'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { formatTsFile, formatTsFiles, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; - -interface IRespositoryOptions { - name: string; -} - -function transform(options: IRespositoryOptions): IRespositoryOptions { - const newOptions = Object.assign({}, options); - - newOptions.name = strings.dasherize(basename(options.name as Path)); - - return newOptions; -} - -function addRepositoryToModule(options: IRespositoryOptions, path: Path): Rule { - return (tree: Tree): Tree => { - const modulePosiblePath = join(path, '..'); - const moduleName = strings.classify(basename(modulePosiblePath) + '-module'); - - const module = new ModuleFinder(tree).find({ - name: moduleName, - path: modulePosiblePath, - }); - if (!module) { - return tree; - } - - const content = new ASTFileBuilder(tree.read(module)!.toString()) - .removeImports('./model/entities/' + options.name + '.entity') - .addImports(strings.classify(options.name + '-repository'), './repositories/' + options.name + '.repository') - .addTypeormRepositoryToModule(moduleName, strings.classify(options.name)); - - tree.overwrite(module, formatTsFile(content.build())); - - return tree; - }; -} - -export function main(options: IRespositoryOptions): Rule { - const name = strings.dasherize(basename(options.name as Path)); - const path = normalize(join('src/app' as Path, options.name, '../repositories')); - - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - (tree: Tree): Rule => { - if (!tree.exists(join(path, '../model/entities', name + '.entity.ts'))) { - return schematic('entity', options); - } - - return noop(); - }, - mergeWith( - apply(url('./files'), [ - template({ - ...strings, - name, - }), - formatTsFiles(), - move(path), - ]), - ), - addRepositoryToModule(transform(options), path), - ]); -} diff --git a/packages/schematics/src/lib/repository/repository.factory_spec.ts b/packages/schematics/src/lib/repository/repository.factory_spec.ts deleted file mode 100644 index 62f74ed7..00000000 --- a/packages/schematics/src/lib/repository/repository.factory_spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Repository Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('repository', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate the entity if not exists', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('repository', { name: 'module/repo' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/model/entities/repo.entity.ts'); - }); - - it('should not generate the entity if exists', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - - tree.create('/src/app/module/model/entities/repo.entity.ts', Buffer.from('this is a fake entity')); - tree = await runner.runSchematicAsync('repository', { name: 'module/repo' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/model/entities/repo.entity.ts'); - expect(tree.readContent('/src/app/module/model/entities/repo.entity.ts')).toStrictEqual('this is a fake entity'); - }); - - it('should generate the repository file', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('repository', { name: 'module/repo' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/module/repositories/repo.repository.ts'); - }); - - it('should generate the repository file at root level if no module is provided', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('repository', { name: 'repo' }, tree).toPromise(); - - expect(tree.files).toContain('/src/app/repositories/repo.repository.ts'); - }); - - it('should add the repository to the module provided', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('module', { name: 'module' }, tree).toPromise(); - tree = await runner.runSchematicAsync('repository', { name: 'module/repo' }, tree).toPromise(); - - const moduleContent = tree.readContent('/src/app/module/module.module.ts'); - expect(moduleContent).toContain(`import { RepoRepository } from './repositories/repo.repository';`); - expect(moduleContent).toMatch(/TypeOrmModule\.forFeature\(\[(.|\n)*RepoRepository(.|\n)*\]\)/g); - }); - - it('should add the repository to AppModule if no other module is provided', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('repository', { name: 'repo' }, tree).toPromise(); - - const moduleContent = tree.readContent('/src/app/app.module.ts'); - expect(moduleContent).toContain(`import { RepoRepository } from './repositories/repo.repository';`); - expect(moduleContent).toMatch(/TypeOrmModule\.forFeature\(\[(.|\n)*RepoRepository(.|\n)*\]\)/g); - }); -}); diff --git a/packages/schematics/src/lib/repository/schema.json b/packages/schematics/src/lib/repository/schema.json deleted file mode 100644 index c0ca2eba..00000000 --- a/packages/schematics/src/lib/repository/schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "RespositorySchematic", - "title": "Respository Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The repository name. If the entity do not exists, it will also create it. To create crud with name Banana in the module fruits you need to introduce fruits/banana", - "x-prompt": "Introduce the crud name" - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/resource/files/typeorm/rest/controllers/__name__.controller.ts b/packages/schematics/src/lib/resource/files/typeorm/rest/controllers/__name__.controller.ts deleted file mode 100644 index 1756bf32..00000000 --- a/packages/schematics/src/lib/resource/files/typeorm/rest/controllers/__name__.controller.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { GetPage, Page, PageRequest } from '@devon4ts_node/common'; -import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common'; -import { Create<%=classify(nameSingular)%>Dto } from '../model/dtos/create-<%=nameSingular%>.dto'; -import { Update<%=classify(nameSingular)%>Dto } from '../model/dtos/update-<%=nameSingular%>.dto'; -import { <%=classify(nameSingular)%> } from '../model/entities/<%=nameSingular%>.entity'; -import { <%=classify(name)%>Service } from '../services/<%=name%>.service'; - -@Controller('<%=name%>') -export class <%=classify(name)%>Controller { - constructor(private readonly service: <%=classify(name)%>Service) {} - - @Post() - create(@Body() create<%=classify(nameSingular)%>Dto: Create<%=classify(nameSingular)%>Dto): Promise<<%=classify(nameSingular)%>> { - return this.service.create(create<%=classify(nameSingular)%>Dto); - } - - @Get() - findAll(@GetPage() page?: PageRequest): Promise<<%=classify(nameSingular)%>[] | Page<<%=classify(nameSingular)%>>> { - return this.service.findAll(page); - } - - @Get(':id') - findOne(@Param('id') id: string): Promise<<%=classify(nameSingular)%>> { - return this.service.findOne(+id); - } - - @Patch(':id') - update(@Param('id') id: string, @Body() update<%=classify(nameSingular)%>Dto: Update<%=classify(nameSingular)%>Dto): Promise<<%=classify(nameSingular)%>> { - return this.service.update(+id, update<%=classify(nameSingular)%>Dto); - } - - @Delete(':id') - remove(@Param('id') id: string): Promise<<%=classify(nameSingular)%>> { - return this.service.remove(+id); - } -} diff --git a/packages/schematics/src/lib/resource/files/typeorm/rest/services/__name__.service.ts b/packages/schematics/src/lib/resource/files/typeorm/rest/services/__name__.service.ts deleted file mode 100644 index 2157cebb..00000000 --- a/packages/schematics/src/lib/resource/files/typeorm/rest/services/__name__.service.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Page, PageRequest } from '@devon4ts_node/common'; -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { plainToClass } from 'class-transformer'; -import { Repository } from 'typeorm'; -import { EntityNotFound } from '../../shared/exceptions/entity-not-found.exception'; -import { Create<%=classify(nameSingular)%>Dto } from '../model/dtos/create-<%=nameSingular%>.dto'; -import { Update<%=classify(nameSingular)%>Dto } from '../model/dtos/update-<%=nameSingular%>.dto'; -import { <%=classify(nameSingular)%> } from '../model/entities/<%=nameSingular%>.entity'; - -@Injectable() -export class <%=classify(name)%>Service { - constructor(@InjectRepository(<%=classify(nameSingular)%>) private readonly repository: Repository<<%=classify(nameSingular)%>>) {} - - create(create<%=classify(nameSingular)%>Dto: Create<%=classify(nameSingular)%>Dto): Promise<<%=classify(nameSingular)%>> { - const <%=camelize(nameSingular)%> = plainToClass(<%=classify(nameSingular)%>, create<%=classify(nameSingular)%>Dto); - return this.repository.save(<%=camelize(nameSingular)%>); - } - - async findAll(page?: PageRequest): Promise<<%=classify(nameSingular)%>[] | Page<<%=classify(nameSingular)%>>> { - if (!page) { - return this.repository.find(); - } - - const [content, total] = await this.repository.findAndCount({ - take: page.pageSize, - skip: page.pageNumber * page.pageSize, - }); - return new Page(content, { pageNumber: page.pageNumber, pageSize: page.pageSize, total }); - } - - async findOne(id: number): Promise<<%=classify(nameSingular)%>> { - const found = await this.repository.findOneBy({ id: id }); - - if (!found) { - throw new EntityNotFound(<%=classify(nameSingular)%>, id); - } - - return found; - } - - async update(id: number, update<%=classify(nameSingular)%>Dto: Update<%=classify(nameSingular)%>Dto): Promise<<%=classify(nameSingular)%>> { - const found = await this.repository.findOneBy({ id: id }); - const <%=camelize(nameSingular)%> = plainToClass(<%=classify(nameSingular)%>, { ...found, ...update<%=classify(nameSingular)%>Dto, id }); - - if (!found) { - throw new EntityNotFound(<%=classify(nameSingular)%>, id); - } - - return this.repository.save(<%=camelize(nameSingular)%>); - } - - async remove(id: number): Promise<<%=classify(nameSingular)%>> { - const found = await this.repository.findOneBy({ id: id }); - - if (!found) { - throw new EntityNotFound(<%=classify(nameSingular)%>, id); - } - - return this.repository.remove(found); - } -} diff --git a/packages/schematics/src/lib/resource/resource.factory.ts b/packages/schematics/src/lib/resource/resource.factory.ts deleted file mode 100644 index 7e6926c5..00000000 --- a/packages/schematics/src/lib/resource/resource.factory.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { basename, dirname, join, normalize, Path, strings } from '@angular-devkit/core'; -import { dasherize } from '@angular-devkit/core/src/utils/strings'; -import { - apply, - chain, - externalSchematic, - FileEntry, - forEach, - MergeStrategy, - mergeWith, - move, - noop, - Rule, - schematic, - template, - Tree, - url, -} from '@angular-devkit/schematics'; -import * as pluralize from 'pluralize'; -import { - BaseNestOptions, - formatTsFile, - formatTsFiles, - installNodePackages, - stopExecutionIfNotRunningAtRootFolder, - transformOptionsToNestJS, -} from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; - -export interface IResourceOptions extends BaseNestOptions { - name: string; - spec: boolean; - type: string; - crud: boolean; - orm?: string; -} - -function updateDtoImports(content: string, name: string): string { - const nameSingular = pluralize(name, 1); - const dtoImports = `./dto/${dasherize('create-' + nameSingular)}.dto`; - const contentCopy = content; - let fileType = 'input'; - - if (contentCopy.includes(dtoImports)) { - fileType = 'dto'; - } - - return new ASTFileBuilder(contentCopy) - .updateImports( - `./dto/${dasherize('create-' + nameSingular)}.${fileType}`, - `../model/dtos/${dasherize('create-' + nameSingular)}.${fileType}`, - ) - .updateImports( - `./dto/${dasherize('update-' + nameSingular)}.${fileType}`, - `../model/dtos/${dasherize('update-' + nameSingular)}.${fileType}`, - ) - .build(); -} - -function updateControllers(fileEntry: FileEntry, name: string): FileEntry { - const fileName = basename(fileEntry.path); - const dirName = dirname(fileEntry.path); - - let content = fileEntry.content.toString(); - - content = new ASTFileBuilder(content) - .updateImports(`./${dasherize(name)}.service`, `../services/${dasherize(name)}.service`) - .build(); - - if (!fileName.endsWith('spec.ts')) { - content = updateDtoImports(content, name); - } - - return { - content: Buffer.from(content), - path: join(dirName, 'controllers', fileName), - }; -} - -function updateResolvers(fileEntry: FileEntry, name: string): FileEntry { - const fileName = basename(fileEntry.path); - const dirName = dirname(fileEntry.path); - const nameSingular = pluralize(name, 1); - - let content = fileEntry.content.toString(); - - content = new ASTFileBuilder(content) - .updateImports(`./${dasherize(name)}.service`, `../services/${dasherize(name)}.service`) - .updateImports( - `./entities/${dasherize(nameSingular)}.entity`, - `../model/entities/${dasherize(nameSingular)}.entity`, - ) - .build(); - - if (!fileName.endsWith('spec.ts')) { - content = updateDtoImports(content, name); - } - - return { - content: Buffer.from(content), - path: join(dirName, 'controllers', fileName), - }; -} - -function updateServices(fileEntry: FileEntry, name: string): FileEntry { - const fileName = basename(fileEntry.path); - const dirName = dirname(fileEntry.path); - - let content = fileEntry.content.toString(); - - if (!fileName.endsWith('spec.ts')) { - content = updateDtoImports(content, name); - } - - return { - content: Buffer.from(content), - path: join(dirName, 'services', fileName), - }; -} - -function updateGateways(fileEntry: FileEntry, name: string): FileEntry { - const fileName = basename(fileEntry.path); - const dirName = dirname(fileEntry.path); - - let content = fileEntry.content.toString(); - - content = new ASTFileBuilder(content) - .updateImports(`./${dasherize(name)}.service`, `../services/${dasherize(name)}.service`) - .build(); - - if (!fileName.endsWith('spec.ts')) { - content = updateDtoImports(content, name); - } - - return { - content: Buffer.from(content), - path: join(dirName, 'controllers', fileName), - }; -} - -function updateModule(fileEntry: FileEntry, name: string): FileEntry { - const content = new ASTFileBuilder(fileEntry.content.toString()) - .updateImports(`./${dasherize(name)}.service`, `./services/${dasherize(name)}.service`) - .updateImports(`./${dasherize(name)}.controller`, `./controllers/${dasherize(name)}.controller`) - .updateImports(`./${dasherize(name)}.resolver`, `./controllers/${dasherize(name)}.resolver`) - .updateImports(`./${dasherize(name)}.gateway`, `./controllers/${dasherize(name)}.gateway`); - - return { - content: Buffer.from(formatTsFile(content.build())), - path: fileEntry.path, - }; -} - -function moveTodevon4ts_nodePaths(name: string): Rule { - return forEach((fileEntry: FileEntry) => { - if (!fileEntry.path.startsWith('/src/app/' + name) && !fileEntry.path.startsWith('/' + name)) { - return fileEntry; - } - - const fileName = basename(fileEntry.path); - const dirName = dirname(fileEntry.path); - - if ( - (fileName.endsWith('controller.ts') || fileName.endsWith('controller.spec.ts')) && - !dirName.endsWith('controllers') - ) { - return updateControllers(fileEntry, name); - } - - if ( - (fileName.endsWith('resolver.ts') || fileName.endsWith('resolver.spec.ts')) && - !dirName.endsWith('controllers') - ) { - return updateResolvers(fileEntry, name); - } - - if ((fileName.endsWith('gateway.ts') || fileName.endsWith('gateway.spec.ts')) && !dirName.endsWith('controllers')) { - return updateGateways(fileEntry, name); - } - - if ((fileName.endsWith('.service.ts') || fileName.endsWith('.service.spec.ts')) && !dirName.endsWith('services')) { - return updateServices(fileEntry, name); - } - - if ((fileName.endsWith('.dto.ts') || fileName.endsWith('.input.ts')) && !dirName.includes('model')) { - return { - content: fileEntry.content, - path: join(dirName, '../model/dtos', fileName), - }; - } - - if (fileName.endsWith('entity.ts') && !dirName.includes('model')) { - return { - content: fileEntry.content, - path: join(dirName, '../model/entities', fileName), - }; - } - - if (fileName.endsWith('module.ts')) { - return updateModule(fileEntry, name); - } - - return fileEntry; - }); -} - -function updatePackageJson(): Rule { - return (host: Tree): Tree => { - const filePath = normalize('./package.json'); - - if (host.exists(filePath)) { - const content = JSON.parse(host.read(filePath)!.toString('utf-8')); - content.dependencies[packagesVersion.nestjsMappedTypes.packageName] = - packagesVersion.nestjsMappedTypes.packageVersion; - - host.overwrite(filePath, JSON.stringify(content, null, 2)); - } - - return host; - }; -} - -function overrideCrud(options: IResourceOptions): Rule { - if (!options.crud) { - noop(); - } - - const templateOpts = { - name: options.name, - nameSingular: pluralize(options.name, 1), - }; - return chain([ - options.orm === 'typeorm' - ? schematic('entity', { - name: join(options.name as Path, pluralize(options.name, 1)), - overwrite: true, - }) - : noop(), - mergeWith( - apply(url(`./files/${options.orm}/${options.type}`), [ - template({ - ...strings, - ...templateOpts, - }), - move(join('src/app/' as Path, options.name)), - ]), - MergeStrategy.Overwrite, - ), - ]); - - // TODO: refactor this to include more ORMs -} - -export function main(options: IResourceOptions): Rule { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - transformOptionsToNestJS(options, '.', false), - externalSchematic('@nestjs/schematics', 'resource', options), - moveTodevon4ts_nodePaths(options.name), - overrideCrud(options), - updatePackageJson(), - formatTsFiles(), - installNodePackages(), - ]); -} diff --git a/packages/schematics/src/lib/resource/resource.factory_spec.ts b/packages/schematics/src/lib/resource/resource.factory_spec.ts deleted file mode 100644 index 41ff03e4..00000000 --- a/packages/schematics/src/lib/resource/resource.factory_spec.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; -import { IResourceOptions } from './resource.factory'; - -describe('Resource Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - const defaultResourceOptions: IResourceOptions = { - crud: false, - name: 'tests', - spec: true, - type: 'rest', - }; - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('resource', { ...defaultResourceOptions }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate the files at src/app if executed on root directory', async () => { - const options = { ...defaultResourceOptions }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.exists('/src/app/tests/tests.module.ts')).toBeDefined(); - expect(tree.exists('/src/app/tests/controllers/tests.controller.spec.ts')).toBeDefined(); - expect(tree.exists('/src/app/tests/controllers/tests.controller.ts')).toBeDefined(); - expect(tree.exists('/src/app/tests/services/tests.service.spec.ts')).toBeDefined(); - expect(tree.exists('/src/app/tests/services/tests.service.ts')).toBeDefined(); - }); - - it('should generate a REST module', async () => { - const options = { ...defaultResourceOptions }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.controller.spec.ts', - '/src/app/tests/controllers/tests.controller.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.controller`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain(`../services/tests.service`); - }); - - it('should generate a REST module with CRUD', async () => { - const options = { ...defaultResourceOptions, crud: true }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.controller.spec.ts', - '/src/app/tests/controllers/tests.controller.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - '/src/app/tests/model/dtos/create-test.dto.ts', - '/src/app/tests/model/dtos/update-test.dto.ts', - '/src/app/tests/model/entities/test.entity.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.controller`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain(`../services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain( - `../model/dtos/create-test.dto`, - ); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain( - `../model/dtos/update-test.dto`, - ); - expect(tree.readContent(`/src/app/tests/services/tests.service.ts`)).toContain(`../model/dtos/create-test.dto`); - expect(tree.readContent(`/src/app/tests/services/tests.service.ts`)).toContain(`../model/dtos/update-test.dto`); - }); - - it('should generate a GraphQL code-first module', async () => { - const options = { ...defaultResourceOptions, type: 'graphql-code-first' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.resolver.spec.ts', - '/src/app/tests/controllers/tests.resolver.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.resolver`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.resolver.ts`)).toContain(`../services/tests.service`); - }); - - it('should generate a GraphQL code-first module with CRUD', async () => { - const options = { ...defaultResourceOptions, crud: true, type: 'graphql-code-first' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.resolver.spec.ts', - '/src/app/tests/controllers/tests.resolver.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - '/src/app/tests/model/dtos/create-test.input.ts', - '/src/app/tests/model/dtos/update-test.input.ts', - '/src/app/tests/model/entities/test.entity.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.resolver`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.resolver.ts`)).toContain(`../services/tests.service`); - }); - - it('should generate a GraphQL schema-first module', async () => { - const options = { ...defaultResourceOptions, crud: true, type: 'graphql-schema-first' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.graphql', - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.resolver.spec.ts', - '/src/app/tests/controllers/tests.resolver.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - '/src/app/tests/model/dtos/create-test.input.ts', - '/src/app/tests/model/dtos/update-test.input.ts', - '/src/app/tests/model/entities/test.entity.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.resolver`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.resolver.ts`)).toContain(`../services/tests.service`); - }); - - it('should generate a GraphQL schema-first module with CRUD', async () => { - const options = { ...defaultResourceOptions, crud: true, type: 'graphql-schema-first' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.graphql', - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.resolver.spec.ts', - '/src/app/tests/controllers/tests.resolver.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - '/src/app/tests/model/dtos/create-test.input.ts', - '/src/app/tests/model/dtos/update-test.input.ts', - '/src/app/tests/model/entities/test.entity.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.resolver`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.resolver.ts`)).toContain(`../services/tests.service`); - }); - - it('should generate a microservice module', async () => { - const options = { ...defaultResourceOptions, type: 'microservice' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.controller.spec.ts', - '/src/app/tests/controllers/tests.controller.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.controller`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain(`../services/tests.service`); - }); - - it('should generate a microservice module with CRUD', async () => { - const options = { ...defaultResourceOptions, crud: true, type: 'microservice' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.controller.spec.ts', - '/src/app/tests/controllers/tests.controller.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - '/src/app/tests/model/dtos/create-test.dto.ts', - '/src/app/tests/model/dtos/update-test.dto.ts', - '/src/app/tests/model/entities/test.entity.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.controller`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain(`../services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain( - `../model/dtos/create-test.dto`, - ); - expect(tree.readContent(`/src/app/tests/controllers/tests.controller.ts`)).toContain( - `../model/dtos/update-test.dto`, - ); - expect(tree.readContent(`/src/app/tests/services/tests.service.ts`)).toContain(`../model/dtos/create-test.dto`); - expect(tree.readContent(`/src/app/tests/services/tests.service.ts`)).toContain(`../model/dtos/update-test.dto`); - }); - - it('should generate a WebSocket module', async () => { - const options = { ...defaultResourceOptions, type: 'ws' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.gateway.spec.ts', - '/src/app/tests/controllers/tests.gateway.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.gateway`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.gateway.ts`)).toContain(`../services/tests.service`); - }); - - it('should generate a WebSocket module with CRUD', async () => { - const options = { ...defaultResourceOptions, crud: true, type: 'ws' }; - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('resource', options, tree).toPromise(); - - expect(tree.files).toEqual( - expect.arrayContaining([ - '/src/app/tests/tests.module.ts', - '/src/app/tests/controllers/tests.gateway.spec.ts', - '/src/app/tests/controllers/tests.gateway.ts', - '/src/app/tests/services/tests.service.spec.ts', - '/src/app/tests/services/tests.service.ts', - '/src/app/tests/model/dtos/create-test.dto.ts', - '/src/app/tests/model/dtos/update-test.dto.ts', - '/src/app/tests/model/entities/test.entity.ts', - ]), - ); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./controllers/tests.gateway`); - expect(tree.readContent(`/src/app/tests/tests.module.ts`)).toContain(`./services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.gateway.ts`)).toContain(`../services/tests.service`); - expect(tree.readContent(`/src/app/tests/controllers/tests.gateway.ts`)).toContain(`../model/dtos/create-test.dto`); - expect(tree.readContent(`/src/app/tests/controllers/tests.gateway.ts`)).toContain(`../model/dtos/update-test.dto`); - expect(tree.readContent(`/src/app/tests/services/tests.service.ts`)).toContain(`../model/dtos/create-test.dto`); - expect(tree.readContent(`/src/app/tests/services/tests.service.ts`)).toContain(`../model/dtos/update-test.dto`); - }); -}); diff --git a/packages/schematics/src/lib/resource/schema.json b/packages/schematics/src/lib/resource/schema.json deleted file mode 100644 index bd7531d0..00000000 --- a/packages/schematics/src/lib/resource/schema.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "ResourceSchematic", - "title": "devon4ts_node Resource Options Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the resource.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for this resource (plural, e.g., \"users\")?" - }, - "spec": { - "type": "boolean", - "default": true, - "description": "Specifies if specs file are generated." - }, - "type": { - "type": "string", - "description": "The transport layer.", - "default": "rest", - "enum": [ - "rest", - "graphql-code-first", - "graphql-schema-first", - "microservice", - "ws" - ], - "x-prompt": { - "message": "What transport layer do you use?", - "type": "list", - "items": [ - { - "value": "rest", - "label": "REST API" - }, - { - "value": "graphql-code-first", - "label": "GraphQL (code first)" - }, - { - "value": "graphql-schema-first", - "label": "GraphQL (schema first)" - }, - { - "value": "microservice", - "label": "Microservice (non-HTTP)" - }, - { - "value": "ws", - "label": "WebSockets" - } - ] - } - }, - "crud": { - "type": "boolean", - "description": "When true, CRUD entry points are generated.", - "default": true, - "x-prompt": { - "message": "Would you like to generate CRUD entry points?", - "type": "confirmation" - } - }, - "orm": { - "type": "string", - "description": "ORM to generate specific files.", - "default": "none", - "enum": [ - "none", - "typeorm", - "prisma", - "mongoose" - ], - "x-prompt": { - "message": "Which ORM are you using? (No efect if you are not generating the CRUD)", - "type": "list", - "items": [ - { - "value": "none", - "label": "I'm not using any ORM" - }, - { - "value": "typeorm", - "label": "TypeORM" - }, - { - "value": "prisma", - "label": "Prisma" - }, - { - "value": "mongoose", - "label": "Mongoose" - } - ] - } - } - }, - "required": [ - "name" - ] -} \ No newline at end of file diff --git a/packages/schematics/src/lib/security/schema.json b/packages/schematics/src/lib/security/schema.json deleted file mode 100644 index d2887e75..00000000 --- a/packages/schematics/src/lib/security/schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SecuritySchematic", - "title": "Security Schema", - "type": "object", - "properties": {} -} diff --git a/packages/schematics/src/lib/security/security.factory.ts b/packages/schematics/src/lib/security/security.factory.ts deleted file mode 100644 index 3c18996d..00000000 --- a/packages/schematics/src/lib/security/security.factory.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Path } from '@angular-devkit/core'; -import { chain, Rule, Tree } from '@angular-devkit/schematics'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { formatTsFile, installNodePackages, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; - -function updatePackageJson(): Rule { - return (host: Tree): Tree => { - const filePath = 'package.json' as Path; - - const content = JSON.parse(host.read(filePath)!.toString('utf-8')); - content.dependencies[packagesVersion.helmet.packageName] = packagesVersion.helmet.packageVersion; - - host.overwrite(filePath, JSON.stringify(content, null, 2)); - - return host; - }; -} - -function updateMain(): Rule { - return (tree: Tree): Tree => { - const filePath = '/src/main.ts' as Path; - const content = new ASTFileBuilder(tree.read(filePath)!.toString('utf-8')) - .addDefaultImports('helmet', 'helmet') - .insertLinesToFunctionBefore('bootstrap', 'app.listen', 'app.use(helmet());') - .insertLinesToFunctionBefore( - 'bootstrap', - 'app.listen', - `app.enableCors({ origin: '*', credentials: true, exposedHeaders: 'Authorization', allowedHeaders: 'authorization, content-type',});`, - ) - .build(); - - if (content) { - tree.overwrite(filePath, formatTsFile(content)); - } - return tree; - }; -} - -export function security(): Rule { - return chain([stopExecutionIfNotRunningAtRootFolder(), updatePackageJson(), updateMain(), installNodePackages()]); -} diff --git a/packages/schematics/src/lib/security/security.factory_spec.ts b/packages/schematics/src/lib/security/security.factory_spec.ts deleted file mode 100644 index e14a23d5..00000000 --- a/packages/schematics/src/lib/security/security.factory_spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Security Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('security', {}).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should add dependencies to package.json', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('security', {}, tree).toPromise(); - - const fileContent = tree.readContent('/package.json'); - expect(fileContent).toMatch(/"dependencies": {(.|\n)*"helmet":/g); - }); - - it('should main.ts to add CORS and helmet', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('security', {}, tree).toPromise(); - - const fileContent = tree.readContent('/src/main.ts'); - expect(fileContent).toContain('app.enableCors'); - expect(fileContent).toContain(`import helmet from 'helmet'`); - }); -}); diff --git a/packages/schematics/src/lib/service/files/services/__name__.service.spec.ts b/packages/schematics/src/lib/service/files/services/__name__.service.spec.ts deleted file mode 100644 index 9bbea857..00000000 --- a/packages/schematics/src/lib/service/files/services/__name__.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { <%= classify(name) %>Service } from './<%= name %>.service'; - -describe('<%= classify(name) %>Service', () => { - let service: <%= classify(name) %>Service; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [<%= classify(name) %>Service], - }).compile(); - - service = module.get<<%= classify(name) %>Service>(<%= classify(name) %>Service); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/packages/schematics/src/lib/service/files/services/__name__.service.ts b/packages/schematics/src/lib/service/files/services/__name__.service.ts deleted file mode 100644 index 2f1c4ebd..00000000 --- a/packages/schematics/src/lib/service/files/services/__name__.service.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class <%= classify(name) %>Service {} diff --git a/packages/schematics/src/lib/service/schema.json b/packages/schematics/src/lib/service/schema.json deleted file mode 100644 index 403712a5..00000000 --- a/packages/schematics/src/lib/service/schema.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "ServiceSchematic", - "title": "Service Schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the service.", - "$default": { - "$source": "argv", - "index": 0 - }, - "x-prompt": "What name would you like to use for the service?" - }, - "spec": { - "default": true, - "description": "Specifies if a spec file is generated." - } - }, - "required": [ - "name" - ] -} diff --git a/packages/schematics/src/lib/service/service.factory.ts b/packages/schematics/src/lib/service/service.factory.ts deleted file mode 100644 index b1f87923..00000000 --- a/packages/schematics/src/lib/service/service.factory.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { basename, join, normalize, Path, strings } from '@angular-devkit/core'; -import { apply, chain, filter, mergeWith, move, noop, Rule, template, url } from '@angular-devkit/schematics'; -import { Tree } from '@angular-devkit/schematics/src/tree/interface'; -import { ModuleFinder } from '@nestjs/schematics/dist/utils/module.finder'; -import * as pluralize from 'pluralize'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { formatTsFile, formatTsFiles, stopExecutionIfNotRunningAtRootFolder } from '../../utils/tree-utils'; - -interface IServiceOptions { - name: string; - spec: boolean; -} - -function updateModule(serviceName: string, modulePath: Path) { - return (tree: Tree): Tree => { - const moduleName = strings.classify(basename(modulePath as Path) + '-module'); - const module = new ModuleFinder(tree).find({ - name: basename(modulePath as Path), - path: modulePath as Path, - }); - if (!module) { - return tree; - } - - const fileContent = new ASTFileBuilder(tree.read(module)!.toString('utf-8')) - .addImports(strings.classify(serviceName) + 'Service', './services/' + serviceName + '.service') - .addToModuleDecorator(moduleName, strings.classify(serviceName) + 'Service', 'providers'); - - if (fileContent) { - tree.overwrite(module, formatTsFile(fileContent.build())); - } - - return tree; - }; -} - -export function main(options: IServiceOptions): Rule { - const name = pluralize(strings.dasherize(basename(options.name as Path))); - const path: Path = strings.dasherize(normalize(join('src/app' as Path, options.name, '..'))) as Path; - - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - mergeWith( - apply(url('./files'), [ - options.spec ? noop() : filter(p => !p.endsWith('.spec.ts')), - template({ - ...strings, - name, - }), - formatTsFiles(), - move(path), - ]), - ), - updateModule(name, path), - ]); -} diff --git a/packages/schematics/src/lib/service/service.factory_spec.ts b/packages/schematics/src/lib/service/service.factory_spec.ts deleted file mode 100644 index a4b09f6f..00000000 --- a/packages/schematics/src/lib/service/service.factory_spec.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; - -describe('Service Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('service', { name: 'test' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate the service files', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner - .runSchematicAsync( - 'service', - { - name: 'foos', - }, - tree, - ) - .toPromise(); - - expect(tree.files).toContain('/src/app/services/foos.service.ts'); - expect(tree.files).toContain('/src/app/services/foos.service.spec.ts'); - }); - - it('should pluralize the name', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner - .runSchematicAsync( - 'service', - { - name: 'foo', - }, - tree, - ) - .toPromise(); - - expect(tree.files).toContain('/src/app/services/foos.service.ts'); - expect(tree.files).toContain('/src/app/services/foos.service.spec.ts'); - }); - - it('should skip spec files if spec is false', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner - .runSchematicAsync( - 'service', - { - name: 'foo', - spec: false, - }, - tree, - ) - .toPromise(); - - expect(tree.files).toContain('/src/app/services/foos.service.ts'); - expect(tree.files).not.toContain('/src/app/services/foos.service.spec.ts'); - }); - - it('should generate the service files inside the specified module', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner - .runSchematicAsync( - 'service', - { - name: 'foo/foo', - spec: false, - }, - tree, - ) - .toPromise(); - - expect(tree.files).toContain('/src/app/foo/services/foos.service.ts'); - expect(tree.files).not.toContain('/src/app/foo/services/foos.service.spec.ts'); - }); -}); diff --git a/packages/schematics/src/lib/swagger/schema.json b/packages/schematics/src/lib/swagger/schema.json deleted file mode 100644 index 60e58995..00000000 --- a/packages/schematics/src/lib/swagger/schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "SwaggerSchematic", - "title": "Swagger Schema", - "type": "object", - "properties": {} -} diff --git a/packages/schematics/src/lib/swagger/swagger.factory.ts b/packages/schematics/src/lib/swagger/swagger.factory.ts deleted file mode 100644 index 3f0da0a8..00000000 --- a/packages/schematics/src/lib/swagger/swagger.factory.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { Path } from '@angular-devkit/core'; -import { apply, chain, mergeWith, Rule, Tree, url } from '@angular-devkit/schematics'; -import { ASTFileBuilder } from '../../utils/ast-file-builder'; -import { mergeFiles } from '../../utils/merge'; -import { - existsConvictConfig, - formatTsFile, - installNodePackages, - stopExecutionIfNotRunningAtRootFolder, -} from '../../utils/tree-utils'; -import { packagesVersion } from '../packagesVersion'; - -const swaggerTemplateWithConfig = `if (config.isDev) { - const options = new DocumentBuilder() - .setTitle(config.swagger?.title ?? 'NestJS application') - .setDescription(config.swagger?.description ?? '') - .setVersion(config.swagger?.version ?? '0.0.1') - .addBearerAuth() - .build(); - - const swaggerDoc = SwaggerModule.createDocument(app, options); - SwaggerModule.setup('v' + (config.defaultVersion) + '/api', app, swaggerDoc); - }`; - -const swaggerTemplate = `if (process.env.NODE_ENV === 'develop') { - const options = new DocumentBuilder() - .setTitle('NestJS application') - .setDescription('') - .setVersion('0.0.1') - .addBearerAuth() - .build(); - - const swaggerDoc = SwaggerModule.createDocument(app, options); - SwaggerModule.setup('v1/api', app, swaggerDoc); - }`; - -const defaultSwaggerConfig = `{ - title: { - doc: 'Swagger documentation title', - default: 'NestJS Application', - format: String, - }, - description: { - doc: 'Swagger documentation description', - default: 'API Documentation', - format: String, - }, - version: { - doc: 'Swagger documentation version', - default: '0.0.1', - format: String, - }, - },`; - -const defaultSwaggerConfigType = `{ - title: string; - description: string; - version: string; - }`; - -function updatePackageJson(): Rule { - return (tree: Tree): Tree => { - const packageJsonPath = 'package.json'; - const packageJson = JSON.parse(tree.read(packageJsonPath)!.toString()); - - packageJson.dependencies[packagesVersion.nestjsSwagger.packageName] = packagesVersion.nestjsSwagger.packageVersion; - tree.overwrite(packageJsonPath, JSON.stringify(packageJson, null, 2)); - - return tree; - }; -} - -function updateBaseEntity() { - return (tree: Tree): Tree => { - const baseEntityPath = 'src/app/shared/model/entities/base.entity.ts'; - - if (!tree.exists(baseEntityPath)) { - return tree; - } - - const fileContent = new ASTFileBuilder(tree.read(baseEntityPath)!.toString()) - .addImports('ApiHideProperty', '@nestjs/swagger') - .addDecoratorToClassProp('BaseEntity', 'version', [ - { - name: 'ApiHideProperty', - arguments: [], - }, - ]) - .addDecoratorToClassProp('BaseEntity', 'createdAt', [ - { - name: 'ApiHideProperty', - arguments: [], - }, - ]) - .addDecoratorToClassProp('BaseEntity', 'updatedAt', [ - { - name: 'ApiHideProperty', - arguments: [], - }, - ]) - .build(); - - if (fileContent) { - tree.overwrite(baseEntityPath, fileContent); - } - - return tree; - }; -} - -function updateNestCliJson() { - return (tree: Tree): Tree => { - const nestCliJsonPath = 'nest-cli.json'; - const nestCliJson = JSON.parse(tree.read(nestCliJsonPath)!.toString()); - - if (nestCliJson.compilerOptions) { - if (nestCliJson.compilerOptions.plugins) { - nestCliJson.compilerOptions.plugins.push('@nestjs/swagger'); - } else { - nestCliJson.compilerOptions.plugins = ['@nestjs/swagger']; - } - } else { - nestCliJson.compilerOptions = { - plugins: ['@nestjs/swagger'], - }; - } - - tree.overwrite(nestCliJsonPath, JSON.stringify(nestCliJson, null, 2)); - - return tree; - }; -} - -function updateConfigFile(tree: Tree): void { - const typesFile: Path = 'src/config.ts' as Path; - - let typesFileContent = tree.read(typesFile)!.toString('utf-8'); - typesFileContent = new ASTFileBuilder(typesFileContent) - .addPropertyToObjectLiteralParam('config', 0, 'swagger', defaultSwaggerConfig) - .build(); - - tree.overwrite(typesFile, formatTsFile(typesFileContent)); -} - -function updateConfigTypeFile(tree: Tree): void { - const typesFile: Path = 'src/app/shared/app-config.ts' as Path; - - let typesFileContent = tree.read(typesFile)!.toString('utf-8'); - typesFileContent = new ASTFileBuilder(typesFileContent) - .addPropToInterface('AppConfig', 'swagger', defaultSwaggerConfigType) - .build(); - - tree.overwrite(typesFile, formatTsFile(typesFileContent)); -} - -function updateMain() { - return (tree: Tree): Tree => { - const config = existsConvictConfig(tree); - - const mainPath = 'src/main.ts'; - const main = new ASTFileBuilder(tree.read(mainPath)!.toString()) - .addImports('DocumentBuilder', '@nestjs/swagger') - .addImports('SwaggerModule', '@nestjs/swagger'); - - if (!config) { - main.insertLinesToFunctionBefore('bootstrap', 'app.listen', swaggerTemplate); - } else { - main.insertLinesToFunctionBefore('bootstrap', 'app.listen', swaggerTemplateWithConfig); - updateConfigFile(tree); - updateConfigTypeFile(tree); - } - - if (main) { - tree.overwrite(mainPath, formatTsFile(main.build())); - } - return tree; - }; -} - -export function swagger(): Rule { - return (tree: Tree): Rule => { - return chain([ - stopExecutionIfNotRunningAtRootFolder(), - mergeWith(apply(url('./files'), [mergeFiles(tree)])), - updatePackageJson(), - updateMain(), - updateNestCliJson(), - updateBaseEntity(), - installNodePackages(), - ]); - }; -} diff --git a/packages/schematics/src/lib/swagger/swagger.factory_spec.ts b/packages/schematics/src/lib/swagger/swagger.factory_spec.ts deleted file mode 100644 index ff6a3eec..00000000 --- a/packages/schematics/src/lib/swagger/swagger.factory_spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; -import * as path from 'path'; -import { packagesVersion } from '../packagesVersion'; - -describe('Swagger Factory', () => { - const runner: SchematicTestRunner = new SchematicTestRunner('.', path.join(process.cwd(), 'src/collection.json')); - - it('should throw an error if not executed at project root folder', done => { - runner.runSchematicAsync('swagger', { name: 'foo' }).subscribe( - () => { - fail(); - }, - error => { - expect(error).toStrictEqual(new Error('You must run the schematic at devon4ts_node project root folder.')); - done(); - }, - ); - }); - - it('should generate the files', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('swagger', {}, tree).toPromise(); - - expect(tree.files).toEqual(expect.arrayContaining(['/config/prod.json', '/config/develop.json'])); - }); - - it('should update package.json to add swagger dependencies', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('swagger', {}, tree).toPromise(); - - expect(tree.readContent('/package.json')).toContain(`"${packagesVersion.nestjsSwagger.packageName}": `); - }); - - it('should update main.ts to initialize swagger', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('swagger', {}, tree).toPromise(); - - const main = tree.readContent('/src/main.ts'); - expect(main).toContain(`import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'`); - expect(main).toContain(`const swaggerDoc = SwaggerModule.createDocument(app, options);`); - expect(main).toContain(`SwaggerModule.setup('v1/api', app, swaggerDoc);`); - }); - - it('should initalize swagger with convict configuration if present in the project', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - tree = await runner.runSchematicAsync('swagger', {}, tree).toPromise(); - - const main = tree.readContent('/src/main.ts'); - expect(main).toContain(`import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'`); - expect(main).toContain(`const swaggerDoc = SwaggerModule.createDocument(app, options);`); - expect(main).toContain(`const swaggerDoc = SwaggerModule.createDocument(app, options);`); - expect(main).toContain(`config.swagger?.title`); - }); - - it('should update nest-cli.json to enable swagger plugin', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('swagger', {}, tree).toPromise(); - - expect(tree.readContent('/nest-cli.json')).toMatch( - /"compilerOptions": \{(.|\n)*"plugins": \[(.|\n)*"@nestjs\/swagger"(.|\n)*\](.|\n)*\}/g, - ); - }); - - it('should initalize swagger with convict configuration if present in the project', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('convict', {}, tree).toPromise(); - tree = await runner.runSchematicAsync('swagger', {}, tree).toPromise(); - - const main = tree.readContent('/src/main.ts'); - expect(main).toContain(`import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'`); - expect(main).toContain(`const swaggerDoc = SwaggerModule.createDocument(app, options);`); - expect(main).toContain(`const swaggerDoc = SwaggerModule.createDocument(app, options);`); - expect(main).toContain(`config.swagger?.title`); - }); - - it('should update base-entity to add swagger decorators', async () => { - let tree = await runner.runSchematicAsync('application', { name: '' }).toPromise(); - tree = await runner.runSchematicAsync('typeorm', { db: 'postgres' }, tree).toPromise(); - tree = await runner.runSchematicAsync('swagger', {}, tree).toPromise(); - - const baseEntity = tree.readContent('/src/app/shared/model/entities/base.entity.ts'); - expect(baseEntity).toContain(`import { ApiHideProperty } from '@nestjs/swagger'`); - expect(baseEntity).toMatch(/@ApiHideProperty\(\)\n *version/g); - expect(baseEntity).toMatch(/@ApiHideProperty\(\)\n *createdAt/g); - expect(baseEntity).toMatch(/@ApiHideProperty\(\)\n *updatedAt/g); - }); -}); diff --git a/packages/schematics/src/utils/index.spec.ts b/packages/schematics/src/utils/index.spec.ts new file mode 100644 index 00000000..f40f7e54 --- /dev/null +++ b/packages/schematics/src/utils/index.spec.ts @@ -0,0 +1,10 @@ +import { classify } from './index'; + +describe('class names generator', () => { + const name = 'test'; + it('should return the name as a class name', () => { + const className = 'Test'; + expect(classify).toBeDefined(); + expect(classify(name)).toBe(className); + }); +}); diff --git a/packages/schematics/src/utils/index.ts b/packages/schematics/src/utils/index.ts new file mode 100644 index 00000000..97cdb50a --- /dev/null +++ b/packages/schematics/src/utils/index.ts @@ -0,0 +1,3 @@ +export function classify(val: string): string { + return val.charAt(0).toUpperCase() + val.slice(1); +} diff --git a/packages/schematics/src/utils/merge.ts b/packages/schematics/src/utils/merge.ts deleted file mode 100644 index 3a7d8690..00000000 --- a/packages/schematics/src/utils/merge.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { extname } from '@angular-devkit/core'; -import { FileEntry, forEach, Tree, Rule } from '@angular-devkit/schematics'; -import { dump, load } from 'js-yaml'; -import { cloneDeep, defaultsDeep, isPlainObject } from 'lodash'; -import { basename } from 'path'; - -function assignDeep(target: any, ...args: any[]): any { - const newTarget = cloneDeep(target); - args.forEach(arg => { - const properties: any[][] = [[newTarget, arg]]; - - while (properties.length > 0) { - const [base, source] = properties.shift()!; - - Object.keys(source).forEach(key => { - if (isPlainObject(source[key]) && base[key] !== undefined) { - properties.push([base[key], source[key]]); - } else { - base[key] = source[key]; - } - }); - } - }); - - return newTarget; -} - -export function mergeJsonFile(tree: Tree, fileEntry: FileEntry): FileEntry | null { - if (tree.exists(fileEntry.path)) { - if (extname(fileEntry.path) === '.json' || basename(fileEntry.path) === '.prettierrc') { - tree.overwrite( - fileEntry.path, - JSON.stringify( - assignDeep( - JSON.parse(tree.read(fileEntry.path)!.toString('utf-8')), - JSON.parse(fileEntry.content.toString('utf-8')), - ), - null, - 2, - ), - ); - } - - // Do not add the new file if it already exists - return null; - } - return fileEntry; -} - -export function mergeYmlFile(tree: Tree, fileEntry: FileEntry): FileEntry | null { - if (tree.exists(fileEntry.path)) { - if (extname(fileEntry.path) === '.yml' || extname(fileEntry.path) === '.yaml') { - tree.overwrite( - fileEntry.path, - dump( - defaultsDeep(load(fileEntry.content.toString('utf-8')), load(tree.read(fileEntry.path)!.toString('utf-8'))), - ), - ); - } - - // Do not add the new file if it already exists - return null; - } - return fileEntry; -} - -export function mergeFiles(tree: Tree): Rule { - return forEach((fileEntry: FileEntry) => { - const extension = extname(fileEntry.path); - const fileName = basename(fileEntry.path); - - if (extension === '.json' || fileName === '.prettierrc') { - return mergeJsonFile(tree, fileEntry); - } - - if (extension === '.yml') { - return mergeYmlFile(tree, fileEntry); - } - - return fileEntry; - }); -} diff --git a/packages/schematics/src/utils/merge_spec.ts b/packages/schematics/src/utils/merge_spec.ts deleted file mode 100644 index 9055ac0b..00000000 --- a/packages/schematics/src/utils/merge_spec.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Path } from '@angular-devkit/core'; -import { FileEntry, Tree } from '@angular-devkit/schematics'; -import { load } from 'js-yaml'; -import { mergeJsonFile, mergeYmlFile } from './merge'; - -describe('Merge', () => { - describe('mergeJsonFile', () => { - it('should merge in depth json files', () => { - const unitTree = Tree.empty(); - unitTree.create( - '/todo.json', - JSON.stringify({ - prop1: 'hello', - prop2: ['a', 'b', 'c'], - prop3: { - prop4: 'd', - }, - }), - ); - - const input: FileEntry = { - path: '/todo.json' as Path, - content: Buffer.from( - JSON.stringify({ - prop1: 'bye', - prop2: ['f'], - prop3: { - prop5: 'g', - }, - }), - ), - }; - - const expected = { - prop1: 'bye', - prop2: ['f'], - prop3: { - prop4: 'd', - prop5: 'g', - }, - }; - - mergeJsonFile(unitTree, input); - - expect(unitTree.readText('/todo.json')).toStrictEqual(JSON.stringify(expected, null, 2)); - }); - }); - - describe('mergeYmlFile', () => { - it('should merge in depth yaml files', () => { - const unitTree = Tree.empty(); - unitTree.create( - '/todo.yaml', - `prop1: hello -prop2: - - a - - b - - c -prop3: - prop4: d -prop6: asdf`, - ); - - const input: FileEntry = { - path: '/todo.yaml' as Path, - content: Buffer.from( - `prop1: bye -prop2: - - f -prop3: - prop5: g`, - ), - }; - - const expected = { - prop1: 'bye', - prop2: ['f', 'b', 'c'], - prop3: { - prop4: 'd', - prop5: 'g', - }, - prop6: 'asdf', - }; - - mergeYmlFile(unitTree, input); - - expect(load(unitTree.readText('/todo.yaml'))).toStrictEqual(expected); - }); - }); -}); diff --git a/packages/schematics/src/utils/tree-utils.ts b/packages/schematics/src/utils/tree-utils.ts index 9129a212..4f18d552 100644 --- a/packages/schematics/src/utils/tree-utils.ts +++ b/packages/schematics/src/utils/tree-utils.ts @@ -1,93 +1,16 @@ -import { basename, dirname, join, normalize, Path } from '@angular-devkit/core'; -import { FileEntry, forEach, Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; -import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; -import { format, Options } from 'prettier'; - -const PRETTIER_DEFAULT_OPTS: Options = { - singleQuote: true, - trailingComma: 'all', - semi: true, - printWidth: 120, - tabWidth: 2, - bracketSpacing: true, - arrowParens: 'avoid', - endOfLine: 'lf', - quoteProps: 'consistent', - useTabs: false, - parser: 'typescript', -}; - -export interface BaseNestOptions { - name: string; - path?: string; - flat?: boolean; - language?: string; -} - -export function formatTsFile(content: string): string { - return format(content, PRETTIER_DEFAULT_OPTS); -} - -export function formatTsFiles(): Rule { - return forEach((fileEntry: FileEntry) => { - if ( - !fileEntry.path.startsWith('/node_modules') && - !fileEntry.path.startsWith('/dist') && - fileEntry.path.endsWith('.ts') - ) { - return { - path: fileEntry.path, - content: Buffer.from(formatTsFile(fileEntry.content.toString())), - }; - } - - return fileEntry; - }); -} +import { Tree } from '@nx/devkit'; export function runningAtRootFolder(tree: Tree): boolean { - return ['/package.json', '/nest-cli.json', '/tsconfig.json'].map(file => tree.exists(file)).every(exists => exists); -} - -export function stopExecutionIfNotRunningAtRootFolder(): Rule { - return tree => { - if (!runningAtRootFolder(tree)) { - throw new Error('You must run the schematic at devon4ts_node project root folder.'); - } - - return tree; - }; -} - -export function transformOptionsToNestJS(options: T, folder: string, flat = true): Rule { - return (host: Tree): Tree => { - const isRootFolder = runningAtRootFolder(host); - - options.flat = flat; - options.language = 'ts'; - - if (options.name.includes('/')) { - options.path = dirname(options.name as Path); - options.name = basename(options.name as Path); - } - - options.path = normalize(join((options.path as Path) ?? '.', folder)); - - if (isRootFolder) { - options.path = normalize(join('app/' as Path, options.path ?? '.')); - } - - return host; - }; + return ['/package.json', '/nx.json'].map(file => tree.exists(file)).every(exists => exists); } -export function existsConvictConfig(tree: Tree): boolean { - return tree.exists('src/config.ts'); +export function stopExecutionIfNotRunningAtRootFolder(tree: Tree): Tree { + if (!runningAtRootFolder(tree)) { + throw new Error('You must run the schematic at your Nx worspace root folder.'); + } + return tree; } -export function installNodePackages(): Rule { - return (host: Tree, context: SchematicContext): Tree => { - context.addTask(new NodePackageInstallTask({ packageManager: 'yarn' })); - return host; - }; +export function existsConvictConfig(tree: Tree, projectName: string): boolean { + return tree.exists(`apps/${projectName}/src/config.ts`); } diff --git a/packages/schematics/tsconfig.build.json b/packages/schematics/tsconfig.build.json index f0e804d7..0ffa22cf 100644 --- a/packages/schematics/tsconfig.build.json +++ b/packages/schematics/tsconfig.build.json @@ -3,9 +3,5 @@ "compilerOptions": { "sourceMap": false }, - "exclude": [ - "node_modules", - "src/lib/**/files/**/*", - "**/*_spec.ts" - ] + "exclude": ["node_modules", "src/generators/**/files/**/*", "**/*_spec.ts", "test"] } diff --git a/packages/schematics/tsconfig.json b/packages/schematics/tsconfig.json index 1ab548b6..3ce87308 100644 --- a/packages/schematics/tsconfig.json +++ b/packages/schematics/tsconfig.json @@ -1,25 +1,25 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "lib": [ - "es2018", - "dom" - ], - "rootDir": "src/", - "outDir": "./src/", - "baseUrl": "./", - "sourceMap": true, + "module": "commonjs", + "noImplicitAny": false, + "lib": ["es2018", "dom"], + "rootDir": ".", + "outDir": "./dist", + "baseUrl": "", + "sourceMap": false, "incremental": false, - "types": [ - "jest", - "node" - ] + "noImplicitThis": false, + "types": ["jest", "node"], }, - "include": [ - "src/**/*" + "include": ["src/**/*"], + "exclude": ["node_modules", "src/generators/**/files/**/*"], + "references": [ + { + "path": "./tsconfig.lib.json", + }, + { + "path": "./tsconfig.spec.json", + }, ], - "exclude": [ - "node_modules", - "src/lib/**/files/**/*" - ] } diff --git a/packages/schematics/tsconfig.lib.json b/packages/schematics/tsconfig.lib.json new file mode 100644 index 00000000..4dccb0d6 --- /dev/null +++ b/packages/schematics/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts", "src/**/*.ts.template"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/packages/schematics/tsconfig.spec.json b/packages/schematics/tsconfig.spec.json new file mode 100644 index 00000000..a68bdcc2 --- /dev/null +++ b/packages/schematics/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts", "src/**/*.ts.template"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64a98224..803f8ead 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,77 +13,86 @@ importers: version: 14.2.13 '@nestjs/cli': specifier: ^9.1.3 - version: 9.5.0(@swc/core@1.3.105) + version: 9.5.0(@swc/core@1.3.107) '@nx/devkit': specifier: 17.2.8 - version: 17.2.8(nx@17.2.6) + version: 17.2.8(nx@17.2.8) '@nx/plugin': specifier: ^17.2.8 - version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5) + version: 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) '@swc/helpers': specifier: ~0.5.2 - version: 0.5.3 + version: 0.5.6 fs-extra: specifier: ^11.2.0 version: 11.2.0 lodash: specifier: ^4.17.21 version: 4.17.21 + passport-jwt: + specifier: ^4.0.1 + version: 4.0.1 prettier: - specifier: ^2.7.1 + specifier: ^2.8.8 version: 2.8.8 triple-beam: specifier: ^1.4.1 version: 1.4.1 tslib: - specifier: ^2.3.0 + specifier: ^2.6.2 version: 2.6.2 + type-fest: + specifier: ^4.10.2 + version: 4.10.2 typescript: - specifier: ^4.8.3 - version: 4.9.5 + specifier: ^5.3.3 + version: 5.3.3 devDependencies: '@commitlint/cli': specifier: ^17.1.2 - version: 17.8.1(@swc/core@1.3.105) + version: 17.8.1(@swc/core@1.3.107) '@commitlint/config-conventional': specifier: ^17.1.0 version: 17.8.1 '@nestjs/common': - specifier: ^9.1.2 - version: 9.4.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: ^10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': - specifier: ^9.1.2 - version: 9.4.3(@nestjs/common@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: ^10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/testing': - specifier: ^9.1.2 - version: 9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3) + specifier: ^10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nx/jest': specifier: 17.2.8 - version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5) + version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) '@nx/js': specifier: 17.2.8 - version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@4.9.5) + version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@nx/nest': + specifier: ^17.2.8 + version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) '@swc-node/register': specifier: ~1.6.7 - version: 1.6.8(@swc/core@1.3.105)(typescript@4.9.5) + version: 1.6.8(@swc/core@1.3.107)(@swc/types@0.1.5)(typescript@5.3.3) '@swc/cli': specifier: ~0.1.62 - version: 0.1.65(@swc/core@1.3.105) + version: 0.1.65(@swc/core@1.3.107) '@swc/core': specifier: ~1.3.85 - version: 1.3.105(@swc/helpers@0.5.3) + version: 1.3.107(@swc/helpers@0.5.6) '@types/jest': specifier: ^29.4.0 - version: 29.5.11 + version: 29.5.12 '@types/js-yaml': - specifier: ^4.0.5 + specifier: ^4.0.9 version: 4.0.9 '@types/lodash': - specifier: ^4.14.185 + specifier: ^4.14.202 version: 4.14.202 '@types/node': - specifier: 18.16.9 - version: 18.16.9 + specifier: 20.11.19 + version: 20.11.19 '@types/nodemailer': specifier: ^6.4.6 version: 6.4.14 @@ -91,26 +100,26 @@ importers: specifier: ^0.0.33 version: 0.0.33 '@types/prettier': - specifier: ^2.7.1 + specifier: ^2.7.3 version: 2.7.3 '@typescript-eslint/eslint-plugin': - specifier: ^5.38.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@4.9.5) + specifier: ^5.62.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': specifier: ^5.38.0 - version: 5.62.0(eslint@8.56.0)(typescript@4.9.5) + version: 5.62.0(eslint@8.56.0)(typescript@5.3.3) class-transformer: specifier: ^0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 - version: 0.14.0 + specifier: ^0.14.1 + version: 0.14.1 commitizen: specifier: ^4.2.4 - version: 4.3.0(typescript@4.9.5) + version: 4.3.0(@types/node@20.11.19)(typescript@5.3.3) cz-conventional-changelog: specifier: 3.3.0 - version: 3.3.0(typescript@4.9.5) + version: 3.3.0(@types/node@20.11.19)(typescript@5.3.3) eslint: specifier: ^8.24.0 version: 8.56.0 @@ -131,16 +140,16 @@ importers: version: 8.0.3 jest: specifier: ^29.4.1 - version: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + version: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-environment-jsdom: specifier: ^29.4.1 version: 29.7.0 lerna: specifier: ^5.5.2 - version: 5.6.2(@swc-node/register@1.6.8)(@swc/core@1.3.105) + version: 5.6.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) nx: - specifier: 17.2.6 - version: 17.2.6(@swc-node/register@1.6.8)(@swc/core@1.3.105) + specifier: ~17.2.8 + version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) reflect-metadata: specifier: ^0.1.13 version: 0.1.14 @@ -148,14 +157,14 @@ importers: specifier: ^7.5.7 version: 7.8.1 ts-jest: - specifier: ^29.1.0 - version: 29.1.1(@babel/core@7.23.6)(jest@29.7.0)(typescript@4.9.5) + specifier: ^29.1.2 + version: 29.1.2(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.3.3) ts-node: - specifier: 10.9.1 - version: 10.9.1(@swc/core@1.3.105)(@types/node@18.16.9)(typescript@4.9.5) + specifier: 10.9.2 + version: 10.9.2(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.3.3) typeorm: specifier: ^0.3.10 - version: 0.3.17(ts-node@10.9.1) + version: 0.3.20(ts-node@10.9.2) zx: specifier: ^7.0.8 version: 7.2.3 @@ -164,19 +173,19 @@ importers: dependencies: '@nestjs/common': specifier: ^9.0.0 - version: 9.4.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + version: 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) packages/config: dependencies: '@nestjs/common': specifier: ^9.0.0 - version: 9.4.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + version: 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) class-transformer: specifier: ^0.5.1 version: 0.5.1 class-validator: specifier: ^0.14.0 - version: 0.14.0 + version: 0.14.1 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -201,7 +210,7 @@ importers: dependencies: '@nestjs/common': specifier: ^10.3.3 - version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': specifier: ^10.3.3 version: 10.3.3(@nestjs/common@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -213,7 +222,7 @@ importers: version: 4.7.8 nodemailer: specifier: ^6.9.8 - version: 6.9.8 + version: 6.9.9 reflect-metadata: specifier: ^0.1.14 version: 0.1.14 @@ -230,21 +239,15 @@ importers: packages/schematics: dependencies: - '@angular-devkit/core': - specifier: ^14.0.2 - version: 14.2.13 - '@angular-devkit/schematics': - specifier: ^14.0.2 - version: 14.2.13 '@nestjs/schematics': - specifier: ^9.0.0 - version: 9.2.0(chokidar@3.5.3)(typescript@4.9.5) - '@schematics/angular': - specifier: ^14.0.2 - version: 14.2.13 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 + specifier: ^10.1.1 + version: 10.1.1(typescript@5.3.3) + '@nx/devkit': + specifier: 17.2.8 + version: 17.2.8(nx@17.2.8) + '@nx/nest': + specifier: 17.2.8 + version: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -252,14 +255,14 @@ importers: specifier: ^8.0.0 version: 8.0.0 prettier: - specifier: ^2.7.1 - version: 2.8.8 + specifier: ^3.2.5 + version: 3.2.5 ts-morph: - specifier: ^15.1.0 - version: 15.1.0 + specifier: ^21.0.1 + version: 21.0.1 typescript: - specifier: ^4.7.4 - version: 4.9.5 + specifier: ^5.3.3 + version: 5.3.3 packages: @@ -272,7 +275,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 /@angular-devkit/core@14.2.13: resolution: {integrity: sha512-aIefeZcbjghQg/V6U9CTLtyB5fXDJ63KwYqVYkWP+i0XriS5A9puFgq2u/OVsWxAfYvqpDqp5AdQ0g0bi3CAsA==} @@ -305,6 +308,22 @@ packages: jsonc-parser: 3.2.0 rxjs: 7.8.1 source-map: 0.7.4 + + /@angular-devkit/core@17.1.2: + resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + jsonc-parser: 3.2.0 + picomatch: 3.0.1 + rxjs: 7.8.1 + source-map: 0.7.4 dev: false /@angular-devkit/schematics-cli@14.2.13: @@ -361,6 +380,18 @@ packages: rxjs: 7.8.1 transitivePeerDependencies: - chokidar + + /@angular-devkit/schematics@17.1.2: + resolution: {integrity: sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 17.1.2 + jsonc-parser: 3.2.0 + magic-string: 0.30.5 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar dev: false /@babel/code-frame@7.23.5: @@ -374,20 +405,20 @@ packages: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - /@babel/core@7.23.6: - resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helpers': 7.23.6 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -400,22 +431,22 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} @@ -423,58 +454,44 @@ packages: dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 + browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.6): - resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + /@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.23.9): + resolution: {integrity: sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6): - resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.6): + /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.9): resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 @@ -491,34 +508,34 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -529,30 +546,30 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.6): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.9): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -561,19 +578,19 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} @@ -592,16 +609,16 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 - /@babel/helpers@7.23.6: - resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color @@ -613,892 +630,892 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.6): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.9): resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-proposal-decorators@7.23.7(@babel/core@7.23.6): - resolution: {integrity: sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==} + /@babel/plugin-proposal-decorators@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.9) - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.6): - resolution: {integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==} + /@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.6) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.6) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) - /@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.6): + /@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.9): resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/template': 7.23.9 - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.9): resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + /@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime@7.23.7(@babel/core@7.23.6): - resolution: {integrity: sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==} + /@babel/plugin-transform-runtime@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.6) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.6) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.9): resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.23.8(@babel/core@7.23.6): - resolution: {integrity: sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==} + /@babel/preset-env@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.6) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.6) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.6) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-async-generator-functions': 7.23.7(@babel/core@7.23.6) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.6) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.6) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.6) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.6) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.6) - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.6) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.6) - core-js-compat: 3.35.1 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) + core-js-compat: 3.36.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 esutils: 2.0.3 - /@babel/preset-typescript@7.23.3(@babel/core@7.23.6): + /@babel/preset-typescript@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.9) /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime@7.23.6: - resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} + /@babel/runtime@7.23.9: + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 - /@babel/traverse@7.23.6: - resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 @@ -1507,15 +1524,15 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 @@ -1537,14 +1554,14 @@ packages: engines: {node: '>=0.1.90'} dev: false - /@commitlint/cli@17.8.1(@swc/core@1.3.105): + /@commitlint/cli@17.8.1(@swc/core@1.3.107): resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.8.1 '@commitlint/lint': 17.8.1 - '@commitlint/load': 17.8.1(@swc/core@1.3.105) + '@commitlint/load': 17.8.1(@swc/core@1.3.107) '@commitlint/read': 17.8.1 '@commitlint/types': 17.8.1 execa: 5.1.1 @@ -1572,12 +1589,12 @@ packages: ajv: 8.12.0 dev: true - /@commitlint/config-validator@18.4.3: - resolution: {integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==} + /@commitlint/config-validator@18.6.1: + resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==} engines: {node: '>=v18'} requiresBuild: true dependencies: - '@commitlint/types': 18.4.3 + '@commitlint/types': 18.6.1 ajv: 8.12.0 dev: true optional: true @@ -1599,8 +1616,8 @@ packages: engines: {node: '>=v14'} dev: true - /@commitlint/execute-rule@18.4.3: - resolution: {integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==} + /@commitlint/execute-rule@18.6.1: + resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==} engines: {node: '>=v18'} requiresBuild: true dev: true @@ -1632,7 +1649,7 @@ packages: '@commitlint/types': 17.8.1 dev: true - /@commitlint/load@17.8.1(@swc/core@1.3.105): + /@commitlint/load@17.8.1(@swc/core@1.3.107): resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} engines: {node: '>=v14'} dependencies: @@ -1642,37 +1659,37 @@ packages: '@commitlint/types': 17.8.1 '@types/node': 20.5.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@4.9.5) - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@4.9.5) + cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.2)(typescript@5.3.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.105)(@types/node@20.5.1)(typescript@4.9.5) - typescript: 4.9.5 + ts-node: 10.9.2(@swc/core@1.3.107)(@types/node@20.5.1)(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /@commitlint/load@18.4.3(typescript@4.9.5): - resolution: {integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==} + /@commitlint/load@18.6.1(@types/node@20.11.19)(typescript@5.3.3): + resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} engines: {node: '>=v18'} requiresBuild: true dependencies: - '@commitlint/config-validator': 18.4.3 - '@commitlint/execute-rule': 18.4.3 - '@commitlint/resolve-extends': 18.4.3 - '@commitlint/types': 18.4.3 - '@types/node': 18.16.9 + '@commitlint/config-validator': 18.6.1 + '@commitlint/execute-rule': 18.6.1 + '@commitlint/resolve-extends': 18.6.1 + '@commitlint/types': 18.6.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@4.9.5) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.16.9)(cosmiconfig@8.3.6)(typescript@4.9.5) + cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.19)(cosmiconfig@8.3.6)(typescript@5.3.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 transitivePeerDependencies: + - '@types/node' - typescript dev: true optional: true @@ -1714,13 +1731,13 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/resolve-extends@18.4.3: - resolution: {integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==} + /@commitlint/resolve-extends@18.6.1: + resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==} engines: {node: '>=v18'} requiresBuild: true dependencies: - '@commitlint/config-validator': 18.4.3 - '@commitlint/types': 18.4.3 + '@commitlint/config-validator': 18.6.1 + '@commitlint/types': 18.6.1 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 @@ -1758,8 +1775,8 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/types@18.4.3: - resolution: {integrity: sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==} + /@commitlint/types@18.6.1: + resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} engines: {node: '>=v18'} requiresBuild: true dependencies: @@ -1794,7 +1811,7 @@ packages: debug: 4.3.4 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1810,11 +1827,11 @@ packages: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.1 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -1824,14 +1841,26 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} /@hutson/parse-repository-url@3.0.2: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@isaacs/string-locale-compare@1.1.0: resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} dev: true @@ -1855,13 +1884,13 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - /@jest/core@29.7.0(ts-node@10.9.1): + /@jest/core@29.7.0(ts-node@10.9.2): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1875,14 +1904,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -1910,7 +1939,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 jest-mock: 29.7.0 /@jest/expect-utils@29.7.0: @@ -1934,7 +1963,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.16.9 + '@types/node': 20.11.19 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -1964,18 +1993,18 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.20 - '@types/node': 18.16.9 + '@jridgewell/trace-mapping': 0.3.22 + '@types/node': 20.11.19 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.1 + istanbul-lib-instrument: 6.0.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 + istanbul-reports: 3.1.7 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 @@ -1996,7 +2025,7 @@ packages: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -2022,9 +2051,9 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -2047,7 +2076,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.16.9 + '@types/node': 20.11.19 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -2057,10 +2086,10 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} /@jridgewell/set-array@1.1.2: @@ -2071,22 +2100,22 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 dev: false /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 /@lerna/add@5.6.2: @@ -2103,7 +2132,7 @@ packages: npm-package-arg: 8.1.1 p-map: 4.0.0 pacote: 13.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - supports-color @@ -2135,7 +2164,7 @@ packages: p-map: 4.0.0 p-map-series: 2.1.0 p-waterfall: 2.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - supports-color @@ -2250,7 +2279,7 @@ packages: npm-package-arg: 8.1.1 npmlog: 6.0.2 pify: 5.0.0 - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/create-symlink@5.6.2: @@ -2278,7 +2307,7 @@ packages: p-reduce: 2.1.0 pacote: 13.6.2 pify: 5.0.0 - semver: 7.5.4 + semver: 7.6.0 slash: 3.0.0 validate-npm-package-license: 3.0.4 validate-npm-package-name: 4.0.0 @@ -2398,7 +2427,7 @@ packages: deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: '@lerna/child-process': 5.6.2 - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/import@5.6.2: @@ -2423,7 +2452,7 @@ packages: dependencies: '@lerna/command': 5.6.2 '@lerna/output': 5.6.2 - envinfo: 7.11.0 + envinfo: 7.11.1 dev: true /@lerna/init@5.6.2: @@ -2591,7 +2620,7 @@ packages: '@lerna/validation-error': 5.6.2 npm-package-arg: 8.1.1 npmlog: 6.0.2 - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/package@5.6.2: @@ -2609,7 +2638,7 @@ packages: engines: {node: ^14.15.0 || >=16.0.0} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/profiler@5.6.2: @@ -2683,7 +2712,7 @@ packages: p-map: 4.0.0 p-pipe: 3.1.0 pacote: 13.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - encoding @@ -2846,7 +2875,7 @@ packages: p-pipe: 3.1.0 p-reduce: 2.1.0 p-waterfall: 2.1.1 - semver: 7.5.4 + semver: 7.6.0 slash: 3.0.0 write-json-file: 4.3.0 transitivePeerDependencies: @@ -2883,7 +2912,7 @@ packages: os-filter-obj: 2.0.0 dev: true - /@nestjs/cli@9.5.0(@swc/core@1.3.105): + /@nestjs/cli@9.5.0(@swc/core@1.3.107): resolution: {integrity: sha512-Z7q+3vNsQSG2d2r2Hl/OOj5EpfjVx3OfnJ9+KuAsOdw1sKLm7+Zc6KbhMFTd/eIvfx82ww3Nk72xdmfPYCulWA==} engines: {node: '>= 12.9.0'} hasBin: true @@ -2908,7 +2937,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.0.1 typescript: 4.9.5 - webpack: 5.82.1(@swc/core@1.3.105) + webpack: 5.82.1(@swc/core@1.3.107) webpack-node-externals: 3.0.0 transitivePeerDependencies: - '@swc/core' @@ -2917,7 +2946,7 @@ packages: - webpack-cli dev: false - /@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): + /@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1): resolution: {integrity: sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==} peerDependencies: class-transformer: '*' @@ -2931,15 +2960,14 @@ packages: optional: true dependencies: class-transformer: 0.5.1 - class-validator: 0.14.0 + class-validator: 0.14.1 iterare: 1.2.1 reflect-metadata: 0.1.14 rxjs: 7.8.1 tslib: 2.6.2 uid: 2.0.2 - dev: false - /@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): + /@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1): resolution: {integrity: sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==} peerDependencies: cache-manager: <=5 @@ -2956,12 +2984,13 @@ packages: optional: true dependencies: class-transformer: 0.5.1 - class-validator: 0.14.0 + class-validator: 0.14.1 iterare: 1.2.1 reflect-metadata: 0.1.14 rxjs: 7.8.1 tslib: 2.5.3 uid: 2.0.2 + dev: false /@nestjs/core@10.3.3(@nestjs/common@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1): resolution: {integrity: sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==} @@ -2981,7 +3010,7 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -2992,38 +3021,21 @@ packages: uid: 2.0.2 transitivePeerDependencies: - encoding - dev: false - /@nestjs/core@9.4.3(@nestjs/common@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==} - requiresBuild: true + /@nestjs/schematics@10.1.1(typescript@5.3.3): + resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/microservices': ^9.0.0 - '@nestjs/platform-express': ^9.0.0 - '@nestjs/websockets': ^9.0.0 - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true + typescript: '>=4.8.2' dependencies: - '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nuxtjs/opencollective': 0.3.2 - fast-safe-stringify: 2.1.1 - iterare: 1.2.1 - path-to-regexp: 3.2.0 - reflect-metadata: 0.1.14 - rxjs: 7.8.1 - tslib: 2.5.3 - uid: 2.0.2 + '@angular-devkit/core': 17.1.2 + '@angular-devkit/schematics': 17.1.2 + comment-json: 4.2.3 + jsonc-parser: 3.2.1 + pluralize: 8.0.0 + typescript: 5.3.3 transitivePeerDependencies: - - encoding - dev: true + - chokidar + dev: false /@nestjs/schematics@9.2.0(chokidar@3.5.3)(typescript@4.9.5): resolution: {integrity: sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==} @@ -3039,22 +3051,35 @@ packages: - chokidar dev: false - /@nestjs/testing@9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3): - resolution: {integrity: sha512-LDT8Ai2eKnTzvnPaJwWOK03qTaFap5uHHsJCv6dL0uKWk6hyF9jms8DjyVaGsaujCaXDG8izl1mDEER0OmxaZA==} + /@nestjs/schematics@9.2.0(typescript@5.3.3): + resolution: {integrity: sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==} + peerDependencies: + typescript: '>=4.3.5' + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + typescript: 5.3.3 + transitivePeerDependencies: + - chokidar + + /@nestjs/testing@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): + resolution: {integrity: sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==} peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/core': ^9.0.0 - '@nestjs/microservices': ^9.0.0 - '@nestjs/platform-express': ^9.0.0 + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 peerDependenciesMeta: '@nestjs/microservices': optional: true '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) - tslib: 2.5.3 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) + tslib: 2.6.2 dev: true /@nodelib/fs.scandir@2.1.5: @@ -3073,7 +3098,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 + fastq: 1.17.1 /@npmcli/arborist@5.3.0: resolution: {integrity: sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A==} @@ -3110,7 +3135,7 @@ packages: read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 - semver: 7.5.4 + semver: 7.6.0 ssri: 9.0.1 treeverse: 2.0.0 walk-up-path: 1.0.0 @@ -3124,7 +3149,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.4 + semver: 7.6.0 dev: true /@npmcli/git@3.0.2: @@ -3138,7 +3163,7 @@ packages: proc-log: 2.0.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.4 + semver: 7.6.0 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -3170,7 +3195,7 @@ packages: cacache: 16.1.3 json-parse-even-better-errors: 2.3.1 pacote: 13.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - supports-color @@ -3222,10 +3247,10 @@ packages: - supports-color dev: true - /@nrwl/cli@15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105): + /@nrwl/cli@15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107): resolution: {integrity: sha512-1jtHBDuJzA57My5nLzYiM372mJW0NY6rFKxlWt5a0RLsAZdPTHsd8lE3Gs9XinGC1jhXbruWmhhnKyYtZvX/zA==} dependencies: - nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105) + nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107) transitivePeerDependencies: - '@swc-node/register' - '@swc/core' @@ -3238,31 +3263,32 @@ packages: nx: '>= 14.1 <= 16' dependencies: ejs: 3.1.9 - ignore: 5.3.0 - nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105) + ignore: 5.3.1 + nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107) semver: 7.5.4 tmp: 0.2.1 tslib: 2.6.2 dev: true - /@nrwl/devkit@17.2.8(nx@17.2.6): + /@nrwl/devkit@17.2.8(nx@17.2.8): resolution: {integrity: sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw==} dependencies: - '@nx/devkit': 17.2.8(nx@17.2.6) + '@nx/devkit': 17.2.8(nx@17.2.8) transitivePeerDependencies: - nx - /@nrwl/devkit@17.2.8(nx@17.2.8): - resolution: {integrity: sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw==} + /@nrwl/devkit@17.3.2(nx@17.2.8): + resolution: {integrity: sha512-31wh7dDZPM1YUCfhhk/ioHnUeoPIlKYLFLW0fGdw76Ow2nmTqrmxha2m0CSIR1/9En9GpYut2IdUdNh9CctNlA==} dependencies: - '@nx/devkit': 17.2.8(nx@17.2.8) + '@nx/devkit': 17.3.2(nx@17.2.8) transitivePeerDependencies: - nx + dev: false - /@nrwl/jest@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5): + /@nrwl/jest@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): resolution: {integrity: sha512-suyAm+5dj03ZevZW0fEZJSn+au1k6+OGPo4LKQ9Y4u/QJW52d2k0nOzrKu79CwkdKP5PFhjnvPP4Oo93RbNNnA==} dependencies: - '@nx/jest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5) + '@nx/jest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -3278,10 +3304,30 @@ packages: - typescript - verdaccio - /@nrwl/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@4.9.5): + /@nrwl/jest@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-sL7POaqrzHUBqKMOigmGsDin9hFtzL6orzSev0qOoTPCegRvMfyPpTbYdUsyN186jj0/ReD0b9lAiSOpfq3Q1g==} + dependencies: + '@nx/jest': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - babel-plugin-macros + - debug + - node-notifier + - nx + - supports-color + - ts-node + - typescript + - verdaccio + dev: false + + /@nrwl/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.2.2): resolution: {integrity: sha512-ZfTGNSmSBqvEfP8NOfOHcnqKwhXsfqBrN4IhthQR02sqTA9GkrjSfSUtcGXY01fUitsNUDOn6RZjgX6UysDCXg==} dependencies: - '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@4.9.5) + '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.2.2) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -3294,10 +3340,26 @@ packages: - typescript - verdaccio - /@nrwl/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@5.2.2): + /@nrwl/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3): resolution: {integrity: sha512-ZfTGNSmSBqvEfP8NOfOHcnqKwhXsfqBrN4IhthQR02sqTA9GkrjSfSUtcGXY01fUitsNUDOn6RZjgX6UysDCXg==} dependencies: - '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@5.2.2) + '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - debug + - nx + - supports-color + - typescript + - verdaccio + + /@nrwl/js@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3): + resolution: {integrity: sha512-WuIeSErulJuMeSpeK41RfiWI3jLjDD0S+tLnYdOLaWdjaIPqjknClM2BAJKlq472NnkkNWvtwtOS8jm518OjOQ==} + dependencies: + '@nx/js': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -3311,6 +3373,49 @@ packages: - verdaccio dev: false + /@nrwl/nest@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-pj2UNE7XM/7JdKlGhywXOVaCXZE3Fpd7eoZNZc8fBq+pcxvX3ylh4KLmnCwcSaKlcqFsYkWbmj6xDBJx8xSGoA==} + dependencies: + '@nx/nest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - babel-plugin-macros + - chokidar + - debug + - eslint + - js-yaml + - node-notifier + - nx + - supports-color + - ts-node + - typescript + - verdaccio + + /@nrwl/node@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-DGwPAasjDgSrNJcB2qcCA7y02licJFCNyiGhEnIhLEUCWOyPCrAsuPmBy4/QYFoiEP6YOsIpJac/1p+9QWeJ7Q==} + dependencies: + '@nx/node': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - babel-plugin-macros + - debug + - eslint + - js-yaml + - node-notifier + - nx + - supports-color + - ts-node + - typescript + - verdaccio + /@nrwl/nx-darwin-arm64@15.9.7: resolution: {integrity: sha512-aBUgnhlkrgC0vu0fK6eb9Vob7eFnkuknrK+YzTjmLrrZwj7FGNAeyGXSlyo1dVokIzjVKjJg2saZZ0WQbfuCJw==} engines: {node: '>= 10'} @@ -3374,10 +3479,10 @@ packages: dev: true optional: true - /@nrwl/nx-plugin@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-AoBDG0ewQ3GK3FNdLU4XQK9WxAbS+E7j74/WY8+44pHaGYtfUPu5uCghPMBTx4y7K5NuA608w+L3Om9EXaC9pQ==} + /@nrwl/nx-plugin@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-iXzW/PqKnTFo5KGFb09u9N69xyWilO0/r8eff8xE54MutzGirYgj5J5ITqLIswHyyYo547TxbBc4oxhKIA+xyw==} dependencies: - '@nx/plugin': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5) + '@nx/plugin': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -3386,7 +3491,6 @@ packages: - '@types/node' - babel-plugin-macros - debug - - eslint - js-yaml - node-notifier - nx @@ -3414,47 +3518,58 @@ packages: dev: true optional: true - /@nrwl/tao@15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105): + /@nrwl/tao@15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107): resolution: {integrity: sha512-OBnHNvQf3vBH0qh9YnvBQQWyyFZ+PWguF6dJ8+1vyQYlrLVk/XZ8nJ4ukWFb+QfPv/O8VBmqaofaOI9aFC4yTw==} hasBin: true dependencies: - nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105) + nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107) transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug dev: true - /@nrwl/tao@17.2.6(@swc-node/register@1.6.8)(@swc/core@1.3.105): - resolution: {integrity: sha512-cgtUKTRSxDZ94S9IpC27/qYZJ1YttJDET+veKrtRYvwnHFgkq1peyeTTtnM25yJon7PRdm2lYrlIVdPm0vXupw==} + /@nrwl/tao@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107): + resolution: {integrity: sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg==} hasBin: true dependencies: - nx: 17.2.6(@swc-node/register@1.6.8)(@swc/core@1.3.105) + nx: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) tslib: 2.6.2 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug - /@nrwl/tao@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105): - resolution: {integrity: sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg==} + /@nrwl/tao@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107): + resolution: {integrity: sha512-5uvpSmij0J9tteFV/0M/024K+H/o3XAlqtSdU8j03Auj1IleclSLF2yCTuIo7pYXhG3cgx1+nR+3nMs1QVAdUA==} hasBin: true dependencies: - nx: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) + nx: 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) tslib: 2.6.2 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug + dev: false - /@nrwl/workspace@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105): + /@nrwl/workspace@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107): resolution: {integrity: sha512-RiTDTuzdueZ+++kNQAENHdHbYToOhzO56XWxKOGoMEUSpcmbKRAFReFBzNqD91Fnv562vkW1VNRIb6Ey7X1YHQ==} dependencies: - '@nx/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) + '@nx/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + + /@nrwl/workspace@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107): + resolution: {integrity: sha512-7xE/dujPjOIxsCV6TB0C4768voQaQSxmEUAbVz0mywBGrVpjpvAIx1GvdB6wwgWqtpZTz34hKFkUSJFPweUvbg==} + dependencies: + '@nx/workspace': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug + dev: false /@nuxtjs/opencollective@0.3.2: resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} @@ -3467,35 +3582,53 @@ packages: transitivePeerDependencies: - encoding - /@nx/devkit@17.2.8(nx@17.2.6): + /@nx/devkit@17.2.8(nx@17.2.8): resolution: {integrity: sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw==} peerDependencies: nx: '>= 16 <= 18' dependencies: - '@nrwl/devkit': 17.2.8(nx@17.2.6) + '@nrwl/devkit': 17.2.8(nx@17.2.8) ejs: 3.1.9 enquirer: 2.3.6 - ignore: 5.3.0 - nx: 17.2.6(@swc-node/register@1.6.8)(@swc/core@1.3.105) + ignore: 5.3.1 + nx: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) semver: 7.5.3 tmp: 0.2.1 tslib: 2.6.2 - /@nx/devkit@17.2.8(nx@17.2.8): - resolution: {integrity: sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw==} + /@nx/devkit@17.3.2(nx@17.2.8): + resolution: {integrity: sha512-gbOIhwrZKCSSFFbh6nE6LLCvAU7mhSdBSnRiS14YBwJJMu4CRJ0IcaFz58iXqGWZefMivKtkNFtx+zqwUC4ziw==} peerDependencies: nx: '>= 16 <= 18' dependencies: - '@nrwl/devkit': 17.2.8(nx@17.2.8) + '@nrwl/devkit': 17.3.2(nx@17.2.8) ejs: 3.1.9 enquirer: 2.3.6 - ignore: 5.3.0 - nx: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) - semver: 7.5.3 + ignore: 5.3.1 + nx: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) + semver: 7.6.0 tmp: 0.2.1 tslib: 2.6.2 + yargs-parser: 21.1.1 + dev: false + + /@nx/devkit@17.3.2(nx@17.3.2): + resolution: {integrity: sha512-gbOIhwrZKCSSFFbh6nE6LLCvAU7mhSdBSnRiS14YBwJJMu4CRJ0IcaFz58iXqGWZefMivKtkNFtx+zqwUC4ziw==} + peerDependencies: + nx: '>= 16 <= 18' + dependencies: + '@nrwl/devkit': 17.3.2(nx@17.2.8) + ejs: 3.1.9 + enquirer: 2.3.6 + ignore: 5.3.1 + nx: 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) + semver: 7.6.0 + tmp: 0.2.1 + tslib: 2.6.2 + yargs-parser: 21.1.1 + dev: false - /@nx/eslint@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6): + /@nx/eslint@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8): resolution: {integrity: sha512-P6s85cIK7LYHixCJFZ+tLCPDxeOt9m2bQQOLxBCLEy5mqaGmjMHzWkLaoQBueCSntE6PSao0MMA+1TeeZjOoDw==} peerDependencies: eslint: ^8.0.0 @@ -3506,9 +3639,9 @@ packages: js-yaml: optional: true dependencies: - '@nx/devkit': 17.2.8(nx@17.2.6) - '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@5.2.2) - '@nx/linter': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6) + '@nx/devkit': 17.2.8(nx@17.2.8) + '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.2.2) + '@nx/linter': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8) eslint: 8.56.0 tslib: 2.6.2 typescript: 5.2.2 @@ -3522,20 +3655,45 @@ packages: - nx - supports-color - verdaccio + + /@nx/eslint@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8): + resolution: {integrity: sha512-KArvmi9Y4Qcf0bIRXGC1/FZsjL6XtT7wzhJ5uGsJIvXAJUiMMlw/KqIR31pY4nu2cBbphCa0/P1Jp2C/IFXG8w==} + peerDependencies: + js-yaml: 4.1.0 + peerDependenciesMeta: + js-yaml: + optional: true + dependencies: + '@nx/devkit': 17.3.2(nx@17.2.8) + '@nx/js': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@nx/linter': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8) + eslint: 8.56.0 + tslib: 2.6.2 + typescript: 5.3.3 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - debug + - nx + - supports-color + - verdaccio dev: false - /@nx/jest@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5): + /@nx/jest@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): resolution: {integrity: sha512-FnwwURXmG+uv5ELHjHd9uVbUioCPjefAOtENcasLJMs2WYeu3zePsru5B8GO9BBM5g2eTmw10Y5f0riAikZjcw==} dependencies: '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 - '@nrwl/jest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5) - '@nx/devkit': 17.2.8(nx@17.2.6) - '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@4.9.5) - '@phenomnomnominal/tsquery': 5.0.1(typescript@4.9.5) + '@nrwl/jest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@nx/devkit': 17.2.8(nx@17.2.8) + '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) chalk: 4.1.2 identity-obj-proxy: 3.0.0 - jest-config: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-resolve: 29.7.0 jest-util: 29.7.0 resolve.exports: 1.1.0 @@ -3555,7 +3713,40 @@ packages: - typescript - verdaccio - /@nx/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@4.9.5): + /@nx/jest@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-koX4tsRe7eP6ZC/DsVz+WPlWrywAHG97HzwKuWd812BNAl4HC8NboYPz2EXLJyvoLafO7uznin4jR1EBBaUKBA==} + dependencies: + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@nrwl/jest': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@nx/devkit': 17.3.2(nx@17.2.8) + '@nx/js': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) + chalk: 4.1.2 + identity-obj-proxy: 3.0.0 + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) + jest-resolve: 29.7.0 + jest-util: 29.7.0 + minimatch: 9.0.3 + resolve.exports: 1.1.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - babel-plugin-macros + - debug + - node-notifier + - nx + - supports-color + - ts-node + - typescript + - verdaccio + dev: false + + /@nx/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.2.2): resolution: {integrity: sha512-M91tw9tfSnkoC8pZaC9wNxrgaFU4MeQcgdT08ievaroo77kH4RheySsU1uNc0J58Jk4X4315wu/X7Bf/35m0Mw==} peerDependencies: verdaccio: ^5.0.4 @@ -3563,26 +3754,26 @@ packages: verdaccio: optional: true dependencies: - '@babel/core': 7.23.6 - '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.6) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.23.6) - '@babel/preset-env': 7.23.8(@babel/core@7.23.6) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) - '@babel/runtime': 7.23.6 - '@nrwl/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@4.9.5) - '@nx/devkit': 17.2.8(nx@17.2.6) - '@nx/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) - '@phenomnomnominal/tsquery': 5.0.1(typescript@4.9.5) - babel-plugin-const-enum: 1.2.0(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/plugin-proposal-decorators': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.23.9) + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/runtime': 7.23.9 + '@nrwl/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.2.2) + '@nx/devkit': 17.2.8(nx@17.2.8) + '@nx/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) + babel-plugin-const-enum: 1.2.0(@babel/core@7.23.9) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.6) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.9) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.5.1 fast-glob: 3.2.7 fs-extra: 11.2.0 - ignore: 5.3.0 + ignore: 5.3.1 js-tokens: 4.0.0 minimatch: 3.0.5 npm-package-arg: 11.0.1 @@ -3590,7 +3781,7 @@ packages: ora: 5.3.0 semver: 7.5.3 source-map-support: 0.5.19 - ts-node: 10.9.1(@swc/core@1.3.105)(@types/node@18.16.9)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.2.2) tsconfig-paths: 4.2.0 tslib: 2.6.2 transitivePeerDependencies: @@ -3604,7 +3795,7 @@ packages: - supports-color - typescript - /@nx/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@5.2.2): + /@nx/js@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3): resolution: {integrity: sha512-M91tw9tfSnkoC8pZaC9wNxrgaFU4MeQcgdT08ievaroo77kH4RheySsU1uNc0J58Jk4X4315wu/X7Bf/35m0Mw==} peerDependencies: verdaccio: ^5.0.4 @@ -3612,26 +3803,26 @@ packages: verdaccio: optional: true dependencies: - '@babel/core': 7.23.6 - '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.6) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.23.6) - '@babel/preset-env': 7.23.8(@babel/core@7.23.6) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) - '@babel/runtime': 7.23.6 - '@nrwl/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@5.2.2) - '@nx/devkit': 17.2.8(nx@17.2.6) - '@nx/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) - babel-plugin-const-enum: 1.2.0(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/plugin-proposal-decorators': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.23.9) + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/runtime': 7.23.9 + '@nrwl/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@nx/devkit': 17.2.8(nx@17.2.8) + '@nx/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) + babel-plugin-const-enum: 1.2.0(@babel/core@7.23.9) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.6) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.9) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.5.1 fast-glob: 3.2.7 fs-extra: 11.2.0 - ignore: 5.3.0 + ignore: 5.3.1 js-tokens: 4.0.0 minimatch: 3.0.5 npm-package-arg: 11.0.1 @@ -3639,7 +3830,56 @@ packages: ora: 5.3.0 semver: 7.5.3 source-map-support: 0.5.19 - ts-node: 10.9.1(@swc/core@1.3.105)(@types/node@18.16.9)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.3.3) + tsconfig-paths: 4.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - debug + - nx + - supports-color + - typescript + + /@nx/js@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3): + resolution: {integrity: sha512-37E3OILyu/7rCj6Z7tvC6PktHYa51UQBU+wWPdVWSZ64xu1SUsg9B9dfiyD1LXR9/rhjg4+0+g4cou0aqDK1Wg==} + peerDependencies: + verdaccio: ^5.0.4 + peerDependenciesMeta: + verdaccio: + optional: true + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-proposal-decorators': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.23.9) + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/runtime': 7.23.9 + '@nrwl/js': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@nx/devkit': 17.3.2(nx@17.2.8) + '@nx/workspace': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) + babel-plugin-const-enum: 1.2.0(@babel/core@7.23.9) + babel-plugin-macros: 2.8.0 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.9) + chalk: 4.1.2 + columnify: 1.6.0 + detect-port: 1.5.1 + fast-glob: 3.2.7 + fs-extra: 11.2.0 + ignore: 5.3.1 + js-tokens: 4.0.0 + minimatch: 9.0.3 + npm-package-arg: 11.0.1 + npm-run-path: 4.0.1 + ora: 5.3.0 + semver: 7.6.0 + source-map-support: 0.5.19 + ts-node: 10.9.1(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.3.3) tsconfig-paths: 4.2.0 tslib: 2.6.2 transitivePeerDependencies: @@ -3654,10 +3894,10 @@ packages: - typescript dev: false - /@nx/linter@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6): + /@nx/linter@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8): resolution: {integrity: sha512-dwqE742TIw1+/djzlikKakIfComq8nFnhupWjvl7KrU9r8ytcKyQbxHw7KGMUT9HAEG4xSNuwiaELr/8w4MM2Q==} dependencies: - '@nx/eslint': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6) + '@nx/eslint': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -3670,15 +3910,78 @@ packages: - nx - supports-color - verdaccio + + /@nx/linter@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8): + resolution: {integrity: sha512-ruB72ODekAlqGI65IeO37vqgJIY+ROcx2Gyf12H3tZGUYeC1IwpPltbU63vD5Qkgj2znrD6aNkpYPV7C0b0scQ==} + dependencies: + '@nx/eslint': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - debug + - js-yaml + - nx + - supports-color + - verdaccio dev: false - /@nx/nx-darwin-arm64@17.2.6: - resolution: {integrity: sha512-ezU5u7hkEwI2xzsFSjyr53uNURBvga40LQlpEnS/CbqRifHHhTKisCy+r2+kRhiOwTeR+I+/2D3zPyIyN3aEHQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true + /@nx/nest@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-VZ84VBWACcABjU4djWHHVxY83g3VTkg13AjAeZWyvPAMkNqS05e2jj3CpPVd4EAbwqXX3/CLM/bLKRuGWpYCWg==} + dependencies: + '@nestjs/schematics': 9.2.0(typescript@5.3.3) + '@nrwl/nest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@nx/devkit': 17.2.8(nx@17.2.8) + '@nx/eslint': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8) + '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@nx/node': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) + tslib: 2.6.2 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - babel-plugin-macros + - chokidar + - debug + - eslint + - js-yaml + - node-notifier + - nx + - supports-color + - ts-node + - typescript + - verdaccio + + /@nx/node@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-MxvJ2MlbpHeB5ZnlSAbSvBXAYoxCre4fsAwwCpysz1OWkf9dDGYzvlV4ovnu6jET7/ZQzzDvaKD9CvVSDk/amg==} + dependencies: + '@nrwl/node': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@nx/devkit': 17.2.8(nx@17.2.8) + '@nx/eslint': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(eslint@8.56.0)(nx@17.2.8) + '@nx/jest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + tslib: 2.6.2 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - babel-plugin-macros + - debug + - eslint + - js-yaml + - node-notifier + - nx + - supports-color + - ts-node + - typescript + - verdaccio /@nx/nx-darwin-arm64@17.2.8: resolution: {integrity: sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg==} @@ -3688,12 +3991,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-darwin-x64@17.2.6: - resolution: {integrity: sha512-wUIwbM/7LMxlFkEOlbxR/s2qaRuD69yXc70f2rtxsskwJ4GOF5kfc1jk2YaDs9qswI+FgQVgbeZu8pgF+slY7Q==} + /@nx/nx-darwin-arm64@17.3.2: + resolution: {integrity: sha512-hn12o/tt26Pf4wG+8rIBgNIEZq5BFlHLv3scNrgKbd5SancHlTbY4RveRGct737UQ/78GCMCgMDRgNdagbCr6w==} engines: {node: '>= 10'} - cpu: [x64] + cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true /@nx/nx-darwin-x64@17.2.8: @@ -3704,12 +4008,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-freebsd-x64@17.2.6: - resolution: {integrity: sha512-uBKEGqG4txVCpBirRzt1QwuOLzfA0s9dlUP7n5t4qJuaf9OXuVcDXay8g84WT1jx4PPtipyv/wyIFu3r7v8kZw==} + /@nx/nx-darwin-x64@17.3.2: + resolution: {integrity: sha512-5F28wrfE7yU60MzEXGjndy1sPJmNMIaV2W/g82kTXzxAbGHgSjwrGFmrJsrexzLp9oDlWkbc6YmInKV8gmmIaQ==} engines: {node: '>= 10'} cpu: [x64] - os: [freebsd] + os: [darwin] requiresBuild: true + dev: false optional: true /@nx/nx-freebsd-x64@17.2.8: @@ -3720,12 +4025,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-linux-arm-gnueabihf@17.2.6: - resolution: {integrity: sha512-dSDVz2BktaPHMkrJojFCx+V+QFLDF0KzoHorESzZmHZTfumr0xtJ1COWCU+gYmLptc+8OgwCzCPWXHhcDgji/A==} + /@nx/nx-freebsd-x64@17.3.2: + resolution: {integrity: sha512-07MMTfsJooONqL1Vrm5L6qk/gzmSrYLazjkiTmJz+9mrAM61RdfSYfO3mSyAoyfgWuQ5yEvfI56P036mK8aoPg==} engines: {node: '>= 10'} - cpu: [arm] - os: [linux] + cpu: [x64] + os: [freebsd] requiresBuild: true + dev: false optional: true /@nx/nx-linux-arm-gnueabihf@17.2.8: @@ -3736,12 +4042,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-linux-arm64-gnu@17.2.6: - resolution: {integrity: sha512-AD99Kk47Yxn3IJ89aCT1oVpNX1XNECAYay97yhqf2tiBsDv9hC43PppOdjI0dNP5VRBTrr6EsWdhvE0uNJ3RJw==} + /@nx/nx-linux-arm-gnueabihf@17.3.2: + resolution: {integrity: sha512-gQxMF6U/h18Rz+FZu50DZCtfOdk27hHghNh3d3YTeVsrJTd1SmUQbYublmwU/ia1HhFS8RVI8GvkaKt5ph0HoA==} engines: {node: '>= 10'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true + dev: false optional: true /@nx/nx-linux-arm64-gnu@17.2.8: @@ -3752,12 +4059,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-linux-arm64-musl@17.2.6: - resolution: {integrity: sha512-MOX/EJyzseEnzbFxY7V6es/xta6WQ0cDDrl6i6qjCRnoRTFFVMsL0Fb4dtVbv7fd75O41P+OBGpG70MYx2SOxw==} + /@nx/nx-linux-arm64-gnu@17.3.2: + resolution: {integrity: sha512-X20wiXtXmKlC01bpVEREsRls1uVOM22xDTpqILvVty6+P+ytEYFR3Vs5EjDtzBKF51wjrwf03rEoToZbmgM8MA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@nx/nx-linux-arm64-musl@17.2.8: @@ -3768,12 +4076,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-linux-x64-gnu@17.2.6: - resolution: {integrity: sha512-16xTSszGPY25INDUr4pzLXWcO3va1764iVFiHRTuJr5siDymY7zSj+DPKFmewzqF2358Y5m8AtMotY0FqKciYg==} + /@nx/nx-linux-arm64-musl@17.3.2: + resolution: {integrity: sha512-yko3Xsezkn4tjeudZYLjxFl07X/YB84K+DLK7EFyh9elRWV/8VjFcQmBAKUS2r9LfaEMNXq8/vhWMOWYyWBrIA==} engines: {node: '>= 10'} - cpu: [x64] + cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@nx/nx-linux-x64-gnu@17.2.8: @@ -3784,12 +4093,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-linux-x64-musl@17.2.6: - resolution: {integrity: sha512-F/nIq8bcZd2cNuBiQbyJwur7CpeRBCt0qKDF38HQ2l3HhQv+jwk4T6115LMQqwZb9e6kt6BAFsY+6O7I6t3pCw==} + /@nx/nx-linux-x64-gnu@17.3.2: + resolution: {integrity: sha512-RiPvvQMmlZmDu9HdT6n6sV0+fEkyAqR5VocrD5ZAzEzFIlh4dyVLripFR3+MD+QhIhXyPt/hpri1kq9sgs4wnw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@nx/nx-linux-x64-musl@17.2.8: @@ -3800,12 +4110,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-win32-arm64-msvc@17.2.6: - resolution: {integrity: sha512-1lAKKKiH7eduzqcPDB03iPz38yNXn3Y4Q/3jULjaRc3EFAplfBsYVwJ9kGjXPZSrpt/AY7w5ATY55/r5B3gQnA==} + /@nx/nx-linux-x64-musl@17.3.2: + resolution: {integrity: sha512-PWfVGmFsFJi+N1Nljg/jTKLHdufpGuHlxyfHqhDso/o4Qc0exZKSeZ1C63WkD7eTcT5kInifTQ/PffLiIDE3MA==} engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [linux] requiresBuild: true + dev: false optional: true /@nx/nx-win32-arm64-msvc@17.2.8: @@ -3816,12 +4127,13 @@ packages: requiresBuild: true optional: true - /@nx/nx-win32-x64-msvc@17.2.6: - resolution: {integrity: sha512-LrJySMWrO5oWMrP4VOWM1hr3c4rtxHGCcRy19VwqvaAPDrnsg0qfPjv4q1C9YyIU8sj+T3oJs1yZdnNntlN8ew==} + /@nx/nx-win32-arm64-msvc@17.3.2: + resolution: {integrity: sha512-O+4FFPbQz1mqaIj+SVE02ppe7T9ELj7Z5soQct5TbRRhwjGaw5n5xaPPBW7jUuQe2L5htid1E82LJyq3JpVc8A==} engines: {node: '>= 10'} - cpu: [x64] + cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true /@nx/nx-win32-x64-msvc@17.2.8: @@ -3832,15 +4144,24 @@ packages: requiresBuild: true optional: true - /@nx/plugin@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-N4FOS3iSTCu0oBj0+ehFiAOawbctipLG3LQN0dae/BdBIsm4xRSvhRyr3RTXITbmWWJYP+x1n6bSnXaL2Lc9RQ==} + /@nx/nx-win32-x64-msvc@17.3.2: + resolution: {integrity: sha512-4hQm+7coy+hBqGY9J709hz/tUPijhf/WS7eML2r2xBmqBew3PMHfeZuaAAYWN690nIsu0WX3wyDsNjulR8HGPQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nx/plugin@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-VlqbG2wCAY6lzzSjpOZwiCIwOCdPDaYtgB8A8PlyuFjWIU4yioRpNufCTCv7H/ivkbIR3Pt4Z+jNTYyUm6wKxA==} dependencies: - '@nrwl/nx-plugin': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5) - '@nx/devkit': 17.2.8(nx@17.2.6) - '@nx/eslint': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(eslint@8.56.0)(nx@17.2.6) - '@nx/jest': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(ts-node@10.9.1)(typescript@4.9.5) - '@nx/js': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105)(@types/node@18.16.9)(nx@17.2.6)(typescript@4.9.5) - '@phenomnomnominal/tsquery': 5.0.1(typescript@4.9.5) + '@nrwl/nx-plugin': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@nx/devkit': 17.3.2(nx@17.2.8) + '@nx/eslint': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8) + '@nx/jest': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(ts-node@10.9.2)(typescript@5.3.3) + '@nx/js': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107)(@types/node@20.11.19)(nx@17.2.8)(typescript@5.3.3) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) fs-extra: 11.2.0 tslib: 2.6.2 transitivePeerDependencies: @@ -3851,7 +4172,6 @@ packages: - '@types/node' - babel-plugin-macros - debug - - eslint - js-yaml - node-notifier - nx @@ -3861,20 +4181,36 @@ packages: - verdaccio dev: false - /@nx/workspace@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105): + /@nx/workspace@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107): resolution: {integrity: sha512-QCriI4CFCuG+0WTbpu3fHljVR1x6bjNSrbq8nqu8Z/3y+si2/O+7lVNSTkQNr1X2eBPqtIX74APS7ExG8c4vog==} dependencies: - '@nrwl/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) + '@nrwl/workspace': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) '@nx/devkit': 17.2.8(nx@17.2.8) chalk: 4.1.2 enquirer: 2.3.6 - nx: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) + nx: 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) + tslib: 2.6.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + + /@nx/workspace@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107): + resolution: {integrity: sha512-2y952OmJx+0Rj+LQIxat8SLADjIkgB6NvjtgYZt8uRQ94jRS/JsRvGTw0V8DsY9mvsNbYoIRdJP25T3pGnI3gQ==} + dependencies: + '@nrwl/workspace': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) + '@nx/devkit': 17.3.2(nx@17.3.2) + chalk: 4.1.2 + enquirer: 2.3.6 + nx: 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) tslib: 2.6.2 yargs-parser: 21.1.1 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug + dev: false /@octokit/auth-token@3.0.4: resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} @@ -4010,36 +4346,31 @@ packages: requiresBuild: true dependencies: node-addon-api: 3.2.1 - node-gyp-build: 4.7.1 + node-gyp-build: 4.8.0 dev: true - /@phenomnomnominal/tsquery@5.0.1(typescript@4.9.5): + /@phenomnomnominal/tsquery@5.0.1(typescript@5.2.2): resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} peerDependencies: typescript: ^3 || ^4 || ^5 dependencies: esquery: 1.5.0 - typescript: 4.9.5 + typescript: 5.2.2 - /@phenomnomnominal/tsquery@5.0.1(typescript@5.2.2): + /@phenomnomnominal/tsquery@5.0.1(typescript@5.3.3): resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} peerDependencies: typescript: ^3 || ^4 || ^5 dependencies: esquery: 1.5.0 - typescript: 5.2.2 - dev: false + typescript: 5.3.3 - /@schematics/angular@14.2.13: - resolution: {integrity: sha512-MLxTpTU3E8QACQ/5c0sENMR2gRiMXpGaKeD5IHY+3wyU2fUSJVB0QPU/l1WhoyZbX8N9ospBgf5UEG7taVF9rg==} - engines: {node: ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 14.2.13 - '@angular-devkit/schematics': 14.2.13 - jsonc-parser: 3.1.0 - transitivePeerDependencies: - - chokidar - dev: false + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -4049,43 +4380,46 @@ packages: engines: {node: '>=10'} dev: true - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: type-detect: 4.0.8 /@sinonjs/fake-timers@10.3.0: resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: - '@sinonjs/commons': 3.0.0 + '@sinonjs/commons': 3.0.1 /@sqltools/formatter@1.2.5: resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} dev: true - /@swc-node/core@1.10.6(@swc/core@1.3.105): - resolution: {integrity: sha512-lDIi/rPosmKIknWzvs2/Fi9zWRtbkx8OJ9pQaevhsoGzJSal8Pd315k1W5AIrnknfdAB4HqRN12fk6AhqnrEEw==} + /@swc-node/core@1.12.0(@swc/core@1.3.107)(@swc/types@0.1.5): + resolution: {integrity: sha512-AYrEmPL2BT46wbikHwSMR5IK98SelBEYH+ycjalUxJ5xYjEupjF8Fd+NkadKoZAzf5zDtysFKd5R1PY4QBHIiw==} engines: {node: '>= 10'} peerDependencies: '@swc/core': '>= 1.3' + '@swc/types': '>= 0.1' dependencies: - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) + '@swc/types': 0.1.5 - /@swc-node/register@1.6.8(@swc/core@1.3.105)(typescript@4.9.5): + /@swc-node/register@1.6.8(@swc/core@1.3.107)(@swc/types@0.1.5)(typescript@5.3.3): resolution: {integrity: sha512-74ijy7J9CWr1Z88yO+ykXphV29giCrSpANQPQRooE0bObpkTO1g4RzQovIfbIaniBiGDDVsYwDoQ3FIrCE8HcQ==} peerDependencies: '@swc/core': '>= 1.3' typescript: '>= 4.3' dependencies: - '@swc-node/core': 1.10.6(@swc/core@1.3.105) + '@swc-node/core': 1.12.0(@swc/core@1.3.107)(@swc/types@0.1.5) '@swc-node/sourcemap-support': 0.3.0 - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) colorette: 2.0.20 debug: 4.3.4 pirates: 4.0.6 tslib: 2.6.2 - typescript: 4.9.5 + typescript: 5.3.3 transitivePeerDependencies: + - '@swc/types' - supports-color /@swc-node/sourcemap-support@0.3.0: @@ -4094,7 +4428,7 @@ packages: source-map-support: 0.5.21 tslib: 2.6.2 - /@swc/cli@0.1.65(@swc/core@1.3.105): + /@swc/cli@0.1.65(@swc/core@1.3.107): resolution: {integrity: sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg==} engines: {node: '>= 12.13'} hasBin: true @@ -4106,97 +4440,97 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) commander: 7.2.0 fast-glob: 3.3.2 minimatch: 9.0.3 - semver: 7.5.4 + semver: 7.6.0 slash: 3.0.0 source-map: 0.7.4 dev: true - /@swc/core-darwin-arm64@1.3.105: - resolution: {integrity: sha512-buWeweLVDXXmcnfIemH4PGnpjwsDTUGitnPchdftb0u1FU8zSSP/lw/pUCBDG/XvWAp7c/aFxgN4CyG0j7eayA==} + /@swc/core-darwin-arm64@1.3.107: + resolution: {integrity: sha512-47tD/5vSXWxPd0j/ZllyQUg4bqalbQTsmqSw0J4dDdS82MWqCAwUErUrAZPRjBkjNQ6Kmrf5rpCWaGTtPw+ngw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.3.105: - resolution: {integrity: sha512-hFmXPApqjA/8sy/9NpljHVaKi1OvL9QkJ2MbbTCCbJERuHMpMUeMBUWipHRfepGHFhU+9B9zkEup/qJaJR4XIg==} + /@swc/core-darwin-x64@1.3.107: + resolution: {integrity: sha512-hwiLJ2ulNkBGAh1m1eTfeY1417OAYbRGcb/iGsJ+LuVLvKAhU/itzsl535CvcwAlt2LayeCFfcI8gdeOLeZa9A==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.105: - resolution: {integrity: sha512-mwXyMC41oMKkKrPpL8uJpOxw7fyfQoVtIw3Y5p0Blabk+espNYqix0E8VymHdRKuLmM//z5wVmMsuHdGBHvZeg==} + /@swc/core-linux-arm-gnueabihf@1.3.107: + resolution: {integrity: sha512-I2wzcC0KXqh0OwymCmYwNRgZ9nxX7DWnOOStJXV3pS0uB83TXAkmqd7wvMBuIl9qu4Hfomi9aDM7IlEEn9tumQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.3.105: - resolution: {integrity: sha512-H7yEIVydnUtqBSUxwmO6vpIQn7j+Rr0DF6ZOORPyd/SFzQJK9cJRtmJQ3ZMzlJ1Bb+1gr3MvjgLEnmyCYEm2Hg==} + /@swc/core-linux-arm64-gnu@1.3.107: + resolution: {integrity: sha512-HWgnn7JORYlOYnGsdunpSF8A+BCZKPLzLtEUA27/M/ZuANcMZabKL9Zurt7XQXq888uJFAt98Gy+59PU90aHKg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.3.105: - resolution: {integrity: sha512-Jg7RTFT3pGFdGt5elPV6oDkinRy7q9cXpenjXnJnM2uvx3jOwnsAhexPyCDHom8SHL0j+9kaLLC66T3Gz1E4UA==} + /@swc/core-linux-arm64-musl@1.3.107: + resolution: {integrity: sha512-vfPF74cWfAm8hyhS8yvYI94ucMHIo8xIYU+oFOW9uvDlGQRgnUf/6DEVbLyt/3yfX5723Ln57U8uiMALbX5Pyw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.3.105: - resolution: {integrity: sha512-DJghplpyusAmp1X5pW/y93MmS/u83Sx5GrpJxI6KLPa82+NItTgMcl8KBQmW5GYAJpVKZyaIvBanS5TdR8aN2w==} + /@swc/core-linux-x64-gnu@1.3.107: + resolution: {integrity: sha512-uBVNhIg0ip8rH9OnOsCARUFZ3Mq3tbPHxtmWk9uAa5u8jQwGWeBx5+nTHpDOVd3YxKb6+5xDEI/edeeLpha/9g==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.3.105: - resolution: {integrity: sha512-wD5jL2dZH/5nPNssBo6jhOvkI0lmWnVR4vnOXWjuXgjq1S0AJpO5jdre/6pYLmf26hft3M42bteDnjR4AAZ38w==} + /@swc/core-linux-x64-musl@1.3.107: + resolution: {integrity: sha512-mvACkUvzSIB12q1H5JtabWATbk3AG+pQgXEN95AmEX2ZA5gbP9+B+mijsg7Sd/3tboHr7ZHLz/q3SHTvdFJrEw==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.3.105: - resolution: {integrity: sha512-UqJtwILUHRw2+3UTPnRkZrzM/bGdQtbR4UFdp79mZQYfryeOUVNg7aJj/bWUTkKtLiZ3o+FBNrM/x2X1mJX5bA==} + /@swc/core-win32-arm64-msvc@1.3.107: + resolution: {integrity: sha512-J3P14Ngy/1qtapzbguEH41kY109t6DFxfbK4Ntz9dOWNuVY3o9/RTB841ctnJk0ZHEG+BjfCJjsD2n8H5HcaOA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.3.105: - resolution: {integrity: sha512-Z95C6vZgBEJ1snidYyjVKnVWiy/ZpPiIFIXGWkDr4ZyBgL3eZX12M6LzZ+NApHKffrbO4enbFyFomueBQgS2oA==} + /@swc/core-win32-ia32-msvc@1.3.107: + resolution: {integrity: sha512-ZBUtgyjTHlz8TPJh7kfwwwFma+ktr6OccB1oXC8fMSopD0AxVnQasgun3l3099wIsAB9eEsJDQ/3lDkOLs1gBA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.3.105: - resolution: {integrity: sha512-3J8fkyDPFsS3mszuYUY4Wfk7/B2oio9qXUwF3DzOs2MK+XgdyMLIptIxL7gdfitXJBH8k39uVjrIw1JGJDjyFA==} + /@swc/core-win32-x64-msvc@1.3.107: + resolution: {integrity: sha512-Eyzo2XRqWOxqhE1gk9h7LWmUf4Bp4Xn2Ttb0ayAXFp6YSTxQIThXcT9kipXZqcpxcmDwoq8iWbbf2P8XL743EA==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.3.105(@swc/helpers@0.5.3): - resolution: {integrity: sha512-me2VZyr3OjqRpFrYQJJYy7x/zbFSl9nt+MAGnIcBtjDsN00iTVqEaKxBjPBFQV9BDAgPz2SRWes/DhhVm5SmMw==} + /@swc/core@1.3.107(@swc/helpers@0.5.6): + resolution: {integrity: sha512-zKhqDyFcTsyLIYK1iEmavljZnf4CCor5pF52UzLAz4B6Nu/4GLU+2LQVAf+oRHjusG39PTPjd2AlRT3f3QWfsQ==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -4205,26 +4539,26 @@ packages: '@swc/helpers': optional: true dependencies: - '@swc/counter': 0.1.2 - '@swc/helpers': 0.5.3 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.6 '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.105 - '@swc/core-darwin-x64': 1.3.105 - '@swc/core-linux-arm-gnueabihf': 1.3.105 - '@swc/core-linux-arm64-gnu': 1.3.105 - '@swc/core-linux-arm64-musl': 1.3.105 - '@swc/core-linux-x64-gnu': 1.3.105 - '@swc/core-linux-x64-musl': 1.3.105 - '@swc/core-win32-arm64-msvc': 1.3.105 - '@swc/core-win32-ia32-msvc': 1.3.105 - '@swc/core-win32-x64-msvc': 1.3.105 - - /@swc/counter@0.1.2: - resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} - - /@swc/helpers@0.5.3: - resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} + '@swc/core-darwin-arm64': 1.3.107 + '@swc/core-darwin-x64': 1.3.107 + '@swc/core-linux-arm-gnueabihf': 1.3.107 + '@swc/core-linux-arm64-gnu': 1.3.107 + '@swc/core-linux-arm64-musl': 1.3.107 + '@swc/core-linux-x64-gnu': 1.3.107 + '@swc/core-linux-x64-musl': 1.3.107 + '@swc/core-win32-arm64-msvc': 1.3.107 + '@swc/core-win32-ia32-msvc': 1.3.107 + '@swc/core-win32-x64-msvc': 1.3.107 + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + /@swc/helpers@0.5.6: + resolution: {integrity: sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==} dependencies: tslib: 2.6.2 @@ -4247,12 +4581,12 @@ packages: engines: {node: '>= 10'} dev: true - /@ts-morph/common@0.16.0: - resolution: {integrity: sha512-SgJpzkTgZKLKqQniCjLaE3c2L2sdL7UShvmTmPBejAKd2OKV/yfMpQ2IWpAuA+VY5wy7PkSUaEObIqEK6afFuw==} + /@ts-morph/common@0.22.0: + resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} dependencies: fast-glob: 3.3.2 - minimatch: 5.1.6 - mkdirp: 1.0.4 + minimatch: 9.0.3 + mkdirp: 3.0.1 path-browserify: 1.0.1 dev: false @@ -4271,46 +4605,46 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.4 + '@types/babel__traverse': 7.20.5 /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 - /@types/babel__traverse@7.20.4: - resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 18.16.9 + '@types/node': 20.11.19 '@types/responselike': 1.0.3 dev: true /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.44.9 + '@types/eslint': 8.56.2 '@types/estree': 1.0.5 dev: false - /@types/eslint@8.44.9: - resolution: {integrity: sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==} + /@types/eslint@8.56.2: + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -4324,13 +4658,13 @@ packages: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 18.16.9 + '@types/node': 20.11.19 dev: true /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 /@types/http-cache-semantics@4.0.4: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} @@ -4349,8 +4683,8 @@ packages: dependencies: '@types/istanbul-lib-report': 3.0.3 - /@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -4363,7 +4697,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true @@ -4378,13 +4712,13 @@ packages: /@types/jsonfile@6.1.4: resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 dev: true /@types/lodash@4.14.202: @@ -4394,7 +4728,7 @@ packages: /@types/logfmt@1.2.6: resolution: {integrity: sha512-9/L27oLOjVlhMEHJs4vuvgEFNsAnPISQMi4ploHhidLwv2NX1S7aDmpWuSmaC2S+mXWD/Zx7qUP0mWFO7G0zvw==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 dev: true /@types/minimatch@3.0.5: @@ -4405,8 +4739,16 @@ packages: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true - /@types/node@18.16.9: - resolution: {integrity: sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==} + /@types/node@18.19.17: + resolution: {integrity: sha512-SzyGKgwPzuWp2SHhlpXKzCX0pIOfcI4V2eF37nNBJOhwlegQ83omtVQ1XxZpDE06V/d6AQvfQdPfnw0tRC//Ng==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@20.11.19: + resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} + dependencies: + undici-types: 5.26.5 /@types/node@20.5.1: resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} @@ -4415,7 +4757,7 @@ packages: /@types/nodemailer@6.4.14: resolution: {integrity: sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 dev: true /@types/normalize-package-data@2.4.4: @@ -4440,11 +4782,11 @@ packages: /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 dev: true - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + /@types/semver@7.5.7: + resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} dev: true /@types/stack-utils@2.0.3: @@ -4458,8 +4800,8 @@ packages: resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} dev: false - /@types/validator@13.11.7: - resolution: {integrity: sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==} + /@types/validator@13.11.9: + resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} /@types/which@3.0.3: resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==} @@ -4473,7 +4815,7 @@ packages: dependencies: '@types/yargs-parser': 21.0.3 - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4485,23 +4827,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4513,10 +4855,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 - typescript: 4.9.5 + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true @@ -4529,7 +4871,7 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4539,12 +4881,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 + tsutils: 3.21.0(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true @@ -4554,7 +4896,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4568,14 +4910,14 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4583,13 +4925,13 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 + '@types/semver': 7.5.7 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) eslint: 8.56.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -4756,31 +5098,31 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.11.2 - acorn-walk: 8.3.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.2): + /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 dev: false - /acorn-jsx@5.3.2(acorn@8.11.2): + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 - /acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true @@ -4836,7 +5178,6 @@ packages: optional: true dependencies: ajv: 8.12.0 - dev: false /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} @@ -4885,6 +5226,11 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -4901,6 +5247,11 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true @@ -4944,11 +5295,12 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 + call-bind: 1.0.7 + is-array-buffer: 3.0.4 dev: true /array-differ@3.0.0: @@ -4964,36 +5316,51 @@ packages: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.22.4 + get-intrinsic: 1.2.4 is-string: 1.0.7 dev: true + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + dev: false + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + /array.prototype.filter@1.0.3: + resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /array.prototype.findlastindex@1.2.4: + resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 + es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 dev: true /array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-shim-unscopables: 1.0.2 dev: true @@ -5001,23 +5368,24 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-shim-unscopables: 1.0.2 dev: true - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 + es-abstract: 1.22.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 dev: true /arrify@1.0.1: @@ -5045,46 +5413,48 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 dev: true - /axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: - follow-redirects: 1.15.3 + follow-redirects: 1.15.5 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - /babel-jest@29.7.0(@babel/core@7.23.6): + /babel-jest@29.7.0(@babel/core@7.23.9): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.6) + babel-preset-jest: 29.6.3(@babel/core@7.23.9) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - /babel-plugin-const-enum@1.2.0(@babel/core@7.23.6): + /babel-plugin-const-enum@1.2.0(@babel/core@7.23.9): resolution: {integrity: sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) - '@babel/traverse': 7.23.6 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/traverse': 7.23.9 transitivePeerDependencies: - supports-color @@ -5104,52 +5474,52 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.4 + '@types/babel__traverse': 7.20.5 /babel-plugin-macros@2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.23.9 cosmiconfig: 6.0.0 resolve: 1.22.8 - /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.6): + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.9): resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): - resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + /babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.23.9): + resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) - core-js-compat: 3.35.1 + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) + core-js-compat: 3.36.0 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.6): + /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.9): resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) transitivePeerDependencies: - supports-color - /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.23.6): + /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.23.9): resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} peerDependencies: '@babel/core': ^7 @@ -5158,37 +5528,37 @@ packages: '@babel/traverse': optional: true dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.6): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.6) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.6) - - /babel-preset-jest@29.6.3(@babel/core@7.23.6): + '@babel/core': 7.23.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + + /babel-preset-jest@29.6.3(@babel/core@7.23.9): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.6) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -5225,7 +5595,7 @@ packages: engines: {node: '>=12'} dependencies: bin-version: 6.0.0 - semver: 7.5.4 + semver: 7.6.0 semver-truncate: 3.0.0 dev: true @@ -5240,7 +5610,6 @@ packages: /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: false /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -5266,15 +5635,15 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001570 - electron-to-chromium: 1.4.615 + caniuse-lite: 1.0.30001588 + electron-to-chromium: 1.4.677 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) + update-browserslist-db: 1.0.13(browserslist@4.23.0) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -5288,6 +5657,10 @@ packages: dependencies: node-int64: 0.4.0 + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -5311,7 +5684,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.4 + semver: 7.5.3 /byte-size@7.0.1: resolution: {integrity: sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==} @@ -5367,12 +5740,15 @@ packages: engines: {node: '>=6'} dev: true - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 dev: true /callsites@3.1.0: @@ -5396,8 +5772,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - /caniuse-lite@1.0.30001570: - resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} + /caniuse-lite@1.0.30001588: + resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -5439,7 +5815,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: false /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -5465,11 +5840,11 @@ packages: /class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - /class-validator@0.14.0: - resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==} + /class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} dependencies: - '@types/validator': 13.11.7 - libphonenumber-js: 1.10.52 + '@types/validator': 13.11.9 + libphonenumber-js: 1.10.56 validator: 13.11.0 /clean-stack@2.2.0: @@ -5563,8 +5938,8 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - /code-block-writer@11.0.3: - resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + /code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} dev: false /collect-v8-coverage@1.0.2: @@ -5622,13 +5997,24 @@ packages: engines: {node: '>= 10'} dev: true - /commitizen@4.3.0(typescript@4.9.5): + /comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 + dev: false + + /commitizen@4.3.0(@types/node@20.11.19)(typescript@5.3.3): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(typescript@4.9.5) + cz-conventional-changelog: 3.3.0(@types/node@20.11.19)(typescript@5.3.3) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -5642,6 +6028,7 @@ packages: strip-bom: 4.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: + - '@types/node' - typescript dev: true @@ -5807,16 +6194,15 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /core-js-compat@3.35.1: - resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==} + /core-js-compat@3.36.0: + resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} dependencies: - browserslist: 4.22.2 + browserslist: 4.23.0 /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@4.9.5): + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.2)(typescript@5.3.3): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} engines: {node: '>=v14.21.3'} peerDependencies: @@ -5826,12 +6212,12 @@ packages: typescript: '>=4' dependencies: '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@4.9.5) - ts-node: 10.9.1(@swc/core@1.3.105)(@types/node@20.5.1)(typescript@4.9.5) - typescript: 4.9.5 + cosmiconfig: 8.3.6(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.3.107)(@types/node@20.5.1)(typescript@5.3.3) + typescript: 5.3.3 dev: true - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.16.9)(cosmiconfig@8.3.6)(typescript@4.9.5): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.19)(cosmiconfig@8.3.6)(typescript@5.3.3): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} requiresBuild: true @@ -5840,10 +6226,10 @@ packages: cosmiconfig: '>=8.2' typescript: '>=4' dependencies: - '@types/node': 18.16.9 - cosmiconfig: 8.3.6(typescript@4.9.5) + '@types/node': 20.11.19 + cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 - typescript: 4.9.5 + typescript: 5.3.3 dev: true optional: true @@ -5867,7 +6253,7 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cosmiconfig@8.3.6(typescript@4.9.5): + /cosmiconfig@8.3.6(typescript@5.3.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -5880,10 +6266,10 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 4.9.5 + typescript: 5.3.3 dev: true - /create-jest@29.7.0(@types/node@18.16.9)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -5892,7 +6278,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5936,19 +6322,20 @@ packages: cssom: 0.3.8 dev: true - /cz-conventional-changelog@3.3.0(typescript@4.9.5): + /cz-conventional-changelog@3.3.0(@types/node@20.11.19)(typescript@5.3.3): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(typescript@4.9.5) + commitizen: 4.3.0(@types/node@20.11.19)(typescript@5.3.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 18.4.3(typescript@4.9.5) + '@commitlint/load': 18.6.1(@types/node@20.11.19)(typescript@5.3.3) transitivePeerDependencies: + - '@types/node' - typescript dev: true @@ -5971,17 +6358,14 @@ packages: whatwg-url: 11.0.0 dev: true - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.23.6 - dev: true - /dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} dev: true + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dev: true + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -6062,13 +6446,13 @@ packages: engines: {node: '>=10'} dev: true - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 + es-errors: 1.3.0 gopd: 1.0.1 - has-property-descriptors: 1.0.1 dev: true /define-lazy-prop@2.0.0: @@ -6079,8 +6463,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 dev: true @@ -6190,13 +6574,28 @@ packages: engines: {node: '>=10'} dev: true - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + /dotenv@16.3.2: + resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} + engines: {node: '>=12'} + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + dev: true /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} @@ -6204,8 +6603,8 @@ packages: dependencies: jake: 10.8.7 - /electron-to-chromium@1.4.615: - resolution: {integrity: sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==} + /electron-to-chromium@1.4.677: + resolution: {integrity: sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -6214,6 +6613,10 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} requiresBuild: true @@ -6251,8 +6654,8 @@ packages: engines: {node: '>=6'} dev: true - /envinfo@7.11.0: - resolution: {integrity: sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==} + /envinfo@7.11.1: + resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} engines: {node: '>=4'} hasBin: true dev: true @@ -6266,68 +6669,86 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + /es-abstract@1.22.4: + resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - es-set-tostringtag: 2.0.2 + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 globalthis: 1.0.3 gopd: 1.0.1 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 + hasown: 2.0.1 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.3 string.prototype.trim: 1.2.8 string.prototype.trimend: 1.0.7 string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 + dev: true + + /es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} dev: true /es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} dev: false - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.1 dev: true /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: true /es-to-primitive@1.2.1: @@ -6339,8 +6760,8 @@ packages: is-symbol: 1.0.4 dev: true - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} /escape-string-regexp@1.0.5: @@ -6412,7 +6833,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 @@ -6430,9 +6851,9 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.3.3) array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 + array.prototype.findlastindex: 1.2.4 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 @@ -6440,12 +6861,12 @@ packages: eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) - hasown: 2.0.0 + hasown: 2.0.1 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.7 - object.groupby: 1.0.1 + object.groupby: 1.0.2 object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.15.0 @@ -6499,7 +6920,7 @@ packages: '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -6520,7 +6941,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -6540,8 +6961,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 /esprima@4.0.1: @@ -6728,8 +7149,8 @@ packages: /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - /fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 @@ -6747,7 +7168,7 @@ packages: engines: {node: ^12.20 || >= 14.13} dependencies: node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 + web-streams-polyfill: 3.3.3 dev: true /figures@3.2.0: @@ -6849,7 +7270,7 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 @@ -6857,11 +7278,11 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - /follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6875,6 +7296,14 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@5.82.1): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} @@ -6892,10 +7321,10 @@ packages: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.5.4 + semver: 7.6.0 tapable: 2.2.1 typescript: 4.9.5 - webpack: 5.82.1(@swc/core@1.3.105) + webpack: 5.82.1(@swc/core@1.3.107) dev: false /form-data@4.0.0: @@ -6975,9 +7404,9 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 functions-have-names: 1.2.3 dev: true @@ -7012,13 +7441,15 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: + es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.1 dev: true /get-package-type@0.1.0: @@ -7057,12 +7488,13 @@ packages: engines: {node: '>=10'} dev: true - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 dev: true /git-raw-commits@2.0.11: @@ -7129,13 +7561,25 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: false + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + /glob@7.1.4: resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.0.5 once: 1.4.0 path-is-absolute: 1.0.1 @@ -7221,7 +7665,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.0 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -7232,7 +7676,7 @@ packages: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.0 + ignore: 5.3.1 merge2: 1.4.1 slash: 4.0.0 dev: true @@ -7240,7 +7684,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 dev: true /got@11.8.6: @@ -7298,14 +7742,19 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + /has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + dev: false + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} dev: true @@ -7314,8 +7763,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 @@ -7325,8 +7774,8 @@ packages: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -7371,7 +7820,7 @@ packages: resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - lru-cache: 10.1.0 + lru-cache: 10.2.0 /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} @@ -7447,7 +7896,6 @@ packages: /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - requiresBuild: true dependencies: safer-buffer: 2.1.2 dev: true @@ -7468,8 +7916,8 @@ packages: minimatch: 5.1.6 dev: true - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} /import-fresh@3.3.0: @@ -7522,7 +7970,7 @@ packages: promzard: 0.3.0 read: 1.0.7 read-package-json: 5.0.2 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 validate-npm-package-name: 4.0.0 dev: true @@ -7589,13 +8037,13 @@ packages: wrap-ansi: 6.2.0 dev: true - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.5 dev: true /interpret@1.4.0: @@ -7603,16 +8051,20 @@ packages: engines: {node: '>= 0.10'} dev: false - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + /ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 dev: true - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 dev: true /is-arrayish@0.2.1: @@ -7629,14 +8081,13 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - dev: false /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 dev: true /is-callable@1.2.7: @@ -7654,13 +8105,13 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-docker@2.2.1: @@ -7694,8 +8145,8 @@ packages: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: true - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} dev: true @@ -7703,7 +8154,7 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-number@7.0.0: @@ -7749,14 +8200,15 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 dev: true - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-ssh@1.4.0: @@ -7778,7 +8230,7 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-symbol@1.0.4: @@ -7795,11 +8247,11 @@ packages: text-extensions: 1.9.0 dev: true - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 dev: true /is-typedarray@1.0.0: @@ -7817,7 +8269,7 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-windows@1.0.2: @@ -7855,23 +8307,23 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.6 - '@babel/parser': 7.23.6 + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + /istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.6 - '@babel/parser': 7.23.6 + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -7893,8 +8345,8 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 @@ -7904,6 +8356,15 @@ packages: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} @@ -7931,7 +8392,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -7951,7 +8412,7 @@ packages: - babel-plugin-macros - supports-color - /jest-cli@29.7.0(@types/node@18.16.9)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7961,14 +8422,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -7979,7 +8440,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@18.16.9)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7991,11 +8452,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 - babel-jest: 29.7.0(@babel/core@7.23.6) + '@types/node': 20.11.19 + babel-jest: 29.7.0(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -8014,7 +8475,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@swc/core@1.3.105)(@types/node@18.16.9)(typescript@4.9.5) + ts-node: 10.9.2(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -8057,7 +8518,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 18.16.9 + '@types/node': 20.11.19 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -8074,7 +8535,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8088,7 +8549,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.16.9 + '@types/node': 20.11.19 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -8135,7 +8596,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -8186,7 +8647,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -8216,7 +8677,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -8238,15 +8699,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) - '@babel/types': 7.23.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/types': 7.23.9 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.6) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -8257,7 +8718,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -8266,7 +8727,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -8289,7 +8750,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.11.19 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -8300,7 +8761,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -8309,12 +8770,12 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.11.19 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@18.16.9)(ts-node@10.9.1): + /jest@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -8324,10 +8785,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8358,6 +8819,10 @@ packages: dependencies: argparse: 2.0.1 + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + dev: true + /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} @@ -8368,7 +8833,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.11.2 + acorn: 8.11.3 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -8454,6 +8919,10 @@ packages: /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: false + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -8466,6 +8935,22 @@ packages: engines: {'0': node >= 0.2.0} dev: true + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.0 + dev: false + /just-diff-apply@5.5.0: resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} dev: true @@ -8474,6 +8959,21 @@ packages: resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} dev: true + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -8489,7 +8989,7 @@ packages: engines: {node: '>=6'} dev: true - /lerna@5.6.2(@swc-node/register@1.6.8)(@swc/core@1.3.105): + /lerna@5.6.2(@swc-node/register@1.6.8)(@swc/core@1.3.107): resolution: {integrity: sha512-Y0yMPslvnBnTZi7Nrs/gDyYZYauNf61xWNCehISHIORxZmmpoluNkcWTfcyb47is5uJQCv5QJX5xKKubbs+a6w==} engines: {node: ^14.15.0 || >=16.0.0} hasBin: true @@ -8515,7 +9015,7 @@ packages: import-local: 3.1.0 inquirer: 8.2.6 npmlog: 6.0.2 - nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105) + nx: 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107) typescript: 4.9.5 transitivePeerDependencies: - '@swc-node/register' @@ -8557,15 +9057,15 @@ packages: normalize-package-data: 4.0.1 npm-package-arg: 9.1.2 npm-registry-fetch: 13.3.1 - semver: 7.5.4 + semver: 7.6.0 ssri: 9.0.1 transitivePeerDependencies: - bluebird - supports-color dev: true - /libphonenumber-js@1.10.52: - resolution: {integrity: sha512-6vCuCHgem+OW1/VCAKgkasfegItCea8zIT7s9/CG/QxdCMIM7GfzbEBG5d7lGO3rzipjt5woOQL3DiHa8Fy78Q==} + /libphonenumber-js@1.10.56: + resolution: {integrity: sha512-d0GdKshNnyfl5gM7kZ9rXjGiAbxT/zCXp0k+EAzh8H4zrb2R7GXtMCrULrX7UQxtfx6CLy/vz/lomvW79FAFdA==} /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -8626,17 +9126,36 @@ packages: /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + /lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} dev: true + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + /lodash.ismatch@4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} dev: true + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false /lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} @@ -8657,6 +9176,10 @@ packages: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + /lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true @@ -8713,8 +9236,8 @@ packages: engines: {node: '>=8'} dev: true - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} /lru-cache@4.1.5: @@ -8757,6 +9280,12 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 dev: false /make-dir@2.1.0: @@ -8778,7 +9307,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.5.4 + semver: 7.6.0 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -8926,7 +9455,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: true /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} @@ -9010,7 +9538,6 @@ packages: /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} - dev: false /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -9033,6 +9560,7 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + dev: true /mkdirp@2.1.6: resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} @@ -9040,6 +9568,12 @@ packages: hasBin: true dev: true + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: false + /modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -9127,8 +9661,8 @@ packages: formdata-polyfill: 4.0.10 dev: true - /node-gyp-build@4.7.1: - resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} + /node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true dev: true @@ -9145,7 +9679,7 @@ packages: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.4 + semver: 7.6.0 tar: 6.2.0 which: 2.0.2 transitivePeerDependencies: @@ -9162,8 +9696,8 @@ packages: /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - /nodemailer@6.9.8: - resolution: {integrity: sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==} + /nodemailer@6.9.9: + resolution: {integrity: sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA==} engines: {node: '>=6.0.0'} dev: false @@ -9198,7 +9732,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -9208,7 +9742,7 @@ packages: dependencies: hosted-git-info: 5.2.1 is-core-module: 2.13.1 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -9238,7 +9772,7 @@ packages: resolution: {integrity: sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-normalize-package-bin@1.0.1: @@ -9256,7 +9790,7 @@ packages: dependencies: hosted-git-info: 7.0.1 proc-log: 3.0.0 - semver: 7.5.4 + semver: 7.5.3 validate-npm-package-name: 5.0.0 /npm-package-arg@8.1.1: @@ -9264,7 +9798,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 3.0.8 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 3.0.0 dev: true @@ -9274,7 +9808,7 @@ packages: dependencies: hosted-git-info: 5.2.1 proc-log: 2.0.1 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 4.0.0 dev: true @@ -9296,7 +9830,7 @@ packages: npm-install-checks: 5.0.0 npm-normalize-package-bin: 2.0.0 npm-package-arg: 9.1.2 - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-registry-fetch@13.3.1: @@ -9342,7 +9876,7 @@ packages: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} dev: true - /nx@15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105): + /nx@15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107): resolution: {integrity: sha512-1qlEeDjX9OKZEryC8i4bA+twNg+lB5RKrozlNwWx/lLJHqWPUfvUTvxh+uxlPYL9KzVReQjUuxMLFMsHNqWUrA==} hasBin: true requiresBuild: true @@ -9355,15 +9889,15 @@ packages: '@swc/core': optional: true dependencies: - '@nrwl/cli': 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105) - '@nrwl/tao': 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.105) + '@nrwl/cli': 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107) + '@nrwl/tao': 15.9.7(@swc-node/register@1.6.8)(@swc/core@1.3.107) '@parcel/watcher': 2.0.4 - '@swc-node/register': 1.6.8(@swc/core@1.3.105)(typescript@4.9.5) - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@swc-node/register': 1.6.8(@swc/core@1.3.107)(@swc/types@0.1.5)(typescript@5.3.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 - axios: 1.6.2 + axios: 1.6.7 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -9375,7 +9909,7 @@ packages: flat: 5.0.2 fs-extra: 11.2.0 glob: 7.1.4 - ignore: 5.3.0 + ignore: 5.3.1 js-yaml: 4.1.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.4 @@ -9406,8 +9940,8 @@ packages: - debug dev: true - /nx@17.2.6(@swc-node/register@1.6.8)(@swc/core@1.3.105): - resolution: {integrity: sha512-lBHp0e0AMBwYwpT44a8b0j29szspmYUhY1okqNctz/3ifuonNFG9WGfbzRO4YKOrVkfNsuaomHVAE6gtqo55ng==} + /nx@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107): + resolution: {integrity: sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw==} hasBin: true requiresBuild: true peerDependencies: @@ -9419,25 +9953,25 @@ packages: '@swc/core': optional: true dependencies: - '@nrwl/tao': 17.2.6(@swc-node/register@1.6.8)(@swc/core@1.3.105) - '@swc-node/register': 1.6.8(@swc/core@1.3.105)(typescript@4.9.5) - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@nrwl/tao': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.107) + '@swc-node/register': 1.6.8(@swc/core@1.3.107)(@swc/types@0.1.5)(typescript@5.3.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 - axios: 1.6.2 + axios: 1.6.7 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 - dotenv: 16.3.1 + dotenv: 16.3.2 dotenv-expand: 10.0.0 enquirer: 2.3.6 figures: 3.2.0 flat: 5.0.2 fs-extra: 11.2.0 glob: 7.1.4 - ignore: 5.3.0 + ignore: 5.3.1 jest-diff: 29.7.0 js-yaml: 4.1.0 jsonc-parser: 3.2.0 @@ -9456,21 +9990,21 @@ packages: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 17.2.6 - '@nx/nx-darwin-x64': 17.2.6 - '@nx/nx-freebsd-x64': 17.2.6 - '@nx/nx-linux-arm-gnueabihf': 17.2.6 - '@nx/nx-linux-arm64-gnu': 17.2.6 - '@nx/nx-linux-arm64-musl': 17.2.6 - '@nx/nx-linux-x64-gnu': 17.2.6 - '@nx/nx-linux-x64-musl': 17.2.6 - '@nx/nx-win32-arm64-msvc': 17.2.6 - '@nx/nx-win32-x64-msvc': 17.2.6 + '@nx/nx-darwin-arm64': 17.2.8 + '@nx/nx-darwin-x64': 17.2.8 + '@nx/nx-freebsd-x64': 17.2.8 + '@nx/nx-linux-arm-gnueabihf': 17.2.8 + '@nx/nx-linux-arm64-gnu': 17.2.8 + '@nx/nx-linux-arm64-musl': 17.2.8 + '@nx/nx-linux-x64-gnu': 17.2.8 + '@nx/nx-linux-x64-musl': 17.2.8 + '@nx/nx-win32-arm64-msvc': 17.2.8 + '@nx/nx-win32-x64-msvc': 17.2.8 transitivePeerDependencies: - debug - /nx@17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105): - resolution: {integrity: sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw==} + /nx@17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107): + resolution: {integrity: sha512-QjF1gnwKebQISvATrSbW7dsmIcLbA0fcyDyxLo5wVHx/MIlcaIb/lLYaPTld73ZZ6svHEZ6n2gOkhMitmkIPQA==} hasBin: true requiresBuild: true peerDependencies: @@ -9482,34 +10016,34 @@ packages: '@swc/core': optional: true dependencies: - '@nrwl/tao': 17.2.8(@swc-node/register@1.6.8)(@swc/core@1.3.105) - '@swc-node/register': 1.6.8(@swc/core@1.3.105)(typescript@4.9.5) - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@nrwl/tao': 17.3.2(@swc-node/register@1.6.8)(@swc/core@1.3.107) + '@swc-node/register': 1.6.8(@swc/core@1.3.107)(@swc/types@0.1.5)(typescript@5.3.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 - axios: 1.6.2 + axios: 1.6.7 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 - dotenv: 16.3.1 + dotenv: 16.3.2 dotenv-expand: 10.0.0 enquirer: 2.3.6 figures: 3.2.0 flat: 5.0.2 fs-extra: 11.2.0 - glob: 7.1.4 - ignore: 5.3.0 + ignore: 5.3.1 jest-diff: 29.7.0 js-yaml: 4.1.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.4 - minimatch: 3.0.5 + minimatch: 9.0.3 node-machine-id: 1.1.12 npm-run-path: 4.0.1 open: 8.4.2 - semver: 7.5.3 + ora: 5.3.0 + semver: 7.6.0 string-width: 4.2.3 strong-log-transformer: 2.1.0 tar-stream: 2.2.0 @@ -9519,18 +10053,19 @@ packages: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 17.2.8 - '@nx/nx-darwin-x64': 17.2.8 - '@nx/nx-freebsd-x64': 17.2.8 - '@nx/nx-linux-arm-gnueabihf': 17.2.8 - '@nx/nx-linux-arm64-gnu': 17.2.8 - '@nx/nx-linux-arm64-musl': 17.2.8 - '@nx/nx-linux-x64-gnu': 17.2.8 - '@nx/nx-linux-x64-musl': 17.2.8 - '@nx/nx-win32-arm64-msvc': 17.2.8 - '@nx/nx-win32-x64-msvc': 17.2.8 + '@nx/nx-darwin-arm64': 17.3.2 + '@nx/nx-darwin-x64': 17.3.2 + '@nx/nx-freebsd-x64': 17.3.2 + '@nx/nx-linux-arm-gnueabihf': 17.3.2 + '@nx/nx-linux-arm64-gnu': 17.3.2 + '@nx/nx-linux-arm64-musl': 17.3.2 + '@nx/nx-linux-x64-gnu': 17.3.2 + '@nx/nx-linux-x64-musl': 17.3.2 + '@nx/nx-win32-arm64-msvc': 17.3.2 + '@nx/nx-win32-x64-msvc': 17.3.2 transitivePeerDependencies: - debug + dev: false /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -9550,7 +10085,7 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -9560,27 +10095,28 @@ packages: resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + /object.groupby@1.0.2: + resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} dependencies: - call-bind: 1.0.5 + array.prototype.filter: 1.0.3 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.22.4 + es-errors: 1.3.0 dev: true /object.values@1.1.7: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /once@1.4.0: @@ -9860,6 +10396,18 @@ packages: entities: 4.5.0 dev: true + /passport-jwt@4.0.1: + resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} + dependencies: + jsonwebtoken: 9.0.2 + passport-strategy: 1.0.0 + dev: false + + /passport-strategy@1.0.0: + resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} + engines: {node: '>= 0.4.0'} + dev: false + /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: false @@ -9893,9 +10441,8 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.1.0 + lru-cache: 10.2.0 minipass: 7.0.4 - dev: false /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} @@ -9929,6 +10476,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + dev: false + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -9963,7 +10515,11 @@ packages: /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - dev: false + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -9981,6 +10537,12 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: false + /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10220,7 +10782,6 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: false /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} @@ -10240,6 +10801,10 @@ packages: /reflect-metadata@0.1.14: resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + /reflect-metadata@0.2.1: + resolution: {integrity: sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==} + dev: true + /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -10255,15 +10820,16 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.23.9 - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - set-function-name: 2.0.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 dev: true /regexpu-core@5.3.2: @@ -10283,6 +10849,11 @@ packages: dependencies: jsesc: 0.5.0 + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: false + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -10371,7 +10942,7 @@ packages: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.1.4 + glob: 7.2.3 /rimraf@4.4.1: resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} @@ -10402,12 +10973,12 @@ packages: dependencies: tslib: 2.6.2 - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 dev: true @@ -10419,11 +10990,12 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 is-regex: 1.1.4 dev: true @@ -10460,7 +11032,7 @@ packages: resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} engines: {node: '>=12'} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /semver@5.7.2: @@ -10485,9 +11057,17 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 dev: false @@ -10496,23 +11076,26 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: true - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 + define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: true /sha.js@2.4.11: @@ -10562,17 +11145,24 @@ packages: rechoir: 0.6.2 dev: false - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + /side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 object-inspect: 1.13.1 dev: true /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -10597,16 +11187,16 @@ packages: dependencies: agent-base: 6.0.2 debug: 4.3.4 - socks: 2.7.1 + socks: 2.7.3 transitivePeerDependencies: - supports-color dev: true - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + /socks@2.7.3: + resolution: {integrity: sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} dependencies: - ip: 2.0.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 dev: true @@ -10673,22 +11263,22 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-license-ids: 3.0.17 dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 dev: true - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} dev: true /split2@3.2.2: @@ -10718,6 +11308,10 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + dev: true + /ssri@9.0.1: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -10752,29 +11346,38 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /string_decoder@1.1.1: @@ -10794,6 +11397,13 @@ packages: dependencies: ansi-regex: 5.0.1 + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -10907,8 +11517,8 @@ packages: engines: {node: '>=4'} dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.105)(webpack@5.82.1): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + /terser-webpack-plugin@5.3.10(@swc/core@1.3.107)(webpack@5.82.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -10923,22 +11533,22 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.20 - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@jridgewell/trace-mapping': 0.3.22 + '@swc/core': 1.3.107(@swc/helpers@0.5.6) jest-worker: 27.5.1 schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.26.0 - webpack: 5.82.1(@swc/core@1.3.105) + serialize-javascript: 6.0.2 + terser: 5.27.2 + webpack: 5.82.1(@swc/core@1.3.107) dev: false - /terser@5.26.0: - resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} + /terser@5.27.2: + resolution: {integrity: sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: false @@ -11068,9 +11678,9 @@ packages: engines: {node: '>= 14.0.0'} dev: false - /ts-jest@29.1.1(@babel/core@7.23.6)(jest@29.7.0)(typescript@4.9.5): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /ts-jest@29.1.2(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.3.3): + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -11089,27 +11699,27 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.4 - typescript: 4.9.5 + semver: 7.6.0 + typescript: 5.3.3 yargs-parser: 21.1.1 dev: true - /ts-morph@15.1.0: - resolution: {integrity: sha512-RBsGE2sDzUXFTnv8Ba22QfeuKbgvAGJFuTN7HfmIRUkgT/NaVLfDM/8OFm2NlFkGlWEXdpW5OaFIp1jvqdDuOg==} + /ts-morph@21.0.1: + resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} dependencies: - '@ts-morph/common': 0.16.0 - code-block-writer: 11.0.3 + '@ts-morph/common': 0.22.0 + code-block-writer: 12.0.0 dev: false - /ts-node@10.9.1(@swc/core@1.3.105)(@types/node@18.16.9)(typescript@4.9.5): + /ts-node@10.9.1(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11124,23 +11734,23 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.16.9 - acorn: 8.11.2 - acorn-walk: 8.3.1 + '@types/node': 20.11.19 + acorn: 8.11.3 + acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.2.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.9.1(@swc/core@1.3.105)(@types/node@18.16.9)(typescript@5.2.2): + /ts-node@10.9.1(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.3.3): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11155,25 +11765,55 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.16.9 - acorn: 8.11.2 - acorn-walk: 8.3.1 + '@types/node': 20.11.19 + acorn: 8.11.3 + acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.2.2 + typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: false - /ts-node@10.9.1(@swc/core@1.3.105)(@types/node@20.5.1)(typescript@4.9.5): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + /ts-node@10.9.2(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.3.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.3.107(@swc/helpers@0.5.6) + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.11.19 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + /ts-node@10.9.2(@swc/core@1.3.107)(@types/node@20.5.1)(typescript@5.3.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -11187,19 +11827,19 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.105(@swc/helpers@0.5.3) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.5.1 - acorn: 8.11.2 - acorn-walk: 8.3.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -11235,18 +11875,19 @@ packages: /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsutils@3.21.0(typescript@4.9.5): + /tsutils@3.21.0(typescript@5.3.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.9.5 + typescript: 5.3.3 dev: true /type-check@0.4.0: @@ -11287,42 +11928,53 @@ packages: engines: {node: '>=8'} dev: true - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + /type-fest@4.10.2: + resolution: {integrity: sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==} + engines: {node: '>=16'} + dev: false + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 dev: true - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 dev: true - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 dev: true - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + /typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 dev: true /typedarray-to-buffer@3.1.5: @@ -11335,20 +11987,20 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typeorm@0.3.17(ts-node@10.9.1): - resolution: {integrity: sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==} - engines: {node: '>= 12.9.0'} + /typeorm@0.3.20(ts-node@10.9.2): + resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} + engines: {node: '>=16.13.0'} hasBin: true peerDependencies: '@google-cloud/spanner': ^5.18.0 '@sap/hana-client': ^2.12.25 - better-sqlite3: ^7.1.2 || ^8.0.0 + better-sqlite3: ^7.1.2 || ^8.0.0 || ^9.0.0 hdb-pool: ^0.1.6 ioredis: ^5.0.4 - mongodb: ^5.2.0 - mssql: ^9.1.1 + mongodb: ^5.8.0 + mssql: ^9.1.1 || ^10.0.1 mysql2: ^2.2.5 || ^3.0.1 - oracledb: ^5.1.0 + oracledb: ^6.3.0 pg: ^8.5.1 pg-native: ^3.0.0 pg-query-stream: ^4.0.0 @@ -11398,14 +12050,14 @@ packages: buffer: 6.0.3 chalk: 4.1.2 cli-highlight: 2.1.11 - date-fns: 2.30.0 + dayjs: 1.11.10 debug: 4.3.4 - dotenv: 16.3.1 - glob: 8.1.0 + dotenv: 16.4.5 + glob: 10.3.10 mkdirp: 2.1.6 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 sha.js: 2.4.11 - ts-node: 10.9.1(@swc/core@1.3.105)(@types/node@18.16.9)(typescript@4.9.5) + ts-node: 10.9.2(@swc/core@1.3.107)(@types/node@20.11.19)(typescript@5.3.3) tslib: 2.6.2 uuid: 9.0.1 yargs: 17.7.2 @@ -11422,7 +12074,11 @@ packages: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true - dev: false + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -11440,12 +12096,15 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -11497,14 +12156,14 @@ packages: engines: {node: '>=4'} dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.2): + /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 + browserslist: 4.23.0 + escalade: 3.1.2 picocolors: 1.0.0 /uri-js@4.4.1: @@ -11543,7 +12202,7 @@ packages: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -11606,8 +12265,8 @@ packages: dependencies: defaults: 1.0.4 - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} dev: true @@ -11629,7 +12288,7 @@ packages: engines: {node: '>=10.13.0'} dev: false - /webpack@5.82.1(@swc/core@1.3.105): + /webpack@5.82.1(@swc/core@1.3.107): resolution: {integrity: sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==} engines: {node: '>=10.13.0'} hasBin: true @@ -11644,9 +12303,9 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.2 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.4.1 @@ -11660,7 +12319,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.105)(webpack@5.82.1) + terser-webpack-plugin: 5.3.10(@swc/core@1.3.107)(webpack@5.82.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -11710,15 +12369,15 @@ packages: is-symbol: 1.0.4 dev: true - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + /which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /which@1.3.1: @@ -11781,6 +12440,15 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -11910,7 +12578,7 @@ packages: engines: {node: '>=10'} dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -11923,7 +12591,7 @@ packages: engines: {node: '>=12'} dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -11945,7 +12613,7 @@ packages: dependencies: '@types/fs-extra': 11.0.4 '@types/minimist': 1.2.5 - '@types/node': 18.16.9 + '@types/node': 18.19.17 '@types/ps-tree': 1.1.6 '@types/which': 3.0.3 chalk: 5.3.0 diff --git a/tsconfig.json b/tsconfig.json index 46b2c39b..3af73b1b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,7 @@ "allowSyntheticDefaultImports": true, "types": ["node"], "paths": { + "@devon4ts_node/schematics": ["packages/schematics/src/index.ts"], "@devon4ts_node/mailer": ["packages/mailer/src/lib/index.ts"] } },