diff --git a/.vscode/settings.json b/.vscode/settings.json index efbab091d7..b1ab340339 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -19,6 +19,5 @@ "jestCommandLine": "source ~/.zshrc && nvm use && npm run test --", "runMode": "watch" } - ], - "typescript.tsdk": "node_modules/typescript/lib" + ] } diff --git a/apiv2/arch-unit-ts.json b/apiv2/arch-unit-ts.json new file mode 100644 index 0000000000..4a4d7024d3 --- /dev/null +++ b/apiv2/arch-unit-ts.json @@ -0,0 +1,4 @@ +{ + "showImportsWarning": false, + "failOnEmptyShould": false +} diff --git a/apiv2/package.json b/apiv2/package.json index 0b1ebf8792..e8da9516d3 100644 --- a/apiv2/package.json +++ b/apiv2/package.json @@ -59,6 +59,7 @@ "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", + "arch-unit-ts": "^1.0.8", "eslint": "^8.42.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", @@ -69,7 +70,6 @@ "ts-jest": "^29.2.5", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", - "tsarch": "^5.4.0", "tsconfig-paths": "^4.2.0", "typescript": "^5.6.3" }, diff --git a/apiv2/src/admin/infra/iam/auth/ReferentAuth.facade.ts b/apiv2/src/admin/infra/iam/auth/ReferentAuth.facade.ts index d2fa646d9a..a53c964c2e 100644 --- a/apiv2/src/admin/infra/iam/auth/ReferentAuth.facade.ts +++ b/apiv2/src/admin/infra/iam/auth/ReferentAuth.facade.ts @@ -6,7 +6,6 @@ import { AuthProvider } from "./Auth.provider"; import * as bcrypt from "bcrypt"; import { ReferentMapper } from "../repository/mongo/Referent.mapper"; import { TechnicalException, TechnicalExceptionType } from "@shared/infra/TechnicalException"; -import { error } from "console"; @Injectable() export class ReferentAuthFacade implements ReferentAuthGateway { diff --git a/apiv2/test/architecture/arch.spec.ts b/apiv2/test/architecture/arch.spec.ts deleted file mode 100644 index 0884f36a75..0000000000 --- a/apiv2/test/architecture/arch.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -// imports and applies the jest extensions -import "tsarch/dist/jest"; - -// imports the files entrypoint -import { FileConditionBuilder, filesOfProject } from "tsarch"; -import { Folders } from "./folder"; - -describe("architecture", () => { - let files: FileConditionBuilder; - beforeAll(async () => { - // console.log(__filename + "/tsconfig.json"); - // files = filesOfProject(__dirname + "/tsconfig.json"); - files = await filesOfProject("./tsconfig.json"); - }); - // architecture tests can take a while to finish - jest.setTimeout(60000); - - it("business logic should not depend on infra folder", async () => { - const rule = files.matchingPattern(Folders.CORE).shouldNot().dependOnFiles().matchingPattern(Folders.INFRA); - await expect(rule).toPassAsync(); - }); - - it.skip("business logic should exclusively depend on @notification, @shared, snu-lib, @nestjs/common", async () => { - const rule = files - .inFolder(Folders.SRC_CORE) - .should() - .dependOnFiles() - .matchingPattern(`^(snu-lib|common|core)$`); - // .matchingPattern("^(@notification|@shared|snu-lib|@nestjs/common|core)$"); - - // console.log(files.matchingPattern(Folders.SRC_CORE_PATTERN)); - await expect(rule).toPassAsync(); - }); - - it("business logic should be cycle free", async () => { - const rule = files.inFolder(Folders.SRC).should().beFreeOfCycles(); - - await expect(rule).toPassAsync(); - }); -}); diff --git a/apiv2/test/architecture/architecture.spec.ts b/apiv2/test/architecture/architecture.spec.ts new file mode 100644 index 0000000000..a0b4e9e2e5 --- /dev/null +++ b/apiv2/test/architecture/architecture.spec.ts @@ -0,0 +1,85 @@ +import { RelativePath } from "arch-unit-ts/dist/arch-unit/core/domain/RelativePath"; +import { TypeScriptProject } from "arch-unit-ts/dist/arch-unit/core/domain/TypeScriptProject"; +import { Architectures } from "arch-unit-ts/dist/arch-unit/library/Architectures"; +import { classes, noClasses } from "arch-unit-ts/dist/main"; +import { MatchingPattern } from "./folderPattern"; +describe("Architecture test", () => { + const srcProject = new TypeScriptProject(RelativePath.of("src")); + + describe("Application", () => { + it("Should not depend on infrastructure", () => { + noClasses() + .that() + .resideInAPackage(MatchingPattern.CORE) + .should() + .dependOnClassesThat() + .resideInAnyPackage(MatchingPattern.INFRA) + .because("core should not depend on infrastructure") + .check(srcProject.allClasses()); + }); + it("Should only have few dependencies", () => { + classes() + .that() + .resideInAPackage(MatchingPattern.CORE) + .should() + .onlyDependOnClassesThat() + .resideInAnyPackage( + MatchingPattern.SNU_LIB, + MatchingPattern.CORE, + MatchingPattern.NESTJS_COMMON, + MatchingPattern.NESTJS_TESTING, + ) + .because("Core should not depend on any other dependencies") + .check(srcProject.allClasses()); + }); + }); + + describe("Admin", () => { + it("Should implement an hexagonal architecture", async () => { + Architectures.layeredArchitecture() + .consideringOnlyDependenciesInAnyPackage(MatchingPattern.ADMIN_CORE, MatchingPattern.ADMIN_INFRA) + .layer("useCase", MatchingPattern.ADMIN_USECASE) + .layer("repository", MatchingPattern.ADMIN_REPOSITORY) + .layer("infra", MatchingPattern.ADMIN_INFRA) + .layer("core", MatchingPattern.ADMIN_CORE) + .whereLayer("useCase") + .mayOnlyBeAccessedByLayers("infra", "useCase") + .whereLayer("repository") + .mayOnlyBeAccessedByLayers("infra") + .whereLayer("infra") + .mayNotBeAccessedByAnyLayer() + .because("Each bounded context should implement an hexagonal architecture") + .check(srcProject.allClasses()); + }); + it("Should depend on specific dependencies", async () => { + classes() + .that() + .resideInAPackage(MatchingPattern.ADMIN_CORE) + .should() + .onlyDependOnClassesThat() + .resideInAnyPackage( + MatchingPattern.SNU_LIB, + MatchingPattern.NOTIFICATION_CORE, + MatchingPattern.SHARED_CORE, + MatchingPattern.ADMIN_CORE, + MatchingPattern.NESTJS_COMMON, + MatchingPattern.NESTJS_TESTING, + ) + .because("Core should not depend on any other dependencies") + .check(srcProject.allClasses()); + }); + }); + + describe("Shared", () => { + it("Should depend on specific dependencies", async () => { + classes() + .that() + .resideInAPackage(MatchingPattern.SHARED_CORE) + .should() + .onlyDependOnClassesThat() + .resideInAnyPackage(MatchingPattern.SHARED_CORE, MatchingPattern.NESTJS_COMMON) + .because("Core should not depend on any other dependencies") + .check(srcProject.allClasses()); + }); + }); +}); diff --git a/apiv2/test/architecture/folder.ts b/apiv2/test/architecture/folder.ts deleted file mode 100644 index 4e591ff1c4..0000000000 --- a/apiv2/test/architecture/folder.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum Folders { - SRC = "src", - CORE = "core", - INFRA = "infra", - SRC_CORE_PATTERN = "^(?=.*\bsrc\b)(?=.*\bcore\b)(?!.*.spec.ts$).*", - SRC_CORE = "src/admin/core", -} diff --git a/apiv2/test/architecture/folderPattern.ts b/apiv2/test/architecture/folderPattern.ts new file mode 100644 index 0000000000..70c30ec83c --- /dev/null +++ b/apiv2/test/architecture/folderPattern.ts @@ -0,0 +1,18 @@ +export enum MatchingPattern { + CORE = "..core..", + INFRA = "..infra..", + + ADMIN_CORE = "src.admin.core..", + ADMIN_USECASE = "src.admin..core..useCase..", + ADMIN_INFRA = "src.admin..infra..", + ADMIN_REPOSITORY = "src.admin..infra..repository..", + + NOTIFICATION_CORE = "src.notification.core..", + + SHARED_CORE = "..shared.core..", + + NESTJS_COMMON = "@nestjs.common", + NESTJS_TESTING = "@nestjs.testing", + + SNU_LIB = "packages", +} diff --git a/apiv2/tsconfig.test.json b/apiv2/tsconfig.test.json deleted file mode 100644 index 71cce3ca8a..0000000000 --- a/apiv2/tsconfig.test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.json", -} diff --git a/package-lock.json b/package-lock.json index 0a9514236b..f753812705 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1324,6 +1324,7 @@ "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", + "arch-unit-ts": "^1.0.8", "eslint": "^8.42.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", @@ -1334,7 +1335,6 @@ "ts-jest": "^29.2.5", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", - "tsarch": "^5.4.0", "tsconfig-paths": "^4.2.0", "typescript": "^5.6.3" }, @@ -5603,6 +5603,18 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/file-path-filter": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@jsdevtools/file-path-filter/-/file-path-filter-3.0.2.tgz", + "integrity": "sha512-+SbZG6stIE/nRF2PpRnubtuzhh4pouDsk/hEWwM5mKsSKlFfr4ziAE5VMogGG/K++i9NHbUTxxW0y4vdM678ew==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@kurkle/color": { "version": "0.3.2", "license": "MIT" @@ -10259,6 +10271,41 @@ "version": "0.23.0", "license": "MIT" }, + "node_modules/@ts-morph/common": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.25.0.tgz", + "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.4", + "path-browserify": "^1.0.1", + "tinyglobby": "^0.2.9" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -11213,18 +11260,6 @@ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, - "node_modules/@zerollup/ts-helpers": { - "version": "1.7.18", - "resolved": "https://registry.npmjs.org/@zerollup/ts-helpers/-/ts-helpers-1.7.18.tgz", - "integrity": "sha512-S9zN+y+i5yN/evfWquzSO3lubqPXIsPQf6p9OiPMpRxDx/0totPLF39XoRw48Dav5dSvbIE8D2eAPpXXJxvKwg==", - "dev": true, - "dependencies": { - "resolve": "^1.12.0" - }, - "peerDependencies": { - "typescript": ">=3.7.2" - } - }, "node_modules/abbrev": { "version": "1.1.1", "license": "ISC" @@ -11482,6 +11517,20 @@ "version": "2.0.0", "license": "ISC" }, + "node_modules/arch-unit-ts": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/arch-unit-ts/-/arch-unit-ts-1.0.8.tgz", + "integrity": "sha512-6en/0FU8kna+FUp2XBNkZEUJaEEr1T1aAwtSmrU/E3ZYWx0rZkmy5/SD+Exi8TIE+XIX4G6fbe5Bcr4/adJLjg==", + "dev": true, + "dependencies": { + "file-path-filter": "3.0.2", + "ts-morph": "24.0.0", + "typescript-memoize": "1.1.1" + }, + "engines": { + "node": ">=18.18.2" + } + }, "node_modules/archiver": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", @@ -12993,6 +13042,12 @@ "node": ">= 0.12.0" } }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "dev": true + }, "node_modules/codepage": { "version": "1.15.0", "license": "Apache-2.0", @@ -13771,15 +13826,6 @@ "version": "2.1.2", "license": "MIT" }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decode-named-character-reference": { "version": "1.0.2", "license": "MIT", @@ -14421,15 +14467,6 @@ "version": "2.0.6", "license": "MIT" }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -14835,12 +14872,6 @@ "node": ">=8.6" } }, - "node_modules/ensure-posix-path": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz", - "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==", - "dev": true - }, "node_modules/entities": { "version": "4.5.0", "license": "BSD-2-Clause", @@ -16363,6 +16394,18 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-path-filter": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/file-path-filter/-/file-path-filter-3.0.2.tgz", + "integrity": "sha512-vk5bAcKnThOLij2fCbUyk3CUSnEWXOQfeXzAklDocN2JTBsP2x2Lo9oMLbUoi1nPHWhpNt/4JqREhCqWIcK45A==", + "dev": true, + "dependencies": { + "@jsdevtools/file-path-filter": "3.0.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/file-saver": { "version": "2.0.5", "license": "MIT" @@ -17033,12 +17076,6 @@ "node": ">= 0.6" } }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", - "dev": true - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -17195,18 +17232,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "dev": true, @@ -19481,87 +19506,6 @@ "version": "3.0.1", "license": "MIT" }, - "node_modules/json-colorizer": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json-colorizer/-/json-colorizer-2.2.2.tgz", - "integrity": "sha512-56oZtwV1piXrQnRNTtJeqRv+B9Y/dXAYLqBBaYl/COcUdoZxgLBLAO88+CnkbT6MxNs0c5E9mPBIb2sFcNz3vw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "lodash.get": "^4.4.2" - } - }, - "node_modules/json-colorizer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-colorizer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-colorizer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/json-colorizer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/json-colorizer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/json-colorizer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-colorizer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "license": "MIT" @@ -19921,12 +19865,6 @@ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, "node_modules/lodash.groupby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", @@ -20126,25 +20064,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/matcher-collection": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-2.0.1.tgz", - "integrity": "sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "minimatch": "^3.0.2" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/matcher-collection/node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.1", "license": "MIT", @@ -21580,31 +21499,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, - "node_modules/node-stream": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/node-stream/-/node-stream-1.7.0.tgz", - "integrity": "sha512-AB1qHzJWjAuxpDvTr/n1wvKVOg8c9BjAHV21QXq+q9yEUNr7wSqfHmAhAzvpQWSbf8mQQle3fjsnu3R14jrElA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.2", - "readable-stream": "^2.3.3", - "split2": "^2.1.0", - "stream-combiner2": "^1.1.1", - "through2": "^2.0.1" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/node-stream/node_modules/split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "dependencies": { - "through2": "^2.0.2" - } - }, "node_modules/nodemailer": { "version": "6.9.14", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.14.tgz", @@ -22426,15 +22320,11 @@ "node": ">= 14" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "dev": true, - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true }, "node_modules/path-exists": { "version": "4.0.0", @@ -22502,21 +22392,6 @@ "node": ">=8" } }, - "node_modules/path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/path/node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, "node_modules/pause": { "version": "0.0.1" }, @@ -22543,12 +22418,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/pegjs-backtrace": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/pegjs-backtrace/-/pegjs-backtrace-0.2.1.tgz", - "integrity": "sha512-rnVQiHyTE1wZG14Vl3Xk33ecrF7ZJ7ZW7jSgSlw4LdzBuhbyGVQ+oVApQ6tRi4QsII/xHgByHb6Ax68K6SPLhw==", - "dev": true - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -22728,144 +22597,6 @@ "node": ">=8" } }, - "node_modules/plantuml-parser": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/plantuml-parser/-/plantuml-parser-0.0.16.tgz", - "integrity": "sha512-E8DaUqAO+GkeEpLUb7w5rM404/LgfAIcYCPZ/QeUMg0tSLf1dmXrhzbJ/D29KuArjxg4+Ucmmu5tivHdxZjFWw==", - "dev": true, - "dependencies": { - "async": "^3.2.0", - "fast-glob": "^3.2.4", - "get-stdin": "^8.0.0", - "json-colorizer": "^2.2.2", - "pegjs-backtrace": "^0.2.0", - "read-vinyl-file-stream": "^2.0.3", - "require-dir": "^1.2.0", - "serialize-error": "^7.0.1", - "yargs": "^15.3.1" - }, - "bin": { - "plantuml-parser": "dist/bin/cli.js" - } - }, - "node_modules/plantuml-parser/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/plantuml-parser/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plantuml-parser/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plantuml-parser/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plantuml-parser/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plantuml-parser/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plantuml-parser/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/plantuml-parser/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plantuml-parser/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -24024,16 +23755,6 @@ "pify": "^2.3.0" } }, - "node_modules/read-vinyl-file-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-vinyl-file-stream/-/read-vinyl-file-stream-2.0.3.tgz", - "integrity": "sha512-ZbtobBf+n/va3eRcIkMDYsp7DCnnjh46YFOOdj42aCiWFirp9T/+YGMCTfVpEFIuiH3c5Kp13jpn3i5DoygxLw==", - "dev": true, - "dependencies": { - "node-stream": "^1.5.0", - "through2": "^2.0.1" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "license": "MIT", @@ -24355,15 +24076,6 @@ "node": ">=4" } }, - "node_modules/require-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/require-dir/-/require-dir-1.2.0.tgz", - "integrity": "sha512-LY85DTSu+heYgDqq/mK+7zFHWkttVNRXC9NKcKGyuGLdlsfbjEPrIEYdCVrx6hqnJb+xSu3Lzaoo8VnmOhhjNA==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/require-directory": { "version": "2.1.1", "dev": true, @@ -24393,12 +24105,6 @@ "node": ">=6" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "license": "MIT" @@ -25009,33 +24715,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -25493,16 +25172,6 @@ "npm": ">=6" } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "engines": { @@ -26323,16 +25992,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", @@ -26346,6 +26005,45 @@ "version": "1.0.3", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/titleize": { "version": "3.0.0", "dev": true, @@ -26615,6 +26313,16 @@ "node": ">= 8" } }, + "node_modules/ts-morph": { + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-24.0.0.tgz", + "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.25.0", + "code-block-writer": "^13.0.3" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -26677,36 +26385,6 @@ "version": "1.6.5", "license": "MIT" }, - "node_modules/tsarch": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tsarch/-/tsarch-5.4.0.tgz", - "integrity": "sha512-xZgZZilKxB69t/JSMcwCXtmID6oLpMYtar75qdryzOne1Rp2wu8ouOYZBbS2qBfPFWLVTzn15zTAmjouHujieA==", - "dev": true, - "dependencies": { - "@zerollup/ts-helpers": "^1.7.18", - "fs": "0.0.1-security", - "path": "^0.12.7", - "plantuml-parser": "0.0.16", - "typescript": "^3.8.3", - "walk-sync": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tsarch/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -27714,6 +27392,12 @@ "node": ">=10" } }, + "node_modules/typescript-memoize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/typescript-memoize/-/typescript-memoize-1.1.1.tgz", + "integrity": "sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==", + "dev": true + }, "node_modules/uid": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", @@ -28159,27 +27843,6 @@ "lodash": "^4.17.14" } }, - "node_modules/walk-sync": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.2.0.tgz", - "integrity": "sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "ensure-posix-path": "^1.1.0", - "matcher-collection": "^2.0.0", - "minimatch": "^3.0.4" - }, - "engines": { - "node": "8.* || >= 10.*" - } - }, - "node_modules/walk-sync/node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, "node_modules/walker": { "version": "1.0.8", "dev": true, @@ -28392,12 +28055,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, "node_modules/which-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",