From 55bfa284bc1ec2e332176d053a232ffef120b260 Mon Sep 17 00:00:00 2001 From: daffl Date: Mon, 3 Oct 2022 16:43:09 -0700 Subject: [PATCH 01/11] feat(schema): Make schemas validation library independent and update CLI generator accordingly --- package-lock.json | 2834 +++++++++-------- package.json | 2 +- packages/cli/src/app/templates/app.tpl.ts | 2 +- .../cli/src/app/templates/declarations.tpl.ts | 2 +- .../{configuration.tpl.ts => schemas.tpl.ts} | 35 +- .../templates/declarations.tpl.ts | 4 +- .../templates/user.resolver.tpl.ts | 110 - .../templates/user.schema.tpl.ts | 78 +- packages/cli/src/commons.ts | 14 + .../cli/src/connection/templates/knex.tpl.ts | 2 +- .../src/connection/templates/mongodb.tpl.ts | 2 +- packages/cli/src/service/service.tpl.ts | 117 + .../cli/src/service/templates/class.tpl.ts | 78 - .../cli/src/service/templates/client.tpl.ts | 12 +- .../cli/src/service/templates/resolver.tpl.ts | 82 - .../cli/src/service/templates/schema.tpl.ts | 60 +- .../cli/src/service/templates/service.tpl.ts | 60 - packages/cli/src/service/type/custom.tpl.ts | 68 +- packages/cli/src/service/type/knex.tpl.ts | 64 +- packages/cli/src/service/type/mongodb.tpl.ts | 54 +- packages/cli/test/generators.test.ts | 1 + packages/schema/src/hooks/resolve.ts | 2 + packages/schema/src/hooks/validate.ts | 40 +- packages/schema/src/index.ts | 1 + packages/schema/src/schema.ts | 48 +- packages/schema/test/fixture.ts | 133 +- packages/schema/test/hooks.test.ts | 8 +- 27 files changed, 1916 insertions(+), 1997 deletions(-) rename packages/cli/src/app/templates/{configuration.tpl.ts => schemas.tpl.ts} (60%) delete mode 100644 packages/cli/src/authentication/templates/user.resolver.tpl.ts create mode 100644 packages/cli/src/service/service.tpl.ts delete mode 100644 packages/cli/src/service/templates/class.tpl.ts delete mode 100644 packages/cli/src/service/templates/resolver.tpl.ts delete mode 100644 packages/cli/src/service/templates/service.tpl.ts diff --git a/package-lock.json b/package-lock.json index 606ce772bd..9f86f43014 100644 --- a/package-lock.json +++ b/package-lock.json @@ -128,28 +128,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", - "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", + "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", - "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.1", + "@babel/parser": "^7.19.3", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -173,11 +173,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", + "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", "dependencies": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -222,11 +222,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", - "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "dependencies": { - "@babel/compat-data": "^7.19.1", + "@babel/compat-data": "^7.19.3", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -480,9 +480,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } @@ -600,9 +600,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1537,12 +1537,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", - "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", + "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", "dependencies": { - "@babel/compat-data": "^7.19.1", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/compat-data": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", @@ -1610,7 +1610,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1677,18 +1677,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", + "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.19.3", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/types": "^7.19.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1705,12 +1705,12 @@ } }, "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", + "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", "dependencies": { "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1819,12 +1819,25 @@ "url": "https://github.com/sponsors/daffl" } }, + "node_modules/@feathershq/pinion/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@feathershq/pinion/node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", @@ -1859,9 +1872,9 @@ "devOptional": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2001,16 +2014,16 @@ } }, "node_modules/@lerna/add": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-5.5.1.tgz", - "integrity": "sha512-Vi6Zm8bt1QAoDYl7YERTOgjEn2bwbZNBqYxNz0DlsxcqKHW2GkefEemZLXxmd9G8YgbsbC71W4sz/yFlkSSsxQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-5.5.4.tgz", + "integrity": "sha512-eMEWdyH2ijjDuOCZ5qI7nZlWtVmOx/aABGyNmNEG1ChNDQSmxgEmmqxagQCtW7+T63e9AaHsjrxYahBWYBnuhw==", "dev": true, "dependencies": { - "@lerna/bootstrap": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/npm-conf": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/bootstrap": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/npm-conf": "5.5.4", + "@lerna/validation-error": "5.5.4", "dedent": "^0.7.0", "npm-package-arg": "8.1.1", "p-map": "^4.0.0", @@ -2022,23 +2035,23 @@ } }, "node_modules/@lerna/bootstrap": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-5.5.1.tgz", - "integrity": "sha512-BNfrwZD3peUiJll5ZBVgLRyURWSY9px6hJna1i7zTT1DNged/ehqd2hfMqWV+7iX6mO+CvcfH/v3zJaUwU1aOw==", - "dev": true, - "dependencies": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/has-npm-version": "5.5.1", - "@lerna/npm-install": "5.5.1", - "@lerna/package-graph": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/rimraf-dir": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/symlink-binary": "5.5.1", - "@lerna/symlink-dependencies": "5.5.1", - "@lerna/validation-error": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-5.5.4.tgz", + "integrity": "sha512-MGC6naM0DrFNYTZPEW477uqWCqXmI4MRBKjtGNMiJhczYcFdD6x30u688zoAuO5HUoyqL6Uw7Ea28GVEyDm93Q==", + "dev": true, + "dependencies": { + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/has-npm-version": "5.5.4", + "@lerna/npm-install": "5.5.4", + "@lerna/package-graph": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/rimraf-dir": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/symlink-binary": "5.5.4", + "@lerna/symlink-dependencies": "5.5.4", + "@lerna/validation-error": "5.5.4", "@npmcli/arborist": "5.3.0", "dedent": "^0.7.0", "get-port": "^5.1.1", @@ -2055,38 +2068,38 @@ } }, "node_modules/@lerna/changed": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-5.5.1.tgz", - "integrity": "sha512-aDm+KQZhOdivNSs74lqC71BO7lVtKHu9oyisqhqCb5MdZn7yjO3Ef2Y0CYN4+dt355zW+xI87NzwSWYGQEd/5Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-5.5.4.tgz", + "integrity": "sha512-/tns9PA5m9XCKJk13RRJotCOFR/bZ+7zfxz20zpIELT9GehZLTaEPsItxVnlqQ4dMHMe0fl6XG6dFqeBqLOW4g==", "dev": true, "dependencies": { - "@lerna/collect-updates": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/listable": "5.5.1", - "@lerna/output": "5.5.1" + "@lerna/collect-updates": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/listable": "5.5.4", + "@lerna/output": "5.5.4" }, "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/check-working-tree": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-5.5.1.tgz", - "integrity": "sha512-scfv1KDYQVy1US6SA8C4uj56HN021E2GXCL0bXzc6VKFewdZ9LreJTo0zSN6JwRitxc0c45lTAfTqDueVWANNQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-5.5.4.tgz", + "integrity": "sha512-uIHlEb/JSX9P230UNH69W21fWM4oKu8ulRdXuYCBckpbJkDz9nT1yS2y4wUHx+3GfXWqGKygTh8Z06vSdYg+2A==", "dev": true, "dependencies": { - "@lerna/collect-uncommitted": "5.5.1", - "@lerna/describe-ref": "5.5.1", - "@lerna/validation-error": "5.5.1" + "@lerna/collect-uncommitted": "5.5.4", + "@lerna/describe-ref": "5.5.4", + "@lerna/validation-error": "5.5.4" }, "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/child-process": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-5.5.1.tgz", - "integrity": "sha512-rGVK5DIJa2EljPb3RW4ZAvwgiyX6xL3hZzRGRkSQWV7866W/Xy0aCgWhfSmUvxB7iiH1NBw5ANlCuBLk31T0QQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-5.5.4.tgz", + "integrity": "sha512-1QlxFASrKlV3cG7XPFolOdrS4W784zv4DgipmTxaP++VlVAwbrHhqUdIEytDV6d0rlRksf6LPYzJhXdwlBkCEQ==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -2098,16 +2111,16 @@ } }, "node_modules/@lerna/clean": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-5.5.1.tgz", - "integrity": "sha512-Be0nQpoppH43oRhNoevNms6unRvZFwFnuz3sGABii+hyFYqLIpZiAz98ur0LtV8OVq1bUYLXp8bHf+XylgvXQg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-5.5.4.tgz", + "integrity": "sha512-q1fXRm6ZXo3HrFfsgyY9C83haotPT/Xa5K8fQX6GADuNLk0Xo3+ycouHeidblRLmQtCa3WNPEmCthTuaWrSUoQ==", "dev": true, "dependencies": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/rimraf-dir": "5.5.1", + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/rimraf-dir": "5.5.4", "p-map": "^4.0.0", "p-map-series": "^2.1.0", "p-waterfall": "^2.1.1" @@ -2117,12 +2130,12 @@ } }, "node_modules/@lerna/cli": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-5.5.1.tgz", - "integrity": "sha512-57dEQoiJnMhLIgS5zAEhPmL70LLrZHUqfxoXYBCg+yqlmsGqZ7t0Re5XtBUbFk6hsUm81sblf9A4YI2fssGVrA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-5.5.4.tgz", + "integrity": "sha512-4uJEFEN0QNnQgghbpdY5wLmBPOeUeBeCKGh9s2pc1fkn0I1wKDhG0QByOfcf+jGuid2bA7DXzvJRXRgq0fWw0A==", "dev": true, "dependencies": { - "@lerna/global-options": "5.5.1", + "@lerna/global-options": "5.5.4", "dedent": "^0.7.0", "npmlog": "^6.0.2", "yargs": "^16.2.0" @@ -2132,12 +2145,12 @@ } }, "node_modules/@lerna/collect-uncommitted": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-5.5.1.tgz", - "integrity": "sha512-BPGpov4aYRugkY5aieolHEqJRV/6IQ9y6Xy+Fv/892jNhe2dFwi6+u2JbdmO+9JOkz/ZeDDZ85qEbnaiuVQDWg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-5.5.4.tgz", + "integrity": "sha512-xLCsp8Qx5z/BWCxqUt8W8Se2XJcCQE6YUAti9TSWD5Ar+M5Etkgz2YJiUjZfZrsWZPBCqNfGfxx9Sjs7a/r+8A==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "chalk": "^4.1.0", "npmlog": "^6.0.2" }, @@ -2146,13 +2159,13 @@ } }, "node_modules/@lerna/collect-updates": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-5.5.1.tgz", - "integrity": "sha512-Dco+0KwmbnKv1Uv/4jWmFObZKEVTcY7YpN863LsXjieOyD5hz1B5z/2fVk8g6QP5lUsVBG0WUnSKtdapUO5yBw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-5.5.4.tgz", + "integrity": "sha512-m34bVoMO5QOd5K5uyAtQtkTiXBIEJHydXMwNXs+YTIAgy82JXNHfZE9vV63Fd5ZWOGY6ORthuXuC2Jn0Vx9tQA==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/describe-ref": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/describe-ref": "5.5.4", "minimatch": "^3.0.4", "npmlog": "^6.0.2", "slash": "^3.0.0" @@ -2162,16 +2175,16 @@ } }, "node_modules/@lerna/command": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-5.5.1.tgz", - "integrity": "sha512-HHnGQpUh7kiHja/mB5rlnHnL3B3B12y4RBpJTxX22IkdcwsiO8g/n2FWh9MPQvuVcR2FRh4PWXhmfVnboZCAaw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-5.5.4.tgz", + "integrity": "sha512-/7drNy2DjVjDjm2knsDfEQIFEdRgPE2/lQ3yfEjVbXqs319o6KWbQVeoNy5GjGnLvc3v3eObA0cSJXHzEV11Bg==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/package-graph": "5.5.1", - "@lerna/project": "5.5.1", - "@lerna/validation-error": "5.5.1", - "@lerna/write-log-file": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/package-graph": "5.5.4", + "@lerna/project": "5.5.4", + "@lerna/validation-error": "5.5.4", + "@lerna/write-log-file": "5.5.4", "clone-deep": "^4.0.1", "dedent": "^0.7.0", "execa": "^5.0.0", @@ -2183,12 +2196,12 @@ } }, "node_modules/@lerna/conventional-commits": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-5.5.1.tgz", - "integrity": "sha512-oYTt1SbCNc/5N98ESFFDjWImU61qcYmQZBVxdzBDeZku/VRlaXw7Km5lSnVy7GrGkIPRxayunL4r1k32w5SZpA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-5.5.4.tgz", + "integrity": "sha512-zLcaveLXnIDYo3e9ChKsHSxiG7vOJeKdcoC5Fj8WH4DjAq/aqy15TE5SJr6aO8hOU/ph0EonPwyQBf4X2Lg5fg==", "dev": true, "dependencies": { - "@lerna/validation-error": "5.5.1", + "@lerna/validation-error": "5.5.4", "conventional-changelog-angular": "^5.0.12", "conventional-changelog-core": "^4.2.4", "conventional-recommended-bump": "^6.1.0", @@ -2204,15 +2217,15 @@ } }, "node_modules/@lerna/create": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-5.5.1.tgz", - "integrity": "sha512-ZkN0rTTrIRIk9B+FzMXsjL8tK8wy4Orw7U3lVu8xe7LkxmK+lYxSOqcgfwWJjmA1yyoiNK+Xn++RlqXF7LW++Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-5.5.4.tgz", + "integrity": "sha512-mmZKy5U4OKBr/r8Tm6C8gubYHubQaHdPJ+aYuA/l4uCfK0p/Jly84Fy7M3kclcqm8FKDPKDhlp0Y2jnc32jBbA==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/npm-conf": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/npm-conf": "5.5.4", + "@lerna/validation-error": "5.5.4", "dedent": "^0.7.0", "fs-extra": "^9.1.0", "globby": "^11.0.2", @@ -2232,9 +2245,9 @@ } }, "node_modules/@lerna/create-symlink": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-5.5.1.tgz", - "integrity": "sha512-yOo1dXzoyeqhX4QCeswS0FjMSFyfNmHxtwE73+1k4uIYPWHWPHA/PW3y3hkOqh6QbBBg+y6+KCRiCOPaftZb6g==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-5.5.4.tgz", + "integrity": "sha512-TOfkeEQGhE90mvtky0Vpfl+6hwBz0tSXV0+gjRBmla/sYU/9+QoSH36TauHrmu/O3C8/CWtoGruxiWq8jP6Gyw==", "dev": true, "dependencies": { "cmd-shim": "^5.0.0", @@ -2255,12 +2268,12 @@ } }, "node_modules/@lerna/describe-ref": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-5.5.1.tgz", - "integrity": "sha512-pioaEFDKUcYsdgqz/wnjJ5pZyfrh7etJMYdxDDxijysn/96R28zTQMBrgGgjrBmkFyV9zmaxNaQXz1gx+IMohA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-5.5.4.tgz", + "integrity": "sha512-2LDEsuSbZTta7SuwKVo9ofeKvxqy4YFNOjEt7+JceZIfh4si3MjIPBX7l8AsCaUmwJnpOEYba0aau72AUAOtoA==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "npmlog": "^6.0.2" }, "engines": { @@ -2268,14 +2281,14 @@ } }, "node_modules/@lerna/diff": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-5.5.1.tgz", - "integrity": "sha512-mqKSafF5hGteVbRUPI41b8OZutolr6vqg2ObkKXFXpT6RvAX2NPpppHf0c0XORLWjc47p14Iv8xsQMCNwJ0tzQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-5.5.4.tgz", + "integrity": "sha512-OTieqJA4zKAV0KeG0nXwPnCkwg3LH+ucXlelnj1w+gaP2ndHbJVwgUWXGpqCHk8tn935KKOULhP7BGmAwvTYlQ==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/validation-error": "5.5.4", "npmlog": "^6.0.2" }, "engines": { @@ -2283,17 +2296,17 @@ } }, "node_modules/@lerna/exec": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-5.5.1.tgz", - "integrity": "sha512-eip4MlIYkbxibIoV0ANjKdf9CSAER87C2zGY+GwHZKUSOD0I3xfhbPTkJozHBE3aqez6dR0pebi6cpNWvzEdIg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-5.5.4.tgz", + "integrity": "sha512-o1SQ+6/U6L8hih6+wAgjyOhqo2CKzMcW6YWLs5erRY9E6VCEc2kX7SW3223ehsAhUIPfG7n+KYPmuZbWvTpbGQ==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/profiler": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/profiler": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/validation-error": "5.5.4", "p-map": "^4.0.0" }, "engines": { @@ -2301,13 +2314,13 @@ } }, "node_modules/@lerna/filter-options": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-5.5.1.tgz", - "integrity": "sha512-U4erQgGBawazN0eDLQzWf5xu1mTaucVguzUblBSOfQm+fUBsYG5WYJtn9AvVLrUCQMwAV3L2+/NWb1FOkqArMw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-5.5.4.tgz", + "integrity": "sha512-t1amUypgloaKN8d3VN7GiJQd4ommDplxSisAMS8hztb6ail3EbxasRQ03GXz4+6yQ98sam+D03soqSWAJcinrw==", "dev": true, "dependencies": { - "@lerna/collect-updates": "5.5.1", - "@lerna/filter-packages": "5.5.1", + "@lerna/collect-updates": "5.5.4", + "@lerna/filter-packages": "5.5.4", "dedent": "^0.7.0", "npmlog": "^6.0.2" }, @@ -2316,12 +2329,12 @@ } }, "node_modules/@lerna/filter-packages": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-5.5.1.tgz", - "integrity": "sha512-970kc2w6Bzr9FAL8DFisOonDocj7VDFdNnVVJpaTbNnbuMLnCT4vPXHKHQku2XEgxfr1lgyFA+srzxiiLQGWaQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-5.5.4.tgz", + "integrity": "sha512-mwpiF+L0np003AUp3ntKEFkNOXWBONwm9q8rW9TOR8OeqMXbxYWGLg2IR+Wc8EClmen79tahn076nUD85OLqew==", "dev": true, "dependencies": { - "@lerna/validation-error": "5.5.1", + "@lerna/validation-error": "5.5.4", "multimatch": "^5.0.0", "npmlog": "^6.0.2" }, @@ -2330,9 +2343,9 @@ } }, "node_modules/@lerna/get-npm-exec-opts": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.5.1.tgz", - "integrity": "sha512-z8HoeCHbKVoHRjsyEwEhFF37vubX52CQOI+7TcEhjMYDXRrfKYfGcLXFh++DGihRQ7qk7ir27VrJgweeu/rcNw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.5.4.tgz", + "integrity": "sha512-PLvSdt0woeOz3TZDHRshYVR9TSOUNunxZ4mE8f0tg9FPQ5R1uuwd2BF4HmEL7AlWFtFS+sOwuL9bI1btV1ELew==", "dev": true, "dependencies": { "npmlog": "^6.0.2" @@ -2342,9 +2355,9 @@ } }, "node_modules/@lerna/get-packed": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-5.5.1.tgz", - "integrity": "sha512-8zlT1Yzl1f8XfmNzu+zqJFKIqX28icbfVJp/hrbz7CEyn8JtTy9oNFokt3wbolmQ53LZ69B1gECZ1vlKOtoCSQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-5.5.4.tgz", + "integrity": "sha512-BXQcQ5rfdIa8hkDd4UdETWs9mDiFvmBRpSNxpgaRiuL1w7AXEaMREQgKOFiv8fv/e+z/F0SXD048Fptj8d5pjA==", "dev": true, "dependencies": { "fs-extra": "^9.1.0", @@ -2356,15 +2369,15 @@ } }, "node_modules/@lerna/github-client": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-5.5.1.tgz", - "integrity": "sha512-921aWALGJT3L7iF3pYkj9tzXS1D/nZw32qWNoGQweTyAs7ycqm037WhdJPS67k+bqZL8flC80CbGEOuEMQq8Xw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-5.5.4.tgz", + "integrity": "sha512-m5vTRsHyfzh16T3fX3ipdjZyQwl4Gnwav4RmEaVUFp2uMqsr0TrML7LJ/eqOqjGvj/+JWa52rIQsUCQe9BJYag==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "@octokit/plugin-enterprise-rest": "^6.0.1", "@octokit/rest": "^19.0.3", - "git-url-parse": "^12.0.0", + "git-url-parse": "^13.1.0", "npmlog": "^6.0.2" }, "engines": { @@ -2372,9 +2385,9 @@ } }, "node_modules/@lerna/gitlab-client": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-5.5.1.tgz", - "integrity": "sha512-hp0/p6cITz6pdZ1ToYNHcLHh8iusdXzYNwoLZABSuMAqvvPBuJt2aOxhU7DXBYCB+sQUj8K8qcVP9qpvBs98Wg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-5.5.4.tgz", + "integrity": "sha512-vPSr6xFxtOigFY/fE8oYF+360WsV+g2ZkoJB34FA6UucjWBBPu2W13ydUYfqvJYODJYFzhTjB9b8zf0MJ0KMrQ==", "dev": true, "dependencies": { "node-fetch": "^2.6.1", @@ -2385,21 +2398,21 @@ } }, "node_modules/@lerna/global-options": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-5.5.1.tgz", - "integrity": "sha512-Hy/Yrskk5wuigpG+4GN8cAfBk9tGY/NlJlONmjqcZr5mKc3DkJ2It03jeGtUK/j7hP3GNZo2nx2VGnJf40RGuA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-5.5.4.tgz", + "integrity": "sha512-J2K4CsnYuKrW7bDR2gRABUFFrLaJ5z4GaaDpaKtQi6sHFKcVBfYz0B51Fe3NGFOvrct4YS9N7SgKDxPd5Nznig==", "dev": true, "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/has-npm-version": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-5.5.1.tgz", - "integrity": "sha512-t/eff0L3pX31L97mt26LENvIkt+e9fye8hSHUiLoFmUqjmy2yA1qQz2g+oQpGbRXpy+oz9rCCpBx+G4i13aN9A==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-5.5.4.tgz", + "integrity": "sha512-l+nDc/QYvfA5f0tFxzd9mZ/SP0nfxbqpZ9csGyqU8NV/40fHRRouO+fcLtxjcG/mruMjiAB/P216BBbRmGb2VA==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "semver": "^7.3.4" }, "engines": { @@ -2407,16 +2420,16 @@ } }, "node_modules/@lerna/import": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-5.5.1.tgz", - "integrity": "sha512-9eeagJrw8EBXuONOIagm45zhdHlHrDN9iT5c9OWHV8yh1MBevd7ERbDc8UluHHg5/dP6aqFJxtv54cDdb/3aJg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-5.5.4.tgz", + "integrity": "sha512-1edy4e+0w4/awahc3uPvRQngIHbri5BGZZbjvsX8aKlPUd9pFg5U9/5w3lVE5jnZFRnqwhpJyyvJjL2M5F6IgQ==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/validation-error": "5.5.4", "dedent": "^0.7.0", "fs-extra": "^9.1.0", "p-map-series": "^2.1.0" @@ -2426,13 +2439,13 @@ } }, "node_modules/@lerna/info": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-5.5.1.tgz", - "integrity": "sha512-gRrC2yy0qm9scb0B2xSGlPWBGnFMurie5SbGTz4hPesOdZEoiplMaL+e5y5cr67KDEhYPwIkL1sUXHLkTYZekA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-5.5.4.tgz", + "integrity": "sha512-JgYRP2WZUCuiYyf3CQjqEMGoqWpM7t/bammKW/sC3P0/xGSykh45vdRwVojcu4fGRZ/YS7sfFt28Dbw4QFp0iQ==", "dev": true, "dependencies": { - "@lerna/command": "5.5.1", - "@lerna/output": "5.5.1", + "@lerna/command": "5.5.4", + "@lerna/output": "5.5.4", "envinfo": "^7.7.4" }, "engines": { @@ -2440,14 +2453,14 @@ } }, "node_modules/@lerna/init": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-5.5.1.tgz", - "integrity": "sha512-jyi8DZK2hylI8wjX5NgI/CBZEx2UJmmt12PiQuIvnfEvyTbd90MK0zj4AtyVMKpEal5oZCyprGFBb8MY8lS5Dg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-5.5.4.tgz", + "integrity": "sha512-BteH3O8ywUN8eBhwzOey3gTXxxKRxGz1JJ6tP1mA0KZoJgiBsSFoZbx7SJeGrR8gY7kmEyvXTY1geaxmb7V+vQ==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/project": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/project": "5.5.4", "fs-extra": "^9.1.0", "p-map": "^4.0.0", "write-json-file": "^4.3.0" @@ -2457,15 +2470,15 @@ } }, "node_modules/@lerna/link": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-5.5.1.tgz", - "integrity": "sha512-U/voZ0f/3CHiui3cf9r2ad+jESQZnUAMf6n5oIysBFrT5YtAHHN4FYXtzjXJQ4TLFNke2YnLaw67mLaHeQDW+w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-5.5.4.tgz", + "integrity": "sha512-/kFST918MLhvWbs3szbUw3/6pPa0/vS77WnHk8n3S3v/PuzUEjm9CncYrZ0xB1ZiGk6oa4YTPWMlqyYMY1k0hQ==", "dev": true, "dependencies": { - "@lerna/command": "5.5.1", - "@lerna/package-graph": "5.5.1", - "@lerna/symlink-dependencies": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/command": "5.5.4", + "@lerna/package-graph": "5.5.4", + "@lerna/symlink-dependencies": "5.5.4", + "@lerna/validation-error": "5.5.4", "p-map": "^4.0.0", "slash": "^3.0.0" }, @@ -2474,27 +2487,27 @@ } }, "node_modules/@lerna/list": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-5.5.1.tgz", - "integrity": "sha512-tRDUpV06ZpV6g2MvqRf35ozsRjKweCTCvS8z1o1/4laZen6aPK+Y9TIihvd36biDzCdNYz3IOLzvz8nO8WIJiA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-5.5.4.tgz", + "integrity": "sha512-ppLy99mQYoDkO+SxqnknPYqOnO+iJskb0G2h2fLF4ZK98oy2duJWkkehagwCVtmPax/DqWDDc/IAj+KWpcC0bQ==", "dev": true, "dependencies": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/listable": "5.5.1", - "@lerna/output": "5.5.1" + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/listable": "5.5.4", + "@lerna/output": "5.5.4" }, "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/listable": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-5.5.1.tgz", - "integrity": "sha512-EU+OUBV0vrySrDhlMHvfdA0NgwRtaTx5nc4XUtNrTN4Zqjav9iElrf6Xx9k0fUq27smiQ1tyutQEwGaNab0VTQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-5.5.4.tgz", + "integrity": "sha512-c6acWwSDQE5zeBcnH3m+mwfDr3zr515LsC30tXRenkqp4lbXeyrUPw0Mckw1ksw2nyb5LZl8gQnrFbAKC8gBSA==", "dev": true, "dependencies": { - "@lerna/query-graph": "5.5.1", + "@lerna/query-graph": "5.5.4", "chalk": "^4.1.0", "columnify": "^1.6.0" }, @@ -2503,9 +2516,9 @@ } }, "node_modules/@lerna/log-packed": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-5.5.1.tgz", - "integrity": "sha512-i6SomT53TquZwrl8Ib+bleU0xYo8z36jIWGqfb0OlbNZswEbHQ5nvVO73Kjjc14g+eM0JGHwGi79LHFictcjVw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-5.5.4.tgz", + "integrity": "sha512-g3lW5yIIe66aVTOYn78+h21GR9gr/WdU3/z8jm0VzGC+VR7KqCKU+49JOCOh7LlNf7sY4ZE6ZbaZptp5wUjrgQ==", "dev": true, "dependencies": { "byte-size": "^7.0.0", @@ -2518,9 +2531,9 @@ } }, "node_modules/@lerna/npm-conf": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-5.5.1.tgz", - "integrity": "sha512-ARqXAUlkEfFL00fgZa84aFzvp9GSPxAm4Fy1wzGz9ltXTwg/1yyGu6AucSKO1qa/JvcF2giWuXuvkJ3jsY4Log==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-5.5.4.tgz", + "integrity": "sha512-BwnP0ezR84nQ5Sh0CdH77Q8evDcqP9bFUdjX6eZT4Rxl0432ocB1YpweNnUDQO4Boxj/FiOu/OaE0Kej+I+5ew==", "dev": true, "dependencies": { "config-chain": "^1.1.12", @@ -2531,12 +2544,12 @@ } }, "node_modules/@lerna/npm-dist-tag": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-5.5.1.tgz", - "integrity": "sha512-DN3l01gpgV3M2MYo7zhZOgZrl21ltr+PoxK2LBVv5Snbhc88WqKm6slCrF5LXnfM6FraZ2UQTjBYXx8fQnpIDw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-5.5.4.tgz", + "integrity": "sha512-aAisCh5b2+6cjLxZh03/MGGcBjL7KNBWi5qW6OCdQQpcxH5r0aUJ5F1rmXJE0qxgsLWaGRLzngWk+v6VJHqYJQ==", "dev": true, "dependencies": { - "@lerna/otplease": "5.5.1", + "@lerna/otplease": "5.5.4", "npm-package-arg": "8.1.1", "npm-registry-fetch": "^13.3.0", "npmlog": "^6.0.2" @@ -2546,13 +2559,13 @@ } }, "node_modules/@lerna/npm-install": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-5.5.1.tgz", - "integrity": "sha512-O99aYWrWAz+EuHrsED2Wv0X6Ge1O9CrAfcIu6dMf8r5Q58LL67engi9AtH98cwx2LTeyYYHwksjewIsL/kn0ig==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-5.5.4.tgz", + "integrity": "sha512-lglf2KRxg30dCvNWwxQRJmCfXC51byNqYQt9/dFrnWcotHwpNRIFnVM3tWMdVxlwJMiozU/PjUFBateaxmukXw==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/get-npm-exec-opts": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/get-npm-exec-opts": "5.5.4", "fs-extra": "^9.1.0", "npm-package-arg": "8.1.1", "npmlog": "^6.0.2", @@ -2564,13 +2577,13 @@ } }, "node_modules/@lerna/npm-publish": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-5.5.1.tgz", - "integrity": "sha512-ajdV2Vb9SOGGp7E7pvb0q7gHqQpd8fQ4DztPOQYrhMUILobJgu4oR3tojMp0XN7vki+pG/OmsOqrQY6M02AkPw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-5.5.4.tgz", + "integrity": "sha512-Z3GQqby0FR7HW82/t7j7nOF9pfSwNVmgms0zTq7a8YaEe8uDlAxGMW4sVN8uT89mZfBfS6R1WMlBbC5Ea+jy/A==", "dev": true, "dependencies": { - "@lerna/otplease": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", + "@lerna/otplease": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", "fs-extra": "^9.1.0", "libnpmpublish": "^6.0.4", "npm-package-arg": "8.1.1", @@ -2583,13 +2596,13 @@ } }, "node_modules/@lerna/npm-run-script": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-5.5.1.tgz", - "integrity": "sha512-/68rDfOHtAEHAeAVYC1KXidQkssMBnz/9kcXlcdUaqe88LXSCuhWz49w7qWsUJvSmqwCuD7BWtVR5zx4GnLXhQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-5.5.4.tgz", + "integrity": "sha512-fwHZRTGUldN9D2Rugg0HdwE8A8OZ7CF7g63y7OjzIoxASqtZBDyHZgrVbY/xZcrhqCF0+VJ1vR0c/uFwtWFrtA==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", - "@lerna/get-npm-exec-opts": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/get-npm-exec-opts": "5.5.4", "npmlog": "^6.0.2" }, "engines": { @@ -2597,21 +2610,21 @@ } }, "node_modules/@lerna/otplease": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-5.5.1.tgz", - "integrity": "sha512-I2SEuIb7JWWT4xNUNWvKP7qaRHeQslMuiSdJuO6dV1fnH7FM7xEiHnWIhgDsQqacsci17Ix92toORaYmkU/kqg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-5.5.4.tgz", + "integrity": "sha512-c/tSjuMGw0esoxqtW0Qs2gCcvFDCrOlFnd4EgTJQKUSbNwVrabMkDJRMP0zu7UiSYJCCWKlBnjpBCiBXNG2H4A==", "dev": true, "dependencies": { - "@lerna/prompt": "5.5.1" + "@lerna/prompt": "5.5.4" }, "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/output": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-5.5.1.tgz", - "integrity": "sha512-G8WpRlXWUCaJqxtVTCrYRSu5hBy0lxsfdzoEJwkVW9wXL6mL4WwH5TkstPq8LFSEr+NkWa+Hz25VO7LywQQWaQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-5.5.4.tgz", + "integrity": "sha512-qiYtDQ4k9sXzXRlbSuLUFDNLk42sJY3n7x7fWKt6v5I9s2uh5d3cBctBuvV8+YX82H1inQ9hpyFafzOBO8tbCA==", "dev": true, "dependencies": { "npmlog": "^6.0.2" @@ -2621,15 +2634,15 @@ } }, "node_modules/@lerna/pack-directory": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-5.5.1.tgz", - "integrity": "sha512-gvKnq9spvIPV4KGK1sxCk23jUjKdpzXtZFZ77QSDWfv2ZXOLcU9MvNC9xx23wcQRkX1IhKFngwMtIfcxrUZN2Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-5.5.4.tgz", + "integrity": "sha512-yUhu8ADzUZOZPfimMwlxxuxIweXitMKTVAmhz9eruiNHxsc0GpKb89yemep03iXqtrjC1Pt/QsS+dhJNNKdZ4A==", "dev": true, "dependencies": { - "@lerna/get-packed": "5.5.1", - "@lerna/package": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/temp-write": "5.5.1", + "@lerna/get-packed": "5.5.4", + "@lerna/package": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/temp-write": "5.5.4", "npm-packlist": "^5.1.1", "npmlog": "^6.0.2", "tar": "^6.1.0" @@ -2639,9 +2652,9 @@ } }, "node_modules/@lerna/package": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-5.5.1.tgz", - "integrity": "sha512-K2ylaS3DJ2SU/ptWHMeXkN1AUVPAOKNCP5/K8S42z/ZAmuLlt1LcTMznWPaCbYf2h3HExda8j3UmbEsOtYuixw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-5.5.4.tgz", + "integrity": "sha512-wpBcq4zVFVQOJI9QT0TJItRjl6jGSGFp93n4D8KHXXiyeKmN9CW4EnwFY9bnT3r5OteZN+eorD6r2TnRe8VPDg==", "dev": true, "dependencies": { "load-json-file": "^6.2.0", @@ -2653,13 +2666,13 @@ } }, "node_modules/@lerna/package-graph": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-5.5.1.tgz", - "integrity": "sha512-BgkJquJcm/GaGwLmZRTCSAdUBitlGP4HmEP1NI9xrR1x9/OHgfVfkp5yDZBipA/6jY7ucumShU6mYE0fIP9CVA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-5.5.4.tgz", + "integrity": "sha512-1g0c08mooZBtrIG8gMOdpbZ3rn5VM+e47pLFAXZcfGUaNUfc0OM58Z50ONiJq23XlJmS4vQ2e4X3cs7Hc7+Dxw==", "dev": true, "dependencies": { - "@lerna/prerelease-id-from-version": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/prerelease-id-from-version": "5.5.4", + "@lerna/validation-error": "5.5.4", "npm-package-arg": "8.1.1", "npmlog": "^6.0.2", "semver": "^7.3.4" @@ -2669,9 +2682,9 @@ } }, "node_modules/@lerna/prerelease-id-from-version": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.5.1.tgz", - "integrity": "sha512-F12+2ubWOY3pnUyTpV/jgZUMaFWas0ehFwYs20WMAnQQVyRHCVjg+bBfvQPGVnuJ6r7n3kXzn69TLDzouhRJcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.5.4.tgz", + "integrity": "sha512-IHNQxbILrRGhw9CCdqy0ncSjDpNvdJCcaGFh3+TJRx6Bjhl5ifbUjI0gBUxd7i5Aict5dguWlhAWHQpef48AqA==", "dev": true, "dependencies": { "semver": "^7.3.4" @@ -2681,9 +2694,9 @@ } }, "node_modules/@lerna/profiler": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-5.5.1.tgz", - "integrity": "sha512-WDPgXEYl0lU/dBZ7ejiiNLqwJkPFR+d4vmIkPAFR4RsKQV4VCOCtlJ2QxOHroOPLJ7FrKD71rKyX4cZUIrHl7Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-5.5.4.tgz", + "integrity": "sha512-LPnO8mXhXSBT8PD5pEWkgd+2d8lJqQ0fnwcIPG0B8o6tnQrSc2gXLNxStYOFedzcZXRhAYiFVrf5VjOKHV6Ghw==", "dev": true, "dependencies": { "fs-extra": "^9.1.0", @@ -2695,13 +2708,13 @@ } }, "node_modules/@lerna/project": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-5.5.1.tgz", - "integrity": "sha512-If3HOjNk/hcbe1gJDysKPws0RKvyG7rrGzkEmBGQ6bi6+eDdaK98XRFHTTAnHfBVOLLd1eimprZCUsYuCATdLg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-5.5.4.tgz", + "integrity": "sha512-iLdyc+jPU0cR6BQO3V3Sf51WP3Oac+I/+518dIGdWS7ot9nEbjuZripHJjIkyZKSfnKPTEtz2aUta0ndoewwuQ==", "dev": true, "dependencies": { - "@lerna/package": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/package": "5.5.4", + "@lerna/validation-error": "5.5.4", "cosmiconfig": "^7.0.0", "dedent": "^0.7.0", "dot-prop": "^6.0.1", @@ -2740,9 +2753,9 @@ } }, "node_modules/@lerna/prompt": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-5.5.1.tgz", - "integrity": "sha512-pKxdfwW4VwIapLj3kZBR3V6usCbZmCfkYUJSO//Vcw/dYf8X1lI9a+qR6imXSa1VwGdU/29oimMGpFn89BjyCA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-5.5.4.tgz", + "integrity": "sha512-X8H2V4dDkFLYzZkMTillvuGAphU5fTDR66HgZlhgKtbJjm7OrjxhoRdk/YlMpI+HdYwXhdUzhEe9YJEhqhfe6w==", "dev": true, "dependencies": { "inquirer": "^8.2.4", @@ -2753,30 +2766,30 @@ } }, "node_modules/@lerna/publish": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-5.5.1.tgz", - "integrity": "sha512-hQCEHGLHR4Wd3M/Ay7bmOViL1HRekI/VoJGy+JoG3rn/0H13cTh+lVhvwmtOGKJHsHBQkQ0WaZzwZF16/XLTzA==", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "5.5.1", - "@lerna/child-process": "5.5.1", - "@lerna/collect-updates": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/describe-ref": "5.5.1", - "@lerna/log-packed": "5.5.1", - "@lerna/npm-conf": "5.5.1", - "@lerna/npm-dist-tag": "5.5.1", - "@lerna/npm-publish": "5.5.1", - "@lerna/otplease": "5.5.1", - "@lerna/output": "5.5.1", - "@lerna/pack-directory": "5.5.1", - "@lerna/prerelease-id-from-version": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/validation-error": "5.5.1", - "@lerna/version": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-5.5.4.tgz", + "integrity": "sha512-zBlZsk+NBUfg4o7ycKH8/hc4NRJWd4RmxB6Kn7xo7MOJMW3x+K4aABcqY2GGxEMUxx3rBBVPIdziVWbyS7UIxA==", + "dev": true, + "dependencies": { + "@lerna/check-working-tree": "5.5.4", + "@lerna/child-process": "5.5.4", + "@lerna/collect-updates": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/describe-ref": "5.5.4", + "@lerna/log-packed": "5.5.4", + "@lerna/npm-conf": "5.5.4", + "@lerna/npm-dist-tag": "5.5.4", + "@lerna/npm-publish": "5.5.4", + "@lerna/otplease": "5.5.4", + "@lerna/output": "5.5.4", + "@lerna/pack-directory": "5.5.4", + "@lerna/prerelease-id-from-version": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/validation-error": "5.5.4", + "@lerna/version": "5.5.4", "fs-extra": "^9.1.0", "libnpmaccess": "^6.0.3", "npm-package-arg": "8.1.1", @@ -2792,9 +2805,9 @@ } }, "node_modules/@lerna/pulse-till-done": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-5.5.1.tgz", - "integrity": "sha512-fIE9+LRy172Utfei34QpAg34CFy890j2GCZFln6A+0M3aMNrXkLgF3Zn2awPCugXNu7tLqHRrdZ9ZiSeuk5FYg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-5.5.4.tgz", + "integrity": "sha512-xC4/QPnIQfrE1aA8W5w6AfaT0gTm8SeVmrsQzMMlUTJ2JAnflsHv1oG69M89xq2DrlXsEVaah56Xbjavy+woQg==", "dev": true, "dependencies": { "npmlog": "^6.0.2" @@ -2804,21 +2817,21 @@ } }, "node_modules/@lerna/query-graph": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-5.5.1.tgz", - "integrity": "sha512-BqkxJntH/2o+s9Qz0WUOnbA/SW+ASjkvrS/DJ9jVeZ6KQQykPx/VN+ZRcWCBaSDlJEjSyMiTZUPGqtbN5qV+QQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-5.5.4.tgz", + "integrity": "sha512-TJsmJ++3NpEs+LxF0B02hAv2HigJ9ffa9e+paK27oE8sTiH3YataMHaNu5ZkeotJTw7u0IiRLm0zi4z4xoRlLg==", "dev": true, "dependencies": { - "@lerna/package-graph": "5.5.1" + "@lerna/package-graph": "5.5.4" }, "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/resolve-symlink": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-5.5.1.tgz", - "integrity": "sha512-xuVPN9SrtOfx9crgYbfJX7c/TpGKQj2cKlkGNt1HqfD2GvUvLzksn1Wjj1Mq23yinPNXo2QDXr7XgjHuDNd48w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-5.5.4.tgz", + "integrity": "sha512-cAIXELf04dHx/XF/2njCM0bpiyup6Nedpmm1XNJzrJuWrGmwK2qW5F2wQ/RHXWXsLIe/BsOl/hfEONm7o7k8sA==", "dev": true, "dependencies": { "fs-extra": "^9.1.0", @@ -2830,12 +2843,12 @@ } }, "node_modules/@lerna/rimraf-dir": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-5.5.1.tgz", - "integrity": "sha512-bS7NUKFMT1HsqEFA8mxtHD3jDnpS2xLfQjCyCb7FHHatL46ByZ4oex2965XqL2/aOf+C5aCvYmLFHQ9JN7E2cQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-5.5.4.tgz", + "integrity": "sha512-++I7ToqICE4KSqi4T8enfcou8XPZV3gmrpARVD9VW4Tz3w8BP/JijB6AJwgZKojdqQenXU7u3lLTzfepKN1iOA==", "dev": true, "dependencies": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "npmlog": "^6.0.2", "path-exists": "^4.0.0", "rimraf": "^3.0.2" @@ -2845,19 +2858,20 @@ } }, "node_modules/@lerna/run": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-5.5.1.tgz", - "integrity": "sha512-IVXkiOmTMm1jtrDznunzQx796D9LrwKhlmsTv4YTNfnnyPBlyDAobm/PmOUekf30LKrKvcgTRnbEQ6vWXTR93Q==", - "dev": true, - "dependencies": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/npm-run-script": "5.5.1", - "@lerna/output": "5.5.1", - "@lerna/profiler": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/timer": "5.5.1", - "@lerna/validation-error": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-5.5.4.tgz", + "integrity": "sha512-R9g+4nfIDgK+I4RleAJpXrStzLlUCEHR/rxH2t5LJ6DLaoKUG6oeRZsf2w/It/r2IMV1dq2xG6chs+H1o1J+Ow==", + "dev": true, + "dependencies": { + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/npm-run-script": "5.5.4", + "@lerna/output": "5.5.4", + "@lerna/profiler": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/timer": "5.5.4", + "@lerna/validation-error": "5.5.4", + "fs-extra": "^9.1.0", "p-map": "^4.0.0" }, "engines": { @@ -2865,12 +2879,12 @@ } }, "node_modules/@lerna/run-lifecycle": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-5.5.1.tgz", - "integrity": "sha512-ZM66N7e1sUxsckBnJxdP1NenPNo3hKjPi8fop4do61kwHrWakyRZHl5EEw3CgCWtC7QT+d3zQ/XgDQeJMYEUZg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-5.5.4.tgz", + "integrity": "sha512-MIE8HJml8gWkH5jt/5omiPr69VUMUPwvhkf6Irpg5yxIE5K4oeViVZMay2v6cPA9jAeTDCshHb7gt2EPBSsYQA==", "dev": true, "dependencies": { - "@lerna/npm-conf": "5.5.1", + "@lerna/npm-conf": "5.5.4", "@npmcli/run-script": "^4.1.7", "npmlog": "^6.0.2", "p-queue": "^6.6.2" @@ -2880,12 +2894,12 @@ } }, "node_modules/@lerna/run-topologically": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-5.5.1.tgz", - "integrity": "sha512-27n6SY2X8hWIU2VkttNx+G9D5pUXkxvkum6fvWkOrT/3a5miIwmeZvk0t1qhJ2VHxheB3hpd8HntAb2I2tR62g==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-5.5.4.tgz", + "integrity": "sha512-p1UNHgR8sOaS40nVD0HyqwmawDXBOikIibjbJLcY2QuvWwzAGKjfWm/sAXagYjgzaPYQAhaHyOxTdGe8T+a7uQ==", "dev": true, "dependencies": { - "@lerna/query-graph": "5.5.1", + "@lerna/query-graph": "5.5.4", "p-queue": "^6.6.2" }, "engines": { @@ -2893,13 +2907,13 @@ } }, "node_modules/@lerna/symlink-binary": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-5.5.1.tgz", - "integrity": "sha512-PhrpeO2+3S1bYURb8y7QykmvwS/3KT2nF6Tvv23aqHJOBnrD61I2x0lQdjZK71+WOvi+EN+CatHckNWez14zpw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-5.5.4.tgz", + "integrity": "sha512-FVhkL8KIgk0gPJV136Sl0/t3LD3qDngIRqJVNPIbATVHagkLVsuJM6+BcdWLxoMUCtwHIyWqgcXn1Oa/DVSUEA==", "dev": true, "dependencies": { - "@lerna/create-symlink": "5.5.1", - "@lerna/package": "5.5.1", + "@lerna/create-symlink": "5.5.4", + "@lerna/package": "5.5.4", "fs-extra": "^9.1.0", "p-map": "^4.0.0" }, @@ -2908,14 +2922,14 @@ } }, "node_modules/@lerna/symlink-dependencies": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-5.5.1.tgz", - "integrity": "sha512-xfxTIbg/fUC0afRODbXnFeJ7inEEow4Jkt3agrI10BrztjDKOmoG65KPPh8j0TGKk46TmeN5DI2Ob/5sKRiRzA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-5.5.4.tgz", + "integrity": "sha512-BfOcATr0TreXRfIhIRvgGCT2o8uEqrwVLo8edCQICeqgju19fFn22Qmyb8LW+LMJjBUuSkpJDqqamQ6nj3Ch2A==", "dev": true, "dependencies": { - "@lerna/create-symlink": "5.5.1", - "@lerna/resolve-symlink": "5.5.1", - "@lerna/symlink-binary": "5.5.1", + "@lerna/create-symlink": "5.5.4", + "@lerna/resolve-symlink": "5.5.4", + "@lerna/symlink-binary": "5.5.4", "fs-extra": "^9.1.0", "p-map": "^4.0.0", "p-map-series": "^2.1.0" @@ -2925,9 +2939,9 @@ } }, "node_modules/@lerna/temp-write": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-5.5.1.tgz", - "integrity": "sha512-Msuv4OBXXKJlbxhD4kAUs95XsPYGshoKwQSI2sqOinFXnOkkbhdPdRz+7cd4JKs5qMCEy0+5dh7haruYDnSWmQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-5.5.4.tgz", + "integrity": "sha512-cJy9f9uSvnPxfc2a1ARapGLJXllQlJKKb0idi8aA3ylvgDA7grfKIDPdkf6cBcpPAq8aixDq9GdCZ6oLKdISeA==", "dev": true, "dependencies": { "graceful-fs": "^4.1.15", @@ -2947,18 +2961,18 @@ } }, "node_modules/@lerna/timer": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-5.5.1.tgz", - "integrity": "sha512-DLmCZG0dKh7+Ie/CzK+iz6RPRyAJbXt+4D8OA7n6o/K/Q6AERuNabCDS/3AhJKTdReEjoA2UpswrHXfBN48xVg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-5.5.4.tgz", + "integrity": "sha512-B3eesmrNaw64Svo2pkmCtBVIJbomegiOMrdxFkZrf8ugTKwobn3KSZZkdbN+hjq8SKpRz3XgtjAuSFUzdg8c3A==", "dev": true, "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/validation-error": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-5.5.1.tgz", - "integrity": "sha512-sO5Y6GKmMPtYSKHHR5bNXf/HKISb2g/7uny96X28h+/DihiLhHb0q09fIqmY5WHA1AHsJProZFVEN3BlNrtfEg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-5.5.4.tgz", + "integrity": "sha512-FUC3x40zBAu0ny1AWXT38LOVRaSJkjdAv9GiYLu9sx+7T7X18q38zPFyVPIIhrrTJsNNWkro/NTA7r4/BcdvoQ==", "dev": true, "dependencies": { "npmlog": "^6.0.2" @@ -2968,25 +2982,25 @@ } }, "node_modules/@lerna/version": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-5.5.1.tgz", - "integrity": "sha512-P2AWTBKRytnSOSS243u3/cz1ecOPG2LTMbiyVBcFnYSAgzHf8AcJYtyfu4aMFzpSD5JfVyYSMvraRiZqK4r7+Q==", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "5.5.1", - "@lerna/child-process": "5.5.1", - "@lerna/collect-updates": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/conventional-commits": "5.5.1", - "@lerna/github-client": "5.5.1", - "@lerna/gitlab-client": "5.5.1", - "@lerna/output": "5.5.1", - "@lerna/prerelease-id-from-version": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/temp-write": "5.5.1", - "@lerna/validation-error": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-5.5.4.tgz", + "integrity": "sha512-J39m2KfhkkDzfCUjnC2+UbBrWBRs1TkrvFlHFbb8wHUOY5bs+dj5RLyUchF/VJOYFSJXr8LLQFdMPeptF2wItg==", + "dev": true, + "dependencies": { + "@lerna/check-working-tree": "5.5.4", + "@lerna/child-process": "5.5.4", + "@lerna/collect-updates": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/conventional-commits": "5.5.4", + "@lerna/github-client": "5.5.4", + "@lerna/gitlab-client": "5.5.4", + "@lerna/output": "5.5.4", + "@lerna/prerelease-id-from-version": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/temp-write": "5.5.4", + "@lerna/validation-error": "5.5.4", "chalk": "^4.1.0", "dedent": "^0.7.0", "load-json-file": "^6.2.0", @@ -3005,9 +3019,9 @@ } }, "node_modules/@lerna/write-log-file": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-5.5.1.tgz", - "integrity": "sha512-gWdDQsG6bHsExa+/1+oHyPI/W+pW6IoKw8fKxs62YOZKei3jKxyQbgMZyMqOTSs76kIe2LiY5JsoBD7saN/ORg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-5.5.4.tgz", + "integrity": "sha512-PDdVuWHLkMw6ygP1hKTciphmYKRDTmNJASxVlxxOv9UkZe7QQvfke0i/OXNPRZHJK7eKCtv2Zu91amE8qCjVNw==", "dev": true, "dependencies": { "npmlog": "^6.0.2", @@ -3174,9 +3188,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { "hosted-git-info": "^5.0.0", @@ -3357,21 +3371,21 @@ } }, "node_modules/@nrwl/cli": { - "version": "14.7.5", - "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-14.7.5.tgz", - "integrity": "sha512-hkkavBDHPZKuxG9q8bcib9/TYnTn13t8CaePjx1JvYqWTYblWVLrzlPhJKFC44Dkch+rtvZ/USs5Fih76se25g==", + "version": "14.8.2", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-14.8.2.tgz", + "integrity": "sha512-I+oblryFkZJYk9TMsBWNdN0SV7OjsiD80gD1WjA1KXEQiFVfopYgwErBrxoenodncXrMFRCk/QR9U5F+23+Vow==", "dev": true, "dependencies": { - "nx": "14.7.5" + "nx": "14.8.2" } }, "node_modules/@nrwl/tao": { - "version": "14.7.5", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-14.7.5.tgz", - "integrity": "sha512-MzfJMqVbiMitYjWXaL5/7dDKw1hDG7acciGeu5SyUX8J2J0ymKzXhqjshPvn/Ga1E9QtnMckd6aKmLlvochVag==", + "version": "14.8.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-14.8.2.tgz", + "integrity": "sha512-a4+O307YZJf1H6CDQFGs4DoUvl7xUFSJo2rNHoR9jDlWU+Ug3n0iivX7Fih6Ui0gX4ocEpRwzNMmJhEmEq1BYw==", "dev": true, "dependencies": { - "nx": "14.7.5" + "nx": "14.8.2" }, "bin": { "tao": "index.js" @@ -3436,9 +3450,9 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.12.0.tgz", - "integrity": "sha512-1QYzZrwnn3rTQE7ZoSxXrO8lhu0aIbac1c+qIPOPEaVXBWSaUyLV1x9yt4uDQOwmu6u5ywVS8OJgs+ErDLf6vQ==", + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", + "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==", "dev": true }, "node_modules/@octokit/plugin-enterprise-rest": { @@ -3534,9 +3548,9 @@ } }, "node_modules/@octokit/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.0.tgz", - "integrity": "sha512-aHm+olfIZjQpzoODpl+RCZzchKOrdSLJs+yfI7pMMcmB19Li6vidgx0DwUDO/Ic4Q3fq/lOjJORVCcLZefcrJw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", + "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", "dev": true, "dependencies": { "@octokit/openapi-types": "^13.11.0" @@ -3665,18 +3679,6 @@ "@types/node": "*" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "node_modules/@types/config": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@types/config/-/config-3.3.0.tgz", @@ -3796,9 +3798,9 @@ "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==" }, "node_modules/@types/inquirer": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.3.tgz", - "integrity": "sha512-ZlBqD+8WIVNy3KIVkl+Qne6bGLW2erwN0GJXY9Ri/9EMbyupee3xw3H0Mmv5kJoLyNpfd/oHlwKxO0DUDH7yWA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-Pxxx3i3AyK7vKAj3LRM/vF7ETcHKiLJ/u5CnNgbz/eYj/vB3xGAYtRxI5IKtq0hpe5iFHD22BKV3n6WHUu0k4Q==", "dependencies": { "@types/through": "*" } @@ -3833,15 +3835,6 @@ "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/koa": { "version": "2.13.5", "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz", @@ -3899,9 +3892,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.185", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.185.tgz", - "integrity": "sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==" + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==" }, "node_modules/@types/mime": { "version": "3.0.1", @@ -3935,9 +3928,9 @@ } }, "node_modules/@types/node": { - "version": "18.7.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==" + "version": "18.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.1.tgz", + "integrity": "sha512-vuYaNuEIbOYLTLUAJh50ezEbvxrD43iby+lpUA2aa148Nh5kX/AVO/9m1Ahmbux2iU5uxJTNF9g2Y+31uml7RQ==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -3961,9 +3954,9 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", - "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==" }, "node_modules/@types/qs": { "version": "6.9.7", @@ -3975,15 +3968,6 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", @@ -4040,9 +4024,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz", - "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", "dependencies": { "@types/yargs-parser": "*" } @@ -4053,16 +4037,15 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", - "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", + "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/type-utils": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", @@ -4086,14 +4069,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", - "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", + "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "debug": "^4.3.4" }, "engines": { @@ -4113,13 +4096,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", + "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4130,13 +4113,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", + "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4157,9 +4140,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", + "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4170,13 +4153,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", + "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4197,15 +4180,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", + "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4221,12 +4204,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", + "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/types": "5.39.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4416,6 +4399,59 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.22", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.22.tgz", + "integrity": "sha512-GAWDjXduYBUVmOzlj3X0OwTQ1BV4ZeDdgw8yXST3K0lB95drWEGxa1at0v7BmHDyK2y1F1IJufc8N4yrcuXjWg==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -6549,66 +6585,30 @@ } }, "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.1.tgz", + "integrity": "sha512-3tLJyBjGuXw1s5gpKFSG3iS4kaKT4id04dZi98wzHQp/8cqZNweBnrF9J+rrlvrf4M53OdtDGNctNHFias8BEA==", "dev": true, "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.0", + "keyv": "^4.5.0", + "mimic-response": "^4.0.0", + "normalize-url": "^7.1.0", + "responselike": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.16" } }, "node_modules/call-bind": { @@ -6658,9 +6658,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001402", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001402.tgz", - "integrity": "sha512-Mx4MlhXO5NwuvXGgVb+hg65HZ+bhUYsz8QtDGDo2QmaJS2GBX47Xfi2koL86lc8K+l+htXeTEB/Aeqvezoo6Ew==", + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", "funding": [ { "type": "opencollective", @@ -6889,18 +6889,6 @@ "node": ">=0.10.0" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cmd-shim": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", @@ -6996,9 +6984,9 @@ } }, "node_modules/commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", "engines": { "node": "^12.20.0 || >=14" } @@ -7365,11 +7353,11 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", - "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.5.tgz", + "integrity": "sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==", "dependencies": { - "browserslist": "^4.21.3" + "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", @@ -7873,9 +7861,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.254", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", - "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==" + "version": "1.4.271", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.271.tgz", + "integrity": "sha512-BCPBtK07xR1/uY2HFDtl3wK2De66AW4MSiPlLrnPNxKC/Qhccxd59W73654S3y6Rb/k3hmuGJOBnhjfoutetXA==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -8219,13 +8207,13 @@ } }, "node_modules/eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/config-array": "^0.10.5", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", @@ -9098,9 +9086,9 @@ } }, "node_modules/form-data-encoder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.2.tgz", - "integrity": "sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", + "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==", "dev": true, "engines": { "node": ">= 14.17" @@ -9227,12 +9215,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -9454,22 +9436,22 @@ } }, "node_modules/git-up": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-6.0.0.tgz", - "integrity": "sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "dependencies": { "is-ssh": "^1.4.0", - "parse-url": "^7.0.2" + "parse-url": "^8.1.0" } }, "node_modules/git-url-parse": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-12.0.0.tgz", - "integrity": "sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, "dependencies": { - "git-up": "^6.0.0" + "git-up": "^7.0.0" } }, "node_modules/gitconfiglocal": { @@ -9649,18 +9631,17 @@ } }, "node_modules/got": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.4.1.tgz", - "integrity": "sha512-Sz1ojLt4zGNkcftIyJKnulZT/yEDvifhUjccHA8QzOuTgPs/+njXYNMFE3jR4/2OODQSSbH8SdnoLCkbh41ieA==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.1.tgz", + "integrity": "sha512-sD16AK8cCyUoPtKr/NMvLTFFa+T3i3S+zoiuvhq0HP2YiqBZA9AtlBjAdsQBsLBK7slPuvmfE0OxhGi7N5dD4w==", "dev": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.0", + "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", @@ -10282,9 +10263,9 @@ } }, "node_modules/init-package-json/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { "hosted-git-info": "^5.0.0", @@ -10843,9 +10824,9 @@ "dev": true }, "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, "node_modules/js-tokens": { @@ -10960,9 +10941,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "node_modules/jsonfile": { @@ -11799,27 +11780,27 @@ } }, "node_modules/lerna": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-5.5.1.tgz", - "integrity": "sha512-Ofvlm5FRRxF8IQXnx47YbIXmRDHnDaegDwJ4Kq+cVnafbB0VZvRVy/S4ppmnftnqvd4MBXU022lhW9uGN66iZw==", - "dev": true, - "dependencies": { - "@lerna/add": "5.5.1", - "@lerna/bootstrap": "5.5.1", - "@lerna/changed": "5.5.1", - "@lerna/clean": "5.5.1", - "@lerna/cli": "5.5.1", - "@lerna/create": "5.5.1", - "@lerna/diff": "5.5.1", - "@lerna/exec": "5.5.1", - "@lerna/import": "5.5.1", - "@lerna/info": "5.5.1", - "@lerna/init": "5.5.1", - "@lerna/link": "5.5.1", - "@lerna/list": "5.5.1", - "@lerna/publish": "5.5.1", - "@lerna/run": "5.5.1", - "@lerna/version": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-5.5.4.tgz", + "integrity": "sha512-LAFQ/U6SL7/EM0sedtFaFS4b0RbTqsYYOJ6LV9Y7l/zWFlqLcg41vLblkNRuxsNB5FZBNpfiWvXmd1KiWkQ/yQ==", + "dev": true, + "dependencies": { + "@lerna/add": "5.5.4", + "@lerna/bootstrap": "5.5.4", + "@lerna/changed": "5.5.4", + "@lerna/clean": "5.5.4", + "@lerna/cli": "5.5.4", + "@lerna/create": "5.5.4", + "@lerna/diff": "5.5.4", + "@lerna/exec": "5.5.4", + "@lerna/import": "5.5.4", + "@lerna/info": "5.5.4", + "@lerna/init": "5.5.4", + "@lerna/link": "5.5.4", + "@lerna/list": "5.5.4", + "@lerna/publish": "5.5.4", + "@lerna/run": "5.5.4", + "@lerna/version": "5.5.4", "import-local": "^3.0.2", "npmlog": "^6.0.2", "nx": ">=14.6.1 < 16", @@ -11873,9 +11854,9 @@ } }, "node_modules/libnpmaccess/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { "hosted-git-info": "^5.0.0", @@ -11931,9 +11912,9 @@ } }, "node_modules/libnpmpublish/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { "hosted-git-info": "^5.0.0", @@ -12621,12 +12602,15 @@ } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/min-indent": { @@ -13216,9 +13200,9 @@ } }, "node_modules/mongodb": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", - "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.10.0.tgz", + "integrity": "sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==", "dependencies": { "bson": "^4.7.0", "denque": "^2.1.0", @@ -13233,9 +13217,9 @@ } }, "node_modules/mongodb-connection-string-url": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", - "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", + "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", "dependencies": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -13273,12 +13257,12 @@ } }, "node_modules/mongodb-memory-server": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.9.2.tgz", - "integrity": "sha512-h+u+60C/yYZStKqL13O8EerRyt2gdFg9PLyRSBJr5eJfCr+tVMoMrdCw6Dd6PKlCp5hwq27VpjvtSWAT44bHiA==", + "version": "8.9.3", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.9.3.tgz", + "integrity": "sha512-k/1tbGmN6Xegj/XoSA4F/PpKpdRHyT/3HMldhGyiOXx8RNAkJdc/Q9N4+1pCK+HKHMk7BInbo42Bn4OUeAT+hw==", "hasInstallScript": true, "dependencies": { - "mongodb-memory-server-core": "8.9.2", + "mongodb-memory-server-core": "8.9.3", "tslib": "^2.4.0" }, "engines": { @@ -13286,9 +13270,9 @@ } }, "node_modules/mongodb-memory-server-core": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.9.2.tgz", - "integrity": "sha512-LG8u8QxPGrozy5UBg9YCh8jvvs5Di93zXrusgwgpj+vKxn+Efa6l1pFnCHNy6SYFydFCpMezilsDIXF0tzbJ6A==", + "version": "8.9.3", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.9.3.tgz", + "integrity": "sha512-z/UW/fHTDRA+qvcqBxibTonnwuxRPWsphO9BUGKvFweRxT9uj09/hCK96kjBdF9wQj6k7bj/Tqo9gkGG0XbDng==", "dependencies": { "@types/tmp": "^0.2.3", "async-mutex": "^0.3.2", @@ -13322,6 +13306,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mongodb-memory-server-core/node_modules/mongodb": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", + "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", + "dependencies": { + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.3", + "socks": "^2.7.0" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + } + }, "node_modules/mongodb-memory-server-core/node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -13543,12 +13544,12 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", + "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13564,14 +13565,14 @@ } }, "node_modules/npm-check-updates": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.1.3.tgz", - "integrity": "sha512-cjFV+Mb5I5rZWVElJugp1cArdzlHQy6Tzi+1i6T72nzLNFN10x7OjA7iQXgFpqeN+U5Zwv8u0/XVCEWM9KxqhQ==", + "version": "16.3.8", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.3.8.tgz", + "integrity": "sha512-2CUeCWEs+arWQUJH2IEkiZU/Ak2fLBqGkMyM5JDkfnGhz1VHNe3yyGiXD+0JeVmjbXTEpgZ0t6C9VK52atGuAw==", "dev": true, "dependencies": { "chalk": "^5.0.1", "cli-table": "^0.3.11", - "commander": "^9.4.0", + "commander": "^9.4.1", "fast-memoize": "^2.5.2", "find-up": "5.0.0", "fp-and-or": "^0.1.3", @@ -13652,9 +13653,9 @@ } }, "node_modules/npm-check-updates/node_modules/yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.2.tgz", + "integrity": "sha512-VSdf2/K3FqAetooKQv45Hcu6sA00aDgWZeGcG6V9IYJnVLTnb6988Tie79K5nx2vK7cEpf+yW8Oy+7iPAbdiHA==", "dev": true, "engines": { "node": ">= 14" @@ -13807,9 +13808,9 @@ } }, "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { "hosted-git-info": "^5.0.0", @@ -13852,9 +13853,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { "hosted-git-info": "^5.0.0", @@ -13894,15 +13895,18 @@ } }, "node_modules/nx": { - "version": "14.7.5", - "resolved": "https://registry.npmjs.org/nx/-/nx-14.7.5.tgz", - "integrity": "sha512-hp8TYk/t15MJVXQCafSduriZqoxR2zvw5mDHqg32Mjt2jFEFKaPWtaO5l/qKj+rlLE8cPYTeGL5qAS9WZkAWtg==", + "version": "14.8.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-14.8.2.tgz", + "integrity": "sha512-pPijBoeybsIlCD8FMH8WTns+pcIL+0ZOh/+otUX2LfVsi+ppH33GUxO9QVLPrLcyGaoHhwil4hYBxPIQ7Z1r2g==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nrwl/cli": "14.7.5", - "@nrwl/tao": "14.7.5", + "@nrwl/cli": "14.8.2", + "@nrwl/tao": "14.8.2", "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", "chalk": "4.1.0", "chokidar": "^3.5.1", "cli-cursor": "3.1.0", @@ -13917,12 +13921,13 @@ "glob": "7.1.4", "ignore": "^5.0.4", "js-yaml": "4.1.0", - "jsonc-parser": "3.0.0", + "jsonc-parser": "3.2.0", "minimatch": "3.0.5", "npm-run-path": "^4.0.1", "open": "^8.4.0", "semver": "7.3.4", "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^3.9.0", @@ -14074,12 +14079,12 @@ } }, "node_modules/nx/node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", @@ -14100,6 +14105,20 @@ "node": ">=12" } }, + "node_modules/nx/node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -14492,9 +14511,9 @@ } }, "node_modules/pacote/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { "hosted-git-info": "^5.0.0", @@ -14596,24 +14615,21 @@ } }, "node_modules/parse-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-5.0.0.tgz", - "integrity": "sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "dependencies": { "protocols": "^2.0.0" } }, "node_modules/parse-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-7.0.2.tgz", - "integrity": "sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "dependencies": { - "is-ssh": "^1.4.0", - "normalize-url": "^6.1.0", - "parse-path": "^5.0.0", - "protocols": "^2.0.1" + "parse-path": "^7.0.0" } }, "node_modules/parseurl": { @@ -15080,16 +15096,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -16203,9 +16209,9 @@ "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" }, "node_modules/rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "dependencies": { "tslib": "^2.1.0" } @@ -16628,9 +16634,9 @@ } }, "node_modules/socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -16762,10 +16768,16 @@ "readable-stream": "^3.0.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/sqlite3": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.1.tgz", - "integrity": "sha512-mMinkrQr/LKJqFiFF+AF7imPSzRCCpTCreusZO3D/ssJHVjZOrbu2Caz+zPH5KTmGGXBxXMGSRDssL+44CLxvg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.2.tgz", + "integrity": "sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", @@ -17171,9 +17183,9 @@ } }, "node_modules/superagent": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.0.tgz", - "integrity": "sha512-iudipXEel+SzlP9y29UBWGDjB+Zzag+eeA1iLosaR2YHBRr1Q1kC29iBrF2zIVD9fqVbpZnXkN/VJmwFMVyNWg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.2.tgz", + "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.3", @@ -17183,8 +17195,7 @@ "formidable": "^2.0.1", "methods": "^1.1.2", "mime": "2.6.0", - "qs": "^6.10.3", - "readable-stream": "^3.6.0", + "qs": "^6.11.0", "semver": "^7.3.7" }, "engines": { @@ -17564,9 +17575,9 @@ } }, "node_modules/ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -17761,9 +17772,9 @@ } }, "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17773,9 +17784,9 @@ } }, "node_modules/uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.2.tgz", + "integrity": "sha512-bbxglRjsGQMchfvXZNusUcYgiB9Hx2K4AHYXQy2DITZ9Rd+JzhX7+hoocE5Winr7z2oHvPsekkBwXtigvxevXg==", "dev": true, "optional": true, "bin": { @@ -18831,25 +18842,25 @@ } }, "@babel/compat-data": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", - "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==" + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", + "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==" }, "@babel/core": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", - "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.1", + "@babel/parser": "^7.19.3", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -18865,11 +18876,11 @@ } }, "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", + "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", "requires": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -18904,11 +18915,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", - "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "requires": { - "@babel/compat-data": "^7.19.1", + "@babel/compat-data": "^7.19.3", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -19091,9 +19102,9 @@ "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { "version": "7.18.6", @@ -19183,9 +19194,9 @@ } }, "@babel/parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==" + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -19762,12 +19773,12 @@ } }, "@babel/preset-env": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", - "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", + "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", "requires": { - "@babel/compat-data": "^7.19.1", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/compat-data": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", @@ -19835,7 +19846,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -19888,18 +19899,18 @@ } }, "@babel/traverse": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", + "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.19.3", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/types": "^7.19.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -19912,12 +19923,12 @@ } }, "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", + "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", "requires": { "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -20001,12 +20012,22 @@ "yargs": "^17.5.1" }, "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", @@ -20034,9 +20055,9 @@ "devOptional": true }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -20143,16 +20164,16 @@ } }, "@lerna/add": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-5.5.1.tgz", - "integrity": "sha512-Vi6Zm8bt1QAoDYl7YERTOgjEn2bwbZNBqYxNz0DlsxcqKHW2GkefEemZLXxmd9G8YgbsbC71W4sz/yFlkSSsxQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-5.5.4.tgz", + "integrity": "sha512-eMEWdyH2ijjDuOCZ5qI7nZlWtVmOx/aABGyNmNEG1ChNDQSmxgEmmqxagQCtW7+T63e9AaHsjrxYahBWYBnuhw==", "dev": true, "requires": { - "@lerna/bootstrap": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/npm-conf": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/bootstrap": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/npm-conf": "5.5.4", + "@lerna/validation-error": "5.5.4", "dedent": "^0.7.0", "npm-package-arg": "8.1.1", "p-map": "^4.0.0", @@ -20161,23 +20182,23 @@ } }, "@lerna/bootstrap": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-5.5.1.tgz", - "integrity": "sha512-BNfrwZD3peUiJll5ZBVgLRyURWSY9px6hJna1i7zTT1DNged/ehqd2hfMqWV+7iX6mO+CvcfH/v3zJaUwU1aOw==", - "dev": true, - "requires": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/has-npm-version": "5.5.1", - "@lerna/npm-install": "5.5.1", - "@lerna/package-graph": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/rimraf-dir": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/symlink-binary": "5.5.1", - "@lerna/symlink-dependencies": "5.5.1", - "@lerna/validation-error": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-5.5.4.tgz", + "integrity": "sha512-MGC6naM0DrFNYTZPEW477uqWCqXmI4MRBKjtGNMiJhczYcFdD6x30u688zoAuO5HUoyqL6Uw7Ea28GVEyDm93Q==", + "dev": true, + "requires": { + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/has-npm-version": "5.5.4", + "@lerna/npm-install": "5.5.4", + "@lerna/package-graph": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/rimraf-dir": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/symlink-binary": "5.5.4", + "@lerna/symlink-dependencies": "5.5.4", + "@lerna/validation-error": "5.5.4", "@npmcli/arborist": "5.3.0", "dedent": "^0.7.0", "get-port": "^5.1.1", @@ -20191,32 +20212,32 @@ } }, "@lerna/changed": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-5.5.1.tgz", - "integrity": "sha512-aDm+KQZhOdivNSs74lqC71BO7lVtKHu9oyisqhqCb5MdZn7yjO3Ef2Y0CYN4+dt355zW+xI87NzwSWYGQEd/5Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-5.5.4.tgz", + "integrity": "sha512-/tns9PA5m9XCKJk13RRJotCOFR/bZ+7zfxz20zpIELT9GehZLTaEPsItxVnlqQ4dMHMe0fl6XG6dFqeBqLOW4g==", "dev": true, "requires": { - "@lerna/collect-updates": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/listable": "5.5.1", - "@lerna/output": "5.5.1" + "@lerna/collect-updates": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/listable": "5.5.4", + "@lerna/output": "5.5.4" } }, "@lerna/check-working-tree": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-5.5.1.tgz", - "integrity": "sha512-scfv1KDYQVy1US6SA8C4uj56HN021E2GXCL0bXzc6VKFewdZ9LreJTo0zSN6JwRitxc0c45lTAfTqDueVWANNQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-5.5.4.tgz", + "integrity": "sha512-uIHlEb/JSX9P230UNH69W21fWM4oKu8ulRdXuYCBckpbJkDz9nT1yS2y4wUHx+3GfXWqGKygTh8Z06vSdYg+2A==", "dev": true, "requires": { - "@lerna/collect-uncommitted": "5.5.1", - "@lerna/describe-ref": "5.5.1", - "@lerna/validation-error": "5.5.1" + "@lerna/collect-uncommitted": "5.5.4", + "@lerna/describe-ref": "5.5.4", + "@lerna/validation-error": "5.5.4" } }, "@lerna/child-process": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-5.5.1.tgz", - "integrity": "sha512-rGVK5DIJa2EljPb3RW4ZAvwgiyX6xL3hZzRGRkSQWV7866W/Xy0aCgWhfSmUvxB7iiH1NBw5ANlCuBLk31T0QQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-5.5.4.tgz", + "integrity": "sha512-1QlxFASrKlV3cG7XPFolOdrS4W784zv4DgipmTxaP++VlVAwbrHhqUdIEytDV6d0rlRksf6LPYzJhXdwlBkCEQ==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -20225,68 +20246,68 @@ } }, "@lerna/clean": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-5.5.1.tgz", - "integrity": "sha512-Be0nQpoppH43oRhNoevNms6unRvZFwFnuz3sGABii+hyFYqLIpZiAz98ur0LtV8OVq1bUYLXp8bHf+XylgvXQg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-5.5.4.tgz", + "integrity": "sha512-q1fXRm6ZXo3HrFfsgyY9C83haotPT/Xa5K8fQX6GADuNLk0Xo3+ycouHeidblRLmQtCa3WNPEmCthTuaWrSUoQ==", "dev": true, "requires": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/rimraf-dir": "5.5.1", + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/rimraf-dir": "5.5.4", "p-map": "^4.0.0", "p-map-series": "^2.1.0", "p-waterfall": "^2.1.1" } }, "@lerna/cli": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-5.5.1.tgz", - "integrity": "sha512-57dEQoiJnMhLIgS5zAEhPmL70LLrZHUqfxoXYBCg+yqlmsGqZ7t0Re5XtBUbFk6hsUm81sblf9A4YI2fssGVrA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-5.5.4.tgz", + "integrity": "sha512-4uJEFEN0QNnQgghbpdY5wLmBPOeUeBeCKGh9s2pc1fkn0I1wKDhG0QByOfcf+jGuid2bA7DXzvJRXRgq0fWw0A==", "dev": true, "requires": { - "@lerna/global-options": "5.5.1", + "@lerna/global-options": "5.5.4", "dedent": "^0.7.0", "npmlog": "^6.0.2", "yargs": "^16.2.0" } }, "@lerna/collect-uncommitted": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-5.5.1.tgz", - "integrity": "sha512-BPGpov4aYRugkY5aieolHEqJRV/6IQ9y6Xy+Fv/892jNhe2dFwi6+u2JbdmO+9JOkz/ZeDDZ85qEbnaiuVQDWg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-5.5.4.tgz", + "integrity": "sha512-xLCsp8Qx5z/BWCxqUt8W8Se2XJcCQE6YUAti9TSWD5Ar+M5Etkgz2YJiUjZfZrsWZPBCqNfGfxx9Sjs7a/r+8A==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "chalk": "^4.1.0", "npmlog": "^6.0.2" } }, "@lerna/collect-updates": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-5.5.1.tgz", - "integrity": "sha512-Dco+0KwmbnKv1Uv/4jWmFObZKEVTcY7YpN863LsXjieOyD5hz1B5z/2fVk8g6QP5lUsVBG0WUnSKtdapUO5yBw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-5.5.4.tgz", + "integrity": "sha512-m34bVoMO5QOd5K5uyAtQtkTiXBIEJHydXMwNXs+YTIAgy82JXNHfZE9vV63Fd5ZWOGY6ORthuXuC2Jn0Vx9tQA==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/describe-ref": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/describe-ref": "5.5.4", "minimatch": "^3.0.4", "npmlog": "^6.0.2", "slash": "^3.0.0" } }, "@lerna/command": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-5.5.1.tgz", - "integrity": "sha512-HHnGQpUh7kiHja/mB5rlnHnL3B3B12y4RBpJTxX22IkdcwsiO8g/n2FWh9MPQvuVcR2FRh4PWXhmfVnboZCAaw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-5.5.4.tgz", + "integrity": "sha512-/7drNy2DjVjDjm2knsDfEQIFEdRgPE2/lQ3yfEjVbXqs319o6KWbQVeoNy5GjGnLvc3v3eObA0cSJXHzEV11Bg==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/package-graph": "5.5.1", - "@lerna/project": "5.5.1", - "@lerna/validation-error": "5.5.1", - "@lerna/write-log-file": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/package-graph": "5.5.4", + "@lerna/project": "5.5.4", + "@lerna/validation-error": "5.5.4", + "@lerna/write-log-file": "5.5.4", "clone-deep": "^4.0.1", "dedent": "^0.7.0", "execa": "^5.0.0", @@ -20295,12 +20316,12 @@ } }, "@lerna/conventional-commits": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-5.5.1.tgz", - "integrity": "sha512-oYTt1SbCNc/5N98ESFFDjWImU61qcYmQZBVxdzBDeZku/VRlaXw7Km5lSnVy7GrGkIPRxayunL4r1k32w5SZpA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-5.5.4.tgz", + "integrity": "sha512-zLcaveLXnIDYo3e9ChKsHSxiG7vOJeKdcoC5Fj8WH4DjAq/aqy15TE5SJr6aO8hOU/ph0EonPwyQBf4X2Lg5fg==", "dev": true, "requires": { - "@lerna/validation-error": "5.5.1", + "@lerna/validation-error": "5.5.4", "conventional-changelog-angular": "^5.0.12", "conventional-changelog-core": "^4.2.4", "conventional-recommended-bump": "^6.1.0", @@ -20313,15 +20334,15 @@ } }, "@lerna/create": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-5.5.1.tgz", - "integrity": "sha512-ZkN0rTTrIRIk9B+FzMXsjL8tK8wy4Orw7U3lVu8xe7LkxmK+lYxSOqcgfwWJjmA1yyoiNK+Xn++RlqXF7LW++Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-5.5.4.tgz", + "integrity": "sha512-mmZKy5U4OKBr/r8Tm6C8gubYHubQaHdPJ+aYuA/l4uCfK0p/Jly84Fy7M3kclcqm8FKDPKDhlp0Y2jnc32jBbA==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/npm-conf": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/npm-conf": "5.5.4", + "@lerna/validation-error": "5.5.4", "dedent": "^0.7.0", "fs-extra": "^9.1.0", "globby": "^11.0.2", @@ -20346,9 +20367,9 @@ } }, "@lerna/create-symlink": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-5.5.1.tgz", - "integrity": "sha512-yOo1dXzoyeqhX4QCeswS0FjMSFyfNmHxtwE73+1k4uIYPWHWPHA/PW3y3hkOqh6QbBBg+y6+KCRiCOPaftZb6g==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-5.5.4.tgz", + "integrity": "sha512-TOfkeEQGhE90mvtky0Vpfl+6hwBz0tSXV0+gjRBmla/sYU/9+QoSH36TauHrmu/O3C8/CWtoGruxiWq8jP6Gyw==", "dev": true, "requires": { "cmd-shim": "^5.0.0", @@ -20357,78 +20378,78 @@ } }, "@lerna/describe-ref": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-5.5.1.tgz", - "integrity": "sha512-pioaEFDKUcYsdgqz/wnjJ5pZyfrh7etJMYdxDDxijysn/96R28zTQMBrgGgjrBmkFyV9zmaxNaQXz1gx+IMohA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-5.5.4.tgz", + "integrity": "sha512-2LDEsuSbZTta7SuwKVo9ofeKvxqy4YFNOjEt7+JceZIfh4si3MjIPBX7l8AsCaUmwJnpOEYba0aau72AUAOtoA==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "npmlog": "^6.0.2" } }, "@lerna/diff": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-5.5.1.tgz", - "integrity": "sha512-mqKSafF5hGteVbRUPI41b8OZutolr6vqg2ObkKXFXpT6RvAX2NPpppHf0c0XORLWjc47p14Iv8xsQMCNwJ0tzQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-5.5.4.tgz", + "integrity": "sha512-OTieqJA4zKAV0KeG0nXwPnCkwg3LH+ucXlelnj1w+gaP2ndHbJVwgUWXGpqCHk8tn935KKOULhP7BGmAwvTYlQ==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/validation-error": "5.5.4", "npmlog": "^6.0.2" } }, "@lerna/exec": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-5.5.1.tgz", - "integrity": "sha512-eip4MlIYkbxibIoV0ANjKdf9CSAER87C2zGY+GwHZKUSOD0I3xfhbPTkJozHBE3aqez6dR0pebi6cpNWvzEdIg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-5.5.4.tgz", + "integrity": "sha512-o1SQ+6/U6L8hih6+wAgjyOhqo2CKzMcW6YWLs5erRY9E6VCEc2kX7SW3223ehsAhUIPfG7n+KYPmuZbWvTpbGQ==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/profiler": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/profiler": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/validation-error": "5.5.4", "p-map": "^4.0.0" } }, "@lerna/filter-options": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-5.5.1.tgz", - "integrity": "sha512-U4erQgGBawazN0eDLQzWf5xu1mTaucVguzUblBSOfQm+fUBsYG5WYJtn9AvVLrUCQMwAV3L2+/NWb1FOkqArMw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-5.5.4.tgz", + "integrity": "sha512-t1amUypgloaKN8d3VN7GiJQd4ommDplxSisAMS8hztb6ail3EbxasRQ03GXz4+6yQ98sam+D03soqSWAJcinrw==", "dev": true, "requires": { - "@lerna/collect-updates": "5.5.1", - "@lerna/filter-packages": "5.5.1", + "@lerna/collect-updates": "5.5.4", + "@lerna/filter-packages": "5.5.4", "dedent": "^0.7.0", "npmlog": "^6.0.2" } }, "@lerna/filter-packages": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-5.5.1.tgz", - "integrity": "sha512-970kc2w6Bzr9FAL8DFisOonDocj7VDFdNnVVJpaTbNnbuMLnCT4vPXHKHQku2XEgxfr1lgyFA+srzxiiLQGWaQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-5.5.4.tgz", + "integrity": "sha512-mwpiF+L0np003AUp3ntKEFkNOXWBONwm9q8rW9TOR8OeqMXbxYWGLg2IR+Wc8EClmen79tahn076nUD85OLqew==", "dev": true, "requires": { - "@lerna/validation-error": "5.5.1", + "@lerna/validation-error": "5.5.4", "multimatch": "^5.0.0", "npmlog": "^6.0.2" } }, "@lerna/get-npm-exec-opts": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.5.1.tgz", - "integrity": "sha512-z8HoeCHbKVoHRjsyEwEhFF37vubX52CQOI+7TcEhjMYDXRrfKYfGcLXFh++DGihRQ7qk7ir27VrJgweeu/rcNw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.5.4.tgz", + "integrity": "sha512-PLvSdt0woeOz3TZDHRshYVR9TSOUNunxZ4mE8f0tg9FPQ5R1uuwd2BF4HmEL7AlWFtFS+sOwuL9bI1btV1ELew==", "dev": true, "requires": { "npmlog": "^6.0.2" } }, "@lerna/get-packed": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-5.5.1.tgz", - "integrity": "sha512-8zlT1Yzl1f8XfmNzu+zqJFKIqX28icbfVJp/hrbz7CEyn8JtTy9oNFokt3wbolmQ53LZ69B1gECZ1vlKOtoCSQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-5.5.4.tgz", + "integrity": "sha512-BXQcQ5rfdIa8hkDd4UdETWs9mDiFvmBRpSNxpgaRiuL1w7AXEaMREQgKOFiv8fv/e+z/F0SXD048Fptj8d5pjA==", "dev": true, "requires": { "fs-extra": "^9.1.0", @@ -20437,22 +20458,22 @@ } }, "@lerna/github-client": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-5.5.1.tgz", - "integrity": "sha512-921aWALGJT3L7iF3pYkj9tzXS1D/nZw32qWNoGQweTyAs7ycqm037WhdJPS67k+bqZL8flC80CbGEOuEMQq8Xw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-5.5.4.tgz", + "integrity": "sha512-m5vTRsHyfzh16T3fX3ipdjZyQwl4Gnwav4RmEaVUFp2uMqsr0TrML7LJ/eqOqjGvj/+JWa52rIQsUCQe9BJYag==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "@octokit/plugin-enterprise-rest": "^6.0.1", "@octokit/rest": "^19.0.3", - "git-url-parse": "^12.0.0", + "git-url-parse": "^13.1.0", "npmlog": "^6.0.2" } }, "@lerna/gitlab-client": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-5.5.1.tgz", - "integrity": "sha512-hp0/p6cITz6pdZ1ToYNHcLHh8iusdXzYNwoLZABSuMAqvvPBuJt2aOxhU7DXBYCB+sQUj8K8qcVP9qpvBs98Wg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-5.5.4.tgz", + "integrity": "sha512-vPSr6xFxtOigFY/fE8oYF+360WsV+g2ZkoJB34FA6UucjWBBPu2W13ydUYfqvJYODJYFzhTjB9b8zf0MJ0KMrQ==", "dev": true, "requires": { "node-fetch": "^2.6.1", @@ -20460,103 +20481,103 @@ } }, "@lerna/global-options": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-5.5.1.tgz", - "integrity": "sha512-Hy/Yrskk5wuigpG+4GN8cAfBk9tGY/NlJlONmjqcZr5mKc3DkJ2It03jeGtUK/j7hP3GNZo2nx2VGnJf40RGuA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-5.5.4.tgz", + "integrity": "sha512-J2K4CsnYuKrW7bDR2gRABUFFrLaJ5z4GaaDpaKtQi6sHFKcVBfYz0B51Fe3NGFOvrct4YS9N7SgKDxPd5Nznig==", "dev": true }, "@lerna/has-npm-version": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-5.5.1.tgz", - "integrity": "sha512-t/eff0L3pX31L97mt26LENvIkt+e9fye8hSHUiLoFmUqjmy2yA1qQz2g+oQpGbRXpy+oz9rCCpBx+G4i13aN9A==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-5.5.4.tgz", + "integrity": "sha512-l+nDc/QYvfA5f0tFxzd9mZ/SP0nfxbqpZ9csGyqU8NV/40fHRRouO+fcLtxjcG/mruMjiAB/P216BBbRmGb2VA==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "semver": "^7.3.4" } }, "@lerna/import": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-5.5.1.tgz", - "integrity": "sha512-9eeagJrw8EBXuONOIagm45zhdHlHrDN9iT5c9OWHV8yh1MBevd7ERbDc8UluHHg5/dP6aqFJxtv54cDdb/3aJg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-5.5.4.tgz", + "integrity": "sha512-1edy4e+0w4/awahc3uPvRQngIHbri5BGZZbjvsX8aKlPUd9pFg5U9/5w3lVE5jnZFRnqwhpJyyvJjL2M5F6IgQ==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/validation-error": "5.5.4", "dedent": "^0.7.0", "fs-extra": "^9.1.0", "p-map-series": "^2.1.0" } }, "@lerna/info": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-5.5.1.tgz", - "integrity": "sha512-gRrC2yy0qm9scb0B2xSGlPWBGnFMurie5SbGTz4hPesOdZEoiplMaL+e5y5cr67KDEhYPwIkL1sUXHLkTYZekA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-5.5.4.tgz", + "integrity": "sha512-JgYRP2WZUCuiYyf3CQjqEMGoqWpM7t/bammKW/sC3P0/xGSykh45vdRwVojcu4fGRZ/YS7sfFt28Dbw4QFp0iQ==", "dev": true, "requires": { - "@lerna/command": "5.5.1", - "@lerna/output": "5.5.1", + "@lerna/command": "5.5.4", + "@lerna/output": "5.5.4", "envinfo": "^7.7.4" } }, "@lerna/init": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-5.5.1.tgz", - "integrity": "sha512-jyi8DZK2hylI8wjX5NgI/CBZEx2UJmmt12PiQuIvnfEvyTbd90MK0zj4AtyVMKpEal5oZCyprGFBb8MY8lS5Dg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-5.5.4.tgz", + "integrity": "sha512-BteH3O8ywUN8eBhwzOey3gTXxxKRxGz1JJ6tP1mA0KZoJgiBsSFoZbx7SJeGrR8gY7kmEyvXTY1geaxmb7V+vQ==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/project": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/project": "5.5.4", "fs-extra": "^9.1.0", "p-map": "^4.0.0", "write-json-file": "^4.3.0" } }, "@lerna/link": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-5.5.1.tgz", - "integrity": "sha512-U/voZ0f/3CHiui3cf9r2ad+jESQZnUAMf6n5oIysBFrT5YtAHHN4FYXtzjXJQ4TLFNke2YnLaw67mLaHeQDW+w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-5.5.4.tgz", + "integrity": "sha512-/kFST918MLhvWbs3szbUw3/6pPa0/vS77WnHk8n3S3v/PuzUEjm9CncYrZ0xB1ZiGk6oa4YTPWMlqyYMY1k0hQ==", "dev": true, "requires": { - "@lerna/command": "5.5.1", - "@lerna/package-graph": "5.5.1", - "@lerna/symlink-dependencies": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/command": "5.5.4", + "@lerna/package-graph": "5.5.4", + "@lerna/symlink-dependencies": "5.5.4", + "@lerna/validation-error": "5.5.4", "p-map": "^4.0.0", "slash": "^3.0.0" } }, "@lerna/list": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-5.5.1.tgz", - "integrity": "sha512-tRDUpV06ZpV6g2MvqRf35ozsRjKweCTCvS8z1o1/4laZen6aPK+Y9TIihvd36biDzCdNYz3IOLzvz8nO8WIJiA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-5.5.4.tgz", + "integrity": "sha512-ppLy99mQYoDkO+SxqnknPYqOnO+iJskb0G2h2fLF4ZK98oy2duJWkkehagwCVtmPax/DqWDDc/IAj+KWpcC0bQ==", "dev": true, "requires": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/listable": "5.5.1", - "@lerna/output": "5.5.1" + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/listable": "5.5.4", + "@lerna/output": "5.5.4" } }, "@lerna/listable": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-5.5.1.tgz", - "integrity": "sha512-EU+OUBV0vrySrDhlMHvfdA0NgwRtaTx5nc4XUtNrTN4Zqjav9iElrf6Xx9k0fUq27smiQ1tyutQEwGaNab0VTQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-5.5.4.tgz", + "integrity": "sha512-c6acWwSDQE5zeBcnH3m+mwfDr3zr515LsC30tXRenkqp4lbXeyrUPw0Mckw1ksw2nyb5LZl8gQnrFbAKC8gBSA==", "dev": true, "requires": { - "@lerna/query-graph": "5.5.1", + "@lerna/query-graph": "5.5.4", "chalk": "^4.1.0", "columnify": "^1.6.0" } }, "@lerna/log-packed": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-5.5.1.tgz", - "integrity": "sha512-i6SomT53TquZwrl8Ib+bleU0xYo8z36jIWGqfb0OlbNZswEbHQ5nvVO73Kjjc14g+eM0JGHwGi79LHFictcjVw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-5.5.4.tgz", + "integrity": "sha512-g3lW5yIIe66aVTOYn78+h21GR9gr/WdU3/z8jm0VzGC+VR7KqCKU+49JOCOh7LlNf7sY4ZE6ZbaZptp5wUjrgQ==", "dev": true, "requires": { "byte-size": "^7.0.0", @@ -20566,9 +20587,9 @@ } }, "@lerna/npm-conf": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-5.5.1.tgz", - "integrity": "sha512-ARqXAUlkEfFL00fgZa84aFzvp9GSPxAm4Fy1wzGz9ltXTwg/1yyGu6AucSKO1qa/JvcF2giWuXuvkJ3jsY4Log==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-5.5.4.tgz", + "integrity": "sha512-BwnP0ezR84nQ5Sh0CdH77Q8evDcqP9bFUdjX6eZT4Rxl0432ocB1YpweNnUDQO4Boxj/FiOu/OaE0Kej+I+5ew==", "dev": true, "requires": { "config-chain": "^1.1.12", @@ -20576,25 +20597,25 @@ } }, "@lerna/npm-dist-tag": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-5.5.1.tgz", - "integrity": "sha512-DN3l01gpgV3M2MYo7zhZOgZrl21ltr+PoxK2LBVv5Snbhc88WqKm6slCrF5LXnfM6FraZ2UQTjBYXx8fQnpIDw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-5.5.4.tgz", + "integrity": "sha512-aAisCh5b2+6cjLxZh03/MGGcBjL7KNBWi5qW6OCdQQpcxH5r0aUJ5F1rmXJE0qxgsLWaGRLzngWk+v6VJHqYJQ==", "dev": true, "requires": { - "@lerna/otplease": "5.5.1", + "@lerna/otplease": "5.5.4", "npm-package-arg": "8.1.1", "npm-registry-fetch": "^13.3.0", "npmlog": "^6.0.2" } }, "@lerna/npm-install": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-5.5.1.tgz", - "integrity": "sha512-O99aYWrWAz+EuHrsED2Wv0X6Ge1O9CrAfcIu6dMf8r5Q58LL67engi9AtH98cwx2LTeyYYHwksjewIsL/kn0ig==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-5.5.4.tgz", + "integrity": "sha512-lglf2KRxg30dCvNWwxQRJmCfXC51byNqYQt9/dFrnWcotHwpNRIFnVM3tWMdVxlwJMiozU/PjUFBateaxmukXw==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/get-npm-exec-opts": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/get-npm-exec-opts": "5.5.4", "fs-extra": "^9.1.0", "npm-package-arg": "8.1.1", "npmlog": "^6.0.2", @@ -20603,13 +20624,13 @@ } }, "@lerna/npm-publish": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-5.5.1.tgz", - "integrity": "sha512-ajdV2Vb9SOGGp7E7pvb0q7gHqQpd8fQ4DztPOQYrhMUILobJgu4oR3tojMp0XN7vki+pG/OmsOqrQY6M02AkPw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-5.5.4.tgz", + "integrity": "sha512-Z3GQqby0FR7HW82/t7j7nOF9pfSwNVmgms0zTq7a8YaEe8uDlAxGMW4sVN8uT89mZfBfS6R1WMlBbC5Ea+jy/A==", "dev": true, "requires": { - "@lerna/otplease": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", + "@lerna/otplease": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", "fs-extra": "^9.1.0", "libnpmpublish": "^6.0.4", "npm-package-arg": "8.1.1", @@ -20619,53 +20640,53 @@ } }, "@lerna/npm-run-script": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-5.5.1.tgz", - "integrity": "sha512-/68rDfOHtAEHAeAVYC1KXidQkssMBnz/9kcXlcdUaqe88LXSCuhWz49w7qWsUJvSmqwCuD7BWtVR5zx4GnLXhQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-5.5.4.tgz", + "integrity": "sha512-fwHZRTGUldN9D2Rugg0HdwE8A8OZ7CF7g63y7OjzIoxASqtZBDyHZgrVbY/xZcrhqCF0+VJ1vR0c/uFwtWFrtA==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", - "@lerna/get-npm-exec-opts": "5.5.1", + "@lerna/child-process": "5.5.4", + "@lerna/get-npm-exec-opts": "5.5.4", "npmlog": "^6.0.2" } }, "@lerna/otplease": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-5.5.1.tgz", - "integrity": "sha512-I2SEuIb7JWWT4xNUNWvKP7qaRHeQslMuiSdJuO6dV1fnH7FM7xEiHnWIhgDsQqacsci17Ix92toORaYmkU/kqg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-5.5.4.tgz", + "integrity": "sha512-c/tSjuMGw0esoxqtW0Qs2gCcvFDCrOlFnd4EgTJQKUSbNwVrabMkDJRMP0zu7UiSYJCCWKlBnjpBCiBXNG2H4A==", "dev": true, "requires": { - "@lerna/prompt": "5.5.1" + "@lerna/prompt": "5.5.4" } }, "@lerna/output": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-5.5.1.tgz", - "integrity": "sha512-G8WpRlXWUCaJqxtVTCrYRSu5hBy0lxsfdzoEJwkVW9wXL6mL4WwH5TkstPq8LFSEr+NkWa+Hz25VO7LywQQWaQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-5.5.4.tgz", + "integrity": "sha512-qiYtDQ4k9sXzXRlbSuLUFDNLk42sJY3n7x7fWKt6v5I9s2uh5d3cBctBuvV8+YX82H1inQ9hpyFafzOBO8tbCA==", "dev": true, "requires": { "npmlog": "^6.0.2" } }, "@lerna/pack-directory": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-5.5.1.tgz", - "integrity": "sha512-gvKnq9spvIPV4KGK1sxCk23jUjKdpzXtZFZ77QSDWfv2ZXOLcU9MvNC9xx23wcQRkX1IhKFngwMtIfcxrUZN2Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-5.5.4.tgz", + "integrity": "sha512-yUhu8ADzUZOZPfimMwlxxuxIweXitMKTVAmhz9eruiNHxsc0GpKb89yemep03iXqtrjC1Pt/QsS+dhJNNKdZ4A==", "dev": true, "requires": { - "@lerna/get-packed": "5.5.1", - "@lerna/package": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/temp-write": "5.5.1", + "@lerna/get-packed": "5.5.4", + "@lerna/package": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/temp-write": "5.5.4", "npm-packlist": "^5.1.1", "npmlog": "^6.0.2", "tar": "^6.1.0" } }, "@lerna/package": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-5.5.1.tgz", - "integrity": "sha512-K2ylaS3DJ2SU/ptWHMeXkN1AUVPAOKNCP5/K8S42z/ZAmuLlt1LcTMznWPaCbYf2h3HExda8j3UmbEsOtYuixw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-5.5.4.tgz", + "integrity": "sha512-wpBcq4zVFVQOJI9QT0TJItRjl6jGSGFp93n4D8KHXXiyeKmN9CW4EnwFY9bnT3r5OteZN+eorD6r2TnRe8VPDg==", "dev": true, "requires": { "load-json-file": "^6.2.0", @@ -20674,31 +20695,31 @@ } }, "@lerna/package-graph": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-5.5.1.tgz", - "integrity": "sha512-BgkJquJcm/GaGwLmZRTCSAdUBitlGP4HmEP1NI9xrR1x9/OHgfVfkp5yDZBipA/6jY7ucumShU6mYE0fIP9CVA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-5.5.4.tgz", + "integrity": "sha512-1g0c08mooZBtrIG8gMOdpbZ3rn5VM+e47pLFAXZcfGUaNUfc0OM58Z50ONiJq23XlJmS4vQ2e4X3cs7Hc7+Dxw==", "dev": true, "requires": { - "@lerna/prerelease-id-from-version": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/prerelease-id-from-version": "5.5.4", + "@lerna/validation-error": "5.5.4", "npm-package-arg": "8.1.1", "npmlog": "^6.0.2", "semver": "^7.3.4" } }, "@lerna/prerelease-id-from-version": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.5.1.tgz", - "integrity": "sha512-F12+2ubWOY3pnUyTpV/jgZUMaFWas0ehFwYs20WMAnQQVyRHCVjg+bBfvQPGVnuJ6r7n3kXzn69TLDzouhRJcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.5.4.tgz", + "integrity": "sha512-IHNQxbILrRGhw9CCdqy0ncSjDpNvdJCcaGFh3+TJRx6Bjhl5ifbUjI0gBUxd7i5Aict5dguWlhAWHQpef48AqA==", "dev": true, "requires": { "semver": "^7.3.4" } }, "@lerna/profiler": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-5.5.1.tgz", - "integrity": "sha512-WDPgXEYl0lU/dBZ7ejiiNLqwJkPFR+d4vmIkPAFR4RsKQV4VCOCtlJ2QxOHroOPLJ7FrKD71rKyX4cZUIrHl7Q==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-5.5.4.tgz", + "integrity": "sha512-LPnO8mXhXSBT8PD5pEWkgd+2d8lJqQ0fnwcIPG0B8o6tnQrSc2gXLNxStYOFedzcZXRhAYiFVrf5VjOKHV6Ghw==", "dev": true, "requires": { "fs-extra": "^9.1.0", @@ -20707,13 +20728,13 @@ } }, "@lerna/project": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-5.5.1.tgz", - "integrity": "sha512-If3HOjNk/hcbe1gJDysKPws0RKvyG7rrGzkEmBGQ6bi6+eDdaK98XRFHTTAnHfBVOLLd1eimprZCUsYuCATdLg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-5.5.4.tgz", + "integrity": "sha512-iLdyc+jPU0cR6BQO3V3Sf51WP3Oac+I/+518dIGdWS7ot9nEbjuZripHJjIkyZKSfnKPTEtz2aUta0ndoewwuQ==", "dev": true, "requires": { - "@lerna/package": "5.5.1", - "@lerna/validation-error": "5.5.1", + "@lerna/package": "5.5.4", + "@lerna/validation-error": "5.5.4", "cosmiconfig": "^7.0.0", "dedent": "^0.7.0", "dot-prop": "^6.0.1", @@ -20745,9 +20766,9 @@ } }, "@lerna/prompt": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-5.5.1.tgz", - "integrity": "sha512-pKxdfwW4VwIapLj3kZBR3V6usCbZmCfkYUJSO//Vcw/dYf8X1lI9a+qR6imXSa1VwGdU/29oimMGpFn89BjyCA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-5.5.4.tgz", + "integrity": "sha512-X8H2V4dDkFLYzZkMTillvuGAphU5fTDR66HgZlhgKtbJjm7OrjxhoRdk/YlMpI+HdYwXhdUzhEe9YJEhqhfe6w==", "dev": true, "requires": { "inquirer": "^8.2.4", @@ -20755,30 +20776,30 @@ } }, "@lerna/publish": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-5.5.1.tgz", - "integrity": "sha512-hQCEHGLHR4Wd3M/Ay7bmOViL1HRekI/VoJGy+JoG3rn/0H13cTh+lVhvwmtOGKJHsHBQkQ0WaZzwZF16/XLTzA==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "5.5.1", - "@lerna/child-process": "5.5.1", - "@lerna/collect-updates": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/describe-ref": "5.5.1", - "@lerna/log-packed": "5.5.1", - "@lerna/npm-conf": "5.5.1", - "@lerna/npm-dist-tag": "5.5.1", - "@lerna/npm-publish": "5.5.1", - "@lerna/otplease": "5.5.1", - "@lerna/output": "5.5.1", - "@lerna/pack-directory": "5.5.1", - "@lerna/prerelease-id-from-version": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/pulse-till-done": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/validation-error": "5.5.1", - "@lerna/version": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-5.5.4.tgz", + "integrity": "sha512-zBlZsk+NBUfg4o7ycKH8/hc4NRJWd4RmxB6Kn7xo7MOJMW3x+K4aABcqY2GGxEMUxx3rBBVPIdziVWbyS7UIxA==", + "dev": true, + "requires": { + "@lerna/check-working-tree": "5.5.4", + "@lerna/child-process": "5.5.4", + "@lerna/collect-updates": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/describe-ref": "5.5.4", + "@lerna/log-packed": "5.5.4", + "@lerna/npm-conf": "5.5.4", + "@lerna/npm-dist-tag": "5.5.4", + "@lerna/npm-publish": "5.5.4", + "@lerna/otplease": "5.5.4", + "@lerna/output": "5.5.4", + "@lerna/pack-directory": "5.5.4", + "@lerna/prerelease-id-from-version": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/pulse-till-done": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/validation-error": "5.5.4", + "@lerna/version": "5.5.4", "fs-extra": "^9.1.0", "libnpmaccess": "^6.0.3", "npm-package-arg": "8.1.1", @@ -20791,27 +20812,27 @@ } }, "@lerna/pulse-till-done": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-5.5.1.tgz", - "integrity": "sha512-fIE9+LRy172Utfei34QpAg34CFy890j2GCZFln6A+0M3aMNrXkLgF3Zn2awPCugXNu7tLqHRrdZ9ZiSeuk5FYg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-5.5.4.tgz", + "integrity": "sha512-xC4/QPnIQfrE1aA8W5w6AfaT0gTm8SeVmrsQzMMlUTJ2JAnflsHv1oG69M89xq2DrlXsEVaah56Xbjavy+woQg==", "dev": true, "requires": { "npmlog": "^6.0.2" } }, "@lerna/query-graph": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-5.5.1.tgz", - "integrity": "sha512-BqkxJntH/2o+s9Qz0WUOnbA/SW+ASjkvrS/DJ9jVeZ6KQQykPx/VN+ZRcWCBaSDlJEjSyMiTZUPGqtbN5qV+QQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-5.5.4.tgz", + "integrity": "sha512-TJsmJ++3NpEs+LxF0B02hAv2HigJ9ffa9e+paK27oE8sTiH3YataMHaNu5ZkeotJTw7u0IiRLm0zi4z4xoRlLg==", "dev": true, "requires": { - "@lerna/package-graph": "5.5.1" + "@lerna/package-graph": "5.5.4" } }, "@lerna/resolve-symlink": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-5.5.1.tgz", - "integrity": "sha512-xuVPN9SrtOfx9crgYbfJX7c/TpGKQj2cKlkGNt1HqfD2GvUvLzksn1Wjj1Mq23yinPNXo2QDXr7XgjHuDNd48w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-5.5.4.tgz", + "integrity": "sha512-cAIXELf04dHx/XF/2njCM0bpiyup6Nedpmm1XNJzrJuWrGmwK2qW5F2wQ/RHXWXsLIe/BsOl/hfEONm7o7k8sA==", "dev": true, "requires": { "fs-extra": "^9.1.0", @@ -20820,86 +20841,87 @@ } }, "@lerna/rimraf-dir": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-5.5.1.tgz", - "integrity": "sha512-bS7NUKFMT1HsqEFA8mxtHD3jDnpS2xLfQjCyCb7FHHatL46ByZ4oex2965XqL2/aOf+C5aCvYmLFHQ9JN7E2cQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-5.5.4.tgz", + "integrity": "sha512-++I7ToqICE4KSqi4T8enfcou8XPZV3gmrpARVD9VW4Tz3w8BP/JijB6AJwgZKojdqQenXU7u3lLTzfepKN1iOA==", "dev": true, "requires": { - "@lerna/child-process": "5.5.1", + "@lerna/child-process": "5.5.4", "npmlog": "^6.0.2", "path-exists": "^4.0.0", "rimraf": "^3.0.2" } }, "@lerna/run": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-5.5.1.tgz", - "integrity": "sha512-IVXkiOmTMm1jtrDznunzQx796D9LrwKhlmsTv4YTNfnnyPBlyDAobm/PmOUekf30LKrKvcgTRnbEQ6vWXTR93Q==", - "dev": true, - "requires": { - "@lerna/command": "5.5.1", - "@lerna/filter-options": "5.5.1", - "@lerna/npm-run-script": "5.5.1", - "@lerna/output": "5.5.1", - "@lerna/profiler": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/timer": "5.5.1", - "@lerna/validation-error": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-5.5.4.tgz", + "integrity": "sha512-R9g+4nfIDgK+I4RleAJpXrStzLlUCEHR/rxH2t5LJ6DLaoKUG6oeRZsf2w/It/r2IMV1dq2xG6chs+H1o1J+Ow==", + "dev": true, + "requires": { + "@lerna/command": "5.5.4", + "@lerna/filter-options": "5.5.4", + "@lerna/npm-run-script": "5.5.4", + "@lerna/output": "5.5.4", + "@lerna/profiler": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/timer": "5.5.4", + "@lerna/validation-error": "5.5.4", + "fs-extra": "^9.1.0", "p-map": "^4.0.0" } }, "@lerna/run-lifecycle": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-5.5.1.tgz", - "integrity": "sha512-ZM66N7e1sUxsckBnJxdP1NenPNo3hKjPi8fop4do61kwHrWakyRZHl5EEw3CgCWtC7QT+d3zQ/XgDQeJMYEUZg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-5.5.4.tgz", + "integrity": "sha512-MIE8HJml8gWkH5jt/5omiPr69VUMUPwvhkf6Irpg5yxIE5K4oeViVZMay2v6cPA9jAeTDCshHb7gt2EPBSsYQA==", "dev": true, "requires": { - "@lerna/npm-conf": "5.5.1", + "@lerna/npm-conf": "5.5.4", "@npmcli/run-script": "^4.1.7", "npmlog": "^6.0.2", "p-queue": "^6.6.2" } }, "@lerna/run-topologically": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-5.5.1.tgz", - "integrity": "sha512-27n6SY2X8hWIU2VkttNx+G9D5pUXkxvkum6fvWkOrT/3a5miIwmeZvk0t1qhJ2VHxheB3hpd8HntAb2I2tR62g==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-5.5.4.tgz", + "integrity": "sha512-p1UNHgR8sOaS40nVD0HyqwmawDXBOikIibjbJLcY2QuvWwzAGKjfWm/sAXagYjgzaPYQAhaHyOxTdGe8T+a7uQ==", "dev": true, "requires": { - "@lerna/query-graph": "5.5.1", + "@lerna/query-graph": "5.5.4", "p-queue": "^6.6.2" } }, "@lerna/symlink-binary": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-5.5.1.tgz", - "integrity": "sha512-PhrpeO2+3S1bYURb8y7QykmvwS/3KT2nF6Tvv23aqHJOBnrD61I2x0lQdjZK71+WOvi+EN+CatHckNWez14zpw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-5.5.4.tgz", + "integrity": "sha512-FVhkL8KIgk0gPJV136Sl0/t3LD3qDngIRqJVNPIbATVHagkLVsuJM6+BcdWLxoMUCtwHIyWqgcXn1Oa/DVSUEA==", "dev": true, "requires": { - "@lerna/create-symlink": "5.5.1", - "@lerna/package": "5.5.1", + "@lerna/create-symlink": "5.5.4", + "@lerna/package": "5.5.4", "fs-extra": "^9.1.0", "p-map": "^4.0.0" } }, "@lerna/symlink-dependencies": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-5.5.1.tgz", - "integrity": "sha512-xfxTIbg/fUC0afRODbXnFeJ7inEEow4Jkt3agrI10BrztjDKOmoG65KPPh8j0TGKk46TmeN5DI2Ob/5sKRiRzA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-5.5.4.tgz", + "integrity": "sha512-BfOcATr0TreXRfIhIRvgGCT2o8uEqrwVLo8edCQICeqgju19fFn22Qmyb8LW+LMJjBUuSkpJDqqamQ6nj3Ch2A==", "dev": true, "requires": { - "@lerna/create-symlink": "5.5.1", - "@lerna/resolve-symlink": "5.5.1", - "@lerna/symlink-binary": "5.5.1", + "@lerna/create-symlink": "5.5.4", + "@lerna/resolve-symlink": "5.5.4", + "@lerna/symlink-binary": "5.5.4", "fs-extra": "^9.1.0", "p-map": "^4.0.0", "p-map-series": "^2.1.0" } }, "@lerna/temp-write": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-5.5.1.tgz", - "integrity": "sha512-Msuv4OBXXKJlbxhD4kAUs95XsPYGshoKwQSI2sqOinFXnOkkbhdPdRz+7cd4JKs5qMCEy0+5dh7haruYDnSWmQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-5.5.4.tgz", + "integrity": "sha512-cJy9f9uSvnPxfc2a1ARapGLJXllQlJKKb0idi8aA3ylvgDA7grfKIDPdkf6cBcpPAq8aixDq9GdCZ6oLKdISeA==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -20918,40 +20940,40 @@ } }, "@lerna/timer": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-5.5.1.tgz", - "integrity": "sha512-DLmCZG0dKh7+Ie/CzK+iz6RPRyAJbXt+4D8OA7n6o/K/Q6AERuNabCDS/3AhJKTdReEjoA2UpswrHXfBN48xVg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-5.5.4.tgz", + "integrity": "sha512-B3eesmrNaw64Svo2pkmCtBVIJbomegiOMrdxFkZrf8ugTKwobn3KSZZkdbN+hjq8SKpRz3XgtjAuSFUzdg8c3A==", "dev": true }, "@lerna/validation-error": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-5.5.1.tgz", - "integrity": "sha512-sO5Y6GKmMPtYSKHHR5bNXf/HKISb2g/7uny96X28h+/DihiLhHb0q09fIqmY5WHA1AHsJProZFVEN3BlNrtfEg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-5.5.4.tgz", + "integrity": "sha512-FUC3x40zBAu0ny1AWXT38LOVRaSJkjdAv9GiYLu9sx+7T7X18q38zPFyVPIIhrrTJsNNWkro/NTA7r4/BcdvoQ==", "dev": true, "requires": { "npmlog": "^6.0.2" } }, "@lerna/version": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-5.5.1.tgz", - "integrity": "sha512-P2AWTBKRytnSOSS243u3/cz1ecOPG2LTMbiyVBcFnYSAgzHf8AcJYtyfu4aMFzpSD5JfVyYSMvraRiZqK4r7+Q==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "5.5.1", - "@lerna/child-process": "5.5.1", - "@lerna/collect-updates": "5.5.1", - "@lerna/command": "5.5.1", - "@lerna/conventional-commits": "5.5.1", - "@lerna/github-client": "5.5.1", - "@lerna/gitlab-client": "5.5.1", - "@lerna/output": "5.5.1", - "@lerna/prerelease-id-from-version": "5.5.1", - "@lerna/prompt": "5.5.1", - "@lerna/run-lifecycle": "5.5.1", - "@lerna/run-topologically": "5.5.1", - "@lerna/temp-write": "5.5.1", - "@lerna/validation-error": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-5.5.4.tgz", + "integrity": "sha512-J39m2KfhkkDzfCUjnC2+UbBrWBRs1TkrvFlHFbb8wHUOY5bs+dj5RLyUchF/VJOYFSJXr8LLQFdMPeptF2wItg==", + "dev": true, + "requires": { + "@lerna/check-working-tree": "5.5.4", + "@lerna/child-process": "5.5.4", + "@lerna/collect-updates": "5.5.4", + "@lerna/command": "5.5.4", + "@lerna/conventional-commits": "5.5.4", + "@lerna/github-client": "5.5.4", + "@lerna/gitlab-client": "5.5.4", + "@lerna/output": "5.5.4", + "@lerna/prerelease-id-from-version": "5.5.4", + "@lerna/prompt": "5.5.4", + "@lerna/run-lifecycle": "5.5.4", + "@lerna/run-topologically": "5.5.4", + "@lerna/temp-write": "5.5.4", + "@lerna/validation-error": "5.5.4", "chalk": "^4.1.0", "dedent": "^0.7.0", "load-json-file": "^6.2.0", @@ -20967,9 +20989,9 @@ } }, "@lerna/write-log-file": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-5.5.1.tgz", - "integrity": "sha512-gWdDQsG6bHsExa+/1+oHyPI/W+pW6IoKw8fKxs62YOZKei3jKxyQbgMZyMqOTSs76kIe2LiY5JsoBD7saN/ORg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-5.5.4.tgz", + "integrity": "sha512-PDdVuWHLkMw6ygP1hKTciphmYKRDTmNJASxVlxxOv9UkZe7QQvfke0i/OXNPRZHJK7eKCtv2Zu91amE8qCjVNw==", "dev": true, "requires": { "npmlog": "^6.0.2", @@ -21108,9 +21130,9 @@ } }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -21256,21 +21278,21 @@ } }, "@nrwl/cli": { - "version": "14.7.5", - "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-14.7.5.tgz", - "integrity": "sha512-hkkavBDHPZKuxG9q8bcib9/TYnTn13t8CaePjx1JvYqWTYblWVLrzlPhJKFC44Dkch+rtvZ/USs5Fih76se25g==", + "version": "14.8.2", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-14.8.2.tgz", + "integrity": "sha512-I+oblryFkZJYk9TMsBWNdN0SV7OjsiD80gD1WjA1KXEQiFVfopYgwErBrxoenodncXrMFRCk/QR9U5F+23+Vow==", "dev": true, "requires": { - "nx": "14.7.5" + "nx": "14.8.2" } }, "@nrwl/tao": { - "version": "14.7.5", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-14.7.5.tgz", - "integrity": "sha512-MzfJMqVbiMitYjWXaL5/7dDKw1hDG7acciGeu5SyUX8J2J0ymKzXhqjshPvn/Ga1E9QtnMckd6aKmLlvochVag==", + "version": "14.8.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-14.8.2.tgz", + "integrity": "sha512-a4+O307YZJf1H6CDQFGs4DoUvl7xUFSJo2rNHoR9jDlWU+Ug3n0iivX7Fih6Ui0gX4ocEpRwzNMmJhEmEq1BYw==", "dev": true, "requires": { - "nx": "14.7.5" + "nx": "14.8.2" } }, "@octokit/auth-token": { @@ -21320,9 +21342,9 @@ } }, "@octokit/openapi-types": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.12.0.tgz", - "integrity": "sha512-1QYzZrwnn3rTQE7ZoSxXrO8lhu0aIbac1c+qIPOPEaVXBWSaUyLV1x9yt4uDQOwmu6u5ywVS8OJgs+ErDLf6vQ==", + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", + "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==", "dev": true }, "@octokit/plugin-enterprise-rest": { @@ -21395,9 +21417,9 @@ } }, "@octokit/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.0.tgz", - "integrity": "sha512-aHm+olfIZjQpzoODpl+RCZzchKOrdSLJs+yfI7pMMcmB19Li6vidgx0DwUDO/Ic4Q3fq/lOjJORVCcLZefcrJw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", + "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", "dev": true, "requires": { "@octokit/openapi-types": "^13.11.0" @@ -21500,18 +21522,6 @@ "@types/node": "*" } }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "@types/config": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@types/config/-/config-3.3.0.tgz", @@ -21631,9 +21641,9 @@ "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==" }, "@types/inquirer": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.3.tgz", - "integrity": "sha512-ZlBqD+8WIVNy3KIVkl+Qne6bGLW2erwN0GJXY9Ri/9EMbyupee3xw3H0Mmv5kJoLyNpfd/oHlwKxO0DUDH7yWA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-Pxxx3i3AyK7vKAj3LRM/vF7ETcHKiLJ/u5CnNgbz/eYj/vB3xGAYtRxI5IKtq0hpe5iFHD22BKV3n6WHUu0k4Q==", "requires": { "@types/through": "*" } @@ -21668,15 +21678,6 @@ "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/koa": { "version": "2.13.5", "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz", @@ -21734,9 +21735,9 @@ } }, "@types/lodash": { - "version": "4.14.185", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.185.tgz", - "integrity": "sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==" + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==" }, "@types/mime": { "version": "3.0.1", @@ -21769,9 +21770,9 @@ } }, "@types/node": { - "version": "18.7.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==" + "version": "18.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.1.tgz", + "integrity": "sha512-vuYaNuEIbOYLTLUAJh50ezEbvxrD43iby+lpUA2aa148Nh5kX/AVO/9m1Ahmbux2iU5uxJTNF9g2Y+31uml7RQ==" }, "@types/node-fetch": { "version": "2.6.2", @@ -21795,9 +21796,9 @@ "dev": true }, "@types/prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", - "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==" }, "@types/qs": { "version": "6.9.7", @@ -21809,15 +21810,6 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", @@ -21874,9 +21866,9 @@ } }, "@types/yargs": { - "version": "17.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz", - "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", "requires": { "@types/yargs-parser": "*" } @@ -21887,16 +21879,15 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", - "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", + "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/type-utils": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", @@ -21904,53 +21895,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", - "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", + "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", + "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0" } }, "@typescript-eslint/type-utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", + "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", + "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", + "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21959,26 +21950,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", + "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", + "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/types": "5.39.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -22148,6 +22139,52 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.22", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.22.tgz", + "integrity": "sha512-GAWDjXduYBUVmOzlj3X0OwTQ1BV4ZeDdgw8yXST3K0lB95drWEGxa1at0v7BmHDyK2y1F1IJufc8N4yrcuXjWg==", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -23923,50 +23960,24 @@ } }, "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.1.tgz", + "integrity": "sha512-3tLJyBjGuXw1s5gpKFSG3iS4kaKT4id04dZi98wzHQp/8cqZNweBnrF9J+rrlvrf4M53OdtDGNctNHFias8BEA==", "dev": true, "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - } + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.0", + "keyv": "^4.5.0", + "mimic-response": "^4.0.0", + "normalize-url": "^7.1.0", + "responselike": "^3.0.0" } }, "call-bind": { @@ -24001,9 +24012,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001402", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001402.tgz", - "integrity": "sha512-Mx4MlhXO5NwuvXGgVb+hg65HZ+bhUYsz8QtDGDo2QmaJS2GBX47Xfi2koL86lc8K+l+htXeTEB/Aeqvezoo6Ew==" + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==" }, "center-align": { "version": "0.1.3", @@ -24158,15 +24169,6 @@ } } }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "cmd-shim": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", @@ -24240,9 +24242,9 @@ } }, "commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==" + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==" }, "common-ancestor-path": { "version": "1.0.1", @@ -24550,11 +24552,11 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", - "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.5.tgz", + "integrity": "sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==", "requires": { - "browserslist": "^4.21.3" + "browserslist": "^4.21.4" } }, "core-util-is": { @@ -24942,9 +24944,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.254", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", - "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==" + "version": "1.4.271", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.271.tgz", + "integrity": "sha512-BCPBtK07xR1/uY2HFDtl3wK2De66AW4MSiPlLrnPNxKC/Qhccxd59W73654S3y6Rb/k3hmuGJOBnhjfoutetXA==" }, "elliptic": { "version": "6.5.4", @@ -25199,13 +25201,13 @@ } }, "eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/config-array": "^0.10.5", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", @@ -25878,9 +25880,9 @@ } }, "form-data-encoder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.2.tgz", - "integrity": "sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", + "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==", "dev": true }, "formidable": { @@ -25975,12 +25977,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -26148,22 +26144,22 @@ } }, "git-up": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-6.0.0.tgz", - "integrity": "sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "requires": { "is-ssh": "^1.4.0", - "parse-url": "^7.0.2" + "parse-url": "^8.1.0" } }, "git-url-parse": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-12.0.0.tgz", - "integrity": "sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, "requires": { - "git-up": "^6.0.0" + "git-up": "^7.0.0" } }, "gitconfiglocal": { @@ -26303,18 +26299,17 @@ } }, "got": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.4.1.tgz", - "integrity": "sha512-Sz1ojLt4zGNkcftIyJKnulZT/yEDvifhUjccHA8QzOuTgPs/+njXYNMFE3jR4/2OODQSSbH8SdnoLCkbh41ieA==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.1.tgz", + "integrity": "sha512-sD16AK8cCyUoPtKr/NMvLTFFa+T3i3S+zoiuvhq0HP2YiqBZA9AtlBjAdsQBsLBK7slPuvmfE0OxhGi7N5dD4w==", "dev": true, "requires": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.0", + "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", @@ -26776,9 +26771,9 @@ } }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -27190,9 +27185,9 @@ "dev": true }, "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, "js-tokens": { @@ -27288,9 +27283,9 @@ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "jsonfile": { @@ -27982,27 +27977,27 @@ "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==" }, "lerna": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-5.5.1.tgz", - "integrity": "sha512-Ofvlm5FRRxF8IQXnx47YbIXmRDHnDaegDwJ4Kq+cVnafbB0VZvRVy/S4ppmnftnqvd4MBXU022lhW9uGN66iZw==", - "dev": true, - "requires": { - "@lerna/add": "5.5.1", - "@lerna/bootstrap": "5.5.1", - "@lerna/changed": "5.5.1", - "@lerna/clean": "5.5.1", - "@lerna/cli": "5.5.1", - "@lerna/create": "5.5.1", - "@lerna/diff": "5.5.1", - "@lerna/exec": "5.5.1", - "@lerna/import": "5.5.1", - "@lerna/info": "5.5.1", - "@lerna/init": "5.5.1", - "@lerna/link": "5.5.1", - "@lerna/list": "5.5.1", - "@lerna/publish": "5.5.1", - "@lerna/run": "5.5.1", - "@lerna/version": "5.5.1", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-5.5.4.tgz", + "integrity": "sha512-LAFQ/U6SL7/EM0sedtFaFS4b0RbTqsYYOJ6LV9Y7l/zWFlqLcg41vLblkNRuxsNB5FZBNpfiWvXmd1KiWkQ/yQ==", + "dev": true, + "requires": { + "@lerna/add": "5.5.4", + "@lerna/bootstrap": "5.5.4", + "@lerna/changed": "5.5.4", + "@lerna/clean": "5.5.4", + "@lerna/cli": "5.5.4", + "@lerna/create": "5.5.4", + "@lerna/diff": "5.5.4", + "@lerna/exec": "5.5.4", + "@lerna/import": "5.5.4", + "@lerna/info": "5.5.4", + "@lerna/init": "5.5.4", + "@lerna/link": "5.5.4", + "@lerna/list": "5.5.4", + "@lerna/publish": "5.5.4", + "@lerna/run": "5.5.4", + "@lerna/version": "5.5.4", "import-local": "^3.0.2", "npmlog": "^6.0.2", "nx": ">=14.6.1 < 16", @@ -28041,9 +28036,9 @@ } }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -28089,9 +28084,9 @@ } }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -28634,9 +28629,9 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true }, "min-indent": { @@ -29099,9 +29094,9 @@ "dev": true }, "mongodb": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", - "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.10.0.tgz", + "integrity": "sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==", "requires": { "bson": "^4.7.0", "denque": "^2.1.0", @@ -29111,9 +29106,9 @@ } }, "mongodb-connection-string-url": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", - "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", + "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", "requires": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -29144,18 +29139,18 @@ } }, "mongodb-memory-server": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.9.2.tgz", - "integrity": "sha512-h+u+60C/yYZStKqL13O8EerRyt2gdFg9PLyRSBJr5eJfCr+tVMoMrdCw6Dd6PKlCp5hwq27VpjvtSWAT44bHiA==", + "version": "8.9.3", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.9.3.tgz", + "integrity": "sha512-k/1tbGmN6Xegj/XoSA4F/PpKpdRHyT/3HMldhGyiOXx8RNAkJdc/Q9N4+1pCK+HKHMk7BInbo42Bn4OUeAT+hw==", "requires": { - "mongodb-memory-server-core": "8.9.2", + "mongodb-memory-server-core": "8.9.3", "tslib": "^2.4.0" } }, "mongodb-memory-server-core": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.9.2.tgz", - "integrity": "sha512-LG8u8QxPGrozy5UBg9YCh8jvvs5Di93zXrusgwgpj+vKxn+Efa6l1pFnCHNy6SYFydFCpMezilsDIXF0tzbJ6A==", + "version": "8.9.3", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.9.3.tgz", + "integrity": "sha512-z/UW/fHTDRA+qvcqBxibTonnwuxRPWsphO9BUGKvFweRxT9uj09/hCK96kjBdF9wQj6k7bj/Tqo9gkGG0XbDng==", "requires": { "@types/tmp": "^0.2.3", "async-mutex": "^0.3.2", @@ -29180,6 +29175,18 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, + "mongodb": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", + "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", + "requires": { + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.3", + "saslprep": "^1.0.3", + "socks": "^2.7.0" + } + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -29340,9 +29347,9 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", + "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==", "dev": true }, "npm-bundled": { @@ -29355,14 +29362,14 @@ } }, "npm-check-updates": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.1.3.tgz", - "integrity": "sha512-cjFV+Mb5I5rZWVElJugp1cArdzlHQy6Tzi+1i6T72nzLNFN10x7OjA7iQXgFpqeN+U5Zwv8u0/XVCEWM9KxqhQ==", + "version": "16.3.8", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.3.8.tgz", + "integrity": "sha512-2CUeCWEs+arWQUJH2IEkiZU/Ak2fLBqGkMyM5JDkfnGhz1VHNe3yyGiXD+0JeVmjbXTEpgZ0t6C9VK52atGuAw==", "dev": true, "requires": { "chalk": "^5.0.1", "cli-table": "^0.3.11", - "commander": "^9.4.0", + "commander": "^9.4.1", "fast-memoize": "^2.5.2", "find-up": "5.0.0", "fp-and-or": "^0.1.3", @@ -29424,9 +29431,9 @@ } }, "yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.2.tgz", + "integrity": "sha512-VSdf2/K3FqAetooKQv45Hcu6sA00aDgWZeGcG6V9IYJnVLTnb6988Tie79K5nx2vK7cEpf+yW8Oy+7iPAbdiHA==", "dev": true } } @@ -29549,9 +29556,9 @@ "dev": true }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -29587,9 +29594,9 @@ } }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -29622,14 +29629,17 @@ } }, "nx": { - "version": "14.7.5", - "resolved": "https://registry.npmjs.org/nx/-/nx-14.7.5.tgz", - "integrity": "sha512-hp8TYk/t15MJVXQCafSduriZqoxR2zvw5mDHqg32Mjt2jFEFKaPWtaO5l/qKj+rlLE8cPYTeGL5qAS9WZkAWtg==", + "version": "14.8.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-14.8.2.tgz", + "integrity": "sha512-pPijBoeybsIlCD8FMH8WTns+pcIL+0ZOh/+otUX2LfVsi+ppH33GUxO9QVLPrLcyGaoHhwil4hYBxPIQ7Z1r2g==", "dev": true, "requires": { - "@nrwl/cli": "14.7.5", - "@nrwl/tao": "14.7.5", + "@nrwl/cli": "14.8.2", + "@nrwl/tao": "14.8.2", "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", "chalk": "4.1.0", "chokidar": "^3.5.1", "cli-cursor": "3.1.0", @@ -29644,12 +29654,13 @@ "glob": "7.1.4", "ignore": "^5.0.4", "js-yaml": "4.1.0", - "jsonc-parser": "3.0.0", + "jsonc-parser": "3.2.0", "minimatch": "3.0.5", "npm-run-path": "^4.0.1", "open": "^8.4.0", "semver": "7.3.4", "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^3.9.0", @@ -29753,18 +29764,31 @@ } }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.0.0" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + } } }, "yargs-parser": { @@ -30044,9 +30068,9 @@ } }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -30122,24 +30146,21 @@ } }, "parse-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-5.0.0.tgz", - "integrity": "sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "requires": { "protocols": "^2.0.0" } }, "parse-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-7.0.2.tgz", - "integrity": "sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "requires": { - "is-ssh": "^1.4.0", - "normalize-url": "^6.1.0", - "parse-path": "^5.0.0", - "protocols": "^2.0.1" + "parse-path": "^7.0.0" } }, "parseurl": { @@ -30480,16 +30501,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -31351,9 +31362,9 @@ "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" }, "rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "requires": { "tslib": "^2.1.0" } @@ -31677,9 +31688,9 @@ } }, "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "requires": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -31788,10 +31799,16 @@ "readable-stream": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "sqlite3": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.1.tgz", - "integrity": "sha512-mMinkrQr/LKJqFiFF+AF7imPSzRCCpTCreusZO3D/ssJHVjZOrbu2Caz+zPH5KTmGGXBxXMGSRDssL+44CLxvg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.2.tgz", + "integrity": "sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", "node-addon-api": "^4.2.0", @@ -32110,9 +32127,9 @@ } }, "superagent": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.0.tgz", - "integrity": "sha512-iudipXEel+SzlP9y29UBWGDjB+Zzag+eeA1iLosaR2YHBRr1Q1kC29iBrF2zIVD9fqVbpZnXkN/VJmwFMVyNWg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.2.tgz", + "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.3", @@ -32122,8 +32139,7 @@ "formidable": "^2.0.1", "methods": "^1.1.2", "mime": "2.6.0", - "qs": "^6.10.3", - "readable-stream": "^3.6.0", + "qs": "^6.11.0", "semver": "^7.3.7" }, "dependencies": { @@ -32395,9 +32411,9 @@ } }, "ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -32536,14 +32552,14 @@ } }, "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==" + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" }, "uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.2.tgz", + "integrity": "sha512-bbxglRjsGQMchfvXZNusUcYgiB9Hx2K4AHYXQy2DITZ9Rd+JzhX7+hoocE5Winr7z2oHvPsekkBwXtigvxevXg==", "dev": true, "optional": true }, diff --git a/package.json b/package.json index 8f76c411c6..7052346572 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "update-dependencies": "ncu -u && lerna exec -- ncu -u -x node-fetch -x chalk", "clean": "find . -name node_modules -exec rm -rf '{}' + && find . -name package-lock.json -exec rm -rf '{}' +", "test:deno": "deno test --config deno/tsconfig.json deno/test.ts", - "test": "npm run lint && npm run compile && c8 lerna run test" + "test": "npm run lint && npm run compile && c8 lerna run test --ignore @feathersjs/tests" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.37.0", diff --git a/packages/cli/src/app/templates/app.tpl.ts b/packages/cli/src/app/templates/app.tpl.ts index 00df7012ce..123974530c 100644 --- a/packages/cli/src/app/templates/app.tpl.ts +++ b/packages/cli/src/app/templates/app.tpl.ts @@ -9,7 +9,7 @@ import { koa, rest, bodyParser, errorHandler, parseAuthentication, cors } from ' ${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} import type { Application } from './declarations' -import { configurationSchema } from './configuration' +import { configurationSchema } from './schemas/configuration' import { logErrorHook } from './logger' import { services } from './services/index' import { channels } from './channels' diff --git a/packages/cli/src/app/templates/declarations.tpl.ts b/packages/cli/src/app/templates/declarations.tpl.ts index be2fcaa029..c938e3a3bc 100644 --- a/packages/cli/src/app/templates/declarations.tpl.ts +++ b/packages/cli/src/app/templates/declarations.tpl.ts @@ -5,7 +5,7 @@ const template = ({ framework }: AppGeneratorContext) => /* ts */ `import { HookContext as FeathersHookContext, NextFunction } from '@feathersjs/feathers' import { Application as FeathersApplication } from '@feathersjs/${framework}' -import { ConfigurationSchema } from './configuration' +import { ConfigurationSchema } from './schemas/configuration' export { NextFunction } diff --git a/packages/cli/src/app/templates/configuration.tpl.ts b/packages/cli/src/app/templates/schemas.tpl.ts similarity index 60% rename from packages/cli/src/app/templates/configuration.tpl.ts rename to packages/cli/src/app/templates/schemas.tpl.ts index a042b25a4a..40f815968e 100644 --- a/packages/cli/src/app/templates/configuration.tpl.ts +++ b/packages/cli/src/app/templates/schemas.tpl.ts @@ -2,9 +2,23 @@ import { generator, toFile } from '@feathershq/pinion' import { renderSource } from '../../commons' import { AppGeneratorContext } from '../index' -const template = ({}: AppGeneratorContext) => /* ts */ `import { schema, Ajv } from '@feathersjs/schema' +const validatorTemplate = /* ts */ `import { Ajv } from '@feathersjs/schema' + +export const dataValidator = new Ajv({ + addUsedSchema: false +}) + +export const queryValidator = new Ajv({ + coerceTypes: true, + addUsedSchema: false +}) + +` +const configurationTemplate = + ({}: AppGeneratorContext) => /* ts */ `import { schema, Ajv } from '@feathersjs/schema' import type { Infer } from '@feathersjs/schema' import { authenticationSettingsSchema } from '@feathersjs/authentication' +import { dataValidator } from './validators' export const configurationSchema = schema( { @@ -34,16 +48,23 @@ export const configurationSchema = schema( } } } as const, - new Ajv() + dataValidator ) export type ConfigurationSchema = Infer ` export const generate = (ctx: AppGeneratorContext) => - generator(ctx).then( - renderSource( - template, - toFile(({ lib }) => lib, 'configuration') + generator(ctx) + .then( + renderSource( + configurationTemplate, + toFile(({ lib }) => lib, 'schemas', 'configuration') + ) + ) + .then( + renderSource( + validatorTemplate, + toFile(({ lib }) => lib, 'schemas', 'validators') + ) ) - ) diff --git a/packages/cli/src/authentication/templates/declarations.tpl.ts b/packages/cli/src/authentication/templates/declarations.tpl.ts index 913e3735bb..07e6513640 100644 --- a/packages/cli/src/authentication/templates/declarations.tpl.ts +++ b/packages/cli/src/authentication/templates/declarations.tpl.ts @@ -5,7 +5,7 @@ const importTemplate = ({ upperName, folder, fileName -}: AuthenticationGeneratorContext) => /* ts */ `import { ${upperName}Result } from './services/${folder.join( +}: AuthenticationGeneratorContext) => /* ts */ `import { ${upperName} } from './services/${folder.join( '/' )}/${fileName}.schema' ` @@ -16,7 +16,7 @@ const paramsTemplate = ({ }: AuthenticationGeneratorContext) => /* ts */ `// Add the ${entity} as an optional property to all params declare module '@feathersjs/feathers' { interface Params { - ${entity}?: ${upperName}Result + ${entity}?: ${upperName} } } ` diff --git a/packages/cli/src/authentication/templates/user.resolver.tpl.ts b/packages/cli/src/authentication/templates/user.resolver.tpl.ts deleted file mode 100644 index 5eaa6c8b5c..0000000000 --- a/packages/cli/src/authentication/templates/user.resolver.tpl.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { generator, toFile } from '@feathershq/pinion' -import { renderSource } from '../../commons' -import { AuthenticationGeneratorContext } from '../index' - -const template = ({ - camelName, - upperName, - relative, - authStrategies, - type, - fileName -}: AuthenticationGeneratorContext) => /* ts */ `import { resolve } from '@feathersjs/schema' -${authStrategies.includes('local') ? `import { passwordHash } from '@feathersjs/authentication-local'` : ''} -import type { HookContext } from '${relative}/declarations' -import type { - ${upperName}Data, - ${upperName}Patch, - ${upperName}Result, - ${upperName}Query, -} from './${fileName}.schema' -import { - ${camelName}DataSchema, - ${camelName}PatchSchema, - ${camelName}ResultSchema, - ${camelName}QuerySchema -} from './${fileName}.schema' - - -// Resolver for the basic data model (e.g. creating new entries) -export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ - schema: ${camelName}DataSchema, - validate: 'before', - properties: { - ${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''} - } -}) - - -// Resolver for making partial updates -export const ${camelName}PatchResolver = resolve<${upperName}Patch, HookContext>({ - schema: ${camelName}PatchSchema, - validate: 'before', - properties: { - ${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''} - } -}) - - -// Resolver for the data that is being returned -export const ${camelName}ResultResolver = resolve<${upperName}Result, HookContext>({ - schema: ${camelName}ResultSchema, - validate: false, - properties: {} -}) - - -// Resolver for the "safe" version that external clients are allowed to see -export const ${camelName}DispatchResolver = resolve<${upperName}Result, HookContext>({ - schema: ${camelName}ResultSchema, - validate: false, - properties: { - // The password should never be visible externally - password: async () => undefined - } -}) - - -// Resolver for allowed query properties -export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ - schema: ${camelName}QuerySchema, - validate: 'before', - properties: { - // If there is a user (e.g. with authentication), they are only allowed to see their own data - ${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => { - if (context.params.user) { - return context.params.user.${type === 'mongodb' ? '_id' : 'id'} - } - - return value - } - } -}) - - -// Export all resolvers in a format that can be used with the resolveAll hook -export const ${camelName}Resolvers = { - result: ${camelName}ResultResolver, - dispatch: ${camelName}DispatchResolver, - data: { - create: ${camelName}DataResolver, - update: ${camelName}DataResolver, - patch: ${camelName}PatchResolver - }, - query: ${camelName}QueryResolver -} -` - -export const generate = (ctx: AuthenticationGeneratorContext) => - generator(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }: AuthenticationGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.resolver` - ]), - { force: true } - ) - ) diff --git a/packages/cli/src/authentication/templates/user.schema.tpl.ts b/packages/cli/src/authentication/templates/user.schema.tpl.ts index 2b8e156dad..231f6288f7 100644 --- a/packages/cli/src/authentication/templates/user.schema.tpl.ts +++ b/packages/cli/src/authentication/templates/user.schema.tpl.ts @@ -6,12 +6,17 @@ const template = ({ camelName, upperName, authStrategies, - type -}: AuthenticationGeneratorContext) => /* ts */ `import { schema, querySyntax } from '@feathersjs/schema' -import type { Infer } from '@feathersjs/schema' - + type, + relative +}: AuthenticationGeneratorContext) => /* ts */ `import { getValidator, getDataValidator, resolve, querySyntax } from '@feathersjs/schema' +import type { FromSchema } from '@feathersjs/schema' +${authStrategies.includes('local') ? `import { passwordHash } from '@feathersjs/authentication-local'` : ''} + +import type { HookContext } from '${relative}/declarations' +import { dataValidator, queryValidator } from '${relative}/schemas/validators' + // Schema for the basic data model (e.g. creating new entries) -export const ${camelName}DataSchema = schema({ +export const ${camelName}DataSchema = { $id: '${upperName}Data', type: 'object', additionalProperties: false, @@ -26,54 +31,71 @@ export const ${camelName}DataSchema = schema({ ) .join(',\n')} } -} as const) +} as const -export type ${upperName}Data = Infer +export type ${upperName}Data = FromSchema +export const ${camelName}DataValidator = getDataValidator(${camelName}DataSchema, dataValidator) -// Schema for making partial updates -export const ${camelName}PatchSchema = schema({ - $id: '${upperName}Patch', - type: 'object', - additionalProperties: false, - required: [], +export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ properties: { - ...${camelName}DataSchema.properties + ${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''} } -} as const) - -export type ${upperName}Patch = Infer +}) // Schema for the data that is being returned -export const ${camelName}ResultSchema = schema({ - $id: '${upperName}Result', +export const ${camelName}Schema = { + $id: '${upperName}', type: 'object', additionalProperties: false, - required: [ '${type === 'mongodb' ? '_id' : 'id'}' ], + required: [ ...${camelName}DataSchema.required, '${type === 'mongodb' ? '_id' : 'id'}' ], properties: { ...${camelName}DataSchema.properties, ${type === 'mongodb' ? '_id' : 'id'}: { type: '${type === 'mongodb' ? 'string' : 'number'}' } } -} as const) +} as const -export type ${upperName}Result = Infer +export type ${upperName} = FromSchema -// Queries shouldn't allow doing anything with the password -const { password, ...${camelName}QueryProperties } = ${camelName}ResultSchema.properties +export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ + properties: {} +}) + +export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({ + properties: { + // The password should never be visible externally + password: async () => undefined + } +}) // Schema for allowed query properties -export const ${camelName}QuerySchema = schema({ +export const ${camelName}QuerySchema = { $id: '${upperName}Query', type: 'object', additionalProperties: false, properties: { - ...querySyntax(${camelName}QueryProperties) + ...querySyntax(${camelName}Schema.properties) } -} as const) +} as const + +export type ${upperName}Query = FromSchema -export type ${upperName}Query = Infer +export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) + +export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ + properties: { + // If there is a user (e.g. with authentication), they are only allowed to see their own data + ${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => { + if (context.params.user) { + return context.params.user.${type === 'mongodb' ? '_id' : 'id'} + } + + return value + } + } +}) ` export const generate = (ctx: AuthenticationGeneratorContext) => diff --git a/packages/cli/src/commons.ts b/packages/cli/src/commons.ts index 72f3e88412..49f6e8b17f 100644 --- a/packages/cli/src/commons.ts +++ b/packages/cli/src/commons.ts @@ -271,3 +271,17 @@ export const injectSource = return injector(ctx).then(prettify(target)) } + +/** + * Join multiple templates into one. + * + * @param templates The list of templates (callables) to join + * @returns + */ +export const joinTemplates = + (...templates: Callable[]) => + async (ctx: C) => { + const strings = await Promise.all(templates.map((tpl) => getCallable(tpl, ctx))) + + return strings.join('') + } diff --git a/packages/cli/src/connection/templates/knex.tpl.ts b/packages/cli/src/connection/templates/knex.tpl.ts index c1a653d570..db16f85b7e 100644 --- a/packages/cli/src/connection/templates/knex.tpl.ts +++ b/packages/cli/src/connection/templates/knex.tpl.ts @@ -44,7 +44,7 @@ const importTemplate = ({ database }: ConnectionGeneratorContext) => const configureTemplate = ({ database }: ConnectionGeneratorContext) => `app.configure(${database})` const toAppFile = toFile(({ lib }) => [lib, 'app']) -const toConfig = toFile(({ lib }) => [lib, 'configuration']) +const toConfig = toFile(({ lib }) => [lib, 'schemas', 'configuration']) export const generate = (ctx: ConnectionGeneratorContext) => generator(ctx) diff --git a/packages/cli/src/connection/templates/mongodb.tpl.ts b/packages/cli/src/connection/templates/mongodb.tpl.ts index 018a9c733d..4758b37163 100644 --- a/packages/cli/src/connection/templates/mongodb.tpl.ts +++ b/packages/cli/src/connection/templates/mongodb.tpl.ts @@ -40,7 +40,7 @@ export const generate = (ctx: ConnectionGeneratorContext) => injectSource( configurationTemplate, before('authentication: authenticationSettingsSchema'), - toFile(({ lib }) => [lib, 'configuration']), + toFile(({ lib }) => [lib, 'schemas', 'configuration']), false ) ) diff --git a/packages/cli/src/service/service.tpl.ts b/packages/cli/src/service/service.tpl.ts new file mode 100644 index 0000000000..3fb6a8529f --- /dev/null +++ b/packages/cli/src/service/service.tpl.ts @@ -0,0 +1,117 @@ +import { generator, prepend, after, toFile } from '@feathershq/pinion' +import { injectSource } from '../commons' +import { ServiceGeneratorContext } from './index' + +const toServiceIndex = toFile(({ lib }: ServiceGeneratorContext) => [lib, 'services', `index`]) + +export const registerService = (ctx: ServiceGeneratorContext) => + generator(ctx) + .then( + injectSource( + ({ camelName, folder, fileName }) => + `import { ${camelName} } from './${folder.join('/')}/${fileName}.service'`, + prepend(), + toServiceIndex + ) + ) + .then( + injectSource( + ({ camelName }) => ` app.configure(${camelName})`, + after('export const services'), + toServiceIndex + ) + ) + +export const serviceImportTemplate = ({ + authentication, + isEntityService, + camelName, + upperName, + fileName, + relative +}: ServiceGeneratorContext) => ` +${authentication || isEntityService ? `import { authenticate } from '@feathersjs/authentication'` : ''} +import { schemaHooks } from '@feathersjs/schema' + +import type { Application } from '${relative}/declarations' + +import { + ${camelName}DataValidator, + ${camelName}QueryValidator, + ${camelName}Resolver, + ${camelName}DataResolver, + ${camelName}QueryResolver, + ${camelName}ExternalResolver +} from './${fileName}.schema' + +import type { + ${upperName}, + ${upperName}Data, + ${upperName}Query +} from './${fileName}.schema'` + +export const serviceRegistrationTemplate = ({ + camelName, + authentication, + isEntityService, + path, + className, + relative +}: ServiceGeneratorContext) => /* ts */ ` +export const ${camelName}Hooks = { + around: { + all: [${ + authentication + ? ` + authenticate('jwt'),` + : '' + } + ]${ + isEntityService + ? `, + find: [ authenticate('jwt') ], + get: [ authenticate('jwt') ], + create: [], + update: [ authenticate('jwt') ], + patch: [ authenticate('jwt') ], + remove: [ authenticate('jwt') ]` + : '' + } + }, + before: { + all: [ + schemaHooks.validateQuery(${camelName}QueryValidator), + schemaHooks.validateData(${camelName}DataValidator), + schemaHooks.resolveQuery(${camelName}QueryResolver), + schemaHooks.resolveData(${camelName}DataResolver) + ] + }, + after: { + all: [ + schemaHooks.resolveResult(${camelName}Resolver), + schemaHooks.resolveExternal(${camelName}ExternalResolver) + ] + }, + error: {} +} + +// A configure function that registers the service and its hooks via \`app.configure\` +export const ${camelName} = (app: Application) => { + // Register our service on the Feathers application + app.use('${path}', new ${className}(getOptions(app)), { + // A list of all methods this service exposes externally + methods: ['find', 'get', 'create', 'update', 'patch', 'remove'], + // You can add additional custom events to be sent to clients here + events: [] + }) + // Initialize hooks + app.service('${path}').hooks(${camelName}Hooks) +} + +// Add this service to the service type index +declare module '${relative}/declarations' { + interface ServiceTypes { + '${path}': ${className} + } +} +` diff --git a/packages/cli/src/service/templates/class.tpl.ts b/packages/cli/src/service/templates/class.tpl.ts deleted file mode 100644 index 69a8f89b7d..0000000000 --- a/packages/cli/src/service/templates/class.tpl.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { generator, toFile } from '@feathershq/pinion' -import { renderSource } from '../../commons' -import { ServiceGeneratorContext } from '../index' - -const template = ({ - camelName, - upperName, - fileName, - isEntityService, - authentication -}: ServiceGeneratorContext) => /* ts */ `import { resolveAll } from '@feathersjs/schema' -${isEntityService || authentication ? `import { authenticate } from '@feathersjs/authentication'` : ''} -import type { - ${upperName}Data, - ${upperName}Result, - ${upperName}Query, -} from './${fileName}.schema' -import { ${camelName}Resolvers } from './${fileName}.resolver' - -export const ${camelName}Hooks = { - around: { - all: [${ - authentication - ? ` - authenticate('jwt'),` - : '' - } ${ - !isEntityService - ? ` - resolveAll(${camelName}Resolvers)` - : '' -} - ]${ - isEntityService - ? `, - get: [ - authenticate('jwt'), - resolveAll(${camelName}Resolvers) - ], - find: [ - authenticate('jwt'), - resolveAll(${camelName}Resolvers) - ], - create: [ - resolveAll(${camelName}Resolvers) - ], - patch: [ - authenticate('jwt'), - resolveAll(${camelName}Resolvers) - ], - update: [ - authenticate('jwt'), - resolveAll(${camelName}Resolvers) - ], - remove: [ - authenticate('jwt'), - resolveAll(${camelName}Resolvers) - ]` - : '' - } - }, - before: {}, - after: {}, - error: {} -} -` -export const generate = (ctx: ServiceGeneratorContext) => - generator(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` - ]) - ) - ) diff --git a/packages/cli/src/service/templates/client.tpl.ts b/packages/cli/src/service/templates/client.tpl.ts index efc738598b..01f3c6bc16 100644 --- a/packages/cli/src/service/templates/client.tpl.ts +++ b/packages/cli/src/service/templates/client.tpl.ts @@ -2,25 +2,23 @@ import { generator, inject, toFile, when, after } from '@feathershq/pinion' import { ServiceGeneratorContext } from '../index' const schemaImports = ({ upperName, folder, fileName }: ServiceGeneratorContext) => /* ts */ `import type { + ${upperName}, ${upperName}Data, - ${upperName}Patch, - ${upperName}Result, ${upperName}Query, } from './services/${folder.join('/')}/${fileName}.schema' export type { + ${upperName}, ${upperName}Data, - ${upperName}Patch, - ${upperName}Result, ${upperName}Query, }` const declarationTemplate = ({ path, upperName }: ServiceGeneratorContext) => ` '${path}': ClientService< - ${upperName}Result, + ${upperName}, ${upperName}Data, - ${upperName}Patch, - Paginated<${upperName}Result>, + Partial<${upperName}Data>, + Paginated<${upperName}>, Params<${upperName}Query> >` diff --git a/packages/cli/src/service/templates/resolver.tpl.ts b/packages/cli/src/service/templates/resolver.tpl.ts deleted file mode 100644 index 4cf83ffb72..0000000000 --- a/packages/cli/src/service/templates/resolver.tpl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { generator, toFile } from '@feathershq/pinion' -import { renderSource } from '../../commons' -import { ServiceGeneratorContext } from '../index' - -const template = ({ - camelName, - upperName, - relative, - fileName -}: ServiceGeneratorContext) => /* ts */ `import { resolve } from '@feathersjs/schema' -import type { HookContext } from '${relative}/declarations' - -import type { - ${upperName}Data, - ${upperName}Patch, - ${upperName}Result, - ${upperName}Query, -} from './${fileName}.schema' -import { - ${camelName}DataSchema, - ${camelName}PatchSchema, - ${camelName}ResultSchema, - ${camelName}QuerySchema -} from './${fileName}.schema' - - -// Resolver for the basic data model (e.g. creating new entries) -export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ - schema: ${camelName}DataSchema, - validate: 'before', - properties: {} -}) - - -// Resolver for making partial updates -export const ${camelName}PatchResolver = resolve<${upperName}Patch, HookContext>({ - schema: ${camelName}PatchSchema, - validate: 'before', - properties: {} -}) - - -// Resolver for the data that is being returned -export const ${camelName}ResultResolver = resolve<${upperName}Result, HookContext>({ - schema: ${camelName}ResultSchema, - validate: false, - properties: {} -}) - - -// Resolver for query properties -export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ - schema: ${camelName}QuerySchema, - validate: 'before', - properties: {} -}) - - -// Export all resolvers in a format that can be used with the resolveAll hook -export const ${camelName}Resolvers = { - result: ${camelName}ResultResolver, - data: { - create: ${camelName}DataResolver, - update: ${camelName}DataResolver, - patch: ${camelName}PatchResolver - }, - query: ${camelName}QueryResolver -} -` - -export const generate = (ctx: ServiceGeneratorContext) => - generator(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.resolver` - ]) - ) - ) diff --git a/packages/cli/src/service/templates/schema.tpl.ts b/packages/cli/src/service/templates/schema.tpl.ts index c8cab59c71..1c00f6a814 100644 --- a/packages/cli/src/service/templates/schema.tpl.ts +++ b/packages/cli/src/service/templates/schema.tpl.ts @@ -5,12 +5,16 @@ import { ServiceGeneratorContext } from '../index' const template = ({ camelName, upperName, + relative, type -}: ServiceGeneratorContext) => /* ts */ `import { schema, querySyntax } from '@feathersjs/schema' -import type { Infer } from '@feathersjs/schema' +}: ServiceGeneratorContext) => /* ts */ `import { querySyntax, getValidator, getDataValidator, resolve } from '@feathersjs/schema' +import type { FromSchema } from '@feathersjs/schema' + +import type { HookContext } from '${relative}/declarations' +import { dataValidator, queryValidator } from '${relative}/schemas/validators' // Schema for the basic data model (e.g. creating new entries) -export const ${camelName}DataSchema = schema({ +export const ${camelName}DataSchema = { $id: '${upperName}Data', type: 'object', additionalProperties: false, @@ -20,28 +24,19 @@ export const ${camelName}DataSchema = schema({ type: 'string' } } -} as const) - -export type ${upperName}Data = Infer - +} as const -// Schema for making partial updates -export const ${camelName}PatchSchema = schema({ - $id: '${upperName}Patch', - type: 'object', - additionalProperties: false, - required: [], - properties: { - ...${camelName}DataSchema.properties - } -} as const) +export type ${upperName}Data = FromSchema -export type ${upperName}Patch = Infer +export const ${camelName}DataValidator = getDataValidator(${camelName}DataSchema, dataValidator) +export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ + properties: {} +}) // Schema for the data that is being returned -export const ${camelName}ResultSchema = schema({ - $id: '${upperName}Result', +export const ${camelName}Schema = { + $id: '${upperName}', type: 'object', additionalProperties: false, required: [ ...${camelName}DataSchema.required, '${type === 'mongodb' ? '_id' : 'id'}' ], @@ -51,22 +46,35 @@ export const ${camelName}ResultSchema = schema({ type: '${type === 'mongodb' ? 'string' : 'number'}' } } -} as const) +} as const + +export type ${upperName} = FromSchema -export type ${upperName}Result = Infer +export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ + properties: {} +}) +export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({ + properties: {} +}) // Schema for allowed query properties -export const ${camelName}QuerySchema = schema({ +export const ${camelName}QuerySchema = { $id: '${upperName}Query', type: 'object', additionalProperties: false, properties: { - ...querySyntax(${camelName}ResultSchema.properties) + ...querySyntax(${camelName}Schema.properties) } -} as const) +} as const + +export type ${upperName}Query = FromSchema + +export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) -export type ${upperName}Query = Infer +export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ + properties: {} +}) ` export const generate = (ctx: ServiceGeneratorContext) => diff --git a/packages/cli/src/service/templates/service.tpl.ts b/packages/cli/src/service/templates/service.tpl.ts deleted file mode 100644 index 549499fb46..0000000000 --- a/packages/cli/src/service/templates/service.tpl.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { generator, prepend, toFile, after } from '@feathershq/pinion' -import { injectSource, renderSource } from '../../commons' -import { ServiceGeneratorContext } from '../index' - -const template = ({ - relative, - path, - className, - camelName, - fileName -}: ServiceGeneratorContext) => /* ts */ `import type { Application } from '${relative}/declarations' - -import { ${className}, ${camelName}Hooks } from './${fileName}.class' - -// A configure function that registers the service and its hooks via \`app.configure\` -export function ${camelName} (app: Application) { - const options = { // Service options will go here - } - - // Register our service on the Feathers application - app.use('${path}', new ${className}(options), { - // A list of all methods this service exposes externally - methods: ['find', 'get', 'create', 'update', 'patch', 'remove'], - // You can add additional custom events to be sent to clients here - events: [] - }) - // Initialize hooks - app.service('${path}').hooks(${camelName}Hooks) -} - -// Add this service to the service type index -declare module '${relative}/declarations' { - interface ServiceTypes { - '${path}': ${className} - } -} -` - -const importTemplate = ({ camelName, folder, fileName }: ServiceGeneratorContext) => - `import { ${camelName} } from './${folder.join('/')}/${fileName}.service'` - -const configureTemplate = ({ camelName }: ServiceGeneratorContext) => ` app.configure(${camelName})` - -const toServiceIndex = toFile(({ lib }: ServiceGeneratorContext) => [lib, 'services', `index`]) - -export const generate = (ctx: ServiceGeneratorContext) => - generator(ctx) - .then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.service` - ]) - ) - ) - .then(injectSource(importTemplate, prepend(), toServiceIndex)) - .then(injectSource(configureTemplate, after('export const services'), toServiceIndex)) diff --git a/packages/cli/src/service/type/custom.tpl.ts b/packages/cli/src/service/type/custom.tpl.ts index 37161dd3f6..f72f82f255 100644 --- a/packages/cli/src/service/type/custom.tpl.ts +++ b/packages/cli/src/service/type/custom.tpl.ts @@ -1,13 +1,12 @@ -import { generator, toFile, after, prepend, append } from '@feathershq/pinion' -import { injectSource } from '../../commons' +import { generator, toFile } from '@feathershq/pinion' +import { joinTemplates, renderSource } from '../../commons' import { ServiceGeneratorContext } from '../index' +import { registerService, serviceImportTemplate, serviceRegistrationTemplate } from '../service.tpl' + +export const importTemplate = "import type { Id, NullableId, Params } from '@feathersjs/feathers'" + +export const serviceTemplate = ({ className, upperName }: ServiceGeneratorContext) => ` -export const template = ({ - className, - upperName, - relative -}: ServiceGeneratorContext) => /* ts */ `import type { Application } from '${relative}/declarations' - export interface ${className}Options { app: Application } @@ -21,20 +20,20 @@ export class ${className} { constructor (public options: ${className}Options) { } - async find (_params?: ${upperName}Params): Promise<${upperName}Result[]> { + async find (_params?: ${upperName}Params): Promise<${upperName}[]> { return [] } - async get (id: Id, _params?: ${upperName}Params): Promise<${upperName}Result> { + async get (id: Id, _params?: ${upperName}Params): Promise<${upperName}> { return { id: 0, text: \`A new message with ID: \${id}!\` } } - async create (data: ${upperName}Data, params?: ${upperName}Params): Promise<${upperName}Result> - async create (data: ${upperName}Data[], params?: ${upperName}Params): Promise<${upperName}Result[]> - async create (data: ${upperName}Data|${upperName}Data[], params?: ${upperName}Params): Promise<${upperName}Result|${upperName}Result[]> { + async create (data: ${upperName}Data, params?: ${upperName}Params): Promise<${upperName}> + async create (data: ${upperName}Data[], params?: ${upperName}Params): Promise<${upperName}[]> + async create (data: ${upperName}Data|${upperName}Data[], params?: ${upperName}Params): Promise<${upperName}|${upperName}[]> { if (Array.isArray(data)) { return Promise.all(data.map(current => this.create(current, params))); } @@ -45,49 +44,44 @@ export class ${className} { } } - async update (id: NullableId, data: ${upperName}Data, _params?: ${upperName}Params): Promise<${upperName}Result> { + async update (id: NullableId, data: ${upperName}Data, _params?: ${upperName}Params): Promise<${upperName}> { return { id: 0, ...data } } - async patch (id: NullableId, data: ${upperName}Data, _params?: ${upperName}Params): Promise<${upperName}Result> { + async patch (id: NullableId, data: ${upperName}Data, _params?: ${upperName}Params): Promise<${upperName}> { return { id: 0, ...data } } - async remove (id: NullableId, _params?: ${upperName}Params): Promise<${upperName}Result> { + async remove (id: NullableId, _params?: ${upperName}Params): Promise<${upperName}> { return { id: 0, text: 'removed' } } } -` - -export const importTemplate = "import type { Id, NullableId, Params } from '@feathersjs/feathers'" - -const optionTemplate = ({}: ServiceGeneratorContext) => ` app` - -const toServiceFile = toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.service` -]) -const toClassFile = toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` -]) +export const getOptions = (app: Application) => { + return { app } +} +` export const generate = (ctx: ServiceGeneratorContext) => generator(ctx) - .then(injectSource(template, append(), toClassFile)) - .then(injectSource(importTemplate, prepend(), toClassFile)) - .then(injectSource(optionTemplate, after('const options ='), toServiceFile, false)) + .then( + renderSource( + joinTemplates(importTemplate, serviceImportTemplate, serviceTemplate, serviceRegistrationTemplate), + toFile(({ lib, folder, fileName }) => [ + lib, + 'services', + ...folder, + `${fileName}.service` + ]) + ) + ) + .then(registerService) diff --git a/packages/cli/src/service/type/knex.tpl.ts b/packages/cli/src/service/type/knex.tpl.ts index b1037708c4..d2345b8cd0 100644 --- a/packages/cli/src/service/type/knex.tpl.ts +++ b/packages/cli/src/service/type/knex.tpl.ts @@ -1,6 +1,7 @@ -import { generator, toFile, after, prepend, append } from '@feathershq/pinion' -import { injectSource, renderSource } from '../../commons' +import { generator, toFile } from '@feathershq/pinion' +import { joinTemplates, renderSource } from '../../commons' import { ServiceGeneratorContext } from '../index' +import { registerService, serviceImportTemplate, serviceRegistrationTemplate } from '../service.tpl' const migrationTemplate = ({ kebabName @@ -18,42 +19,49 @@ export async function down(knex: Knex): Promise { } ` -export const importTemplate = /* ts */ `import { KnexService } from \'@feathersjs/knex\' -import type { KnexAdapterParams } from \'@feathersjs/knex\'` +export const importTemplate = `import { KnexService } from '@feathersjs/knex' +import type { KnexAdapterParams } from '@feathersjs/knex' +` + +export const serviceTemplate = ({ + className, + upperName, + kebabName, + feathers +}: ServiceGeneratorContext) => /* ts */ ` -export const classCode = ({ className, upperName }: ServiceGeneratorContext) => - `export interface ${upperName}Params extends KnexAdapterParams<${upperName}Query> { +export interface ${upperName}Params extends KnexAdapterParams<${upperName}Query> { } // By default calls the standard Knex adapter service methods but can be customized with your own functionality. -export class ${className} extends KnexService<${upperName}Result, ${upperName}Data, ${upperName}Params> { +export class ${className} extends KnexService<${upperName}, ${upperName}Data, ${upperName}Params> { } -` -export const optionTemplate = ({ kebabName, feathers }: ServiceGeneratorContext) => - ` paginate: app.get('paginate'), +export const getOptions = (app: Application) => { + return { + paginate: app.get('paginate'), Model: app.get('${feathers.database}Client'), - name: '${kebabName}'` - -const toServiceFile = toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.service` -]) - -const toClassFile = toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` -]) + name: '${kebabName}' + } +} +` export const generate = (ctx: ServiceGeneratorContext) => generator(ctx) - .then(injectSource(classCode, append(), toClassFile)) - .then(injectSource(importTemplate, prepend(), toClassFile)) - .then(injectSource(optionTemplate, after('const options ='), toServiceFile, false)) + .then( + renderSource( + joinTemplates(importTemplate, serviceImportTemplate, serviceTemplate, serviceRegistrationTemplate), + toFile( + toFile(({ lib, folder, fileName }) => [ + lib, + 'services', + ...folder, + `${fileName}.service` + ]) + ) + ) + ) + .then(registerService) .then( renderSource( migrationTemplate, diff --git a/packages/cli/src/service/type/mongodb.tpl.ts b/packages/cli/src/service/type/mongodb.tpl.ts index 060a6ee541..5278723652 100644 --- a/packages/cli/src/service/type/mongodb.tpl.ts +++ b/packages/cli/src/service/type/mongodb.tpl.ts @@ -1,41 +1,39 @@ -import { generator, toFile, after, prepend, append } from '@feathershq/pinion' -import { injectSource } from '../../commons' +import { generator, toFile } from '@feathershq/pinion' +import { joinTemplates, renderSource } from '../../commons' import { ServiceGeneratorContext } from '../index' +import { registerService, serviceImportTemplate, serviceRegistrationTemplate } from '../service.tpl' export const importTemplate = /* ts */ `import { MongoDBService } from \'@feathersjs/mongodb\' import type { MongoDBAdapterParams } from \'@feathersjs/mongodb\'` -export const classCode = ({ - className, - upperName -}: ServiceGeneratorContext) => /* ts */ `export interface ${upperName}Params extends MongoDBAdapterParams<${upperName}Query> { +export const serviceTemplate = ({ className, upperName, kebabName }: ServiceGeneratorContext) => /* ts */ ` + +export interface ${upperName}Params extends MongoDBAdapterParams<${upperName}Query> { } // By default calls the standard MongoDB adapter service methods but can be customized with your own functionality. -export class ${className} extends MongoDBService<${upperName}Result, ${upperName}Data, ${upperName}Params> { +export class ${className} extends MongoDBService<${upperName}, ${upperName}Data, ${upperName}Params> { } -` - -const optionTemplate = ({ kebabName }: ServiceGeneratorContext) => - ` paginate: app.get('paginate'), - Model: app.get('mongodbClient').then(db => db.collection('${kebabName}'))` -const toServiceFile = toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.service` -]) - -const toClassFile = toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` -]) +export const getOptions = (app: Application) => { + return { + paginate: app.get('paginate'), + Model: app.get('mongodbClient').then(db => db.collection('${kebabName}')) + } +} +` export const generate = (ctx: ServiceGeneratorContext) => generator(ctx) - .then(injectSource(classCode, append(), toClassFile)) - .then(injectSource(importTemplate, prepend(), toClassFile)) - .then(injectSource(optionTemplate, after('const options ='), toServiceFile, false)) + .then( + renderSource( + joinTemplates(importTemplate, serviceImportTemplate, serviceTemplate, serviceRegistrationTemplate), + toFile(({ lib, folder, fileName }) => [ + lib, + 'services', + ...folder, + `${fileName}.service` + ]) + ) + ) + .then(registerService) diff --git a/packages/cli/test/generators.test.ts b/packages/cli/test/generators.test.ts index 07808a2db9..d54d7abfed 100644 --- a/packages/cli/test/generators.test.ts +++ b/packages/cli/test/generators.test.ts @@ -38,6 +38,7 @@ describe('@feathersjs/cli', () => { before(async () => { cwd = await mkdtemp(path.join(os.tmpdir(), name + '-')) + console.log(cwd) context = await generateApp( getContext( { diff --git a/packages/schema/src/hooks/resolve.ts b/packages/schema/src/hooks/resolve.ts index ac6364126c..8312c450a9 100644 --- a/packages/schema/src/hooks/resolve.ts +++ b/packages/schema/src/hooks/resolve.ts @@ -170,6 +170,8 @@ export const resolveDispatch = }) } +export const resolveExternal = resolveDispatch + export const resolveAll = (map: ResolveAllSettings) => { const middleware = [] diff --git a/packages/schema/src/hooks/validate.ts b/packages/schema/src/hooks/validate.ts index 5dcf2c901d..a3126579d5 100644 --- a/packages/schema/src/hooks/validate.ts +++ b/packages/schema/src/hooks/validate.ts @@ -1,14 +1,15 @@ import { HookContext, NextFunction } from '@feathersjs/feathers' -import { BadRequest } from '../../../errors/lib' -import { Schema } from '../schema' +import { BadRequest } from '@feathersjs/errors' +import { DataValidatorMap, Schema, Validator } from '../schema' -export const validateQuery = - (schema: Schema) => - async (context: H, next?: NextFunction) => { +export const validateQuery = (schema: Schema | Validator) => { + const validator: Validator = typeof schema === 'function' ? schema : schema.validate.bind(schema) + + return async (context: H, next?: NextFunction) => { const data = context?.params?.query || {} try { - const query = await schema.validate(data) + const query = await validator(data) context.params = { ...context.params, @@ -22,23 +23,30 @@ export const validateQuery = throw error.ajv ? new BadRequest(error.message, error.errors) : error } } +} -export const validateData = - (schema: Schema) => - async (context: H, next?: NextFunction) => { +export const validateData = (schema: Schema | DataValidatorMap) => { + return async (context: H, next?: NextFunction) => { const data = context.data + const validator = + typeof (schema as Schema).validate === 'function' + ? (schema as Schema).validate.bind(schema) + : (schema as any)[context.method] - try { - if (Array.isArray(data)) { - context.data = await Promise.all(data.map((current) => schema.validate(current))) - } else { - context.data = await schema.validate(data) + if (validator) { + try { + if (Array.isArray(data)) { + context.data = await Promise.all(data.map((current) => validator(current))) + } else { + context.data = await validator(data) + } + } catch (error: any) { + throw error.ajv ? new BadRequest(error.message, error.errors) : error } - } catch (error: any) { - throw error.ajv ? new BadRequest(error.message, error.errors) : error } if (typeof next === 'function') { return next() } } +} diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 9d583be639..292e90e452 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -5,6 +5,7 @@ export * from './schema' export * from './resolver' export * from './hooks' export * from './query' +export * as schemaHooks from './hooks' export type Infer = S['_type'] diff --git a/packages/schema/src/schema.ts b/packages/schema/src/schema.ts index f2c2a9f038..f772d2b522 100644 --- a/packages/schema/src/schema.ts +++ b/packages/schema/src/schema.ts @@ -11,11 +11,57 @@ export { Ajv } export type JSONSchemaDefinition = JSONSchema & { $id: string - $async?: boolean + $async?: true properties?: { [key: string]: JSONSchema } required?: readonly string[] } +export type Validator = (data: T) => Promise + +export type DataSchemaMap = { + create: JSONSchemaDefinition + update?: JSONSchemaDefinition + patch?: JSONSchemaDefinition +} + +export type DataValidatorMap = { + create: Validator + update: Validator + patch: Validator +} + +/** + * Returns a compiled validation function for a schema and AJV validator instance + * + * @param schema The JSON schema definition + * @param validator The AJV validation instance + * @returns A compiled validation function + */ +export const getValidator = (schema: JSONSchemaDefinition, validator: Ajv): Validator => + validator.compile({ + $async: true, + ...(schema as any) + }) as any as Validator + +export const getDataValidator = ( + def: JSONSchemaDefinition | DataSchemaMap, + validator: Ajv +): DataValidatorMap => { + const schema = ((def as any).create ? def : { create: def }) as DataSchemaMap + + return { + create: getValidator(schema.create, validator), + update: getValidator(schema.update || schema.create, validator), + patch: getValidator( + schema.patch || { + ...(schema.create as any), + required: [] + }, + validator + ) + } +} + export interface Schema { validate(...args: Parameters>): Promise } diff --git a/packages/schema/test/fixture.ts b/packages/schema/test/fixture.ts index 72437ae04a..e2b429cd3f 100644 --- a/packages/schema/test/fixture.ts +++ b/packages/schema/test/fixture.ts @@ -3,28 +3,28 @@ import { memory, MemoryService } from '@feathersjs/memory' import { GeneralError } from '@feathersjs/errors' import { - schema, resolve, - Infer, resolveResult, resolveQuery, resolveData, validateData, validateQuery, querySyntax, - Combine, resolveDispatch, resolveAll, - Ajv + Ajv, + FromSchema, + getValidator, + getDataValidator } from '../src' import { AdapterParams } from '../../memory/node_modules/@feathersjs/adapter-commons/lib' const fixtureAjv = new Ajv({ coerceTypes: true, - addUsedSchema: true // default + addUsedSchema: false }) -export const userSchema = schema({ +export const userDataSchema = { $id: 'UserData', type: 'object', additionalProperties: false, @@ -33,28 +33,13 @@ export const userSchema = schema({ email: { type: 'string' }, password: { type: 'string' } } -} as const) +} as const -export const userResultSchema = schema( - { - $id: 'UserResult', - type: 'object', - additionalProperties: false, - required: ['id', ...userSchema.required], - properties: { - ...userSchema.properties, - id: { type: 'number' } - } - } as const, - fixtureAjv -) +export const userDataValidator = getDataValidator(userDataSchema, fixtureAjv) -export type User = Infer -export type UserResult = Infer & { name: string } +export type UserData = FromSchema -export const userDataResolver = resolve>({ - schema: userSchema, - validate: 'before', +export const userDataResolver = resolve>({ properties: { password: async () => { return 'hashed' @@ -62,29 +47,40 @@ export const userDataResolver = resolve>({ } }) -export const userResultResolver = resolve>({ - schema: userResultSchema, +export const userSchema = { + $id: 'User', + type: 'object', + additionalProperties: false, + required: ['id', ...userDataSchema.required], + properties: { + ...userDataSchema.properties, + id: { type: 'number' }, + name: { type: 'string' } + } +} as const + +export type User = FromSchema + +export const userResolver = resolve>({ properties: { name: async (_value, user) => user.email.split('@')[0] } }) -export const userDispatchResolver = resolve>({ - schema: userResultSchema, +export const userExternalResolver = resolve>({ properties: { password: async () => undefined, email: async () => '[redacted]' } }) -export const secondUserResultResolver = resolve>({ - schema: userResultSchema, +export const secondUserResolver = resolve>({ properties: { name: async (value, user) => `${value} (${user.email})` } }) -export const messageSchema = schema({ +export const messageDataSchema = { $id: 'MessageData', type: 'object', additionalProperties: false, @@ -93,33 +89,30 @@ export const messageSchema = schema({ text: { type: 'string' }, userId: { type: 'number' } } -} as const) +} as const -export const messageResultSchema = schema( - { - $id: 'MessageResult', - type: 'object', - additionalProperties: false, - required: ['id', ...messageSchema.required], - properties: { - ...messageSchema.properties, - id: { type: 'number' }, - user: { $ref: 'UserResult' } - } - } as const, - fixtureAjv -) +export type MessageData = FromSchema -export type Message = Infer -export type MessageResult = Combine< - typeof messageResultSchema, +export const messageSchema = { + $id: 'MessageResult', + type: 'object', + additionalProperties: false, + required: ['id', ...messageDataSchema.required], + properties: { + ...messageDataSchema.properties, + id: { type: 'number' }, + user: { $ref: 'User' } + } +} as const + +export type Message = FromSchema< + typeof messageSchema, { - user: User + references: [typeof userSchema] } > -export const messageResultResolver = resolve>({ - schema: messageResultSchema, +export const messageResolver = resolve>({ properties: { user: async (_value, message, context) => { const { userId } = message @@ -128,30 +121,32 @@ export const messageResultResolver = resolve -export type MessageQuery = Infer +export const messageQueryValidator = getValidator(messageQuerySchema, fixtureAjv) export const messageQueryResolver = resolve>({ - schema: messageQuerySchema, - validate: 'before', properties: { userId: async (value, _query, context) => { if (context.params?.user) { @@ -169,9 +164,9 @@ interface ServiceParams extends AdapterParams { } type ServiceTypes = { - users: MemoryService - messages: MemoryService - paginatedMessages: MemoryService + users: MemoryService + messages: MemoryService + paginatedMessages: MemoryService } type Application = FeathersApplication @@ -188,27 +183,27 @@ app.use('paginatedMessages', memory({ paginate: { default: 10 } })) app.service('messages').hooks([ resolveAll({ - result: messageResultResolver, + result: messageResolver, query: messageQueryResolver }), - validateQuery(messageQuerySchema) + validateQuery(messageQueryValidator) ]) app .service('paginatedMessages') .hooks([ - validateQuery(messageQuerySchema), + validateQuery(messageQueryValidator), resolveQuery(messageQueryResolver), - resolveResult(messageResultResolver) + resolveResult(messageResolver) ]) app .service('users') - .hooks([resolveDispatch(userDispatchResolver), resolveResult(userResultResolver, secondUserResultResolver)]) + .hooks([resolveDispatch(userExternalResolver), resolveResult(userResolver, secondUserResolver)]) app.service('users').hooks({ create: [ - validateData(userSchema), + validateData(userDataValidator), resolveData({ create: userDataResolver, patch: userDataResolver, diff --git a/packages/schema/test/hooks.test.ts b/packages/schema/test/hooks.test.ts index de1a2b22da..e1ee48dd82 100644 --- a/packages/schema/test/hooks.test.ts +++ b/packages/schema/test/hooks.test.ts @@ -1,13 +1,13 @@ import { createContext } from '@feathersjs/feathers' import assert from 'assert' -import { app, MessageResult, UserResult } from './fixture' +import { app, Message, User } from './fixture' describe('@feathersjs/schema/hooks', () => { const text = 'Hi there' - let message: MessageResult - let messageOnPaginatedService: MessageResult - let user: UserResult + let message: Message + let messageOnPaginatedService: Message + let user: User before(async () => { user = ( From 39babdff7f2a522c606a201310dbca330c899476 Mon Sep 17 00:00:00 2001 From: daffl Date: Mon, 3 Oct 2022 16:55:35 -0700 Subject: [PATCH 02/11] Fix Express app configuration import --- packages/cli/src/app/templates/app.tpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/app/templates/app.tpl.ts b/packages/cli/src/app/templates/app.tpl.ts index 123974530c..27ce22730d 100644 --- a/packages/cli/src/app/templates/app.tpl.ts +++ b/packages/cli/src/app/templates/app.tpl.ts @@ -69,7 +69,7 @@ import configuration from '@feathersjs/configuration' ${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} import type { Application } from './declarations' -import { configurationSchema } from './configuration' +import { configurationSchema } from './schemas/configuration' import { logger, logErrorHook } from './logger' import { services } from './services/index' import { channels } from './channels' From 9e28bc8155335f07ac6d5c6d46fc1de8b208e2b2 Mon Sep 17 00:00:00 2001 From: daffl Date: Mon, 3 Oct 2022 17:43:17 -0700 Subject: [PATCH 03/11] Improve schema and resolver usage --- .../templates/user.schema.tpl.ts | 8 +- .../cli/src/service/templates/schema.tpl.ts | 8 +- packages/schema/src/hooks/validate.ts | 3 +- packages/schema/src/index.ts | 4 +- packages/schema/src/json-schema.ts | 171 ++++++++++++++++++ packages/schema/src/query.ts | 97 ---------- packages/schema/src/resolver.ts | 25 +++ packages/schema/src/schema.ts | 52 +----- 8 files changed, 215 insertions(+), 153 deletions(-) create mode 100644 packages/schema/src/json-schema.ts delete mode 100644 packages/schema/src/query.ts diff --git a/packages/cli/src/authentication/templates/user.schema.tpl.ts b/packages/cli/src/authentication/templates/user.schema.tpl.ts index 231f6288f7..93fcfefb6c 100644 --- a/packages/cli/src/authentication/templates/user.schema.tpl.ts +++ b/packages/cli/src/authentication/templates/user.schema.tpl.ts @@ -8,7 +8,7 @@ const template = ({ authStrategies, type, relative -}: AuthenticationGeneratorContext) => /* ts */ `import { getValidator, getDataValidator, resolve, querySyntax } from '@feathersjs/schema' +}: AuthenticationGeneratorContext) => /* ts */ `import { resolve, jsonSchema } from '@feathersjs/schema' import type { FromSchema } from '@feathersjs/schema' ${authStrategies.includes('local') ? `import { passwordHash } from '@feathersjs/authentication-local'` : ''} @@ -35,7 +35,7 @@ export const ${camelName}DataSchema = { export type ${upperName}Data = FromSchema -export const ${camelName}DataValidator = getDataValidator(${camelName}DataSchema, dataValidator) +export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ properties: { @@ -76,13 +76,13 @@ export const ${camelName}QuerySchema = { type: 'object', additionalProperties: false, properties: { - ...querySyntax(${camelName}Schema.properties) + ...jsonSchema.querySyntax(${camelName}Schema.properties) } } as const export type ${upperName}Query = FromSchema -export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) +export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ properties: { diff --git a/packages/cli/src/service/templates/schema.tpl.ts b/packages/cli/src/service/templates/schema.tpl.ts index 1c00f6a814..0072bb3ad4 100644 --- a/packages/cli/src/service/templates/schema.tpl.ts +++ b/packages/cli/src/service/templates/schema.tpl.ts @@ -7,7 +7,7 @@ const template = ({ upperName, relative, type -}: ServiceGeneratorContext) => /* ts */ `import { querySyntax, getValidator, getDataValidator, resolve } from '@feathersjs/schema' +}: ServiceGeneratorContext) => /* ts */ `import { jsonSchema, resolve } from '@feathersjs/schema' import type { FromSchema } from '@feathersjs/schema' import type { HookContext } from '${relative}/declarations' @@ -28,7 +28,7 @@ export const ${camelName}DataSchema = { export type ${upperName}Data = FromSchema -export const ${camelName}DataValidator = getDataValidator(${camelName}DataSchema, dataValidator) +export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ properties: {} @@ -64,13 +64,13 @@ export const ${camelName}QuerySchema = { type: 'object', additionalProperties: false, properties: { - ...querySyntax(${camelName}Schema.properties) + ...jsonSchema.querySyntax(${camelName}Schema.properties) } } as const export type ${upperName}Query = FromSchema -export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) +export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ properties: {} diff --git a/packages/schema/src/hooks/validate.ts b/packages/schema/src/hooks/validate.ts index a3126579d5..8c1b37a8da 100644 --- a/packages/schema/src/hooks/validate.ts +++ b/packages/schema/src/hooks/validate.ts @@ -1,6 +1,7 @@ import { HookContext, NextFunction } from '@feathersjs/feathers' import { BadRequest } from '@feathersjs/errors' -import { DataValidatorMap, Schema, Validator } from '../schema' +import { Schema, Validator } from '../schema' +import { DataValidatorMap } from '../json-schema' export const validateQuery = (schema: Schema | Validator) => { const validator: Validator = typeof schema === 'function' ? schema : schema.validate.bind(schema) diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 292e90e452..fc80fd7904 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -4,8 +4,10 @@ export type { FromSchema } from 'json-schema-to-ts' export * from './schema' export * from './resolver' export * from './hooks' -export * from './query' +export * from './json-schema' + export * as schemaHooks from './hooks' +export * as jsonSchema from './json-schema' export type Infer = S['_type'] diff --git a/packages/schema/src/json-schema.ts b/packages/schema/src/json-schema.ts new file mode 100644 index 0000000000..0f74db33b0 --- /dev/null +++ b/packages/schema/src/json-schema.ts @@ -0,0 +1,171 @@ +import { _ } from '@feathersjs/commons' +import { JSONSchema } from 'json-schema-to-ts' +import { JSONSchemaDefinition, Ajv, Validator } from './schema' + +export type DataSchemaMap = { + create: JSONSchemaDefinition + update?: JSONSchemaDefinition + patch?: JSONSchemaDefinition +} + +export type DataValidatorMap = { + create: Validator + update: Validator + patch: Validator +} + +/** + * Returns a compiled validation function for a schema and AJV validator instance. + * + * @param schema The JSON schema definition + * @param validator The AJV validation instance + * @returns A compiled validation function + */ +export const getValidator = (schema: JSONSchemaDefinition, validator: Ajv): Validator => + validator.compile({ + $async: true, + ...(schema as any) + }) as any as Validator + +/** + * Returns compiled validation functions to validate data for the `create`, `update` and `patch` + * service methods. If not passed explicitly, the `update` validator will be the same as the `create` + * and `patch` will be the `create` validator with no required fields. + * + * @param def Either general JSON schema definition or a mapping of `create`, `update` and `patch` + * to their respecitve JSON schema + * @param validator The Ajv instance to use as the validator + * @returns A map of validator functions + */ +export const getDataValidator = ( + def: JSONSchemaDefinition | DataSchemaMap, + validator: Ajv +): DataValidatorMap => { + const schema = ((def as any).create ? def : { create: def }) as DataSchemaMap + + return { + create: getValidator(schema.create, validator), + update: getValidator(schema.update || schema.create, validator), + patch: getValidator( + schema.patch || { + ...(schema.create as any), + required: [] + }, + validator + ) + } +} + +export type PropertyQuery = { + anyOf: [ + D, + { + type: 'object' + additionalProperties: false + properties: { + $gt: D + $gte: D + $lt: D + $lte: D + $ne: D + $in: { + type: 'array' + items: D + } + $nin: { + type: 'array' + items: D + } + } + } + ] +} + +/** + * Create a Feathers query syntax compatible JSON schema definition for a property definition. + * + * @param def The property definition (e.g. `{ type: 'string' }`) + * @returns A JSON schema definition for the Feathers query syntax for this property. + */ +export const queryProperty = (def: T) => { + const definition = _.omit(def, 'default') + return { + anyOf: [ + definition, + { + type: 'object', + additionalProperties: false, + properties: { + $gt: definition, + $gte: definition, + $lt: definition, + $lte: definition, + $ne: definition, + $in: { + type: 'array', + items: definition + }, + $nin: { + type: 'array', + items: definition + } + } + } + ] + } as const +} + +/** + * Creates Feathers a query syntax compatible JSON schema for multiple properties. + * + * @param definition A map of property definitions + * @returns The JSON schema definition for the Feathers query syntax for multiple properties + */ +export const queryProperties = (definition: T) => + Object.keys(definition).reduce((res, key) => { + const result = res as any + + result[key] = queryProperty(definition[key]) + + return result + }, {} as { [K in keyof T]: PropertyQuery }) + +/** + * Creates a JSON schema for the complete Feathers query syntax including `$limit`, $skip` + * and `$sort` and `$select` for the allowed properties. + * + * @param definition The property definitions to create the query syntax schema for + * @returns A JSON schema for the complete query syntax + */ +export const querySyntax = (definition: T) => + ({ + $limit: { + type: 'number', + minimum: 0 + }, + $skip: { + type: 'number', + minimum: 0 + }, + $sort: { + type: 'object', + properties: Object.keys(definition).reduce((res, key) => { + const result = res as any + + result[key] = { + type: 'number', + enum: [1, -1] + } + + return result + }, {} as { [K in keyof T]: { readonly type: 'number'; readonly enum: [1, -1] } }) + }, + $select: { + type: 'array', + items: { + type: 'string', + enum: Object.keys(definition) as any as (keyof T)[] + } + }, + ...queryProperties(definition) + } as const) diff --git a/packages/schema/src/query.ts b/packages/schema/src/query.ts deleted file mode 100644 index e786069ea5..0000000000 --- a/packages/schema/src/query.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { _ } from '@feathersjs/commons' -import { JSONSchema } from 'json-schema-to-ts' - -export type PropertyQuery = { - anyOf: [ - D, - { - type: 'object' - additionalProperties: false - properties: { - $gt: D - $gte: D - $lt: D - $lte: D - $ne: D - $in: { - type: 'array' - items: D - } - $nin: { - type: 'array' - items: D - } - } - } - ] -} - -export const queryProperty = (def: T) => { - const definition = _.omit(def, 'default') - return { - anyOf: [ - definition, - { - type: 'object', - additionalProperties: false, - properties: { - $gt: definition, - $gte: definition, - $lt: definition, - $lte: definition, - $ne: definition, - $in: { - type: 'array', - items: definition - }, - $nin: { - type: 'array', - items: definition - } - } - } - ] - } as const -} - -export const queryProperties = (definition: T) => - Object.keys(definition).reduce((res, key) => { - const result = res as any - - result[key] = queryProperty(definition[key]) - - return result - }, {} as { [K in keyof T]: PropertyQuery }) - -export const querySyntax = (definition: T) => - ({ - $limit: { - type: 'number', - minimum: 0 - }, - $skip: { - type: 'number', - minimum: 0 - }, - $sort: { - type: 'object', - properties: Object.keys(definition).reduce((res, key) => { - const result = res as any - - result[key] = { - type: 'number', - enum: [1, -1] - } - - return result - }, {} as { [K in keyof T]: { readonly type: 'number'; readonly enum: [1, -1] } }) - }, - $select: { - type: 'array', - items: { - type: 'string', - enum: Object.keys(definition) as any as (keyof T)[] - } - }, - ...queryProperties(definition) - } as const) diff --git a/packages/schema/src/resolver.ts b/packages/schema/src/resolver.ts index eb8343c309..26ad0af727 100644 --- a/packages/schema/src/resolver.ts +++ b/packages/schema/src/resolver.ts @@ -20,8 +20,18 @@ export type ResolverConverter = ( export interface ResolverConfig { schema?: Schema + /** + * @deprecated Use the `validateData` and `validateQuery` hooks explicitly instead + */ validate?: 'before' | 'after' | false + /** + * The properties to resolve + */ properties: PropertyResolverMap + /** + * A converter function that is run before property resolvers + * to transform the initial data into a different format. + */ converter?: ResolverConverter } @@ -37,6 +47,15 @@ export class Resolver { constructor(public options: ResolverConfig) {} + /** + * Resolve a single property + * + * @param name The name of the property + * @param data The current data + * @param context The current resolver context + * @param status The current resolver status + * @returns The resolver property + */ async resolveProperty( name: K, data: D, @@ -122,6 +141,12 @@ export class Resolver { } } +/** + * Create a new resolver with ``. + * + * @param options The configuration for the returned resolver + * @returns A new resolver instance + */ export function resolve(options: ResolverConfig) { return new Resolver(options) } diff --git a/packages/schema/src/schema.ts b/packages/schema/src/schema.ts index f772d2b522..293d086d52 100644 --- a/packages/schema/src/schema.ts +++ b/packages/schema/src/schema.ts @@ -9,6 +9,12 @@ export const DEFAULT_AJV = new Ajv({ export { Ajv } +/** + * A validation function that takes data and returns the (possibly coerced) + * data or throws a validation error. + */ +export type Validator = (data: T) => Promise + export type JSONSchemaDefinition = JSONSchema & { $id: string $async?: true @@ -16,52 +22,6 @@ export type JSONSchemaDefinition = JSONSchema & { required?: readonly string[] } -export type Validator = (data: T) => Promise - -export type DataSchemaMap = { - create: JSONSchemaDefinition - update?: JSONSchemaDefinition - patch?: JSONSchemaDefinition -} - -export type DataValidatorMap = { - create: Validator - update: Validator - patch: Validator -} - -/** - * Returns a compiled validation function for a schema and AJV validator instance - * - * @param schema The JSON schema definition - * @param validator The AJV validation instance - * @returns A compiled validation function - */ -export const getValidator = (schema: JSONSchemaDefinition, validator: Ajv): Validator => - validator.compile({ - $async: true, - ...(schema as any) - }) as any as Validator - -export const getDataValidator = ( - def: JSONSchemaDefinition | DataSchemaMap, - validator: Ajv -): DataValidatorMap => { - const schema = ((def as any).create ? def : { create: def }) as DataSchemaMap - - return { - create: getValidator(schema.create, validator), - update: getValidator(schema.update || schema.create, validator), - patch: getValidator( - schema.patch || { - ...(schema.create as any), - required: [] - }, - validator - ) - } -} - export interface Schema { validate(...args: Parameters>): Promise } From aeeb0d2507628d84883604c09cec77768d1d134d Mon Sep 17 00:00:00 2001 From: daffl Date: Mon, 3 Oct 2022 22:44:40 -0700 Subject: [PATCH 04/11] Allow to generate services without schema --- packages/cli/src/app/index.ts | 35 +++++++++------ .../cli/src/app/templates/package.json.tpl.ts | 6 ++- packages/cli/src/authentication/index.ts | 10 ++++- .../authentication/templates/config.tpl.ts | 2 +- .../src/authentication/templates/test.tpl.ts | 3 +- packages/cli/src/commons.ts | 4 ++ packages/cli/src/service/index.ts | 31 ++++++++++++- packages/cli/src/service/service.tpl.ts | 43 ++++++++++++++----- .../cli/src/service/templates/client.tpl.ts | 2 +- .../cli/src/service/templates/schema.tpl.ts | 21 +++++---- packages/cli/test/generators.test.ts | 13 +++--- packages/schema/src/index.ts | 2 +- 12 files changed, 122 insertions(+), 50 deletions(-) diff --git a/packages/cli/src/app/index.ts b/packages/cli/src/app/index.ts index d3d017fec4..a5dbb9fb1a 100644 --- a/packages/cli/src/app/index.ts +++ b/packages/cli/src/app/index.ts @@ -109,10 +109,21 @@ export const generate = (ctx: AppGeneratorArguments) => { value: 'pnpm', name: 'pnpm' } ] }, + { + type: 'list', + name: 'schema', + when: !ctx.schema, + message: 'What is your preferred schema (model) definition format?', + choices: [ + { value: 'typebox', name: `TypeBox ${chalk.grey('(recommended)')}` }, + { value: 'json', name: 'JSON schema' } + ] + }, ...connectionPrompts(ctx), ...authenticationPrompts({ ...ctx, - service: 'users', + service: 'user', + path: 'users', entity: 'user' }) ]) @@ -120,26 +131,22 @@ export const generate = (ctx: AppGeneratorArguments) => .then(runGenerators(__dirname, 'templates')) .then(copyFiles(fromFile(__dirname, 'static'), toFile('.'))) .then(initializeBaseContext()) - .then( - when( - ({ authStrategies }) => authStrategies.length > 0, - async (ctx) => { - const { dependencies } = await connectionGenerator(ctx) + .then(async (ctx) => { + const { dependencies } = await connectionGenerator(ctx) - return { - ...ctx, - dependencies - } - } - ) - ) + return { + ...ctx, + dependencies + } + }) .then( when( ({ authStrategies }) => authStrategies.length > 0, async (ctx) => { const { dependencies } = await authenticationGenerator({ ...ctx, - service: 'users', + service: 'user', + path: 'users', entity: 'user' }) diff --git a/packages/cli/src/app/templates/package.json.tpl.ts b/packages/cli/src/app/templates/package.json.tpl.ts index ad90ada521..19b867dc46 100644 --- a/packages/cli/src/app/templates/package.json.tpl.ts +++ b/packages/cli/src/app/templates/package.json.tpl.ts @@ -33,7 +33,8 @@ const packageJson = ({ framework, transports, lib, - test + test, + schema }: AppGeneratorContext) => ({ name, description, @@ -52,7 +53,8 @@ const packageJson = ({ packager, database, framework, - transports + transports, + schema }, directories: { lib, diff --git a/packages/cli/src/authentication/index.ts b/packages/cli/src/authentication/index.ts index 4f4fce804f..553e81c4e9 100644 --- a/packages/cli/src/authentication/index.ts +++ b/packages/cli/src/authentication/index.ts @@ -17,7 +17,7 @@ export interface AuthenticationGeneratorContext extends ServiceGeneratorContext } export type AuthenticationGeneratorArguments = FeathersBaseContext & - Partial> + Partial> export const prompts = (ctx: AuthenticationGeneratorArguments) => [ { @@ -59,6 +59,13 @@ export const prompts = (ctx: AuthenticationGeneratorArguments) => [ type: 'input', when: !ctx.service, message: 'What is your authentication service name?', + default: 'user' + }, + { + name: 'path', + type: 'input', + when: !ctx.path, + message: 'What path should the service be registered on?', default: 'users' }, { @@ -80,7 +87,6 @@ export const generate = (ctx: AuthenticationGeneratorArguments) => const serviceContext = await serviceGenerator({ ...ctx, name: ctx.service, - path: ctx.service, isEntityService: true, type: getDatabaseAdapter(ctx.feathers?.database) }) diff --git a/packages/cli/src/authentication/templates/config.tpl.ts b/packages/cli/src/authentication/templates/config.tpl.ts index 14d72b0026..598f0a84cc 100644 --- a/packages/cli/src/authentication/templates/config.tpl.ts +++ b/packages/cli/src/authentication/templates/config.tpl.ts @@ -8,7 +8,7 @@ export const generate = (ctx: AuthenticationGeneratorContext) => mergeJSON(({ authStrategies }) => { const authentication: any = { entity: ctx.entity, - service: ctx.service, + service: ctx.path, secret: crypto.randomBytes(24).toString('base64'), authStrategies: ['jwt'], jwtOptions: { diff --git a/packages/cli/src/authentication/templates/test.tpl.ts b/packages/cli/src/authentication/templates/test.tpl.ts index 39c6e80597..722cc2f427 100644 --- a/packages/cli/src/authentication/templates/test.tpl.ts +++ b/packages/cli/src/authentication/templates/test.tpl.ts @@ -4,6 +4,7 @@ import { AuthenticationGeneratorContext } from '../index' const template = ({ authStrategies, + path, lib }: AuthenticationGeneratorContext) => /* ts */ `import assert from 'assert'; import { app } from '../${lib}/app'; @@ -19,7 +20,7 @@ describe('authentication', () => { before(async () => { try { - await app.service('users').create(userInfo) + await app.service('${path}').create(userInfo) } catch (error) { // Do nothing, it just means the user already exists and can be tested } diff --git a/packages/cli/src/commons.ts b/packages/cli/src/commons.ts index 49f6e8b17f..449c802f4b 100644 --- a/packages/cli/src/commons.ts +++ b/packages/cli/src/commons.ts @@ -54,6 +54,10 @@ export type FeathersAppInfo = { * The HTTP framework used */ framework: 'koa' | 'express' + /** + * The main schema definition format + */ + schema: 'typebox' | 'json' } export interface AppPackageJson extends PackageJson { diff --git a/packages/cli/src/service/index.ts b/packages/cli/src/service/index.ts index 16108085af..864fb47217 100644 --- a/packages/cli/src/service/index.ts +++ b/packages/cli/src/service/index.ts @@ -49,6 +49,10 @@ export interface ServiceGeneratorContext extends FeathersBaseContext { * The chosen service type */ type: 'knex' | 'mongodb' | 'custom' + /** + * Which schema definition format to use + */ + schema: 'typebox' | 'json' | false /** * Wether this service uses authentication */ @@ -63,7 +67,9 @@ export interface ServiceGeneratorContext extends FeathersBaseContext { * Parameters the generator is called with */ export type ServiceGeneratorArguments = FeathersBaseContext & - Partial> + Partial< + Pick + > export const generate = (ctx: ServiceGeneratorArguments) => generator(ctx) @@ -71,7 +77,7 @@ export const generate = (ctx: ServiceGeneratorArguments) => .then(checkPreconditions()) .then( prompt( - ({ name, path, type, authentication, isEntityService }) => [ + ({ name, path, type, schema, authentication, isEntityService }) => [ { name: 'name', type: 'input', @@ -111,6 +117,27 @@ export const generate = (ctx: ServiceGeneratorArguments) => name: 'A custom service' } ] + }, + { + name: 'schema', + type: 'list', + when: schema === undefined, + message: 'Which schema definition format do you want to use?', + choices: [ + { + value: 'json', + name: 'JSON schema' + }, + { + value: 'typebox', + name: 'TypeBox', + disabled: true + }, + { + value: false, + name: 'No schema' + } + ] } ] ) diff --git a/packages/cli/src/service/service.tpl.ts b/packages/cli/src/service/service.tpl.ts index 3fb6a8529f..330cf1a55a 100644 --- a/packages/cli/src/service/service.tpl.ts +++ b/packages/cli/src/service/service.tpl.ts @@ -28,14 +28,17 @@ export const serviceImportTemplate = ({ camelName, upperName, fileName, - relative + relative, + schema }: ServiceGeneratorContext) => ` ${authentication || isEntityService ? `import { authenticate } from '@feathersjs/authentication'` : ''} -import { schemaHooks } from '@feathersjs/schema' +${schema ? `import { hooks as schemaHooks } from '@feathersjs/schema'` : ''} import type { Application } from '${relative}/declarations' -import { +${ + schema + ? `import { ${camelName}DataValidator, ${camelName}QueryValidator, ${camelName}Resolver, @@ -48,7 +51,16 @@ import type { ${upperName}, ${upperName}Data, ${upperName}Query -} from './${fileName}.schema'` +} from './${fileName}.schema' + +export * from './${fileName}.schema' +` + : ` +export type ${upperName} = any +export type ${upperName}Data = any +export type ${upperName}Query = any +` +}` export const serviceRegistrationTemplate = ({ camelName, @@ -56,7 +68,8 @@ export const serviceRegistrationTemplate = ({ isEntityService, path, className, - relative + relative, + schema }: ServiceGeneratorContext) => /* ts */ ` export const ${camelName}Hooks = { around: { @@ -79,20 +92,30 @@ export const ${camelName}Hooks = { } }, before: { - all: [ + all: [${ + schema + ? ` schemaHooks.validateQuery(${camelName}QueryValidator), schemaHooks.validateData(${camelName}DataValidator), schemaHooks.resolveQuery(${camelName}QueryResolver), schemaHooks.resolveData(${camelName}DataResolver) - ] + ` + : '' + }] }, after: { - all: [ + all: [${ + schema + ? ` schemaHooks.resolveResult(${camelName}Resolver), schemaHooks.resolveExternal(${camelName}ExternalResolver) - ] + ` + : '' + }] }, - error: {} + error: { + all: [] + } } // A configure function that registers the service and its hooks via \`app.configure\` diff --git a/packages/cli/src/service/templates/client.tpl.ts b/packages/cli/src/service/templates/client.tpl.ts index 01f3c6bc16..4a570ee4b2 100644 --- a/packages/cli/src/service/templates/client.tpl.ts +++ b/packages/cli/src/service/templates/client.tpl.ts @@ -5,7 +5,7 @@ const schemaImports = ({ upperName, folder, fileName }: ServiceGeneratorContext) ${upperName}, ${upperName}Data, ${upperName}Query, -} from './services/${folder.join('/')}/${fileName}.schema' +} from './services/${folder.join('/')}/${fileName}.service' export type { ${upperName}, diff --git a/packages/cli/src/service/templates/schema.tpl.ts b/packages/cli/src/service/templates/schema.tpl.ts index 0072bb3ad4..a7dfbc103c 100644 --- a/packages/cli/src/service/templates/schema.tpl.ts +++ b/packages/cli/src/service/templates/schema.tpl.ts @@ -1,4 +1,4 @@ -import { generator, toFile } from '@feathershq/pinion' +import { generator, toFile, when } from '@feathershq/pinion' import { renderSource } from '../../commons' import { ServiceGeneratorContext } from '../index' @@ -79,13 +79,16 @@ export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext> export const generate = (ctx: ServiceGeneratorContext) => generator(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.schema` - ]) + when( + ({ schema }) => schema !== false, + renderSource( + template, + toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ + lib, + 'services', + ...folder, + `${fileName}.schema` + ]) + ) ) ) diff --git a/packages/cli/test/generators.test.ts b/packages/cli/test/generators.test.ts index d54d7abfed..54b538a0bc 100644 --- a/packages/cli/test/generators.test.ts +++ b/packages/cli/test/generators.test.ts @@ -53,7 +53,7 @@ describe('@feathersjs/cli', () => { connectionString: `${name}.sqlite`, transports: ['rest', 'websockets'], authStrategies: ['local', 'github'], - _: ['generate', 'app'] + schema: 'typebox' }, { cwd } ) @@ -73,8 +73,7 @@ describe('@feathersjs/cli', () => { { dependencyVersions, database: 'mongodb' as const, - connectionString: `mongodb://localhost:27017/${name}`, - _: ['generate', 'connection'] + connectionString: `mongodb://localhost:27017/${name}` }, { cwd } ) @@ -87,7 +86,7 @@ describe('@feathersjs/cli', () => { path: 'path/to/test', authentication: true, type: 'mongodb', - _: ['generate', 'service'] + schema: false }, { cwd } ) @@ -104,11 +103,11 @@ describe('@feathersjs/cli', () => { getContext( { dependencyVersions, - name: 'Custom Service', - path: 'custom', + name: 'Custom', + path: 'customized', authentication: false, type: 'custom', - _: ['generate', 'service'] + schema: 'typebox' }, { cwd } ) diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index fc80fd7904..b1aa00b159 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -6,7 +6,7 @@ export * from './resolver' export * from './hooks' export * from './json-schema' -export * as schemaHooks from './hooks' +export * as hooks from './hooks' export * as jsonSchema from './json-schema' export type Infer = S['_type'] From 1a0b0571c9152a424bbce635ca4a7d5c51a84ea8 Mon Sep 17 00:00:00 2001 From: daffl Date: Mon, 3 Oct 2022 23:00:09 -0700 Subject: [PATCH 05/11] Add some minor prompt validatoin --- packages/cli/src/app/index.ts | 9 ++++++++- packages/cli/src/service/index.ts | 28 +++++++++++++++++++++------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/packages/cli/src/app/index.ts b/packages/cli/src/app/index.ts index a5dbb9fb1a..2e159921dc 100644 --- a/packages/cli/src/app/index.ts +++ b/packages/cli/src/app/index.ts @@ -70,7 +70,14 @@ export const generate = (ctx: AppGeneratorArguments) => type: 'input', when: !ctx.name, message: 'What is the name of your application?', - default: ctx.cwd.split(sep).pop() + default: ctx.cwd.split(sep).pop(), + validate: (input) => { + if (ctx.dependencyVersions[input]) { + return `Application can not have the same name as a dependency` + } + + return true + } }, { name: 'description', diff --git a/packages/cli/src/service/index.ts b/packages/cli/src/service/index.ts index 864fb47217..1db7950e89 100644 --- a/packages/cli/src/service/index.ts +++ b/packages/cli/src/service/index.ts @@ -82,14 +82,28 @@ export const generate = (ctx: ServiceGeneratorArguments) => name: 'name', type: 'input', when: !name, - message: 'What is the name of your service?' + message: 'What is the name of your service?', + validate: (input) => { + if (!input || input === 'authentication') { + return 'Invalid service name' + } + + return true + } }, { name: 'path', type: 'input', when: !path, message: 'Which path should the service be registered on?', - default: (answers: ServiceGeneratorArguments) => `${_.kebabCase(answers.name)}` + default: (answers: ServiceGeneratorArguments) => `${_.kebabCase(answers.name)}`, + validate: (input) => { + if (!input || input === 'authentication') { + return 'Invalid service path' + } + + return true + } }, { name: 'authentication', @@ -123,15 +137,15 @@ export const generate = (ctx: ServiceGeneratorArguments) => type: 'list', when: schema === undefined, message: 'Which schema definition format do you want to use?', + default: ctx.feathers?.schema, choices: [ { - value: 'json', - name: 'JSON schema' + value: 'typebox', + name: 'TypeBox' }, { - value: 'typebox', - name: 'TypeBox', - disabled: true + value: 'json', + name: 'JSON schema' }, { value: false, From 8903214a38e3b37b2be22a15fedf22c208b37c83 Mon Sep 17 00:00:00 2001 From: daffl Date: Tue, 4 Oct 2022 12:26:35 -0700 Subject: [PATCH 06/11] Add Typebox integration --- package-lock.json | 11 ++ packages/cli/src/app/templates/schemas.tpl.ts | 31 ++++-- ...{user.schema.tpl.ts => schema.json.tpl.ts} | 23 ++-- .../templates/schema.typebox.tpl.ts | 101 ++++++++++++++++++ packages/cli/src/service/service.tpl.ts | 14 +-- .../{schema.tpl.ts => schema.json.tpl.ts} | 2 +- .../service/templates/schema.typebox.tpl.ts | 76 +++++++++++++ packages/schema/package.json | 2 + packages/schema/src/index.ts | 6 ++ packages/schema/src/json-schema.ts | 23 ++-- packages/schema/src/typebox.ts | 72 +++++++++++++ packages/schema/test/typebox.test.ts | 29 +++++ 12 files changed, 359 insertions(+), 31 deletions(-) rename packages/cli/src/authentication/templates/{user.schema.tpl.ts => schema.json.tpl.ts} (89%) create mode 100644 packages/cli/src/authentication/templates/schema.typebox.tpl.ts rename packages/cli/src/service/templates/{schema.tpl.ts => schema.json.tpl.ts} (98%) create mode 100644 packages/cli/src/service/templates/schema.typebox.tpl.ts create mode 100644 packages/schema/src/typebox.ts create mode 100644 packages/schema/test/typebox.test.ts diff --git a/package-lock.json b/package-lock.json index 9f86f43014..7f49cb69df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@feathershq/pinion": "^0.3.5", "@feathersjs/hooks": "^0.7.5", "@koa/cors": "^3.4.1", + "@sinclair/typebox": "^0.24.44", "@types/bcryptjs": "^2.4.2", "@types/config": "^3.3.0", "@types/cookie-session": "^2.0.44", @@ -3599,6 +3600,11 @@ "node": ">=12" } }, + "node_modules/@sinclair/typebox": { + "version": "0.24.44", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.44.tgz", + "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg==" + }, "node_modules/@sindresorhus/is": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", @@ -21454,6 +21460,11 @@ "config-chain": "^1.1.11" } }, + "@sinclair/typebox": { + "version": "0.24.44", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.44.tgz", + "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg==" + }, "@sindresorhus/is": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", diff --git a/packages/cli/src/app/templates/schemas.tpl.ts b/packages/cli/src/app/templates/schemas.tpl.ts index 40f815968e..31ab13d75a 100644 --- a/packages/cli/src/app/templates/schemas.tpl.ts +++ b/packages/cli/src/app/templates/schemas.tpl.ts @@ -2,16 +2,31 @@ import { generator, toFile } from '@feathershq/pinion' import { renderSource } from '../../commons' import { AppGeneratorContext } from '../index' -const validatorTemplate = /* ts */ `import { Ajv } from '@feathersjs/schema' +const validatorTemplate = /* ts */ `import { Ajv, addFormats } from '@feathersjs/schema' +import type { FormatsPluginOptions } from '@feathersjs/schema' -export const dataValidator = new Ajv({ - addUsedSchema: false -}) +const formats: FormatsPluginOptions = [ + 'date-time', + 'time', + 'date', + 'email', + 'hostname', + 'ipv4', + 'ipv6', + 'uri', + 'uri-reference', + 'uuid', + 'uri-template', + 'json-pointer', + 'relative-json-pointer', + 'regex' +] -export const queryValidator = new Ajv({ - coerceTypes: true, - addUsedSchema: false -}) +export const dataValidator = addFormats(new Ajv({}), formats) + +export const queryValidator = addFormats(new Ajv({ + coerceTypes: true +}), formats) ` const configurationTemplate = diff --git a/packages/cli/src/authentication/templates/user.schema.tpl.ts b/packages/cli/src/authentication/templates/schema.json.tpl.ts similarity index 89% rename from packages/cli/src/authentication/templates/user.schema.tpl.ts rename to packages/cli/src/authentication/templates/schema.json.tpl.ts index 93fcfefb6c..3bbe289611 100644 --- a/packages/cli/src/authentication/templates/user.schema.tpl.ts +++ b/packages/cli/src/authentication/templates/schema.json.tpl.ts @@ -1,4 +1,4 @@ -import { generator, toFile } from '@feathershq/pinion' +import { generator, toFile, when } from '@feathershq/pinion' import { renderSource } from '../../commons' import { AuthenticationGeneratorContext } from '../index' @@ -100,14 +100,17 @@ export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext> export const generate = (ctx: AuthenticationGeneratorContext) => generator(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }: AuthenticationGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.schema` - ]), - { force: true } + when( + ({ schema }) => schema === 'json', + renderSource( + template, + toFile(({ lib, folder, fileName }: AuthenticationGeneratorContext) => [ + lib, + 'services', + ...folder, + `${fileName}.schema` + ]), + { force: true } + ) ) ) diff --git a/packages/cli/src/authentication/templates/schema.typebox.tpl.ts b/packages/cli/src/authentication/templates/schema.typebox.tpl.ts new file mode 100644 index 0000000000..0590e51769 --- /dev/null +++ b/packages/cli/src/authentication/templates/schema.typebox.tpl.ts @@ -0,0 +1,101 @@ +import { generator, toFile, when } from '@feathershq/pinion' +import { renderSource } from '../../commons' +import { AuthenticationGeneratorContext } from '../index' + +export const template = ({ + camelName, + upperName, + authStrategies, + type, + relative +}: AuthenticationGeneratorContext) => /* ts */ `import { Type, typebox, jsonSchema, resolve } from '@feathersjs/schema' +import type { Static } from '@feathersjs/schema' +${authStrategies.includes('local') ? `import { passwordHash } from '@feathersjs/authentication-local'` : ''} + +import type { HookContext } from '${relative}/declarations' +import { dataValidator, queryValidator } from '${relative}/schemas/validators' + +// Schema for the basic data model (e.g. creating new entries) +export const ${camelName}DataSchema = Type.Object({ + ${authStrategies + .map((name) => + name === 'local' + ? ` email: Type.String(), + password: Type.String()` + : ` ${name}Id: Type.Optional(Type.String())` + ) + .join(',\n')} +}, { $id: '${upperName}Data', additionalProperties: false }) + +export type ${upperName}Data = Static + +export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) + +export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ + properties: { + ${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''} + } +}) + +// Schema for the data that is being returned +export const ${camelName}Schema = Type.Intersect([ + ${camelName}DataSchema, + Type.Object({ + ${type === 'mongodb' ? '_id: Type.String()' : 'id: Type.Number()'} + }) +], { $id: '${upperName}' }) + +export type ${upperName} = Static + +export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ + properties: {} +}) + +export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({ + properties: { + // The password should never be visible externally + password: async () => undefined + } +}) + +// Schema for allowed query properties +export const ${camelName}QuerySchema = Type.Intersect([ + typebox.querySyntax(${camelName}Schema), + // Add additional query properties here + Type.Object({}) +]) + +export type ${upperName}Query = Static + +export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) + +export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ + properties: { + // If there is a user (e.g. with authentication), they are only allowed to see their own data + ${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => { + if (context.params.user) { + return context.params.user.${type === 'mongodb' ? '_id' : 'id'} + } + + return value + } + } +}) +` + +export const generate = (ctx: AuthenticationGeneratorContext) => + generator(ctx).then( + when( + ({ schema }) => schema === 'typebox', + renderSource( + template, + toFile(({ lib, folder, fileName }: AuthenticationGeneratorContext) => [ + lib, + 'services', + ...folder, + `${fileName}.schema` + ]), + { force: true } + ) + ) + ) diff --git a/packages/cli/src/service/service.tpl.ts b/packages/cli/src/service/service.tpl.ts index 330cf1a55a..dfcafa5803 100644 --- a/packages/cli/src/service/service.tpl.ts +++ b/packages/cli/src/service/service.tpl.ts @@ -32,13 +32,12 @@ export const serviceImportTemplate = ({ schema }: ServiceGeneratorContext) => ` ${authentication || isEntityService ? `import { authenticate } from '@feathersjs/authentication'` : ''} -${schema ? `import { hooks as schemaHooks } from '@feathersjs/schema'` : ''} - -import type { Application } from '${relative}/declarations' - ${ schema - ? `import { + ? ` +import { hooks as schemaHooks } from '@feathersjs/schema' + +import { ${camelName}DataValidator, ${camelName}QueryValidator, ${camelName}Resolver, @@ -60,7 +59,10 @@ export type ${upperName} = any export type ${upperName}Data = any export type ${upperName}Query = any ` -}` +} + +import type { Application } from '${relative}/declarations' +` export const serviceRegistrationTemplate = ({ camelName, diff --git a/packages/cli/src/service/templates/schema.tpl.ts b/packages/cli/src/service/templates/schema.json.tpl.ts similarity index 98% rename from packages/cli/src/service/templates/schema.tpl.ts rename to packages/cli/src/service/templates/schema.json.tpl.ts index a7dfbc103c..dec1392708 100644 --- a/packages/cli/src/service/templates/schema.tpl.ts +++ b/packages/cli/src/service/templates/schema.json.tpl.ts @@ -80,7 +80,7 @@ export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext> export const generate = (ctx: ServiceGeneratorContext) => generator(ctx).then( when( - ({ schema }) => schema !== false, + ({ schema }) => schema === 'json', renderSource( template, toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ diff --git a/packages/cli/src/service/templates/schema.typebox.tpl.ts b/packages/cli/src/service/templates/schema.typebox.tpl.ts new file mode 100644 index 0000000000..b247010eee --- /dev/null +++ b/packages/cli/src/service/templates/schema.typebox.tpl.ts @@ -0,0 +1,76 @@ +import { generator, toFile, when } from '@feathershq/pinion' +import { renderSource } from '../../commons' +import { ServiceGeneratorContext } from '../index' + +const template = ({ + camelName, + upperName, + relative, + type +}: ServiceGeneratorContext) => /* ts */ `import { Type, jsonSchema, typebox, resolve } from '@feathersjs/schema' +import type { Static } from '@feathersjs/schema' + +import type { HookContext } from '${relative}/declarations' +import { dataValidator, queryValidator } from '${relative}/schemas/validators' + +// Schema for the basic data model (e.g. creating new entries) +export const ${camelName}DataSchema = Type.Object({ + text: Type.String() +}, { $id: '${upperName}Data', additionalProperties: false }) + +export type ${upperName}Data = Static + +export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) + +export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ + properties: {} +}) + +export const ${camelName}Schema = Type.Intersect([ + ${camelName}DataSchema, + Type.Object({ + ${type === 'mongodb' ? '_id: Type.String()' : 'id: Type.Number()'} + }) +], { $id: '${upperName}', additionalProperties: false }) + +export type ${upperName} = Static + +export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ + properties: {} +}) + +export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({ + properties: {} +}) + +// Schema for allowed query properties +export const ${camelName}QuerySchema = Type.Intersect([ + typebox.querySyntax(${camelName}Schema), + // Add additional query properties here + Type.Object({}) +]) + +export type ${upperName}Query = Static + +export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) + +export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ + properties: {} +}) +` + +export const generate = (ctx: ServiceGeneratorContext) => + generator(ctx).then( + when( + ({ schema }) => schema === 'typebox', + renderSource( + template, + toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ + lib, + 'services', + ...folder, + `${fileName}.schema` + ]) + ) + ) + ) diff --git a/packages/schema/package.json b/packages/schema/package.json index 80f50baa8f..b1cb1c45c8 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -58,8 +58,10 @@ "@feathersjs/errors": "^5.0.0-pre.29", "@feathersjs/feathers": "^5.0.0-pre.29", "@feathersjs/hooks": "^0.7.5", + "@sinclair/typebox": "^0.24.44", "@types/json-schema": "^7.0.11", "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", "json-schema": "^0.4.0", "json-schema-to-ts": "^2.5.5" }, diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index b1aa00b159..10b7186921 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -1,6 +1,11 @@ +import addFormats, { FormatName, FormatOptions, FormatsPluginOptions } from 'ajv-formats' import { ResolverStatus } from './resolver' export type { FromSchema } from 'json-schema-to-ts' +export { addFormats, FormatName, FormatOptions, FormatsPluginOptions } + +export * from '@sinclair/typebox' + export * from './schema' export * from './resolver' export * from './hooks' @@ -8,6 +13,7 @@ export * from './json-schema' export * as hooks from './hooks' export * as jsonSchema from './json-schema' +export * as typebox from './typebox' export type Infer = S['_type'] diff --git a/packages/schema/src/json-schema.ts b/packages/schema/src/json-schema.ts index 0f74db33b0..46c64f30c9 100644 --- a/packages/schema/src/json-schema.ts +++ b/packages/schema/src/json-schema.ts @@ -1,11 +1,12 @@ import { _ } from '@feathersjs/commons' import { JSONSchema } from 'json-schema-to-ts' +import { TObject } from '@sinclair/typebox' import { JSONSchemaDefinition, Ajv, Validator } from './schema' export type DataSchemaMap = { - create: JSONSchemaDefinition - update?: JSONSchemaDefinition - patch?: JSONSchemaDefinition + create: JSONSchemaDefinition | TObject + update?: JSONSchemaDefinition | TObject + patch?: JSONSchemaDefinition | TObject } export type DataValidatorMap = { @@ -21,7 +22,10 @@ export type DataValidatorMap = { * @param validator The AJV validation instance * @returns A compiled validation function */ -export const getValidator = (schema: JSONSchemaDefinition, validator: Ajv): Validator => +export const getValidator = ( + schema: JSONSchemaDefinition | TObject, + validator: Ajv +): Validator => validator.compile({ $async: true, ...(schema as any) @@ -38,17 +42,24 @@ export const getValidator = (schema: JSONSchemaDefinition, valid * @returns A map of validator functions */ export const getDataValidator = ( - def: JSONSchemaDefinition | DataSchemaMap, + def: JSONSchemaDefinition | TObject | DataSchemaMap, validator: Ajv ): DataValidatorMap => { const schema = ((def as any).create ? def : { create: def }) as DataSchemaMap return { create: getValidator(schema.create, validator), - update: getValidator(schema.update || schema.create, validator), + update: getValidator( + schema.update || { + ...(schema.create as any), + $id: `${schema.create.$id}Update` + }, + validator + ), patch: getValidator( schema.patch || { ...(schema.create as any), + $id: `${schema.create.$id}Patch`, required: [] }, validator diff --git a/packages/schema/src/typebox.ts b/packages/schema/src/typebox.ts new file mode 100644 index 0000000000..5c870a79c4 --- /dev/null +++ b/packages/schema/src/typebox.ts @@ -0,0 +1,72 @@ +import { Type, TObject, TInteger, TOptional, TSchema, TIntersect } from '@sinclair/typebox' + +const arrayOfKeys = (type: T) => { + const keys = Object.keys(type.properties) + return Type.Unsafe<(keyof T['properties'])[]>({ type: 'array', items: { type: 'string', enum: keys } }) +} + +export function sortDefinition(schema: T) { + const properties = Object.keys(schema.properties).reduce((res, key) => { + const result = res as any + + result[key] = Type.Optional(Type.Integer({ minimum: -1, maximum: 1 })) + + return result + }, {} as { [K in keyof T['properties']]: TOptional }) + + return { + type: 'object', + additionalProperties: false, + properties + } as TObject +} + +export const queryProperty = (def: T) => { + return Type.Optional( + Type.Union([ + def, + Type.Object({ + $gt: Type.Optional(def), + $gte: Type.Optional(def), + $lt: Type.Optional(def), + $lte: Type.Optional(def), + $ne: Type.Optional(def), + $in: Type.Optional(Type.Array(def)), + $nin: Type.Optional(Type.Array(def)) + }) + ]) + ) +} + +type QueryProperty = ReturnType> + +export const queryProperties = (type: T) => { + const properties = Object.keys(type.properties).reduce((res, key) => { + const result = res as any + + result[key] = queryProperty(type.properties[key]) + + return result + }, {} as { [K in keyof T['properties']]: QueryProperty }) + + return { + type: 'object', + additionalProperties: false, + properties + } as TObject +} + +export const querySyntax = (type: T) => { + return Type.Intersect([ + Type.Object( + { + $limit: Type.Optional(Type.Number({ minimum: 0 })), + $skip: Type.Optional(Type.Number({ minimum: 0 })), + $sort: Type.Optional(sortDefinition(type)), + $select: Type.Optional(arrayOfKeys(type)) + }, + { additionalProperties: false } + ), + queryProperties(type) + ]) +} diff --git a/packages/schema/test/typebox.test.ts b/packages/schema/test/typebox.test.ts new file mode 100644 index 0000000000..4ea2287abf --- /dev/null +++ b/packages/schema/test/typebox.test.ts @@ -0,0 +1,29 @@ +import assert from 'assert' +import { typebox, Type, Ajv, Static } from '../src' + +describe('@feathersjs/schema/typebox', () => { + it('querySyntax', async () => { + const schema = Type.Object({ + name: Type.String(), + age: Type.Number() + }) + + const querySchema = typebox.querySyntax(schema) + + type Query = Static + + const query: Query = { + name: 'Dave', + age: { $gt: 42, $in: [50, 51] }, + $select: ['age', 'name'], + $sort: { + age: 1 + } + } + + const validator = new Ajv().compile(querySchema) + const validated = (await validator(query)) as any as Query + + assert.ok(validated) + }) +}) From 2b0f1e97090d1bac90e02da6bd123e890e7afa72 Mon Sep 17 00:00:00 2001 From: daffl Date: Tue, 4 Oct 2022 14:06:43 -0700 Subject: [PATCH 07/11] Add separate service .class file back --- packages/cli/src/commons.ts | 14 -- .../cli/src/service/templates/client.tpl.ts | 2 +- .../service/{ => templates}/service.tpl.ts | 190 +++++++++--------- packages/cli/src/service/type/custom.tpl.ts | 44 ++-- packages/cli/src/service/type/knex.tpl.ts | 50 +++-- packages/cli/src/service/type/mongodb.tpl.ts | 52 +++-- packages/cli/test/generators.test.ts | 20 +- 7 files changed, 203 insertions(+), 169 deletions(-) rename packages/cli/src/service/{ => templates}/service.tpl.ts (50%) diff --git a/packages/cli/src/commons.ts b/packages/cli/src/commons.ts index 449c802f4b..05cf99b11f 100644 --- a/packages/cli/src/commons.ts +++ b/packages/cli/src/commons.ts @@ -275,17 +275,3 @@ export const injectSource = return injector(ctx).then(prettify(target)) } - -/** - * Join multiple templates into one. - * - * @param templates The list of templates (callables) to join - * @returns - */ -export const joinTemplates = - (...templates: Callable[]) => - async (ctx: C) => { - const strings = await Promise.all(templates.map((tpl) => getCallable(tpl, ctx))) - - return strings.join('') - } diff --git a/packages/cli/src/service/templates/client.tpl.ts b/packages/cli/src/service/templates/client.tpl.ts index 4a570ee4b2..31050ad9d0 100644 --- a/packages/cli/src/service/templates/client.tpl.ts +++ b/packages/cli/src/service/templates/client.tpl.ts @@ -5,7 +5,7 @@ const schemaImports = ({ upperName, folder, fileName }: ServiceGeneratorContext) ${upperName}, ${upperName}Data, ${upperName}Query, -} from './services/${folder.join('/')}/${fileName}.service' +} from './services/${folder.join('/')}/${fileName}' export type { ${upperName}, diff --git a/packages/cli/src/service/service.tpl.ts b/packages/cli/src/service/templates/service.tpl.ts similarity index 50% rename from packages/cli/src/service/service.tpl.ts rename to packages/cli/src/service/templates/service.tpl.ts index dfcafa5803..0e397471f2 100644 --- a/packages/cli/src/service/service.tpl.ts +++ b/packages/cli/src/service/templates/service.tpl.ts @@ -1,36 +1,17 @@ -import { generator, prepend, after, toFile } from '@feathershq/pinion' -import { injectSource } from '../commons' -import { ServiceGeneratorContext } from './index' +import { generator, toFile, after, prepend } from '@feathershq/pinion' +import { injectSource, renderSource } from '../../commons' +import { ServiceGeneratorContext } from '../index' -const toServiceIndex = toFile(({ lib }: ServiceGeneratorContext) => [lib, 'services', `index`]) - -export const registerService = (ctx: ServiceGeneratorContext) => - generator(ctx) - .then( - injectSource( - ({ camelName, folder, fileName }) => - `import { ${camelName} } from './${folder.join('/')}/${fileName}.service'`, - prepend(), - toServiceIndex - ) - ) - .then( - injectSource( - ({ camelName }) => ` app.configure(${camelName})`, - after('export const services'), - toServiceIndex - ) - ) - -export const serviceImportTemplate = ({ +export const template = ({ + camelName, authentication, isEntityService, - camelName, - upperName, - fileName, + path, + className, relative, - schema -}: ServiceGeneratorContext) => ` + schema, + fileName +}: ServiceGeneratorContext) => /* ts */ ` ${authentication || isEntityService ? `import { authenticate } from '@feathersjs/authentication'` : ''} ${ schema @@ -45,80 +26,15 @@ import { ${camelName}QueryResolver, ${camelName}ExternalResolver } from './${fileName}.schema' - -import type { - ${upperName}, - ${upperName}Data, - ${upperName}Query -} from './${fileName}.schema' - -export * from './${fileName}.schema' -` - : ` -export type ${upperName} = any -export type ${upperName}Data = any -export type ${upperName}Query = any ` + : '' } import type { Application } from '${relative}/declarations' -` +import { ${className}, getOptions } from './${fileName}.class' -export const serviceRegistrationTemplate = ({ - camelName, - authentication, - isEntityService, - path, - className, - relative, - schema -}: ServiceGeneratorContext) => /* ts */ ` -export const ${camelName}Hooks = { - around: { - all: [${ - authentication - ? ` - authenticate('jwt'),` - : '' - } - ]${ - isEntityService - ? `, - find: [ authenticate('jwt') ], - get: [ authenticate('jwt') ], - create: [], - update: [ authenticate('jwt') ], - patch: [ authenticate('jwt') ], - remove: [ authenticate('jwt') ]` - : '' - } - }, - before: { - all: [${ - schema - ? ` - schemaHooks.validateQuery(${camelName}QueryValidator), - schemaHooks.validateData(${camelName}DataValidator), - schemaHooks.resolveQuery(${camelName}QueryResolver), - schemaHooks.resolveData(${camelName}DataResolver) - ` - : '' - }] - }, - after: { - all: [${ - schema - ? ` - schemaHooks.resolveResult(${camelName}Resolver), - schemaHooks.resolveExternal(${camelName}ExternalResolver) - ` - : '' - }] - }, - error: { - all: [] - } -} +export * from './${fileName}.class' +${schema ? `export * from './${fileName}.schema'` : ''} // A configure function that registers the service and its hooks via \`app.configure\` export const ${camelName} = (app: Application) => { @@ -130,7 +46,52 @@ export const ${camelName} = (app: Application) => { events: [] }) // Initialize hooks - app.service('${path}').hooks(${camelName}Hooks) + app.service('${path}').hooks({ + around: { + all: [${ + authentication + ? ` + authenticate('jwt'),` + : '' + } + ]${ + isEntityService + ? `, + find: [ authenticate('jwt') ], + get: [ authenticate('jwt') ], + create: [], + update: [ authenticate('jwt') ], + patch: [ authenticate('jwt') ], + remove: [ authenticate('jwt') ]` + : '' + } + }, + before: { + all: [${ + schema + ? ` + schemaHooks.validateQuery(${camelName}QueryValidator), + schemaHooks.validateData(${camelName}DataValidator), + schemaHooks.resolveQuery(${camelName}QueryResolver), + schemaHooks.resolveData(${camelName}DataResolver) + ` + : '' + }] + }, + after: { + all: [${ + schema + ? ` + schemaHooks.resolveResult(${camelName}Resolver), + schemaHooks.resolveExternal(${camelName}ExternalResolver) + ` + : '' + }] + }, + error: { + all: [] + } + }) } // Add this service to the service type index @@ -140,3 +101,34 @@ declare module '${relative}/declarations' { } } ` + +const toServiceIndex = toFile(({ lib }: ServiceGeneratorContext) => [lib, 'services', `index`]) + +export const generate = (ctx: ServiceGeneratorContext) => + generator(ctx) + .then( + renderSource( + template, + toFile(({ lib, fileName, folder }: ServiceGeneratorContext) => [ + lib, + 'services', + ...folder, + `${fileName}` + ]) + ) + ) + .then( + injectSource( + ({ camelName, folder, fileName }) => + `import { ${camelName} } from './${folder.join('/')}/${fileName}'`, + prepend(), + toServiceIndex + ) + ) + .then( + injectSource( + ({ camelName }) => ` app.configure(${camelName})`, + after('export const services'), + toServiceIndex + ) + ) diff --git a/packages/cli/src/service/type/custom.tpl.ts b/packages/cli/src/service/type/custom.tpl.ts index f72f82f255..1c244601c9 100644 --- a/packages/cli/src/service/type/custom.tpl.ts +++ b/packages/cli/src/service/type/custom.tpl.ts @@ -1,11 +1,25 @@ import { generator, toFile } from '@feathershq/pinion' -import { joinTemplates, renderSource } from '../../commons' +import { renderSource } from '../../commons' import { ServiceGeneratorContext } from '../index' -import { registerService, serviceImportTemplate, serviceRegistrationTemplate } from '../service.tpl' -export const importTemplate = "import type { Id, NullableId, Params } from '@feathersjs/feathers'" +export const template = ({ className, upperName, schema, fileName, relative }: ServiceGeneratorContext) => ` +import type { Id, NullableId, Params } from '@feathersjs/feathers' -export const serviceTemplate = ({ className, upperName }: ServiceGeneratorContext) => ` +import type { Application } from '${relative}/declarations' +${ + schema + ? `import type { + ${upperName}, + ${upperName}Data, + ${upperName}Query +} from './${fileName}.schema' +` + : ` +export type ${upperName} = any +export type ${upperName}Data = any +export type ${upperName}Query = any +` +} export interface ${className}Options { app: Application @@ -72,16 +86,14 @@ export const getOptions = (app: Application) => { ` export const generate = (ctx: ServiceGeneratorContext) => - generator(ctx) - .then( - renderSource( - joinTemplates(importTemplate, serviceImportTemplate, serviceTemplate, serviceRegistrationTemplate), - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.service` - ]) - ) + generator(ctx).then( + renderSource( + template, + toFile(({ lib, folder, fileName }) => [ + lib, + 'services', + ...folder, + `${fileName}.class` + ]) ) - .then(registerService) + ) diff --git a/packages/cli/src/service/type/knex.tpl.ts b/packages/cli/src/service/type/knex.tpl.ts index d2345b8cd0..b3378949b6 100644 --- a/packages/cli/src/service/type/knex.tpl.ts +++ b/packages/cli/src/service/type/knex.tpl.ts @@ -1,7 +1,6 @@ import { generator, toFile } from '@feathershq/pinion' -import { joinTemplates, renderSource } from '../../commons' +import { renderSource } from '../../commons' import { ServiceGeneratorContext } from '../index' -import { registerService, serviceImportTemplate, serviceRegistrationTemplate } from '../service.tpl' const migrationTemplate = ({ kebabName @@ -19,16 +18,32 @@ export async function down(knex: Knex): Promise { } ` -export const importTemplate = `import { KnexService } from '@feathersjs/knex' -import type { KnexAdapterParams } from '@feathersjs/knex' -` - -export const serviceTemplate = ({ +export const template = ({ className, upperName, kebabName, - feathers -}: ServiceGeneratorContext) => /* ts */ ` + feathers, + schema, + fileName, + relative +}: ServiceGeneratorContext) => /* ts */ `import { KnexService } from '@feathersjs/knex' +import type { KnexAdapterParams } from '@feathersjs/knex' + +import type { Application } from '${relative}/declarations' +${ + schema + ? `import type { + ${upperName}, + ${upperName}Data, + ${upperName}Query +} from './${fileName}.schema' +` + : ` +export type ${upperName} = any +export type ${upperName}Data = any +export type ${upperName}Query = any +` +} export interface ${upperName}Params extends KnexAdapterParams<${upperName}Query> { } @@ -50,18 +65,15 @@ export const generate = (ctx: ServiceGeneratorContext) => generator(ctx) .then( renderSource( - joinTemplates(importTemplate, serviceImportTemplate, serviceTemplate, serviceRegistrationTemplate), - toFile( - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.service` - ]) - ) + template, + toFile(({ lib, folder, fileName }) => [ + lib, + 'services', + ...folder, + `${fileName}.class` + ]) ) ) - .then(registerService) .then( renderSource( migrationTemplate, diff --git a/packages/cli/src/service/type/mongodb.tpl.ts b/packages/cli/src/service/type/mongodb.tpl.ts index 5278723652..e99238ddf9 100644 --- a/packages/cli/src/service/type/mongodb.tpl.ts +++ b/packages/cli/src/service/type/mongodb.tpl.ts @@ -1,12 +1,32 @@ import { generator, toFile } from '@feathershq/pinion' -import { joinTemplates, renderSource } from '../../commons' +import { renderSource } from '../../commons' import { ServiceGeneratorContext } from '../index' -import { registerService, serviceImportTemplate, serviceRegistrationTemplate } from '../service.tpl' -export const importTemplate = /* ts */ `import { MongoDBService } from \'@feathersjs/mongodb\' -import type { MongoDBAdapterParams } from \'@feathersjs/mongodb\'` +export const template = ({ + className, + upperName, + kebabName, + schema, + fileName, + relative +}: ServiceGeneratorContext) => /* ts */ `import { MongoDBService } from \'@feathersjs/mongodb\' +import type { MongoDBAdapterParams } from \'@feathersjs/mongodb\' -export const serviceTemplate = ({ className, upperName, kebabName }: ServiceGeneratorContext) => /* ts */ ` +import type { Application } from '${relative}/declarations' +${ + schema + ? `import type { + ${upperName}, + ${upperName}Data, + ${upperName}Query +} from './${fileName}.schema' +` + : ` +export type ${upperName} = any +export type ${upperName}Data = any +export type ${upperName}Query = any +` +} export interface ${upperName}Params extends MongoDBAdapterParams<${upperName}Query> { } @@ -24,16 +44,14 @@ export const getOptions = (app: Application) => { ` export const generate = (ctx: ServiceGeneratorContext) => - generator(ctx) - .then( - renderSource( - joinTemplates(importTemplate, serviceImportTemplate, serviceTemplate, serviceRegistrationTemplate), - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.service` - ]) - ) + generator(ctx).then( + renderSource( + template, + toFile(({ lib, folder, fileName }) => [ + lib, + 'services', + ...folder, + `${fileName}.class` + ]) ) - .then(registerService) + ) diff --git a/packages/cli/test/generators.test.ts b/packages/cli/test/generators.test.ts index 54b538a0bc..7a9e7b84fb 100644 --- a/packages/cli/test/generators.test.ts +++ b/packages/cli/test/generators.test.ts @@ -78,7 +78,7 @@ describe('@feathersjs/cli', () => { { cwd } ) ) - const mongoServiceContext = await generateService( + const mongoService1Context = await generateService( getContext( { dependencyVersions, @@ -91,10 +91,24 @@ describe('@feathersjs/cli', () => { { cwd } ) ) + const messageServiceContext = await generateService( + getContext( + { + dependencyVersions, + name: 'message', + path: 'messages', + authentication: true, + type: 'mongodb', + schema: 'typebox' + }, + { cwd } + ) + ) const testResult = await context.pinion.exec('npm', ['test'], { cwd }) assert.ok(connectionContext) - assert.ok(mongoServiceContext) + assert.ok(mongoService1Context) + assert.ok(messageServiceContext) assert.strictEqual(testResult, 0) }) @@ -107,7 +121,7 @@ describe('@feathersjs/cli', () => { path: 'customized', authentication: false, type: 'custom', - schema: 'typebox' + schema: 'json' }, { cwd } ) From a4b4ebb06032c5e63753dd45449c7ec686cf7064 Mon Sep 17 00:00:00 2001 From: daffl Date: Tue, 4 Oct 2022 21:50:14 -0700 Subject: [PATCH 08/11] Create @feathersjs/typebox module for TypeBox schema integration --- package-lock.json | 37 +++++----- packages/cli/package.json | 1 + packages/cli/src/app/index.ts | 6 +- .../templates/schema.typebox.tpl.ts | 7 +- .../service/templates/schema.typebox.tpl.ts | 7 +- packages/schema/package.json | 1 - packages/schema/src/index.ts | 3 - packages/typebox/LICENSE | 22 ++++++ packages/typebox/README.md | 23 +++++++ packages/typebox/package.json | 68 +++++++++++++++++++ .../src/typebox.ts => typebox/src/index.ts} | 2 + packages/typebox/test/index.test.ts | 30 ++++++++ packages/typebox/tsconfig.json | 9 +++ 13 files changed, 187 insertions(+), 29 deletions(-) create mode 100644 packages/typebox/LICENSE create mode 100644 packages/typebox/README.md create mode 100644 packages/typebox/package.json rename packages/{schema/src/typebox.ts => typebox/src/index.ts} (98%) create mode 100644 packages/typebox/test/index.test.ts create mode 100644 packages/typebox/tsconfig.json diff --git a/package-lock.json b/package-lock.json index 7f49cb69df..0a5a17ed4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3934,9 +3934,9 @@ } }, "node_modules/@types/node": { - "version": "18.8.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.1.tgz", - "integrity": "sha512-vuYaNuEIbOYLTLUAJh50ezEbvxrD43iby+lpUA2aa148Nh5kX/AVO/9m1Ahmbux2iU5uxJTNF9g2Y+31uml7RQ==" + "version": "18.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.2.tgz", + "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -6664,9 +6664,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001415", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001415.tgz", + "integrity": "sha512-ER+PfgCJUe8BqunLGWd/1EY4g8AzQcsDAVzdtMGKVtQEmKAwaFfU6vb7EAVIqTMYsqxBorYZi2+22Iouj/y7GQ==", "funding": [ { "type": "opencollective", @@ -7867,9 +7867,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.271", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.271.tgz", - "integrity": "sha512-BCPBtK07xR1/uY2HFDtl3wK2De66AW4MSiPlLrnPNxKC/Qhccxd59W73654S3y6Rb/k3hmuGJOBnhjfoutetXA==" + "version": "1.4.272", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.272.tgz", + "integrity": "sha512-KS6gPPGNrzpVv9HzFVq+Etd0AjZEPr5pvaTBn2yD6KV4+cKW4I0CJoJNgmTG6gUQPAMZ4wIPtcOuoou3qFAZCA==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -17192,6 +17192,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.2.tgz", "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", + "deprecated": "Please use v8.0.0 until https://github.com/visionmedia/superagent/issues/1743 is resolved", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.3", @@ -21781,9 +21782,9 @@ } }, "@types/node": { - "version": "18.8.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.1.tgz", - "integrity": "sha512-vuYaNuEIbOYLTLUAJh50ezEbvxrD43iby+lpUA2aa148Nh5kX/AVO/9m1Ahmbux2iU5uxJTNF9g2Y+31uml7RQ==" + "version": "18.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.2.tgz", + "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==" }, "@types/node-fetch": { "version": "2.6.2", @@ -24023,9 +24024,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==" + "version": "1.0.30001415", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001415.tgz", + "integrity": "sha512-ER+PfgCJUe8BqunLGWd/1EY4g8AzQcsDAVzdtMGKVtQEmKAwaFfU6vb7EAVIqTMYsqxBorYZi2+22Iouj/y7GQ==" }, "center-align": { "version": "0.1.3", @@ -24955,9 +24956,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.271", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.271.tgz", - "integrity": "sha512-BCPBtK07xR1/uY2HFDtl3wK2De66AW4MSiPlLrnPNxKC/Qhccxd59W73654S3y6Rb/k3hmuGJOBnhjfoutetXA==" + "version": "1.4.272", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.272.tgz", + "integrity": "sha512-KS6gPPGNrzpVv9HzFVq+Etd0AjZEPr5pvaTBn2yD6KV4+cKW4I0CJoJNgmTG6gUQPAMZ4wIPtcOuoou3qFAZCA==" }, "elliptic": { "version": "6.5.4", diff --git a/packages/cli/package.json b/packages/cli/package.json index 91f0b9ebf5..7ec80499a0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -69,6 +69,7 @@ "@feathersjs/koa": "^5.0.0-pre.29", "@feathersjs/mongodb": "^5.0.0-pre.29", "@feathersjs/schema": "^5.0.0-pre.29", + "@feathersjs/typebox": "^5.0.0-pre.29", "@feathersjs/socketio": "^5.0.0-pre.29", "@feathersjs/transport-commons": "^5.0.0-pre.29", "@types/mocha": "^9.1.1", diff --git a/packages/cli/src/app/index.ts b/packages/cli/src/app/index.ts index 2e159921dc..c358a9de8c 100644 --- a/packages/cli/src/app/index.ts +++ b/packages/cli/src/app/index.ts @@ -166,7 +166,7 @@ export const generate = (ctx: AppGeneratorArguments) => ) .then( install( - ({ transports, framework, dependencyVersions, dependencies }) => { + ({ transports, framework, dependencyVersions, dependencies, schema }) => { const hasSocketio = transports.includes('websockets') dependencies.push( @@ -191,6 +191,10 @@ export const generate = (ctx: AppGeneratorArguments) => dependencies.push('@feathersjs/express', 'compression') } + if (schema === 'typebox') { + dependencies.push('@feathersjs/typebox') + } + return addVersions(dependencies, dependencyVersions) }, false, diff --git a/packages/cli/src/authentication/templates/schema.typebox.tpl.ts b/packages/cli/src/authentication/templates/schema.typebox.tpl.ts index 0590e51769..03ad5d0a46 100644 --- a/packages/cli/src/authentication/templates/schema.typebox.tpl.ts +++ b/packages/cli/src/authentication/templates/schema.typebox.tpl.ts @@ -8,8 +8,9 @@ export const template = ({ authStrategies, type, relative -}: AuthenticationGeneratorContext) => /* ts */ `import { Type, typebox, jsonSchema, resolve } from '@feathersjs/schema' -import type { Static } from '@feathersjs/schema' +}: AuthenticationGeneratorContext) => /* ts */ `import { jsonSchema, resolve } from '@feathersjs/schema' +import { Type, querySyntax } from '@feathersjs/typebox' +import type { Static } from '@feathersjs/typebox' ${authStrategies.includes('local') ? `import { passwordHash } from '@feathersjs/authentication-local'` : ''} import type { HookContext } from '${relative}/declarations' @@ -60,7 +61,7 @@ export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({ // Schema for allowed query properties export const ${camelName}QuerySchema = Type.Intersect([ - typebox.querySyntax(${camelName}Schema), + querySyntax(${camelName}Schema), // Add additional query properties here Type.Object({}) ]) diff --git a/packages/cli/src/service/templates/schema.typebox.tpl.ts b/packages/cli/src/service/templates/schema.typebox.tpl.ts index b247010eee..3103639921 100644 --- a/packages/cli/src/service/templates/schema.typebox.tpl.ts +++ b/packages/cli/src/service/templates/schema.typebox.tpl.ts @@ -7,8 +7,9 @@ const template = ({ upperName, relative, type -}: ServiceGeneratorContext) => /* ts */ `import { Type, jsonSchema, typebox, resolve } from '@feathersjs/schema' -import type { Static } from '@feathersjs/schema' +}: ServiceGeneratorContext) => /* ts */ `import { jsonSchema, resolve } from '@feathersjs/schema' +import { Type, querySyntax } from '@feathersjs/typebox' +import type { Static } from '@feathersjs/typebox' import type { HookContext } from '${relative}/declarations' import { dataValidator, queryValidator } from '${relative}/schemas/validators' @@ -45,7 +46,7 @@ export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({ // Schema for allowed query properties export const ${camelName}QuerySchema = Type.Intersect([ - typebox.querySyntax(${camelName}Schema), + querySyntax(${camelName}Schema), // Add additional query properties here Type.Object({}) ]) diff --git a/packages/schema/package.json b/packages/schema/package.json index b1cb1c45c8..b792e84627 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -58,7 +58,6 @@ "@feathersjs/errors": "^5.0.0-pre.29", "@feathersjs/feathers": "^5.0.0-pre.29", "@feathersjs/hooks": "^0.7.5", - "@sinclair/typebox": "^0.24.44", "@types/json-schema": "^7.0.11", "ajv": "^8.11.0", "ajv-formats": "^2.1.1", diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 10b7186921..08dbd458c7 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -4,8 +4,6 @@ import { ResolverStatus } from './resolver' export type { FromSchema } from 'json-schema-to-ts' export { addFormats, FormatName, FormatOptions, FormatsPluginOptions } -export * from '@sinclair/typebox' - export * from './schema' export * from './resolver' export * from './hooks' @@ -13,7 +11,6 @@ export * from './json-schema' export * as hooks from './hooks' export * as jsonSchema from './json-schema' -export * as typebox from './typebox' export type Infer = S['_type'] diff --git a/packages/typebox/LICENSE b/packages/typebox/LICENSE new file mode 100644 index 0000000000..59604f46f3 --- /dev/null +++ b/packages/typebox/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2022 Feathers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/packages/typebox/README.md b/packages/typebox/README.md new file mode 100644 index 0000000000..6f5982118c --- /dev/null +++ b/packages/typebox/README.md @@ -0,0 +1,23 @@ +# @feathersjs/typebox + +[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) +[![Download Status](https://img.shields.io/npm/dm/@feathersjs/typebox.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/typebox) +[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) + +> [TypeBox](https://github.com/sinclairzx81/typebox) integration for @feathersjs/schema + +## Installation + +``` +npm install @feathersjs/typebox --save +``` + +## Documentation + +Refer to the [Feathers documentation](https://docs.feathersjs.com) for more details. + +## License + +Copyright (c) 2022 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) + +Licensed under the [MIT license](LICENSE). diff --git a/packages/typebox/package.json b/packages/typebox/package.json new file mode 100644 index 0000000000..7ae506212c --- /dev/null +++ b/packages/typebox/package.json @@ -0,0 +1,68 @@ +{ + "name": "@feathersjs/typebox", + "description": "TypeBox integration for @feathersjs/schema", + "version": "5.0.0-pre.29", + "homepage": "https://feathersjs.com", + "main": "lib/", + "types": "lib/", + "keywords": [ + "feathers", + "feathers-plugin" + ], + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + }, + "repository": { + "type": "git", + "url": "git://github.com/feathersjs/feathers.git", + "directory": "packages/schema" + }, + "author": { + "name": "Feathers contributors", + "email": "hello@feathersjs.com", + "url": "https://feathersjs.com" + }, + "contributors": [], + "bugs": { + "url": "https://github.com/feathersjs/feathers/issues" + }, + "engines": { + "node": ">= 12" + }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "src/**", + "lib/**", + "*.d.ts", + "*.js" + ], + "scripts": { + "prepublish": "npm run compile", + "pack": "npm pack --pack-destination ../cli/test", + "compile": "shx rm -rf lib/ && tsc && npm run pack", + "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", + "test": "npm run compile && npm run mocha" + }, + "directories": { + "lib": "lib" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@feathersjs/schema": "^5.0.0-pre.29", + "@sinclair/typebox": "^0.24.44" + }, + "devDependencies": { + "@types/mocha": "^9.1.1", + "@types/node": "^18.7.18", + "mocha": "^10.0.0", + "shx": "^0.3.4", + "typescript": "^4.8.3" + }, + "gitHead": "4314dc89a41a8bbaabf00b47697bf7887861d17d" +} diff --git a/packages/schema/src/typebox.ts b/packages/typebox/src/index.ts similarity index 98% rename from packages/schema/src/typebox.ts rename to packages/typebox/src/index.ts index 5c870a79c4..c8992660ff 100644 --- a/packages/schema/src/typebox.ts +++ b/packages/typebox/src/index.ts @@ -1,5 +1,7 @@ import { Type, TObject, TInteger, TOptional, TSchema, TIntersect } from '@sinclair/typebox' +export * from '@sinclair/typebox' + const arrayOfKeys = (type: T) => { const keys = Object.keys(type.properties) return Type.Unsafe<(keyof T['properties'])[]>({ type: 'array', items: { type: 'string', enum: keys } }) diff --git a/packages/typebox/test/index.test.ts b/packages/typebox/test/index.test.ts new file mode 100644 index 0000000000..92e80dd92b --- /dev/null +++ b/packages/typebox/test/index.test.ts @@ -0,0 +1,30 @@ +import assert from 'assert' +import { Ajv } from '@feathersjs/schema' +import { querySyntax, Type, Static } from '../src' + +describe('@feathersjs/schema/typebox', () => { + it('querySyntax', async () => { + const schema = Type.Object({ + name: Type.String(), + age: Type.Number() + }) + + const querySchema = querySyntax(schema) + + type Query = Static + + const query: Query = { + name: 'Dave', + age: { $gt: 42, $in: [50, 51] }, + $select: ['age', 'name'], + $sort: { + age: 1 + } + } + + const validator = new Ajv().compile(querySchema) + const validated = (await validator(query)) as any as Query + + assert.ok(validated) + }) +}) diff --git a/packages/typebox/tsconfig.json b/packages/typebox/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/typebox/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} From 1b654fd76899b888bfa0bd9ba373dec0e21255a9 Mon Sep 17 00:00:00 2001 From: daffl Date: Wed, 5 Oct 2022 10:13:41 -0700 Subject: [PATCH 09/11] Create application configuration default schemas --- packages/authentication/src/options.ts | 113 +------------ packages/cli/src/app/templates/app.tpl.ts | 8 +- .../cli/src/app/templates/declarations.tpl.ts | 4 +- packages/cli/src/app/templates/schemas.tpl.ts | 77 +++++---- .../cli/src/connection/templates/knex.tpl.ts | 16 -- .../src/connection/templates/mongodb.tpl.ts | 10 -- packages/configuration/src/index.ts | 10 +- packages/schema/src/default-schemas.ts | 157 ++++++++++++++++++ packages/schema/src/index.ts | 1 + packages/schema/test/typebox.test.ts | 29 ---- packages/typebox/package.json | 2 +- packages/typebox/src/default-schemas.ts | 87 ++++++++++ packages/typebox/src/index.ts | 1 + packages/typebox/test/index.test.ts | 22 ++- 14 files changed, 323 insertions(+), 214 deletions(-) create mode 100644 packages/schema/src/default-schemas.ts delete mode 100644 packages/schema/test/typebox.test.ts create mode 100644 packages/typebox/src/default-schemas.ts diff --git a/packages/authentication/src/options.ts b/packages/authentication/src/options.ts index 3f5d7f45ee..2176889087 100644 --- a/packages/authentication/src/options.ts +++ b/packages/authentication/src/options.ts @@ -1,4 +1,4 @@ -import { FromSchema } from '@feathersjs/schema' +import { FromSchema, authenticationSettingsSchema } from '@feathersjs/schema' export const defaultOptions = { authStrategies: [] as string[], @@ -11,115 +11,6 @@ export const defaultOptions = { } } -export const authenticationSettingsSchema = { - type: 'object', - required: ['secret', 'entity', 'authStrategies'], - properties: { - secret: { - type: 'string', - description: 'The JWT signing secret' - }, - entity: { - oneOf: [ - { - type: 'null' - }, - { - type: 'string' - } - ], - description: 'The name of the authentication entity (e.g. user)' - }, - entityId: { - type: 'string', - description: 'The name of the authentication entity id property' - }, - service: { - type: 'string', - description: 'The path of the entity service' - }, - authStrategies: { - type: 'array', - items: { type: 'string' }, - description: 'A list of authentication strategy names that are allowed to create JWT access tokens' - }, - parseStrategies: { - type: 'array', - items: { type: 'string' }, - description: - 'A list of authentication strategy names that should parse HTTP headers for authentication information (defaults to `authStrategies`)' - }, - jwtOptions: { - type: 'object' - }, - jwt: { - type: 'object', - properties: { - header: { - type: 'string', - default: 'Authorization', - description: 'The HTTP header containing the JWT' - }, - schemes: { - type: 'array', - items: { type: 'string' }, - description: 'An array of schemes to support' - } - } - }, - local: { - type: 'object', - required: ['usernameField', 'passwordField'], - properties: { - usernameField: { - type: 'string', - description: 'Name of the username field (e.g. `email`)' - }, - passwordField: { - type: 'string', - description: 'Name of the password field (e.g. `password`)' - }, - hashSize: { - type: 'number', - description: 'The BCrypt salt length' - }, - errorMessage: { - type: 'string', - default: 'Invalid login', - description: 'The error message to return on errors' - }, - entityUsernameField: { - type: 'string', - description: - 'Name of the username field on the entity if authentication request data and entity field names are different' - }, - entityPasswordField: { - type: 'string', - description: - 'Name of the password field on the entity if authentication request data and entity field names are different' - } - } - }, - oauth: { - type: 'object', - properties: { - redirect: { - type: 'string' - }, - origins: { - type: 'array', - items: { type: 'string' } - }, - defaults: { - type: 'object', - properties: { - key: { type: 'string' }, - secret: { type: 'string' } - } - } - } - } - } -} as const +export { authenticationSettingsSchema } export type AuthenticationConfiguration = FromSchema diff --git a/packages/cli/src/app/templates/app.tpl.ts b/packages/cli/src/app/templates/app.tpl.ts index 27ce22730d..c3fa4d18dd 100644 --- a/packages/cli/src/app/templates/app.tpl.ts +++ b/packages/cli/src/app/templates/app.tpl.ts @@ -9,7 +9,7 @@ import { koa, rest, bodyParser, errorHandler, parseAuthentication, cors } from ' ${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} import type { Application } from './declarations' -import { configurationSchema } from './schemas/configuration' +import { configurationValidator } from './schemas/configuration' import { logErrorHook } from './logger' import { services } from './services/index' import { channels } from './channels' @@ -17,7 +17,7 @@ import { channels } from './channels' const app: Application = koa(feathers()) // Load our app configuration (see config/ folder) -app.configure(configuration(configurationSchema)) +app.configure(configuration(configurationValidator)) // Set up Koa middleware app.use(serveStatic(app.get('public'))) @@ -69,7 +69,7 @@ import configuration from '@feathersjs/configuration' ${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} import type { Application } from './declarations' -import { configurationSchema } from './schemas/configuration' +import { configurationValidator } from './schemas/configuration' import { logger, logErrorHook } from './logger' import { services } from './services/index' import { channels } from './channels' @@ -77,7 +77,7 @@ import { channels } from './channels' const app: Application = express(feathers()) // Load app configuration -app.configure(configuration(configurationSchema)) +app.configure(configuration(configurationValidator)) app.use(cors()) app.use(compress()) app.use(json()) diff --git a/packages/cli/src/app/templates/declarations.tpl.ts b/packages/cli/src/app/templates/declarations.tpl.ts index c938e3a3bc..106fc7e538 100644 --- a/packages/cli/src/app/templates/declarations.tpl.ts +++ b/packages/cli/src/app/templates/declarations.tpl.ts @@ -5,11 +5,11 @@ const template = ({ framework }: AppGeneratorContext) => /* ts */ `import { HookContext as FeathersHookContext, NextFunction } from '@feathersjs/feathers' import { Application as FeathersApplication } from '@feathersjs/${framework}' -import { ConfigurationSchema } from './schemas/configuration' +import { ApplicationConfiguration } from './schemas/configuration' export { NextFunction } -export interface Configuration extends ConfigurationSchema {} +export interface Configuration extends ApplicationConfiguration {} // A mapping of service names to types. Will be extended in service files. export interface ServiceTypes {} diff --git a/packages/cli/src/app/templates/schemas.tpl.ts b/packages/cli/src/app/templates/schemas.tpl.ts index 31ab13d75a..e0020b297e 100644 --- a/packages/cli/src/app/templates/schemas.tpl.ts +++ b/packages/cli/src/app/templates/schemas.tpl.ts @@ -27,53 +27,58 @@ export const dataValidator = addFormats(new Ajv({}), formats) export const queryValidator = addFormats(new Ajv({ coerceTypes: true }), formats) +` + +const configurationJsonTemplate = + ({}: AppGeneratorContext) => /* ts */ `import { defaultAppSettings, jsonSchema } from '@feathersjs/schema' +import type { FromSchema } from '@feathersjs/schema' + +import { dataValidator } from './validators' + +export const configurationSchema = { + type: 'object', + additionalProperties: false, + required: [ 'host', 'port', 'public' ], + properties: { + ...defaultAppSettings, + host: { type: 'string' }, + port: { type: 'number' }, + public: { type: 'string' } + } +} as const +export const configurationValidator = jsonSchema.getValidator(configurationSchema, dataValidator) + +export type ApplicationConfiguration = FromSchema ` -const configurationTemplate = - ({}: AppGeneratorContext) => /* ts */ `import { schema, Ajv } from '@feathersjs/schema' -import type { Infer } from '@feathersjs/schema' -import { authenticationSettingsSchema } from '@feathersjs/authentication' + +const configurationTypeboxTemplate = + ({}: AppGeneratorContext) => /* ts */ `import { jsonSchema } from '@feathersjs/schema' +import { Type, defaultAppConfiguration } from '@feathersjs/typebox' +import type { Static } from '@feathersjs/typebox' + import { dataValidator } from './validators' -export const configurationSchema = schema( - { - $id: 'ApplicationConfiguration', - type: 'object', - additionalProperties: false, - required: [ 'host', 'port', 'public', 'paginate' ], - properties: { - host: { type: 'string' }, - port: { type: 'number' }, - public: { type: 'string' }, - authentication: authenticationSettingsSchema, - origins: { - type: 'array', - items: { - type: 'string' - } - }, - paginate: { - type: 'object', - additionalProperties: false, - required: [ 'default', 'max' ], - properties: { - default: { type: 'number' }, - max: { type: 'number' } - } - } - } - } as const, - dataValidator -) +export const configurationSchema = Type.Intersect([ + defaultAppConfiguration, + Type.Object({ + host: Type.String(), + port: Type.Number(), + public: Type.String() + }) +]) + +export type ApplicationConfiguration = Static -export type ConfigurationSchema = Infer +export const configurationValidator = jsonSchema.getValidator(configurationSchema, dataValidator) ` export const generate = (ctx: AppGeneratorContext) => generator(ctx) .then( renderSource( - configurationTemplate, + async (ctx) => + ctx.schema === 'typebox' ? configurationTypeboxTemplate(ctx) : configurationJsonTemplate(ctx), toFile(({ lib }) => lib, 'schemas', 'configuration') ) ) diff --git a/packages/cli/src/connection/templates/knex.tpl.ts b/packages/cli/src/connection/templates/knex.tpl.ts index db16f85b7e..bbc0f5a9df 100644 --- a/packages/cli/src/connection/templates/knex.tpl.ts +++ b/packages/cli/src/connection/templates/knex.tpl.ts @@ -32,19 +32,11 @@ const config = app.get('${database}') ${language === 'js' ? 'export default config' : 'module.exports = config'} ` -const configurationTemplate = ({ database }: ConnectionGeneratorContext) => `${database}: { - type: 'object', - properties: { - client: { type: 'string' }, - connection: { type: 'string' } - } -},` const importTemplate = ({ database }: ConnectionGeneratorContext) => `import { ${database} } from './${database}'` const configureTemplate = ({ database }: ConnectionGeneratorContext) => `app.configure(${database})` const toAppFile = toFile(({ lib }) => [lib, 'app']) -const toConfig = toFile(({ lib }) => [lib, 'schemas', 'configuration']) export const generate = (ctx: ConnectionGeneratorContext) => generator(ctx) @@ -67,13 +59,5 @@ export const generate = (ctx: ConnectionGeneratorContext) => toFile('package.json') ) ) - .then( - injectSource( - configurationTemplate, - before('authentication: authenticationSettingsSchema'), - toConfig, - false - ) - ) .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) diff --git a/packages/cli/src/connection/templates/mongodb.tpl.ts b/packages/cli/src/connection/templates/mongodb.tpl.ts index 4758b37163..4c17545d91 100644 --- a/packages/cli/src/connection/templates/mongodb.tpl.ts +++ b/packages/cli/src/connection/templates/mongodb.tpl.ts @@ -22,8 +22,6 @@ export const mongodb = (app: Application) => { } ` -const configurationTemplate = ({ database }: ConnectionGeneratorContext) => - ` ${database}: { type: 'string' },` const importTemplate = "import { mongodb } from './mongodb'" const configureTemplate = 'app.configure(mongodb)' const toAppFile = toFile(({ lib }) => [lib, 'app']) @@ -36,13 +34,5 @@ export const generate = (ctx: ConnectionGeneratorContext) => toFile(({ lib }) => lib, 'mongodb') ) ) - .then( - injectSource( - configurationTemplate, - before('authentication: authenticationSettingsSchema'), - toFile(({ lib }) => [lib, 'schemas', 'configuration']), - false - ) - ) .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts index de3da8aab7..a34606d679 100644 --- a/packages/configuration/src/index.ts +++ b/packages/configuration/src/index.ts @@ -1,11 +1,13 @@ import { Application, ApplicationHookContext, NextFunction } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' -import { Schema } from '@feathersjs/schema' +import { Schema, Validator } from '@feathersjs/schema' import config from 'config' const debug = createDebug('@feathersjs/configuration') -export = function init(schema?: Schema) { +export = function init(schema?: Schema | Validator) { + const validator: Validator = typeof schema === 'function' ? schema : schema?.validate.bind(schema) + return (app?: Application) => { if (!app) { return config @@ -21,11 +23,11 @@ export = function init(schema?: Schema) { app.set(name, value) }) - if (schema) { + if (validator) { app.hooks({ setup: [ async (_context: ApplicationHookContext, next: NextFunction) => { - await schema.validate(configuration) + await validator(configuration) await next() } ] diff --git a/packages/schema/src/default-schemas.ts b/packages/schema/src/default-schemas.ts new file mode 100644 index 0000000000..a3ef7726c3 --- /dev/null +++ b/packages/schema/src/default-schemas.ts @@ -0,0 +1,157 @@ +import { FromSchema } from 'json-schema-to-ts' + +export const authenticationSettingsSchema = { + type: 'object', + required: ['secret', 'entity', 'authStrategies'], + properties: { + secret: { + type: 'string', + description: 'The JWT signing secret' + }, + entity: { + oneOf: [ + { + type: 'null' + }, + { + type: 'string' + } + ], + description: 'The name of the authentication entity (e.g. user)' + }, + entityId: { + type: 'string', + description: 'The name of the authentication entity id property' + }, + service: { + type: 'string', + description: 'The path of the entity service' + }, + authStrategies: { + type: 'array', + items: { type: 'string' }, + description: 'A list of authentication strategy names that are allowed to create JWT access tokens' + }, + parseStrategies: { + type: 'array', + items: { type: 'string' }, + description: + 'A list of authentication strategy names that should parse HTTP headers for authentication information (defaults to `authStrategies`)' + }, + jwtOptions: { + type: 'object' + }, + jwt: { + type: 'object', + properties: { + header: { + type: 'string', + default: 'Authorization', + description: 'The HTTP header containing the JWT' + }, + schemes: { + type: 'array', + items: { type: 'string' }, + description: 'An array of schemes to support' + } + } + }, + local: { + type: 'object', + required: ['usernameField', 'passwordField'], + properties: { + usernameField: { + type: 'string', + description: 'Name of the username field (e.g. `email`)' + }, + passwordField: { + type: 'string', + description: 'Name of the password field (e.g. `password`)' + }, + hashSize: { + type: 'number', + description: 'The BCrypt salt length' + }, + errorMessage: { + type: 'string', + default: 'Invalid login', + description: 'The error message to return on errors' + }, + entityUsernameField: { + type: 'string', + description: + 'Name of the username field on the entity if authentication request data and entity field names are different' + }, + entityPasswordField: { + type: 'string', + description: + 'Name of the password field on the entity if authentication request data and entity field names are different' + } + } + }, + oauth: { + type: 'object', + properties: { + redirect: { + type: 'string' + }, + origins: { + type: 'array', + items: { type: 'string' } + }, + defaults: { + type: 'object', + properties: { + key: { type: 'string' }, + secret: { type: 'string' } + } + } + } + } + } +} as const + +export type AuthenticationConfiguration = FromSchema + +export const sqlSettingsSchema = { + type: 'object', + properties: { + client: { type: 'string' }, + connection: { type: 'string' } + } +} as const + +/** + * Schema for properties that are available in a standard Feathers application. + */ +export const defaultAppSettings = { + authentication: authenticationSettingsSchema, + origins: { + type: 'array', + items: { + type: 'string' + } + }, + paginate: { + type: 'object', + additionalProperties: false, + required: ['default', 'max'], + properties: { + default: { type: 'number' }, + max: { type: 'number' } + } + }, + mongodb: { type: 'string' }, + mysql: sqlSettingsSchema, + postgresql: sqlSettingsSchema, + sqlite: sqlSettingsSchema, + mssql: sqlSettingsSchema +} as const + +export const defaultAppConfiguration = { + type: 'object', + additionalProperties: false, + properties: defaultAppSettings +} as const + +export type DefaultAppConfiguration = FromSchema diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 08dbd458c7..6e5e2ba8fa 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -8,6 +8,7 @@ export * from './schema' export * from './resolver' export * from './hooks' export * from './json-schema' +export * from './default-schemas' export * as hooks from './hooks' export * as jsonSchema from './json-schema' diff --git a/packages/schema/test/typebox.test.ts b/packages/schema/test/typebox.test.ts deleted file mode 100644 index 4ea2287abf..0000000000 --- a/packages/schema/test/typebox.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import assert from 'assert' -import { typebox, Type, Ajv, Static } from '../src' - -describe('@feathersjs/schema/typebox', () => { - it('querySyntax', async () => { - const schema = Type.Object({ - name: Type.String(), - age: Type.Number() - }) - - const querySchema = typebox.querySyntax(schema) - - type Query = Static - - const query: Query = { - name: 'Dave', - age: { $gt: 42, $in: [50, 51] }, - $select: ['age', 'name'], - $sort: { - age: 1 - } - } - - const validator = new Ajv().compile(querySchema) - const validated = (await validator(query)) as any as Query - - assert.ok(validated) - }) -}) diff --git a/packages/typebox/package.json b/packages/typebox/package.json index 7ae506212c..3d315cfa6d 100644 --- a/packages/typebox/package.json +++ b/packages/typebox/package.json @@ -54,10 +54,10 @@ "access": "public" }, "dependencies": { - "@feathersjs/schema": "^5.0.0-pre.29", "@sinclair/typebox": "^0.24.44" }, "devDependencies": { + "@feathersjs/schema": "^5.0.0-pre.29", "@types/mocha": "^9.1.1", "@types/node": "^18.7.18", "mocha": "^10.0.0", diff --git a/packages/typebox/src/default-schemas.ts b/packages/typebox/src/default-schemas.ts new file mode 100644 index 0000000000..e5dd715db5 --- /dev/null +++ b/packages/typebox/src/default-schemas.ts @@ -0,0 +1,87 @@ +import { Type, Static } from '@sinclair/typebox' + +export const authenticationSettingsSchema = Type.Object({ + secret: Type.String({ description: 'The JWT signing secret' }), + entity: Type.Optional(Type.String({ description: 'The name of the authentication entity (e.g. user)' })), + entityId: Type.Optional(Type.String({ description: 'The name of the authentication entity id property' })), + service: Type.Optional(Type.String({ description: 'The path of the entity service' })), + authStrategies: Type.Array(Type.String(), { + description: 'A list of authentication strategy names that are allowed to create JWT access tokens' + }), + parseStrategies: Type.Optional( + Type.Array(Type.String(), { + description: + 'A list of authentication strategy names that should parse HTTP headers for authentication information (defaults to `authStrategies`)' + }) + ), + jwtOptions: Type.Optional(Type.Object({})), + jwt: Type.Optional( + Type.Object({ + header: Type.String({ default: 'Authorization', description: 'The HTTP header containing the JWT' }), + schemes: Type.String({ description: 'An array of schemes to support' }) + }) + ), + local: Type.Optional( + Type.Object({ + usernameField: Type.String({ description: 'Name of the username field (e.g. `email`)' }), + passwordField: Type.String({ description: 'Name of the password field (e.g. `password`)' }), + hashSize: Type.Optional(Type.Number({ description: 'The BCrypt salt length' })), + errorMessage: Type.Optional(Type.String({ description: 'The error message to return on errors' })), + entityUsernameField: Type.Optional( + Type.String({ + description: + 'Name of the username field on the entity if authentication request data and entity field names are different' + }) + ), + entityPasswordField: Type.Optional( + Type.String({ + description: + 'Name of the password field on the entity if authentication request data and entity field names are different' + }) + ) + }) + ), + oauth: Type.Optional( + Type.Object({ + redirect: Type.Optional(Type.String()), + origins: Type.Optional(Type.Array(Type.String())), + defaults: Type.Optional( + Type.Object({ + key: Type.Optional(Type.String()), + secret: Type.Optional(Type.String()) + }) + ) + }) + ) +}) + +export const sqlSettingsSchema = Type.Optional( + Type.Object({ + client: Type.String(), + connection: Type.String() + }) +) + +export const defaultAppConfiguration = Type.Object( + { + authentication: Type.Optional(authenticationSettingsSchema), + paginate: Type.Optional( + Type.Object( + { + default: Type.Number(), + max: Type.Number() + }, + { additionalProperties: false } + ) + ), + origins: Type.Optional(Type.Array(Type.String())), + mongodb: Type.Optional(Type.String()), + mysql: sqlSettingsSchema, + postgresql: sqlSettingsSchema, + sqlite: sqlSettingsSchema, + mssql: sqlSettingsSchema + }, + { $id: 'ApplicationConfiguration', additionalProperties: false } +) + +export type DefaultAppConfiguration = Static diff --git a/packages/typebox/src/index.ts b/packages/typebox/src/index.ts index c8992660ff..066c37c1c0 100644 --- a/packages/typebox/src/index.ts +++ b/packages/typebox/src/index.ts @@ -1,6 +1,7 @@ import { Type, TObject, TInteger, TOptional, TSchema, TIntersect } from '@sinclair/typebox' export * from '@sinclair/typebox' +export * from './default-schemas' const arrayOfKeys = (type: T) => { const keys = Object.keys(type.properties) diff --git a/packages/typebox/test/index.test.ts b/packages/typebox/test/index.test.ts index 92e80dd92b..88472f7620 100644 --- a/packages/typebox/test/index.test.ts +++ b/packages/typebox/test/index.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' import { Ajv } from '@feathersjs/schema' -import { querySyntax, Type, Static } from '../src' +import { querySyntax, Type, Static, defaultAppConfiguration } from '../src' describe('@feathersjs/schema/typebox', () => { it('querySyntax', async () => { @@ -27,4 +27,24 @@ describe('@feathersjs/schema/typebox', () => { assert.ok(validated) }) + + it('defaultAppConfiguration', async () => { + const configSchema = Type.Intersect([ + defaultAppConfiguration, + Type.Object({ + host: Type.String(), + port: Type.Number(), + public: Type.String() + }) + ]) + + const validator = new Ajv().compile(configSchema) + const validated = await validator({ + host: 'something', + port: 3030, + public: './' + }) + + assert.ok(validated) + }) }) From e953f0deb747ba10861da8dea15bf0bb170dc3d8 Mon Sep 17 00:00:00 2001 From: daffl Date: Wed, 5 Oct 2022 11:47:57 -0700 Subject: [PATCH 10/11] Client and schema formatting improvements --- packages/cli/src/app/templates/app.tpl.ts | 2 +- packages/cli/src/app/templates/client.tpl.ts | 2 +- .../cli/src/app/templates/index.html.tpl.ts | 62 ++++--------------- .../cli/src/app/templates/package.json.tpl.ts | 2 +- .../cli/src/app/templates/readme.md.tpl.ts | 22 ++++--- .../templates/schema.json.tpl.ts | 8 --- .../templates/schema.typebox.tpl.ts | 8 --- packages/cli/src/service/index.ts | 2 +- .../cli/src/service/templates/client.tpl.ts | 35 ++++++++--- .../src/service/templates/schema.json.tpl.ts | 9 --- .../service/templates/schema.typebox.tpl.ts | 9 +-- 11 files changed, 58 insertions(+), 103 deletions(-) diff --git a/packages/cli/src/app/templates/app.tpl.ts b/packages/cli/src/app/templates/app.tpl.ts index c3fa4d18dd..4977c95935 100644 --- a/packages/cli/src/app/templates/app.tpl.ts +++ b/packages/cli/src/app/templates/app.tpl.ts @@ -20,9 +20,9 @@ const app: Application = koa(feathers()) app.configure(configuration(configurationValidator)) // Set up Koa middleware +app.use(cors()) app.use(serveStatic(app.get('public'))) app.use(errorHandler()) -app.use(cors()) app.use(parseAuthentication()) app.use(bodyParser()) diff --git a/packages/cli/src/app/templates/client.tpl.ts b/packages/cli/src/app/templates/client.tpl.ts index eae05291f1..ab83dd0f1e 100644 --- a/packages/cli/src/app/templates/client.tpl.ts +++ b/packages/cli/src/app/templates/client.tpl.ts @@ -6,7 +6,7 @@ const template = ({}: AppGeneratorContext) => /* ts */ `import { feathers } from import type { Paginated, ClientService, TransportConnection, Params } from '@feathersjs/feathers' export interface ServiceTypes { - // A mapping of client side services + // } export const createClient = (connection: TransportConnection) => { diff --git a/packages/cli/src/app/templates/index.html.tpl.ts b/packages/cli/src/app/templates/index.html.tpl.ts index 1486485807..171da72480 100644 --- a/packages/cli/src/app/templates/index.html.tpl.ts +++ b/packages/cli/src/app/templates/index.html.tpl.ts @@ -14,70 +14,30 @@ const template = ({ name, description }: AppGeneratorContext) => /* html */ ` -
-

${name}

- - - - -
+ + ` export const generate = (ctx: AppGeneratorContext) => diff --git a/packages/cli/src/app/templates/package.json.tpl.ts b/packages/cli/src/app/templates/package.json.tpl.ts index 19b867dc46..e8c75b04b7 100644 --- a/packages/cli/src/app/templates/package.json.tpl.ts +++ b/packages/cli/src/app/templates/package.json.tpl.ts @@ -16,7 +16,7 @@ const tsPackageJson = (lib: string) => ({ scripts: { dev: `nodemon -x ts-node ${lib}/index.ts`, compile: 'shx rm -rf lib/ && tsc', - start: 'npm run compile && node lib/', + start: 'node lib/', prettier: 'npx prettier "**/*.ts" --write', mocha: 'cross-env NODE_ENV=test mocha test/ --require ts-node/register --recursive --extension .ts --exit', diff --git a/packages/cli/src/app/templates/readme.md.tpl.ts b/packages/cli/src/app/templates/readme.md.tpl.ts index 20fe12547f..7ac54db41f 100644 --- a/packages/cli/src/app/templates/readme.md.tpl.ts +++ b/packages/cli/src/app/templates/readme.md.tpl.ts @@ -1,7 +1,7 @@ import { generator, renderTemplate, toFile } from '@feathershq/pinion' import { AppGeneratorContext } from '../index' -const template = ({ name, description }: AppGeneratorContext) => /* md */ `# ${name} +const template = ({ name, description, language, database }: AppGeneratorContext) => /* md */ `# ${name} > ${description} @@ -21,7 +21,17 @@ This project uses [Feathers](http://feathersjs.com). An open source framework fo 3. Start your app - \`\`\` + \`\`\`${ + language === 'ts' + ? ` + npm run compile # Compile TypeScript source` + : '' + }${ + database !== 'mongodb' + ? ` + npm run migrate # Run migrations to set up the database` + : '' +} npm start \`\`\` @@ -31,13 +41,11 @@ Run \`npm test\` and all your tests in the \`test/\` directory will be run. ## Scaffolding -Feathers has a powerful command line interface. Here are a few things it can do: +This app comes with a powerful command line interface for Feathers. Here are a few things it can do: \`\`\` -$ npm install -g @feathersjs/cli # Install Feathers CLI - -$ feathers generate service # Generate a new Service -$ feathers help # Show all commands +$ npx feathers help # Show all commands +$ npx feathers generate service # Generate a new Service \`\`\` ## Help diff --git a/packages/cli/src/authentication/templates/schema.json.tpl.ts b/packages/cli/src/authentication/templates/schema.json.tpl.ts index 3bbe289611..6e7ef992fd 100644 --- a/packages/cli/src/authentication/templates/schema.json.tpl.ts +++ b/packages/cli/src/authentication/templates/schema.json.tpl.ts @@ -32,11 +32,8 @@ export const ${camelName}DataSchema = { .join(',\n')} } } as const - export type ${upperName}Data = FromSchema - export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) - export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ properties: { ${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''} @@ -56,9 +53,7 @@ export const ${camelName}Schema = { } } } as const - export type ${upperName} = FromSchema - export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ properties: {} }) @@ -79,11 +74,8 @@ export const ${camelName}QuerySchema = { ...jsonSchema.querySyntax(${camelName}Schema.properties) } } as const - export type ${upperName}Query = FromSchema - export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) - export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ properties: { // If there is a user (e.g. with authentication), they are only allowed to see their own data diff --git a/packages/cli/src/authentication/templates/schema.typebox.tpl.ts b/packages/cli/src/authentication/templates/schema.typebox.tpl.ts index 03ad5d0a46..66b3eb5599 100644 --- a/packages/cli/src/authentication/templates/schema.typebox.tpl.ts +++ b/packages/cli/src/authentication/templates/schema.typebox.tpl.ts @@ -27,11 +27,8 @@ export const ${camelName}DataSchema = Type.Object({ ) .join(',\n')} }, { $id: '${upperName}Data', additionalProperties: false }) - export type ${upperName}Data = Static - export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) - export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ properties: { ${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''} @@ -45,9 +42,7 @@ export const ${camelName}Schema = Type.Intersect([ ${type === 'mongodb' ? '_id: Type.String()' : 'id: Type.Number()'} }) ], { $id: '${upperName}' }) - export type ${upperName} = Static - export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ properties: {} }) @@ -65,11 +60,8 @@ export const ${camelName}QuerySchema = Type.Intersect([ // Add additional query properties here Type.Object({}) ]) - export type ${upperName}Query = Static - export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) - export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ properties: { // If there is a user (e.g. with authentication), they are only allowed to see their own data diff --git a/packages/cli/src/service/index.ts b/packages/cli/src/service/index.ts index 1db7950e89..d40aef02f9 100644 --- a/packages/cli/src/service/index.ts +++ b/packages/cli/src/service/index.ts @@ -137,7 +137,7 @@ export const generate = (ctx: ServiceGeneratorArguments) => type: 'list', when: schema === undefined, message: 'Which schema definition format do you want to use?', - default: ctx.feathers?.schema, + default: ctx.feathers?.schema || 'json', choices: [ { value: 'typebox', diff --git a/packages/cli/src/service/templates/client.tpl.ts b/packages/cli/src/service/templates/client.tpl.ts index 31050ad9d0..f514a9c6ef 100644 --- a/packages/cli/src/service/templates/client.tpl.ts +++ b/packages/cli/src/service/templates/client.tpl.ts @@ -1,4 +1,5 @@ -import { generator, inject, toFile, when, after } from '@feathershq/pinion' +import { generator, inject, toFile, when, after, before } from '@feathershq/pinion' +import { injectSource } from '../../commons' import { ServiceGeneratorContext } from '../index' const schemaImports = ({ upperName, folder, fileName }: ServiceGeneratorContext) => /* ts */ `import type { @@ -20,15 +21,33 @@ const declarationTemplate = ({ path, upperName }: ServiceGeneratorContext) => Partial<${upperName}Data>, Paginated<${upperName}>, Params<${upperName}Query> - >` + > & { + // Add custom methods here + }` + +const registrationTemplate = ({ + path +}: ServiceGeneratorContext) => ` client.use('${path}', connection.service('${path}'), { + // List all standard and custom methods + methods: ['find', 'get', 'create', 'update', 'patch', 'remove'] +}) +` const toClientFile = toFile(({ lib }) => [lib, 'client.ts']) export const generate = async (ctx: ServiceGeneratorContext) => - generator(ctx).then( - when( - (ctx) => ctx.language === 'ts', - inject(schemaImports, after("from '@feathersjs/feathers'"), toClientFile), - inject(declarationTemplate, after('export interface ServiceTypes'), toClientFile) + generator(ctx) + .then( + injectSource( + registrationTemplate, + before('return client'), + toFile(({ lib }) => [lib, 'client']) + ) + ) + .then( + when( + (ctx) => ctx.language === 'ts', + inject(schemaImports, after("from '@feathersjs/feathers'"), toClientFile), + inject(declarationTemplate, after('export interface ServiceTypes'), toClientFile) + ) ) - ) diff --git a/packages/cli/src/service/templates/schema.json.tpl.ts b/packages/cli/src/service/templates/schema.json.tpl.ts index dec1392708..c377ebb9ae 100644 --- a/packages/cli/src/service/templates/schema.json.tpl.ts +++ b/packages/cli/src/service/templates/schema.json.tpl.ts @@ -25,11 +25,8 @@ export const ${camelName}DataSchema = { } } } as const - export type ${upperName}Data = FromSchema - export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) - export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ properties: {} }) @@ -47,13 +44,10 @@ export const ${camelName}Schema = { } } } as const - export type ${upperName} = FromSchema - export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ properties: {} }) - export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({ properties: {} }) @@ -67,11 +61,8 @@ export const ${camelName}QuerySchema = { ...jsonSchema.querySyntax(${camelName}Schema.properties) } } as const - export type ${upperName}Query = FromSchema - export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) - export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ properties: {} }) diff --git a/packages/cli/src/service/templates/schema.typebox.tpl.ts b/packages/cli/src/service/templates/schema.typebox.tpl.ts index 3103639921..b2cd3f2a2a 100644 --- a/packages/cli/src/service/templates/schema.typebox.tpl.ts +++ b/packages/cli/src/service/templates/schema.typebox.tpl.ts @@ -18,24 +18,20 @@ import { dataValidator, queryValidator } from '${relative}/schemas/validators' export const ${camelName}DataSchema = Type.Object({ text: Type.String() }, { $id: '${upperName}Data', additionalProperties: false }) - export type ${upperName}Data = Static - export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator) - export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({ properties: {} }) +// Schema for the data that is being returned export const ${camelName}Schema = Type.Intersect([ ${camelName}DataSchema, Type.Object({ ${type === 'mongodb' ? '_id: Type.String()' : 'id: Type.Number()'} }) ], { $id: '${upperName}', additionalProperties: false }) - export type ${upperName} = Static - export const ${camelName}Resolver = resolve<${upperName}, HookContext>({ properties: {} }) @@ -50,11 +46,8 @@ export const ${camelName}QuerySchema = Type.Intersect([ // Add additional query properties here Type.Object({}) ]) - export type ${upperName}Query = Static - export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator) - export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({ properties: {} }) From 639c7adc4e02517393c715cb00f2d3011bdc9e3d Mon Sep 17 00:00:00 2001 From: daffl Date: Thu, 6 Oct 2022 10:57:11 -0700 Subject: [PATCH 11/11] Update typebox module infrastructure --- packages/typebox/package-lock.json | 242 ----------------------------- packages/typebox/package.json | 8 +- 2 files changed, 4 insertions(+), 246 deletions(-) delete mode 100644 packages/typebox/package-lock.json diff --git a/packages/typebox/package-lock.json b/packages/typebox/package-lock.json deleted file mode 100644 index cdbd379b5e..0000000000 --- a/packages/typebox/package-lock.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "name": "@feathersjs/typebox", - "version": "5.0.0-pre.29", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@feathersjs/typebox", - "version": "5.0.0-pre.29", - "license": "MIT", - "devDependencies": { - "@types/mocha": "^9.1.1", - "@types/node": "^18.7.18", - "typescript": "^4.8.3" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - } - }, - "../adapter-commons": { - "name": "@feathersjs/adapter-commons", - "version": "5.0.0-pre.29", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@feathersjs/commons": "^5.0.0-pre.29", - "@feathersjs/errors": "^5.0.0-pre.29", - "@feathersjs/feathers": "^5.0.0-pre.29" - }, - "devDependencies": { - "@types/mocha": "^10.0.0", - "@types/mongodb": "^4.0.6", - "@types/node": "^18.8.2", - "mocha": "^10.0.0", - "mongodb": "^4.10.0", - "shx": "^0.3.4", - "ts-node": "^10.9.1", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" - } - }, - "../adapter-tests": { - "name": "@feathersjs/adapter-tests", - "version": "5.0.0-pre.29", - "extraneous": true, - "license": "MIT", - "devDependencies": { - "@types/mocha": "^10.0.0", - "@types/node": "^18.8.2", - "mocha": "^10.0.0", - "shx": "^0.3.4", - "ts-node": "^10.9.1", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" - } - }, - "../commons": { - "name": "@feathersjs/commons", - "version": "5.0.0-pre.29", - "extraneous": true, - "license": "MIT", - "devDependencies": { - "@types/mocha": "^10.0.0", - "@types/node": "^18.8.2", - "mocha": "^10.0.0", - "shx": "^0.3.4", - "ts-node": "^10.9.1", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - } - }, - "../errors": { - "name": "@feathersjs/errors", - "version": "5.0.0-pre.29", - "extraneous": true, - "license": "MIT", - "devDependencies": { - "@feathersjs/feathers": "^5.0.0-pre.29", - "@types/mocha": "^10.0.0", - "@types/node": "^18.8.2", - "mocha": "^10.0.0", - "shx": "^0.3.4", - "ts-node": "^10.9.1", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">= 12" - } - }, - "../feathers": { - "name": "@feathersjs/feathers", - "version": "5.0.0-pre.29", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@feathersjs/commons": "^5.0.0-pre.29", - "@feathersjs/hooks": "^0.7.5", - "events": "^3.3.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.0", - "@types/node": "^18.8.2", - "mocha": "^10.0.0", - "shx": "^0.3.4", - "ts-node": "^10.9.1", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - } - }, - "../memory": { - "name": "@feathersjs/memory", - "version": "5.0.0-pre.29", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.0-pre.29", - "@feathersjs/commons": "^5.0.0-pre.29", - "@feathersjs/errors": "^5.0.0-pre.29", - "sift": "^16.0.0" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.0-pre.29", - "@feathersjs/feathers": "^5.0.0-pre.29", - "@types/mocha": "^10.0.0", - "@types/node": "^18.8.2", - "mocha": "^10.0.0", - "shx": "^0.3.4", - "ts-node": "^10.9.1", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">= 12" - } - }, - "../schema": { - "name": "@feathersjs/schema", - "version": "5.0.0-pre.29", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@feathersjs/commons": "^5.0.0-pre.29", - "@feathersjs/errors": "^5.0.0-pre.29", - "@feathersjs/feathers": "^5.0.0-pre.29", - "@feathersjs/hooks": "^0.7.5", - "@types/json-schema": "^7.0.11", - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "json-schema": "^0.4.0", - "json-schema-to-ts": "^2.5.5" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.0-pre.29", - "@types/mocha": "^10.0.0", - "@types/node": "^18.8.2", - "ajv-formats": "^2.1.1", - "mocha": "^10.0.0", - "shx": "^0.3.4", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - } - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.2.tgz", - "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - } - }, - "dependencies": { - "@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "@types/node": { - "version": "18.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.2.tgz", - "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==", - "dev": true - }, - "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true - } - } -} diff --git a/packages/typebox/package.json b/packages/typebox/package.json index 3d315cfa6d..7d264f595f 100644 --- a/packages/typebox/package.json +++ b/packages/typebox/package.json @@ -42,7 +42,7 @@ ], "scripts": { "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../cli/test", + "pack": "npm pack --pack-destination ../cli/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", "test": "npm run compile && npm run mocha" @@ -58,11 +58,11 @@ }, "devDependencies": { "@feathersjs/schema": "^5.0.0-pre.29", - "@types/mocha": "^9.1.1", - "@types/node": "^18.7.18", + "@types/mocha": "^10.0.0", + "@types/node": "^18.8.2", "mocha": "^10.0.0", "shx": "^0.3.4", - "typescript": "^4.8.3" + "typescript": "^4.8.4" }, "gitHead": "4314dc89a41a8bbaabf00b47697bf7887861d17d" }