From 3a6c24b6030c5436d8b5e52b2d0d16707a123d1e Mon Sep 17 00:00:00 2001 From: garrettmills Date: Sun, 16 Jul 2023 17:48:03 -0500 Subject: [PATCH] Create initial standup logic to bootstrap control CT & install Node.js --- .gitignore | 2 + package.json | 11 +- pnpm-lock.yaml | 1501 ++++++++++------- src/app/AppUnit.ts | 7 +- src/app/cli/directive/StandupDirective.ts | 135 ++ ...eP5xCredentialsTableMigration.migration.ts | 48 + ...eateP5xIpRangesTableMigration.migration.ts | 56 + ..._CreateP5xNodesTableMigration.migration.ts | 62 + ..._CreateSettingsTableMigration.migration.ts | 44 + src/app/models/Credential.model.ts | 24 + src/app/models/IpRange.model.ts | 66 + src/app/models/Node.model.ts | 61 + src/app/models/Setting.model.ts | 80 + src/app/services/Images.service.ts | 38 + src/app/services/Provisioner.service.ts | 228 +++ src/app/support/hosts/ExecutionResult.ts | 36 + src/app/support/hosts/Host.ts | 203 +++ src/app/support/hosts/LocalHost.ts | 25 + src/app/support/hosts/PCTHost.ts | 24 + src/app/support/hosts/SSHHost.ts | 77 + src/app/support/hosts/SystemMetrics.ts | 15 + src/app/support/hosts/errors.ts | 51 + src/app/support/hosts/index.ts | 7 + src/app/support/hosts/types.ts | 34 + src/app/types.ts | 31 + src/cli.ts | 1 + src/index.ts | 4 +- 27 files changed, 2212 insertions(+), 659 deletions(-) create mode 100644 src/app/cli/directive/StandupDirective.ts create mode 100644 src/app/migrations/2023-04-01T03:01:02.528Z_CreateP5xCredentialsTableMigration.migration.ts create mode 100644 src/app/migrations/2023-04-01T03:02:21.621Z_CreateP5xIpRangesTableMigration.migration.ts create mode 100644 src/app/migrations/2023-04-01T03:28:47.961Z_CreateP5xNodesTableMigration.migration.ts create mode 100644 src/app/migrations/2023-04-01T04:21:49.411Z_CreateSettingsTableMigration.migration.ts create mode 100644 src/app/models/Credential.model.ts create mode 100644 src/app/models/IpRange.model.ts create mode 100644 src/app/models/Node.model.ts create mode 100644 src/app/models/Setting.model.ts create mode 100644 src/app/services/Images.service.ts create mode 100644 src/app/services/Provisioner.service.ts create mode 100644 src/app/support/hosts/ExecutionResult.ts create mode 100644 src/app/support/hosts/Host.ts create mode 100644 src/app/support/hosts/LocalHost.ts create mode 100644 src/app/support/hosts/PCTHost.ts create mode 100644 src/app/support/hosts/SSHHost.ts create mode 100644 src/app/support/hosts/SystemMetrics.ts create mode 100644 src/app/support/hosts/errors.ts create mode 100644 src/app/support/hosts/index.ts create mode 100644 src/app/support/hosts/types.ts create mode 100644 src/app/types.ts diff --git a/.gitignore b/.gitignore index 2aae23b..a2d9786 100644 --- a/.gitignore +++ b/.gitignore @@ -193,3 +193,5 @@ dist /exbuild *.sqlite +notes.md +src/dev_tools.ts diff --git a/package.json b/package.json index 919d3ff..d778ced 100644 --- a/package.json +++ b/package.json @@ -9,17 +9,26 @@ }, "dependencies": { "@atao60/fse-cli": "^0.1.7", - "@extollo/lib": "^0.14.10", + "@extollo/lib": "^0.14.13", "@types/node": "^18.15.11", + "@types/ssh2": "^1.11.13", + "@types/sshpk": "^1.17.1", + "@types/ws": "^8.5.5", "copyfiles": "^2.4.1", + "engine.io-client": "^6.5.1", "feed": "^4.2.2", "gotify": "^1.1.0", + "ip-cidr": "^3.1.0", + "proxmox-api": "^1.0.0", "rimraf": "^3.0.2", + "ssh2": "^1.14.0", + "sshpk": "^1.17.0", "ts-expose-internals": "^4.5.4", "ts-node": "^10.9.0", "ts-patch": "^2.0.1", "ts-to-zod": "^1.8.0", "typescript": "^4.3.2", + "ws": "^8.13.0", "zod": "^3.11.6" }, "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fdacca9..eee94de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,42 +1,85 @@ -lockfileVersion: 5.4 - -specifiers: - '@atao60/fse-cli': ^0.1.7 - '@extollo/lib': ^0.14.10 - '@types/node': ^18.15.11 - copyfiles: ^2.4.1 - feed: ^4.2.2 - gotify: ^1.1.0 - nodemon: ^2.0.19 - rimraf: ^3.0.2 - ts-expose-internals: ^4.5.4 - ts-node: ^10.9.0 - ts-patch: ^2.0.1 - ts-to-zod: ^1.8.0 - typescript: ^4.3.2 - zod: ^3.11.6 +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@atao60/fse-cli': 0.1.7 - '@extollo/lib': 0.14.10 - '@types/node': 18.15.11 - copyfiles: 2.4.1 - feed: 4.2.2 - gotify: 1.1.0 - rimraf: 3.0.2 - ts-expose-internals: 4.7.4 - ts-node: 10.9.1_cxfbvt4gy2ccta7pvj2zudi2n4 - ts-patch: 2.0.1_typescript@4.7.4 - ts-to-zod: 1.11.0 - typescript: 4.7.4 - zod: 3.17.3 + '@atao60/fse-cli': + specifier: ^0.1.7 + version: 0.1.7 + '@extollo/lib': + specifier: ^0.14.13 + version: 0.14.13 + '@types/node': + specifier: ^18.15.11 + version: 18.15.11 + '@types/ssh2': + specifier: ^1.11.13 + version: 1.11.13 + '@types/sshpk': + specifier: ^1.17.1 + version: 1.17.1 + '@types/ws': + specifier: ^8.5.5 + version: 8.5.5 + copyfiles: + specifier: ^2.4.1 + version: 2.4.1 + engine.io-client: + specifier: ^6.5.1 + version: 6.5.1 + feed: + specifier: ^4.2.2 + version: 4.2.2 + gotify: + specifier: ^1.1.0 + version: 1.1.0 + ip-cidr: + specifier: ^3.1.0 + version: 3.1.0 + proxmox-api: + specifier: ^1.0.0 + version: 1.0.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ssh2: + specifier: ^1.14.0 + version: 1.14.0 + sshpk: + specifier: ^1.17.0 + version: 1.17.0 + ts-expose-internals: + specifier: ^4.5.4 + version: 4.7.4 + ts-node: + specifier: ^10.9.0 + version: 10.9.1(@types/node@18.15.11)(typescript@4.7.4) + ts-patch: + specifier: ^2.0.1 + version: 2.0.1(typescript@4.7.4) + ts-to-zod: + specifier: ^1.8.0 + version: 1.11.0 + typescript: + specifier: ^4.3.2 + version: 4.7.4 + ws: + specifier: ^8.13.0 + version: 8.13.0 + zod: + specifier: ^3.11.6 + version: 3.17.3 devDependencies: - nodemon: 2.0.19 + nodemon: + specifier: ^2.0.19 + version: 2.0.19 packages: - /@atao60/fse-cli/0.1.7: + /@atao60/fse-cli@0.1.7: resolution: {integrity: sha512-gjRvhP1nzQ0tbAp4VokHjc9lOjmnHtHTlfaeTrHuktm47bjb2GNqr01P3mIytbAC6AiDJtdEgMDt2aNXAwJ8sA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0, npm: '>=6.14.11'} hasBin: true @@ -54,52 +97,52 @@ packages: tslib: 2.4.0 dev: false - /@babel/helper-string-parser/7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-validator-identifier/7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} dev: false - /@babel/parser/7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.5 dev: false - /@babel/runtime/7.18.6: + /@babel/runtime@7.18.6: resolution: {integrity: sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.9 dev: false - /@babel/types/7.21.4: - resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 dev: false - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: false - /@extollo/lib/0.14.10: - resolution: {integrity: sha512-lAQxRRR7Dn7oIV3lDlKs0f6tRkhFGkFBjylfo+kcfHIxEzItnyvg3XNJtZ/xGiQuERnF0eMO+Cd5YsT0zeDouQ==} + /@extollo/lib@0.14.13: + resolution: {integrity: sha512-RKppPu92qr+M1nH1N8am1HW3UJfytbM9guvKVveVeZ1/xY/MthA0i3co8GHhB//PimeGsKF/c6tarjgwmPp6SA==} dependencies: '@atao60/fse-cli': 0.1.7 - '@extollo/ui': 0.1.0_@types+node@14.18.42 + '@extollo/ui': 0.1.0(@types/node@14.18.53) '@types/bcrypt': 5.0.0 '@types/busboy': 0.2.4 '@types/cli-table': 0.3.1 @@ -108,14 +151,14 @@ packages: '@types/mime-types': 2.1.1 '@types/mkdirp': 1.0.2 '@types/negotiator': 0.6.1 - '@types/node': 14.18.42 - '@types/pg': 8.6.6 + '@types/node': 14.18.53 + '@types/pg': 8.10.2 '@types/pluralize': 0.0.29 '@types/pug': 2.0.6 '@types/rimraf': 3.0.2 '@types/ssh2': 0.5.52 '@types/uuid': 8.3.4 - '@types/ws': 8.5.4 + '@types/ws': 8.5.5 bcrypt: 5.1.0 busboy: 0.3.1 cli-table: 0.3.11 @@ -127,22 +170,19 @@ packages: mkdirp: 1.0.4 negotiator: 0.6.3 node-fetch: 3.3.1 - pg: 8.10.0 + pg: 8.11.1 pluralize: 8.0.0 pug: 3.0.2 reflect-metadata: 0.1.13 rimraf: 3.0.2 - sqlite: 4.1.2 + sqlite: 4.2.1 sqlite3: 5.1.6 - ssh2: 1.11.0 - ts-node: 10.9.1_wh2cnrlliuuxb2etxm2m3ttgna - typedoc: 0.23.28_typescript@4.9.5 - typedoc-plugin-pages-fork: 0.0.1 - typedoc-plugin-sourcefile-url: 1.0.6_typedoc@0.23.28 + ssh2: 1.14.0 + ts-node: 10.9.1(@types/node@14.18.53)(typescript@4.9.5) typescript: 4.9.5 uuid: 8.3.2 ws: 8.13.0 - zod: 3.17.3 + zod: 3.21.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -154,17 +194,17 @@ packages: - utf-8-validate dev: false - /@extollo/ui/0.1.0_@types+node@14.18.42: + /@extollo/ui@0.1.0(@types/node@14.18.53): resolution: {integrity: sha512-EuFpNfIyL9ZTbrlCxeOwIJaZnZo3EOLEKNUDHgGgTfEUJPDKKl8VTrGsuCEGWtPnwZwz/kwD0q8Qv+jTdgducQ==} dependencies: - '@popperjs/core': 2.11.7 + '@popperjs/core': 2.11.8 '@types/rimraf': 3.0.2 '@types/uuid': 8.3.4 - bootstrap: 5.2.3_@popperjs+core@2.11.7 + bootstrap: 5.3.0(@popperjs/core@2.11.8) dotenv: 10.0.0 mkdirp: 1.0.4 rimraf: 3.0.2 - ts-node: 10.9.1_wh2cnrlliuuxb2etxm2m3ttgna + ts-node: 10.9.1(@types/node@14.18.53)(typescript@4.9.5) typescript: 4.9.5 uuid: 8.3.2 transitivePeerDependencies: @@ -173,46 +213,46 @@ packages: - '@types/node' dev: false - /@gar/promisify/1.1.3: + /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: false optional: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: false - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: false - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: false - /@mapbox/node-pre-gyp/1.0.10: - resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true dependencies: detect-libc: 2.0.1 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.9 + node-fetch: 2.6.12 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 semver: 7.3.7 - tar: 6.1.13 + tar: 6.1.15 transitivePeerDependencies: - encoding - supports-color dev: false - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -220,12 +260,12 @@ packages: run-parallel: 1.2.0 dev: false - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: false - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -233,7 +273,7 @@ packages: fastq: 1.13.0 dev: false - /@npmcli/fs/1.1.1: + /@npmcli/fs@1.1.1: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 @@ -241,7 +281,7 @@ packages: dev: false optional: true - /@npmcli/move-file/1.1.2: + /@npmcli/move-file@1.1.2: resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs @@ -251,9 +291,27 @@ packages: dev: false optional: true - /@oclif/command/1.8.16: + /@oclif/command@1.8.16(@oclif/config@1.18.2): resolution: {integrity: sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w==} engines: {node: '>=12.0.0'} + peerDependencies: + '@oclif/config': ^1 + dependencies: + '@oclif/config': 1.18.2 + '@oclif/errors': 1.3.5 + '@oclif/help': 1.0.1 + '@oclif/parser': 3.8.7 + debug: 4.3.4 + semver: 7.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@oclif/command@1.8.16(@oclif/config@1.18.3): + resolution: {integrity: sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@oclif/config': ^1 dependencies: '@oclif/config': 1.18.3 '@oclif/errors': 1.3.5 @@ -265,7 +323,7 @@ packages: - supports-color dev: false - /@oclif/config/1.18.2: + /@oclif/config@1.18.2: resolution: {integrity: sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA==} engines: {node: '>=8.0.0'} dependencies: @@ -279,7 +337,7 @@ packages: - supports-color dev: false - /@oclif/config/1.18.3: + /@oclif/config@1.18.3: resolution: {integrity: sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA==} engines: {node: '>=8.0.0'} dependencies: @@ -293,7 +351,7 @@ packages: - supports-color dev: false - /@oclif/errors/1.3.5: + /@oclif/errors@1.3.5: resolution: {integrity: sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==} engines: {node: '>=8.0.0'} dependencies: @@ -304,7 +362,7 @@ packages: wrap-ansi: 7.0.0 dev: false - /@oclif/help/1.0.1: + /@oclif/help@1.0.1: resolution: {integrity: sha512-8rsl4RHL5+vBUAKBL6PFI3mj58hjPCp2VYyXD4TAa7IMStikFfOH2gtWmqLzIlxAED2EpD0dfYwo9JJxYsH7Aw==} engines: {node: '>=8.0.0'} dependencies: @@ -321,11 +379,11 @@ packages: - supports-color dev: false - /@oclif/linewrap/1.0.0: + /@oclif/linewrap@1.0.0: resolution: {integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==} dev: false - /@oclif/parser/3.8.7: + /@oclif/parser@3.8.7: resolution: {integrity: sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q==} engines: {node: '>=8.0.0'} dependencies: @@ -335,11 +393,11 @@ packages: tslib: 2.4.0 dev: false - /@oclif/plugin-help/3.3.1: + /@oclif/plugin-help@3.3.1: resolution: {integrity: sha512-QuSiseNRJygaqAdABYFWn/H1CwIZCp9zp/PLid6yXvy6VcQV7OenEFF5XuYaCvSARe2Tg9r8Jqls5+fw1A9CbQ==} engines: {node: '>=8.0.0'} dependencies: - '@oclif/command': 1.8.16 + '@oclif/command': 1.8.16(@oclif/config@1.18.2) '@oclif/config': 1.18.2 '@oclif/errors': 1.3.5 '@oclif/help': 1.0.1 @@ -354,57 +412,67 @@ packages: - supports-color dev: false - /@popperjs/core/2.11.7: - resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==} + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@sindresorhus/is/2.1.1: + /@sindresorhus/is@2.1.1: resolution: {integrity: sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==} engines: {node: '>=10'} dev: false - /@szmarczak/http-timer/4.0.6: + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + dev: false + + /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} dependencies: defer-to-connect: 2.0.1 dev: false - /@tootallnate/once/1.1.2: + /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} dev: false optional: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: false - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: false - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: false - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: false - /@types/bcrypt/5.0.0: + /@types/asn1@0.2.0: + resolution: {integrity: sha512-5TMxIpYbIA9c1J0hYQjQDX3wr+rTgQEAXaW2BI8ECM8FO53wSW4HFZplTalrKSHuZUc76NtXcePRhwuOHqGD5g==} + dependencies: + '@types/node': 18.15.11 + dev: false + + /@types/bcrypt@5.0.0: resolution: {integrity: sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==} dependencies: '@types/node': 18.15.11 dev: false - /@types/busboy/0.2.4: + /@types/busboy@0.2.4: resolution: {integrity: sha512-f+ZCVjlcN8JW/zf3iR0GqO4gjOUlltMTtZjn+YR1mlK+MVu6esTiIecO0/GQlmYQPQLdBnc7+5vG3Xb+SkvFLw==} dependencies: '@types/node': 18.15.11 dev: false - /@types/cacheable-request/6.0.2: + /@types/cacheable-request@6.0.2: resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} dependencies: '@types/http-cache-semantics': 4.0.1 @@ -413,122 +481,135 @@ packages: '@types/responselike': 1.0.0 dev: false - /@types/cli-table/0.3.1: + /@types/cli-table@0.3.1: resolution: {integrity: sha512-m3+6WWfSSl6zqoXy8uQQifbgqV7Gt6fsyWnHLgUWVtJQk75+OfUB+edSZ52YDj7leSiZtX7w1/E4w2x/Hb0orA==} dev: false - /@types/glob/8.1.0: + /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: false - /@types/http-cache-semantics/4.0.1: + /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: false - /@types/ioredis/4.28.10: + /@types/ioredis@4.28.10: resolution: {integrity: sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==} dependencies: '@types/node': 18.15.11 dev: false - /@types/json-buffer/3.0.0: + /@types/json-buffer@3.0.0: resolution: {integrity: sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==} dev: false - /@types/jsonwebtoken/8.5.9: + /@types/jsonwebtoken@8.5.9: resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} dependencies: '@types/node': 18.15.11 dev: false - /@types/keyv/3.1.4: + /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: '@types/node': 18.15.11 dev: false - /@types/mime-types/2.1.1: + /@types/mime-types@2.1.1: resolution: {integrity: sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==} dev: false - /@types/minimatch/5.1.2: + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: false - /@types/mkdirp/1.0.2: + /@types/mkdirp@1.0.2: resolution: {integrity: sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==} dependencies: '@types/node': 18.15.11 dev: false - /@types/negotiator/0.6.1: + /@types/negotiator@0.6.1: resolution: {integrity: sha512-c4mvXFByghezQ/eVGN5HvH/jI63vm3B7FiE81BUzDAWmuiohRecCO6ddU60dfq29oKUMiQujsoB2h0JQC7JHKA==} dev: false - /@types/node/14.18.42: - resolution: {integrity: sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==} + /@types/node@14.18.53: + resolution: {integrity: sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==} dev: false - /@types/node/18.15.11: + /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} dev: false - /@types/pg/8.6.6: - resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} + /@types/pg@8.10.2: + resolution: {integrity: sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==} dependencies: '@types/node': 18.15.11 pg-protocol: 1.6.0 - pg-types: 2.2.0 + pg-types: 4.0.1 dev: false - /@types/pluralize/0.0.29: + /@types/pluralize@0.0.29: resolution: {integrity: sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==} dev: false - /@types/pug/2.0.6: + /@types/pug@2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: false - /@types/responselike/1.0.0: + /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: '@types/node': 18.15.11 dev: false - /@types/rimraf/3.0.2: + /@types/rimraf@3.0.2: resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} dependencies: '@types/glob': 8.1.0 '@types/node': 18.15.11 dev: false - /@types/ssh2-streams/0.1.9: + /@types/ssh2-streams@0.1.9: resolution: {integrity: sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==} dependencies: '@types/node': 18.15.11 dev: false - /@types/ssh2/0.5.52: + /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: '@types/node': 18.15.11 '@types/ssh2-streams': 0.1.9 dev: false - /@types/uuid/8.3.4: + /@types/ssh2@1.11.13: + resolution: {integrity: sha512-08WbG68HvQ2YVi74n2iSUnYHYpUdFc/s2IsI0BHBdJwaqYJpWlVv9elL0tYShTv60yr0ObdxJR5NrCRiGJ/0CQ==} + dependencies: + '@types/node': 18.15.11 + dev: false + + /@types/sshpk@1.17.1: + resolution: {integrity: sha512-bOJek/W++DvWRNAeHmpvgX8Q1ypAq4nmeVi3nJ+pjDcMB214S8kSGkxRUw/Uz+zau4VwxcfNp0xUq4s/3DLjLw==} + dependencies: + '@types/asn1': 0.2.0 + '@types/node': 18.15.11 + dev: false + + /@types/uuid@8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: false - /@types/ws/8.5.4: - resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + /@types/ws@8.5.5: + resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 18.15.11 dev: false - /@typescript/vfs/1.3.5: + /@typescript/vfs@1.3.5: resolution: {integrity: sha512-pI8Saqjupf9MfLw7w2+og+fmb0fZS0J6vsKXXrp4/PDXEFvntgzXmChCXC/KefZZS0YGS6AT8e0hGAJcTsdJlg==} dependencies: debug: 4.3.4 @@ -536,27 +617,27 @@ packages: - supports-color dev: false - /abbrev/1.1.1: + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: false - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: false - /acorn/8.7.1: + /acorn@8.7.1: resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} engines: {node: '>=0.4.0'} hasBin: true dev: false - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -565,7 +646,7 @@ packages: - supports-color dev: false - /agentkeepalive/4.3.0: + /agentkeepalive@4.3.0: resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} engines: {node: '>= 8.0.0'} dependencies: @@ -577,7 +658,7 @@ packages: dev: false optional: true - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -586,48 +667,44 @@ packages: dev: false optional: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 dev: false - /ansi-escapes/5.0.0: + /ansi-escapes@5.0.0: resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} engines: {node: '>=12'} dependencies: type-fest: 1.4.0 dev: false - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: false - /ansi-sequence-parser/1.1.0: - resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} - dev: false - - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 dev: false - /anymatch/3.1.2: + /anymatch@3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /aproba/2.0.0: + /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: false - /are-we-there-yet/2.0.0: + /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} dependencies: @@ -635,7 +712,7 @@ packages: readable-stream: 3.6.0 dev: false - /are-we-there-yet/3.0.1: + /are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -644,79 +721,84 @@ packages: dev: false optional: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: false - /arg/5.0.2: + /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: false - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: false - /asap/2.0.6: + /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: false - /asn1/0.2.6: + /asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 dev: false - /assert-never/1.2.1: + /assert-never@1.2.1: resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} dev: false - /async/3.2.4: + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: false + + /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: false - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: false - /babel-walk/3.0.0-canary-5: + /babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.5 dev: false - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /base64-js/1.5.1: + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false - /bcrypt-pbkdf/1.0.2: + /bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 dev: false - /bcrypt/5.1.0: + /bcrypt@5.1.0: resolution: {integrity: sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==} engines: {node: '>= 10.0.0'} requiresBuild: true dependencies: - '@mapbox/node-pre-gyp': 1.0.10 + '@mapbox/node-pre-gyp': 1.0.11 node-addon-api: 5.1.0 transitivePeerDependencies: - encoding - supports-color dev: false - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 @@ -724,66 +806,67 @@ packages: readable-stream: 3.6.0 dev: false - /bootstrap/5.2.3_@popperjs+core@2.11.7: - resolution: {integrity: sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==} + /bootstrap@5.3.0(@popperjs/core@2.11.8): + resolution: {integrity: sha512-UnBV3E3v4STVNQdms6jSGO2CvOkjUMdDAVR2V5N4uCMdaIkaQjbcEAMqRimDHIs4uqBYzDAKCQwCB+97tJgHQw==} peerDependencies: - '@popperjs/core': ^2.11.6 + '@popperjs/core': ^2.11.7 dependencies: - '@popperjs/core': 2.11.7 + '@popperjs/core': 2.11.8 dev: false - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion/2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: false - - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /buffer-equal-constant-time/1.0.1: - resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} dev: false - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: false - /buffer-writer/2.0.0: + /buffer-writer@2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} dev: false - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: false - /buildcheck/0.0.3: - resolution: {integrity: sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==} + /buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} engines: {node: '>=10.0.0'} dev: false optional: true - /busboy/0.3.1: + /busboy@0.3.1: resolution: {integrity: sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==} engines: {node: '>=4.5.0'} dependencies: dicer: 0.3.0 dev: false - /cacache/15.3.0: + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} dependencies: @@ -803,14 +886,14 @@ packages: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 6.1.13 + tar: 6.1.15 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird dev: false optional: true - /cacheable-lookup/2.0.1: + /cacheable-lookup@2.0.1: resolution: {integrity: sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==} engines: {node: '>=10'} dependencies: @@ -818,7 +901,7 @@ packages: keyv: 4.3.2 dev: false - /cacheable-request/7.0.2: + /cacheable-request@7.0.2: resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} engines: {node: '>=8'} dependencies: @@ -831,24 +914,24 @@ packages: responselike: 2.0.0 dev: false - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 dev: false - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: false - /case/1.6.3: + /case@1.6.3: resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} engines: {node: '>= 0.8.0'} dev: false - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -856,17 +939,17 @@ packages: supports-color: 7.2.0 dev: false - /character-parser/2.2.0: + /character-parser@2.2.0: resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} dependencies: is-regex: 1.1.4 dev: false - /chardet/0.7.0: + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: false - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -880,49 +963,49 @@ packages: optionalDependencies: fsevents: 2.3.2 - /chownr/2.0.0: + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: false - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: false optional: true - /clean-stack/3.0.1: + /clean-stack@3.0.1: resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} engines: {node: '>=10'} dependencies: escape-string-regexp: 4.0.0 dev: false - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 dev: false - /cli-spinners/2.6.1: + /cli-spinners@2.6.1: resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} engines: {node: '>=6'} dev: false - /cli-table/0.3.11: + /cli-table@0.3.11: resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} engines: {node: '>= 0.2.0'} dependencies: colors: 1.0.3 dev: false - /cli-width/3.0.0: + /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} dev: false - /cliui/7.0.4: + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 @@ -930,53 +1013,49 @@ packages: wrap-ansi: 7.0.0 dev: false - /clone-response/1.0.2: + /clone-response@1.0.2: resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} dependencies: mimic-response: 1.0.1 dev: false - /clone/1.0.4: + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} dev: false - /cluster-key-slot/1.1.2: + /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} dev: false - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 dev: false - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false - /color-support/1.1.3: + /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: false - /colors/1.0.3: + /colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} engines: {node: '>=0.1.90'} dev: false - /colors/1.4.0: + /colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} dev: false - /compare-versions/3.6.0: - resolution: {integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==} - dev: false - - /compress-brotli/1.3.8: + /compress-brotli@1.3.8: resolution: {integrity: sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==} engines: {node: '>= 12'} dependencies: @@ -984,21 +1063,21 @@ packages: json-buffer: 3.0.1 dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - /console-control-strings/1.1.0: + /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false - /constantinople/4.0.1: + /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 dev: false - /copyfiles/2.4.1: + /copyfiles@2.4.1: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true dependencies: @@ -1011,35 +1090,42 @@ packages: yargs: 16.2.0 dev: false - /core-js/3.23.4: + /core-js@3.23.4: resolution: {integrity: sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ==} requiresBuild: true dev: false - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false - /cpu-features/0.0.4: - resolution: {integrity: sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==} + /cpu-features@0.0.8: + resolution: {integrity: sha512-BbHBvtYhUhksqTjr6bhNOjGgMnhwhGTQmOoZGD+K7BCaQDCuZl/Ve1ZxUSMRwVC4D/rkCPQ2MAIeYzrWyK7eEg==} engines: {node: '>=10.0.0'} requiresBuild: true dependencies: - buildcheck: 0.0.3 + buildcheck: 0.0.6 nan: 2.17.0 dev: false optional: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: false - /data-uri-to-buffer/4.0.1: + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: false + + /data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} dev: false - /debug/3.2.7_supports-color@5.5.0: + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -1051,7 +1137,7 @@ packages: supports-color: 5.5.0 dev: true - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1063,92 +1149,99 @@ packages: ms: 2.1.2 dev: false - /decompress-response/5.0.0: + /decompress-response@5.0.0: resolution: {integrity: sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==} engines: {node: '>=10'} dependencies: mimic-response: 2.1.0 dev: false - /defaults/1.0.3: + /defaults@1.0.3: resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} dependencies: clone: 1.0.4 dev: false - /defer-to-connect/2.0.1: + /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} dev: false - /delegates/1.0.0: + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: false - /denque/1.5.1: + /denque@1.5.1: resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} engines: {node: '>=0.10'} dev: false - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: false optional: true - /detect-libc/2.0.1: + /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} dev: false - /dicer/0.3.0: + /dicer@0.3.0: resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==} engines: {node: '>=4.5.0'} dependencies: streamsearch: 0.1.2 dev: false - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: false - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: false - /doctypes/1.1.0: + /doctypes@1.1.0: resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} dev: false - /dotenv/10.0.0: + /dotenv@10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} dev: false - /dotenv/8.6.0: + /dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} dev: false - /duplexer3/0.1.5: + /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} dev: false - /ecdsa-sig-formatter/1.0.11: + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + + /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: safe-buffer: 5.2.1 dev: false - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false - /encoding/0.1.13: + /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} requiresBuild: true dependencies: @@ -1156,45 +1249,64 @@ packages: dev: false optional: true - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: false - /env-paths/2.2.1: + /engine.io-client@6.5.1: + resolution: {integrity: sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-parser: 5.1.0 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.1.0: + resolution: {integrity: sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==} + engines: {node: '>=10.0.0'} + dev: false + + /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} dev: false optional: true - /err-code/2.0.3: + /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} dev: false optional: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: false - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: false - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: false - /esm/3.2.25: + /esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} dev: false optional: true - /external-editor/3.1.0: + /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -1203,7 +1315,7 @@ packages: tmp: 0.0.33 dev: false - /fast-glob/3.2.11: + /fast-glob@3.2.11: resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} engines: {node: '>=8.6.0'} dependencies: @@ -1214,20 +1326,20 @@ packages: micromatch: 4.0.5 dev: false - /fastq/1.13.0: + /fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: reusify: 1.0.4 dev: false - /feed/4.2.2: + /feed@4.2.2: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} dependencies: xml-js: 1.6.11 dev: false - /fetch-blob/3.2.0: + /fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} dependencies: @@ -1235,27 +1347,27 @@ packages: web-streams-polyfill: 3.2.1 dev: false - /figures/3.2.0: + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 dev: false - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /formdata-polyfill/4.0.10: + /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} dependencies: fetch-blob: 3.2.0 dev: false - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -1264,7 +1376,7 @@ packages: universalify: 2.0.0 dev: false - /fs-extra/8.1.0: + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -1273,7 +1385,7 @@ packages: universalify: 0.1.2 dev: false - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -1283,29 +1395,29 @@ packages: universalify: 2.0.0 dev: false - /fs-minipass/2.1.0: + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 dev: false - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: false - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: false - /gauge/3.0.2: + /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} dependencies: @@ -1320,7 +1432,7 @@ packages: wide-align: 1.1.5 dev: false - /gauge/4.0.4: + /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -1335,33 +1447,40 @@ packages: dev: false optional: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: false - /get-intrinsic/1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 dev: false - /get-stream/5.2.0: + /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} dependencies: pump: 3.0.0 dev: false - /glob-parent/5.1.2: + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: false + + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -1372,7 +1491,7 @@ packages: path-is-absolute: 1.0.1 dev: false - /global-prefix/3.0.0: + /global-prefix@3.0.0: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} dependencies: @@ -1381,7 +1500,7 @@ packages: which: 1.3.1 dev: false - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -1393,7 +1512,7 @@ packages: slash: 3.0.0 dev: false - /got/10.7.0: + /got@10.7.0: resolution: {integrity: sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==} engines: {node: '>=10'} dependencies: @@ -1416,54 +1535,59 @@ packages: type-fest: 0.10.0 dev: false - /gotify/1.1.0: + /gotify@1.1.0: resolution: {integrity: sha512-f3PUh08i+1JCJuzv9CRYuIx1QOb9DoWXRvWaPttgiZEG7XtetDQVv6S9cr6suPNKkZI4ry8dqdU2qdb9AiPinw==} dependencies: got: 10.7.0 dev: false - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: false - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: false - /has-symbols/1.0.3: + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: false - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: false - /has-unicode/2.0.1: + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: false - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: false - /http-cache-semantics/4.1.0: + /http-cache-semantics@4.1.0: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} dev: false - /http-proxy-agent/4.0.1: + /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} dependencies: @@ -1475,7 +1599,7 @@ packages: dev: false optional: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -1485,21 +1609,21 @@ packages: - supports-color dev: false - /humanize-ms/1.2.1: + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: ms: 2.1.3 dev: false optional: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: false - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: @@ -1507,51 +1631,51 @@ packages: dev: false optional: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false - /ignore-by-default/1.0.1: + /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: true - /ignore/5.2.0: + /ignore@5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} dev: false - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: false optional: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: false - /infer-owner/1.0.4: + /infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} dev: false optional: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: false - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false - /inquirer/8.2.4: + /inquirer@8.2.4: resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} engines: {node: '>=12.0.0'} dependencies: @@ -1572,12 +1696,12 @@ packages: wrap-ansi: 7.0.0 dev: false - /interpret/1.4.0: + /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} dev: false - /ioredis/4.28.5: + /ioredis@4.28.5: resolution: {integrity: sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==} engines: {node: '>=6'} dependencies: @@ -1596,75 +1720,91 @@ packages: - supports-color dev: false - /ip/2.0.0: + /ip-address@7.1.0: + resolution: {integrity: sha512-V9pWC/VJf2lsXqP7IWJ+pe3P1/HCYGBMZrrnT62niLGjAfCbeiwXMUxaeHvnVlz19O27pvXP4azs+Pj/A0x+SQ==} + engines: {node: '>= 10'} + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.2 + dev: false + + /ip-cidr@3.1.0: + resolution: {integrity: sha512-HUCn4snshEX1P8cja/IyU3qk8FVDW8T5zZcegDFbu4w7NojmAhk5NcOgj3M8+0fmumo1afJTPDtJlzsxLdOjtg==} + engines: {node: '>=10.0.0'} + dependencies: + ip-address: 7.1.0 + jsbn: 1.1.0 + dev: false + + /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} dev: false optional: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-core-module/2.9.0: + /is-core-module@2.9.0: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 dev: false - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: false - /is-expression/4.0.0: + /is-expression@4.0.0: resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} dependencies: acorn: 7.4.1 object-assign: 4.1.1 dev: false - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: false - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-interactive/1.0.0: + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} dev: false - /is-lambda/1.0.1: + /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: false optional: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-observable/2.1.0: + /is-observable@2.1.0: resolution: {integrity: sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==} engines: {node: '>=8'} dev: false - /is-promise/2.2.2: + /is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: false - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -1672,49 +1812,53 @@ packages: has-tostringtag: 1.0.0 dev: false - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} dev: false - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: false - /isarray/0.0.1: + /isarray@0.0.1: resolution: {integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=} dev: false - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: false - /js-stringify/1.0.2: + /js-stringify@1.0.2: resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} dev: false - /json-buffer/3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: false + + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} dev: false - /jsonc-parser/3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: false - /jsonfile/4.0.0: + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.10 dev: false - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -1722,7 +1866,7 @@ packages: graceful-fs: 4.2.10 dev: false - /jsonwebtoken/8.5.1: + /jsonwebtoken@8.5.1: resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} engines: {node: '>=4', npm: '>=1.4.28'} dependencies: @@ -1738,14 +1882,14 @@ packages: semver: 5.7.1 dev: false - /jstransformer/1.0.0: - resolution: {integrity: sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=} + /jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} dependencies: is-promise: 2.2.2 promise: 7.3.1 dev: false - /jwa/1.4.1: + /jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} dependencies: buffer-equal-constant-time: 1.0.1 @@ -1753,70 +1897,70 @@ packages: safe-buffer: 5.2.1 dev: false - /jws/3.2.2: + /jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 dev: false - /keyv/4.3.2: + /keyv@4.3.2: resolution: {integrity: sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==} dependencies: compress-brotli: 1.3.8 json-buffer: 3.0.1 dev: false - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: false - /lodash.defaults/4.2.0: + /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} dev: false - /lodash.flatten/4.4.0: + /lodash.flatten@4.4.0: resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} dev: false - /lodash.includes/4.3.0: + /lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} dev: false - /lodash.isarguments/3.1.0: + /lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} dev: false - /lodash.isboolean/3.0.3: + /lodash.isboolean@3.0.3: resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} dev: false - /lodash.isinteger/4.0.4: + /lodash.isinteger@4.0.4: resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} dev: false - /lodash.isnumber/3.0.3: + /lodash.isnumber@3.0.3: resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} dev: false - /lodash.isplainobject/4.0.6: + /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: false - /lodash.isstring/4.0.1: + /lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: false - /lodash.once/4.1.1: + /lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} dev: false - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: false - /log-symbols/4.1.0: + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: @@ -1824,39 +1968,35 @@ packages: is-unicode-supported: 0.1.0 dev: false - /lowercase-keys/2.0.0: + /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} dev: false - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: false - /lunr/2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: false - - /lz-string/1.4.4: + /lz-string@1.4.4: resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true dev: false - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 dev: false - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: false - /make-fetch-happen/9.1.0: + /make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} dependencies: @@ -1882,18 +2022,12 @@ packages: dev: false optional: true - /marked/4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - dev: false - - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: false - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -1901,50 +2035,43 @@ packages: picomatch: 2.3.1 dev: false - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: false - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: false - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: false - /mimic-response/1.0.1: + /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} dev: false - /mimic-response/2.1.0: + /mimic-response@2.1.0: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} engines: {node: '>=8'} dev: false - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - /minimatch/7.4.3: - resolution: {integrity: sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist/1.2.6: + /minimist@1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: false - /minipass-collect/1.0.2: + /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} dependencies: @@ -1952,7 +2079,7 @@ packages: dev: false optional: true - /minipass-fetch/1.4.1: + /minipass-fetch@1.4.1: resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} engines: {node: '>=8'} dependencies: @@ -1964,7 +2091,7 @@ packages: dev: false optional: true - /minipass-flush/1.0.5: + /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: @@ -1972,7 +2099,7 @@ packages: dev: false optional: true - /minipass-pipeline/1.2.4: + /minipass-pipeline@1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} dependencies: @@ -1980,7 +2107,7 @@ packages: dev: false optional: true - /minipass-sized/1.0.3: + /minipass-sized@1.0.3: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} dependencies: @@ -1988,19 +2115,19 @@ packages: dev: false optional: true - /minipass/3.3.6: + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: false - /minipass/4.2.5: - resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} dev: false - /minizlib/2.1.2: + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: @@ -2008,48 +2135,48 @@ packages: yallist: 4.0.0 dev: false - /mkdirp/1.0.4: + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: false - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /mute-stream/0.0.8: + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: false - /nan/2.17.0: + /nan@2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} dev: false optional: true - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: false - /node-addon-api/4.3.0: + /node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} dev: false - /node-addon-api/5.1.0: + /node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} dev: false - /node-domexception/1.0.0: + /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: false - /node-fetch/2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -2060,7 +2187,7 @@ packages: whatwg-url: 5.0.0 dev: false - /node-fetch/3.3.1: + /node-fetch@3.3.1: resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -2069,7 +2196,7 @@ packages: formdata-polyfill: 4.0.10 dev: false - /node-gyp/8.4.1: + /node-gyp@8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} hasBin: true @@ -2083,7 +2210,7 @@ packages: npmlog: 6.0.2 rimraf: 3.0.2 semver: 7.3.7 - tar: 6.1.13 + tar: 6.1.15 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -2091,14 +2218,14 @@ packages: dev: false optional: true - /nodemon/2.0.19: + /nodemon@2.0.19: resolution: {integrity: sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==} engines: {node: '>=8.10.0'} hasBin: true requiresBuild: true dependencies: chokidar: 3.5.3 - debug: 3.2.7_supports-color@5.5.0 + debug: 3.2.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -2109,21 +2236,21 @@ packages: undefsafe: 2.0.5 dev: true - /noms/0.0.0: + /noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} dependencies: inherits: 2.0.4 readable-stream: 1.0.34 dev: false - /nopt/1.0.10: + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true dependencies: abbrev: 1.1.1 dev: true - /nopt/5.0.0: + /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} hasBin: true @@ -2131,16 +2258,16 @@ packages: abbrev: 1.1.1 dev: false - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /normalize-url/6.1.0: + /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} dev: false - /npmlog/5.0.1: + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: are-we-there-yet: 2.0.0 @@ -2149,7 +2276,7 @@ packages: set-blocking: 2.0.0 dev: false - /npmlog/6.0.2: + /npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -2160,29 +2287,33 @@ packages: dev: false optional: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: false - /observable-fns/0.6.1: + /observable-fns@0.6.1: resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} dev: false - /once/1.4.0: + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: false + + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: false - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: false - /ora/5.4.1: + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} dependencies: @@ -2197,34 +2328,34 @@ packages: wcwidth: 1.0.1 dev: false - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} dev: false - /p-cancelable/2.1.1: + /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} dev: false - /p-event/4.2.0: + /p-event@4.2.0: resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} engines: {node: '>=8'} dependencies: p-timeout: 3.2.0 dev: false - /p-finally/1.0.0: + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: false - /p-map/2.1.0: + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: false - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: @@ -2232,53 +2363,64 @@ packages: dev: false optional: true - /p-timeout/3.2.0: + /p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} dependencies: p-finally: 1.0.0 dev: false - /packet-reader/1.0.0: + /packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} dev: false - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: false - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: false - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: false - /pg-connection-string/2.5.0: - resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + requiresBuild: true dev: false + optional: true - /pg-int8/1.0.1: + /pg-connection-string@2.6.1: + resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} + dev: false + + /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} dev: false - /pg-pool/3.6.0_pg@8.10.0: - resolution: {integrity: sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==} + /pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + dev: false + + /pg-pool@3.6.1(pg@8.11.1): + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} peerDependencies: pg: '>=8.0' dependencies: - pg: 8.10.0 + pg: 8.11.1 dev: false - /pg-protocol/1.6.0: + /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} dev: false - /pg-types/2.2.0: + /pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} dependencies: @@ -2289,8 +2431,21 @@ packages: postgres-interval: 1.2.0 dev: false - /pg/8.10.0: - resolution: {integrity: sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==} + /pg-types@4.0.1: + resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==} + engines: {node: '>=10'} + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.0.1 + postgres-interval: 3.0.0 + postgres-range: 1.1.3 + dev: false + + /pg@8.11.1: + resolution: {integrity: sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -2300,61 +2455,89 @@ packages: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.5.0 - pg-pool: 3.6.0_pg@8.10.0 + pg-connection-string: 2.6.1 + pg-pool: 3.6.1(pg@8.11.1) pg-protocol: 1.6.0 pg-types: 2.2.0 pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 dev: false - /pgpass/1.0.5: + /pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} dependencies: split2: 4.2.0 dev: false - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pluralize/8.0.0: + /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} dev: false - /postgres-array/2.0.0: + /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} dev: false - /postgres-bytea/1.0.0: + /postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + dev: false + + /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} dev: false - /postgres-date/1.0.7: + /postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + dependencies: + obuf: 1.1.2 + dev: false + + /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} dev: false - /postgres-interval/1.2.0: + /postgres-date@2.0.1: + resolution: {integrity: sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==} + engines: {node: '>=12'} + dev: false + + /postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} dependencies: xtend: 4.0.2 dev: false - /prettier/2.2.1: + /postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + dev: false + + /postgres-range@1.1.3: + resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==} + dev: false + + /prettier@2.2.1: resolution: {integrity: sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==} engines: {node: '>=10.13.0'} hasBin: true dev: false - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /promise-inflight/1.0.1: + /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: bluebird: '*' @@ -2364,7 +2547,7 @@ packages: dev: false optional: true - /promise-retry/2.0.1: + /promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} dependencies: @@ -2373,17 +2556,23 @@ packages: dev: false optional: true - /promise/7.3.1: + /promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: asap: 2.0.6 dev: false - /pstree.remy/1.1.8: + /proxmox-api@1.0.0: + resolution: {integrity: sha512-ocRFtPn9n4eQTCEspnPAJyIkXmcFAdsl9Opql8ErTPJlkTnssOWzIf3UBwtZPtbRzRSFCFKE3BuGKD06u5F8Ig==} + dependencies: + undici: 5.21.0 + dev: false + + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /pug-attrs/3.0.0: + /pug-attrs@3.0.0: resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} dependencies: constantinople: 4.0.1 @@ -2391,7 +2580,7 @@ packages: pug-runtime: 3.0.1 dev: false - /pug-code-gen/3.0.2: + /pug-code-gen@3.0.2: resolution: {integrity: sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==} dependencies: constantinople: 4.0.1 @@ -2404,11 +2593,11 @@ packages: with: 7.0.2 dev: false - /pug-error/2.0.0: + /pug-error@2.0.0: resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==} dev: false - /pug-filters/4.0.0: + /pug-filters@4.0.0: resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} dependencies: constantinople: 4.0.1 @@ -2418,7 +2607,7 @@ packages: resolve: 1.22.1 dev: false - /pug-lexer/5.0.1: + /pug-lexer@5.0.1: resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} dependencies: character-parser: 2.2.0 @@ -2426,42 +2615,42 @@ packages: pug-error: 2.0.0 dev: false - /pug-linker/4.0.0: + /pug-linker@4.0.0: resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} dependencies: pug-error: 2.0.0 pug-walk: 2.0.0 dev: false - /pug-load/3.0.0: + /pug-load@3.0.0: resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} dependencies: object-assign: 4.1.1 pug-walk: 2.0.0 dev: false - /pug-parser/6.0.0: + /pug-parser@6.0.0: resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} dependencies: pug-error: 2.0.0 token-stream: 1.0.0 dev: false - /pug-runtime/3.0.1: + /pug-runtime@3.0.1: resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} dev: false - /pug-strip-comments/2.0.0: + /pug-strip-comments@2.0.0: resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} dependencies: pug-error: 2.0.0 dev: false - /pug-walk/2.0.0: + /pug-walk@2.0.0: resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} dev: false - /pug/3.0.2: + /pug@3.0.2: resolution: {integrity: sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==} dependencies: pug-code-gen: 3.0.2 @@ -2474,18 +2663,18 @@ packages: pug-strip-comments: 2.0.0 dev: false - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: false - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: false - /readable-stream/1.0.34: + /readable-stream@1.0.34: resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} dependencies: core-util-is: 1.0.3 @@ -2494,7 +2683,7 @@ packages: string_decoder: 0.10.31 dev: false - /readable-stream/2.3.7: + /readable-stream@2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: core-util-is: 1.0.3 @@ -2506,7 +2695,7 @@ packages: util-deprecate: 1.0.2 dev: false - /readable-stream/3.6.0: + /readable-stream@3.6.0: resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} dependencies: @@ -2515,49 +2704,49 @@ packages: util-deprecate: 1.0.2 dev: false - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /rechoir/0.6.2: + /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: resolve: 1.22.1 dev: false - /redis-commands/1.7.0: + /redis-commands@1.7.0: resolution: {integrity: sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==} dev: false - /redis-errors/1.2.0: + /redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} dev: false - /redis-parser/3.0.0: + /redis-parser@3.0.0: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} dependencies: redis-errors: 1.2.0 dev: false - /reflect-metadata/0.1.13: + /reflect-metadata@0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false - /regenerator-runtime/0.13.9: + /regenerator-runtime@0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} dev: false - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: false - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -2566,13 +2755,13 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: false - /responselike/2.0.0: + /responselike@2.0.0: resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==} dependencies: lowercase-keys: 2.0.0 dev: false - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: @@ -2580,72 +2769,72 @@ packages: signal-exit: 3.0.7 dev: false - /retry/0.12.0: + /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: false optional: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: false - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: false - /run-async/2.4.1: + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} dev: false - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: false - /rxjs/7.5.6: + /rxjs@7.5.6: resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} dependencies: tslib: 2.4.0 dev: false - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: false - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false - /sax/1.2.4: + /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: false - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: false - /semver/7.0.0: + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /semver/7.3.7: + /semver@7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true @@ -2653,11 +2842,11 @@ packages: lru-cache: 6.0.0 dev: false - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false - /shelljs/0.8.5: + /shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} hasBin: true @@ -2667,38 +2856,29 @@ packages: rechoir: 0.6.2 dev: false - /shiki/0.14.1: - resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} - dependencies: - ansi-sequence-parser: 1.1.0 - jsonc-parser: 3.2.0 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 - dev: false - - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false - /simple-update-notifier/1.0.7: + /simple-update-notifier@1.0.7: resolution: {integrity: sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==} engines: {node: '>=8.10.0'} dependencies: semver: 7.0.0 dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: false - /smart-buffer/4.2.0: + /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: false optional: true - /socks-proxy-agent/6.2.1: + /socks-proxy-agent@6.2.1: resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} engines: {node: '>= 10'} dependencies: @@ -2710,7 +2890,7 @@ packages: dev: false optional: true - /socks/2.7.1: + /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} dependencies: @@ -2719,37 +2899,37 @@ packages: dev: false optional: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: false - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: false - /split2/4.2.0: + /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: false - /sqlite/4.1.2: - resolution: {integrity: sha512-FlBG51gHbux5vPjwnoqFEghNGvnTMTbHyiI09U3qFTQs9AtWuwd4i++6+WCusCXKrVdIDLzfdGekrolr3m4U4A==} + /sprintf-js@1.1.2: + resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} dev: false - /sqlite3/5.1.6: + /sqlite3@5.1.6: resolution: {integrity: sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==} requiresBuild: true peerDependenciesMeta: node-gyp: optional: true dependencies: - '@mapbox/node-pre-gyp': 1.0.10 + '@mapbox/node-pre-gyp': 1.0.11 node-addon-api: 4.3.0 - tar: 6.1.13 + tar: 6.1.15 optionalDependencies: node-gyp: 8.4.1 transitivePeerDependencies: @@ -2758,19 +2938,39 @@ packages: - supports-color dev: false - /ssh2/1.11.0: - resolution: {integrity: sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==} + /sqlite@4.2.1: + resolution: {integrity: sha512-Tll0Ndvnwkuv5Hn6WIbh26rZiYQORuH1t5m/or9LUpSmDmmyFG89G9fKrSeugMPxwmEIXoVxqTun4LbizTs4uw==} + dev: false + + /ssh2@1.14.0: + resolution: {integrity: sha512-AqzD1UCqit8tbOKoj6ztDDi1ffJZ2rV2SwlgrVVrHPkV5vWqGJOVp5pmtj18PunkPJAuKQsnInyKV+/Nb2bUnA==} engines: {node: '>=10.16.0'} requiresBuild: true dependencies: asn1: 0.2.6 bcrypt-pbkdf: 1.0.2 optionalDependencies: - cpu-features: 0.0.4 + cpu-features: 0.0.8 nan: 2.17.0 dev: false - /ssri/8.0.1: + /sshpk@1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + + /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} dependencies: @@ -2778,16 +2978,21 @@ packages: dev: false optional: true - /standard-as-callback/2.1.0: + /standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} dev: false - /streamsearch/0.1.2: - resolution: {integrity: sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=} + /streamsearch@0.1.2: + resolution: {integrity: sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==} engines: {node: '>=0.8.0'} dev: false - /string-width/4.2.3: + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -2796,44 +3001,44 @@ packages: strip-ansi: 6.0.1 dev: false - /string_decoder/0.10.31: + /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} dev: false - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: false - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: false - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 dev: false - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: false - /supports-hyperlinks/2.2.0: + /supports-hyperlinks@2.2.0: resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} engines: {node: '>=8'} dependencies: @@ -2841,24 +3046,24 @@ packages: supports-color: 7.2.0 dev: false - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: false - /tar/6.1.13: - resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 4.2.5 + minipass: 5.0.0 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 dev: false - /terminal-link/3.0.0: + /terminal-link@3.0.0: resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} engines: {node: '>=12'} dependencies: @@ -2866,7 +3071,7 @@ packages: supports-hyperlinks: 2.2.0 dev: false - /threads/1.7.0: + /threads@1.7.0: resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} dependencies: callsites: 3.1.0 @@ -2879,18 +3084,18 @@ packages: - supports-color dev: false - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false - - /through2/2.0.5: + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.7 xtend: 4.0.2 dev: false - /tiny-worker/2.3.0: + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + + /tiny-worker@2.3.0: resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} requiresBuild: true dependencies: @@ -2898,49 +3103,49 @@ packages: dev: false optional: true - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 dev: false - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: false - /to-readable-stream/2.1.0: + /to-readable-stream@2.1.0: resolution: {integrity: sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==} engines: {node: '>=8'} dev: false - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /token-stream/1.0.0: - resolution: {integrity: sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=} + /token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} dev: false - /touch/3.1.0: + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true dependencies: nopt: 1.0.10 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-expose-internals/4.7.4: + /ts-expose-internals@4.7.4: resolution: {integrity: sha512-y0CwDHVk/IpkAu/g7xGmxej/9homOQG2FMr1iU3ir+N4hfjVmQMWxjGXqYFDloZnU85RNubWctl/UXW90Nd6bg==} dev: false - /ts-node/10.9.1_cxfbvt4gy2ccta7pvj2zudi2n4: + /ts-node@10.9.1(@types/node@14.18.53)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -2959,19 +3164,19 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.11 + '@types/node': 14.18.53 acorn: 8.7.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.7.4 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: false - /ts-node/10.9.1_wh2cnrlliuuxb2etxm2m3ttgna: + /ts-node@10.9.1(@types/node@18.15.11)(typescript@4.7.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -2990,19 +3195,19 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.42 + '@types/node': 18.15.11 acorn: 8.7.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 4.7.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: false - /ts-patch/2.0.1_typescript@4.7.4: + /ts-patch@2.0.1(typescript@4.7.4): resolution: {integrity: sha512-mP7beU1QkmyDs1+SzXYVaSTD6Xo7ZCibOJ3sZkb/xsQjoAQXvn4oPjk0keC2LfCNAgilqtqgjiWp3pQri1uz4w==} hasBin: true peerDependencies: @@ -3018,11 +3223,11 @@ packages: typescript: 4.7.4 dev: false - /ts-to-zod/1.11.0: + /ts-to-zod@1.11.0: resolution: {integrity: sha512-CjPFXAoL75Z1adco7My/H5w5egT4MxtB4R2ljojkLuxE0nPg+TIitevhi/SrKzlzoQp9XIC/gme0ACf4aC6s2Q==} hasBin: true dependencies: - '@oclif/command': 1.8.16 + '@oclif/command': 1.8.16(@oclif/config@1.18.3) '@oclif/config': 1.18.3 '@oclif/plugin-help': 3.3.1 '@typescript/vfs': 1.3.5 @@ -3039,22 +3244,22 @@ packages: slash: 3.0.0 threads: 1.7.0 tslib: 2.4.0 - tsutils: 3.21.0_typescript@4.7.4 + tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 zod: 3.17.3 transitivePeerDependencies: - supports-color dev: false - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: false - /tslib/2.4.0: + /tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: false - /tsutils/3.21.0_typescript@4.7.4: + /tsutils@3.21.0(typescript@4.7.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -3064,163 +3269,125 @@ packages: typescript: 4.7.4 dev: false - /tweetnacl/0.14.5: + /tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} dev: false - /type-fest/0.10.0: + /type-fest@0.10.0: resolution: {integrity: sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==} engines: {node: '>=8'} dev: false - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} dev: false - /type-fest/1.4.0: + /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} dev: false - /typedoc-default-themes/0.10.2: - resolution: {integrity: sha512-zo09yRj+xwLFE3hyhJeVHWRSPuKEIAsFK5r2u47KL/HBKqpwdUSanoaz5L34IKiSATFrjG5ywmIu98hPVMfxZg==} - engines: {node: '>= 8'} - dependencies: - lunr: 2.3.9 - dev: false - - /typedoc-plugin-pages-fork/0.0.1: - resolution: {integrity: sha512-WZoTOSarUL1CPO7LJOpsltP6B8Qrx3Tc0/hjZVNRe5mwvZnU1/LAz12ERyKzA/TsR1iIpiaixzkbhIwYkICGiQ==} - dependencies: - compare-versions: 3.6.0 - typedoc-default-themes: 0.10.2 - dev: false - - /typedoc-plugin-sourcefile-url/1.0.6_typedoc@0.23.28: - resolution: {integrity: sha512-xHq9DzkoQywS7FyPneMm2/Hr9GRoCpjSQXkVN0W6SCJKP7fguqg2tasgh+8l5/mW6YSYvqCqEbkSYLbuD4Y6gA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - typedoc: '>=0.16.0' - dependencies: - typedoc: 0.23.28_typescript@4.9.5 - dev: false - - /typedoc/0.23.28_typescript@4.9.5: - resolution: {integrity: sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==} - engines: {node: '>= 14.14'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x - dependencies: - lunr: 2.3.9 - marked: 4.3.0 - minimatch: 7.4.3 - shiki: 0.14.1 - typescript: 4.9.5 - dev: false - - /typescript/4.7.4: + /typescript@4.7.4: resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true dev: false - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: false - /undefsafe/2.0.5: + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /unique-filename/1.1.1: + /undici@5.21.0: + resolution: {integrity: sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==} + engines: {node: '>=12.18'} + dependencies: + busboy: 1.6.0 + dev: false + + /unique-filename@1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: unique-slug: 2.0.2 dev: false optional: true - /unique-slug/2.0.2: + /unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} dependencies: imurmurhash: 0.1.4 dev: false optional: true - /universalify/0.1.2: + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: false - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: false - /untildify/4.0.0: + /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} dev: false - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: false - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: false - /void-elements/3.1.0: + /void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} dev: false - /vscode-oniguruma/1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: false - - /vscode-textmate/8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: false - - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.3 dev: false - /web-streams-polyfill/3.2.1: + /web-streams-polyfill@3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} dev: false - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 dev: false - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: false - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -3229,30 +3396,30 @@ packages: dev: false optional: true - /wide-align/1.1.5: + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 4.2.3 dev: false - /widest-line/3.1.0: + /widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} dependencies: string-width: 4.2.3 dev: false - /with/7.0.2: + /with@7.0.2: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 dev: false - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -3261,7 +3428,7 @@ packages: strip-ansi: 6.0.1 dev: false - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -3270,11 +3437,24 @@ packages: strip-ansi: 6.0.1 dev: false - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false - /ws/8.13.0: + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -3287,33 +3467,38 @@ packages: optional: true dev: false - /xml-js/1.6.11: + /xml-js@1.6.11: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true dependencies: sax: 1.2.4 dev: false - /xtend/4.0.2: + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: false - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: false - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false - /yargs-parser/20.2.9: + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: false - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -3326,11 +3511,15 @@ packages: yargs-parser: 20.2.9 dev: false - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: false - /zod/3.17.3: + /zod@3.17.3: resolution: {integrity: sha512-4oKP5zvG6GGbMlqBkI5FESOAweldEhSOZ6LI6cG+JzUT7ofj1ZOC0PJudpQOpT1iqOFpYYtX5Pw0+o403y4bcg==} dev: false + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false diff --git a/src/app/AppUnit.ts b/src/app/AppUnit.ts index d31ca04..23ed6cf 100644 --- a/src/app/AppUnit.ts +++ b/src/app/AppUnit.ts @@ -1,9 +1,14 @@ -import {ORMUser, Singleton, Unit} from '@extollo/lib' +import {ORMUser, Singleton, Unit, CommandLine, Inject} from '@extollo/lib' import {User} from './models/User.model' +import {StandupDirective} from './cli/directive/StandupDirective' @Singleton() export class AppUnit extends Unit { + @Inject() + protected readonly cli!: CommandLine + async up(): Promise { this.container().registerStaticOverride(ORMUser, User) + this.cli.registerDirective(StandupDirective) } } diff --git a/src/app/cli/directive/StandupDirective.ts b/src/app/cli/directive/StandupDirective.ts new file mode 100644 index 0000000..b9a0114 --- /dev/null +++ b/src/app/cli/directive/StandupDirective.ts @@ -0,0 +1,135 @@ +import {Directive, Inject, Injectable, OptionDefinition, uuid4} from '@extollo/lib' +import { IpRange } from "../../models/IpRange.model"; +import { Setting } from "../../models/Setting.model"; +import { Provisioner } from "../../services/Provisioner.service"; +import { IpAddress, isIpAddress, isSubnet, Subnet } from "../../types"; +import * as crypto from 'crypto' + +@Injectable() +export class StandupDirective extends Directive { + @Inject() + protected readonly provisioner!: Provisioner + + getKeywords(): string | string[] { + return 'standup' + } + + getDescription(): string { + return 'perform initial configuration and setup for the control server' + } + + getOptions(): OptionDefinition[] { + return [ + '--pve-master-node {name} | the name of the master node in the PVE cluster', + '--pve-api-host {host} | the hostname or IP of a PVE cluster node', + // '--pve-token-id {id} | the fully-qualified ID of a PVE API token', + // '--pve-token-secret {secret} | secret for the PVE API token', + '--pve-root-password {password} | password for the root@pam PVE user', + '--ip-pool-start {start} | the starting address in the P5X IP pool', + '--ip-pool-end {end} | the final address in the P5X IP pool', + '--ip-pool-subnet {subnet} | the numeric subnet of the P5X IP pool (e.g. 24)', + '--ip-pool-gateway {gateway} | the address of the gateway for the P5X IP pool', + '--storage-pool {name} | the name of the PVE shared storage pool', + '--dns-domain {name} | the DNS domain name used for K8s nodes', + '--node-network-bridge {name} | the name of the PVE network bridge to which nodes will join', + '--node-cpu-cores {cores} | the number of cores to provision each K8s node with', + '--node-ram-mib {ram} | the amount of ram (in MiB) to provision each K8s node with', + ] + } + + public async handle(argv: string[]): Promise { + // Configure the settings: + await Setting.set('pveMasterNode', `${this.getOptionOrFail('pve-master-node')}`) + await Setting.set('pveApiHost', `${this.getOptionOrFail('pve-api-host')}`) + // await Setting.set('pveTokenId', `${this.getOptionOrFail('pve-token-id')}`) + // await Setting.set('pveTokenSecret', `${this.getOptionOrFail('pve-token-secret')}`) + await Setting.set('pveRootPassword', `${this.getOptionOrFail('pve-root-password')}`) + await Setting.set('pveStoragePool', `${this.getOptionOrFail('storage-pool')}`) + await Setting.set('dnsDomain', `${this.getOptionOrFail('dns-domain')}`) + await Setting.set('nodeNetworkBridge', `${this.getOptionOrFail('node-network-bridge')}`) + await Setting.set('nodeCpus', this.getIntOptionOrFail('node-cpu-cores')) + await Setting.set('nodeRamMib', this.getIntOptionOrFail('node-ram-mib')) + await Setting.set('rootPassword', uuid4()) + + const [sshPublicKey, sshPrivateKey] = await this.getSSHKeyPair() + await Setting.set('sshPublicKey', sshPublicKey) + await Setting.set('sshPrivateKey', sshPrivateKey) + + // Store the IP address pool: + const ipRange = this.container().makeNew(IpRange) + ipRange.name = 'Default address pool' + ipRange.startIp = this.getIpOptionOrFail('ip-pool-start') + ipRange.endIp = this.getIpOptionOrFail('ip-pool-end') + ipRange.subnet = this.getSubnetOptionOrFail('ip-pool-subnet') + ipRange.gatewayIp = this.getIpOptionOrFail('ip-pool-gateway') + ipRange.save() + + // Provision the master node: + const masterNode = await this.provisioner.provisionMasterNode() + } + + protected getIntOptionOrFail(option: string): number { + const val = parseInt(this.option(option, NaN), 10) + if ( isNaN(val) ) { + this.error(`Missing or malformed required integer option: --${option}`) + process.exit(1) + } + return val + } + + protected getSubnetOptionOrFail(option: string): Subnet { + const val = parseInt(this.option(option, NaN), 10) + if ( !isSubnet(val) ) { + this.error(`Missing or malformed required numeric subnet: --${option}`) + process.exit(1) + } + return val + } + + protected getIpOptionOrFail(option: string): IpAddress { + const val = `${this.option(option, '')}` + if ( !isIpAddress(val) ) { + this.error(`Missing or malformed required IP address: --${option}`) + process.exit(1) + } + return val + } + + protected getOptionOrFail(option: string): unknown { + const val = this.option(option, undefined) + if ( typeof val === 'undefined' ) { + this.error(`Missing required option: --${option}`) + process.exit(1) + } + return val + } + + protected async getSSHKeyPair(): Promise<[string, string]> { + return new Promise<[string, string]>((res, rej) => { + crypto.generateKeyPair( + 'rsa', + { + modulusLength: 4096, + publicKeyEncoding: { + type: 'spki', + format: 'pem', + }, + privateKeyEncoding: { + type: 'pkcs8', + format: 'pem', + cipher: 'aes-256-cbc', + passphrase: '', + }, + }, + (err, pubkey, privkey) => { + if ( err ) { + return rej(err) + } + + res([pubkey, privkey]) + }, + ) + }) + } + +} diff --git a/src/app/migrations/2023-04-01T03:01:02.528Z_CreateP5xCredentialsTableMigration.migration.ts b/src/app/migrations/2023-04-01T03:01:02.528Z_CreateP5xCredentialsTableMigration.migration.ts new file mode 100644 index 0000000..5bc92a8 --- /dev/null +++ b/src/app/migrations/2023-04-01T03:01:02.528Z_CreateP5xCredentialsTableMigration.migration.ts @@ -0,0 +1,48 @@ +import {Injectable, Migration, Inject, DatabaseService, FieldType} from '@extollo/lib' + +/** + * CreateP5xCredentialsTableMigration + * ---------------------------------- + * Create a table to store the PVE user credentials. + */ +@Injectable() +export default class CreateP5xCredentialsTableMigration extends Migration { + @Inject() + protected readonly db!: DatabaseService + + /** + * Apply the migration. + */ + async up(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_credentials') + + table.primaryKey('id') + + table.column('pve_username') + .type(FieldType.varchar) + .required() + + table.column('pve_credential') + .type(FieldType.text) + .required() + + table.column('is_api_token') + .type(FieldType.bool) + .required() + + await schema.commit(table) + } + + /** + * Undo the migration. + */ + async down(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_credentials') + + table.dropIfExists() + + await schema.commit(table) + } +} diff --git a/src/app/migrations/2023-04-01T03:02:21.621Z_CreateP5xIpRangesTableMigration.migration.ts b/src/app/migrations/2023-04-01T03:02:21.621Z_CreateP5xIpRangesTableMigration.migration.ts new file mode 100644 index 0000000..a4c5aca --- /dev/null +++ b/src/app/migrations/2023-04-01T03:02:21.621Z_CreateP5xIpRangesTableMigration.migration.ts @@ -0,0 +1,56 @@ +import {Injectable, Migration, Inject, DatabaseService, FieldType} from '@extollo/lib' + +/** + * CreateP5xIpRangesTableMigration + * ---------------------------------- + * Put some description here. + */ +@Injectable() +export default class CreateP5xIpRangesTableMigration extends Migration { + @Inject() + protected readonly db!: DatabaseService + + /** + * Apply the migration. + */ + async up(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_ip_ranges') + + table.primaryKey('id') + + table.column('name') + .type(FieldType.varchar) + .required() + + table.column('start_ip') + .type(FieldType.varchar) + .required() + + table.column('end_ip') + .type(FieldType.varchar) + .required() + + table.column('subnet') + .type(FieldType.int) + .required() + + table.column('gateway_ip') + .type(FieldType.varchar) + .required() + + await schema.commit(table) + } + + /** + * Undo the migration. + */ + async down(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_ip_ranges') + + table.dropIfExists() + + await schema.commit(table) + } +} diff --git a/src/app/migrations/2023-04-01T03:28:47.961Z_CreateP5xNodesTableMigration.migration.ts b/src/app/migrations/2023-04-01T03:28:47.961Z_CreateP5xNodesTableMigration.migration.ts new file mode 100644 index 0000000..8466817 --- /dev/null +++ b/src/app/migrations/2023-04-01T03:28:47.961Z_CreateP5xNodesTableMigration.migration.ts @@ -0,0 +1,62 @@ +import {Injectable, Migration, Inject, DatabaseService, FieldType} from '@extollo/lib' + +/** + * CreateP5xNodesTableMigration + * ---------------------------------- + * Create a table to track the virtual K8s containers under our control. + */ +@Injectable() +export default class CreateP5xNodesTableMigration extends Migration { + @Inject() + protected readonly db!: DatabaseService + + /** + * Apply the migration. + */ + async up(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_nodes') + + table.primaryKey('id') + + table.column('pve_id') + .type(FieldType.int) + .required() + + table.column('hostname') + .type(FieldType.varchar) + .required() + + table.column('assigned_ip') + .type(FieldType.varchar) + .required() + + table.column('assigned_subnet') + .type(FieldType.int) + .required() + + table.column('is_permanent') + .type(FieldType.bool) + .default(false) + .required() + + table.column('is_master') + .type(FieldType.bool) + .default(false) + .required() + + await schema.commit(table) + } + + /** + * Undo the migration. + */ + async down(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_nodes') + + table.dropIfExists() + + await schema.commit(table) + } +} diff --git a/src/app/migrations/2023-04-01T04:21:49.411Z_CreateSettingsTableMigration.migration.ts b/src/app/migrations/2023-04-01T04:21:49.411Z_CreateSettingsTableMigration.migration.ts new file mode 100644 index 0000000..322d275 --- /dev/null +++ b/src/app/migrations/2023-04-01T04:21:49.411Z_CreateSettingsTableMigration.migration.ts @@ -0,0 +1,44 @@ +import {Injectable, Migration, Inject, DatabaseService, FieldType} from '@extollo/lib' + +/** + * CreateSettingsTableMigration + * ---------------------------------- + * Create a table to store random one-off settings. + */ +@Injectable() +export default class CreateSettingsTableMigration extends Migration { + @Inject() + protected readonly db!: DatabaseService + + /** + * Apply the migration. + */ + async up(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_settings') + + table.primaryKey('id') + + table.column('setting_key') + .type(FieldType.varchar) + .required() + + table.column('setting_json') + .type(FieldType.text) + .required() + + await schema.commit(table) + } + + /** + * Undo the migration. + */ + async down(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('p5x_settings') + + table.dropIfExists() + + await schema.commit(table) + } +} diff --git a/src/app/models/Credential.model.ts b/src/app/models/Credential.model.ts new file mode 100644 index 0000000..dc82bb0 --- /dev/null +++ b/src/app/models/Credential.model.ts @@ -0,0 +1,24 @@ +import {Injectable, Model, Field, FieldType} from '@extollo/lib' + +/** + * Credential Model + * ----------------------------------- + * A username and {password|api token} for the PVE cluster. + */ +@Injectable() +export class Credential extends Model { + protected static table = 'p5x_credentials' + protected static key = 'id' + + @Field(FieldType.serial) + public id?: number + + @Field(FieldType.varchar, 'pve_username') + public username!: string + + @Field(FieldType.text, 'pve_credential') + public credential!: string + + @Field(FieldType.bool, 'is_api_token') + public isApiToken!: boolean +} diff --git a/src/app/models/IpRange.model.ts b/src/app/models/IpRange.model.ts new file mode 100644 index 0000000..8660e50 --- /dev/null +++ b/src/app/models/IpRange.model.ts @@ -0,0 +1,66 @@ +import {Injectable, Model, Field, FieldType, TypeTag, Maybe, collect, ErrorWithContext} from '@extollo/lib' +import * as IPCIDR from 'ip-cidr' +import {IpAddress, Subnet} from '../types' +import {Node} from './Node.model' + +/** + * IpRange Model + * ----------------------------------- + * Represents an available IP address pool from which we can allocate node addresses. + */ +@Injectable() +export class IpRange extends Model { + protected static table = 'p5x_ip_ranges' + protected static key = 'id' + + public static async getDefault(): Promise { + const ipRange = await this.query().first() + if ( !ipRange ) { + throw new Error('Unable to find default IP range!') + } + return ipRange + } + + @Field(FieldType.serial) + public id?: number + + @Field(FieldType.varchar) + public name!: string + + @Field(FieldType.varchar, 'start_ip') + public startIp!: IpAddress + + @Field(FieldType.varchar, 'end_ip') + public endIp!: IpAddress + + @Field(FieldType.int) + public subnet!: Subnet + + @Field(FieldType.varchar, 'gateway_ip') + public gatewayIp!: IpAddress + + /** Get the next IP address in this range that has not already been allocated to a node. */ + public async getNextAvailable(): Promise> { + // Generate the address pool + const cidr = new IPCIDR(`${this.gatewayIp}/${this.subnet}`) + const possibleIps = collect(cidr.toArray({ from: this.startIp, to: this.endIp }) as IpAddress[]) + .filterOut(x => x.endsWith('.0')) + + // Look up already-allocated addresses + const allocatedIps = await Node.query().get().pluck('assignedIp') + + // Find the first available address + return possibleIps.firstWhere(ip => !allocatedIps.includes(ip)) + } + + /** Like `getNextAvailable(...)`, but it will throw if the range is exhausted */ + public async getNextAvailableOrFail(): Promise { + const ip = await this.getNextAvailable() + if ( !ip ) { + throw new ErrorWithContext('Unable to get next available IP from range: is range exhausted?', { + range: this.toObject(), + }) + } + return ip + } +} diff --git a/src/app/models/Node.model.ts b/src/app/models/Node.model.ts new file mode 100644 index 0000000..6ef6805 --- /dev/null +++ b/src/app/models/Node.model.ts @@ -0,0 +1,61 @@ +import {Injectable, Model, Field, FieldType} from '@extollo/lib' +import {IpAddress, Subnet} from '../types' +import {Host, SSHHost} from '../support/hosts' +import * as ssh2 from 'ssh2' +import * as sshpk from 'sshpk' +import {Setting} from './Setting.model' +import {PCTHost} from '../support/hosts/PCTHost' + +/** + * Node Model + * ----------------------------------- + * Represents a single LXC container running a K8s worker node. + */ +@Injectable() +export class Node extends Model { + protected static table = 'p5x_nodes' + protected static key = 'node_id' + + @Field(FieldType.serial) + public id?: number + + @Field(FieldType.varchar, 'pve_id') + public pveId!: number + + @Field(FieldType.varchar) + public hostname!: string + + @Field(FieldType.varchar, 'assigned_ip') + public assignedIp!: IpAddress + + @Field(FieldType.int, 'assigned_subnet') + public assignedSubnet!: Subnet + + @Field(FieldType.bool, 'is_permanent') + public isPermanent: boolean = false + + @Field(FieldType.bool, 'is_master') + public isMaster: boolean = false + + public async getHost(): Promise { + // Try to make a direct SSH connection to the container + const privKey = await Setting.loadOneRequired('sshPrivateKey') + const formattedPrivKey = sshpk.parsePrivateKey(privKey, 'pem', {passphrase: ''}).toString('ssh') + const directHost = this.container().makeNew(SSHHost, { + host: this.assignedIp, + username: 'root', + privateKey: formattedPrivKey, + } as ssh2.ConnectConfig) + + if ( await directHost.isAlive() ) { + return directHost + } + + // Otherwise, fall back to the PCTHost proxy + return this.container().makeNew(PCTHost, { + host: await Setting.loadOneRequired('pveApiHost'), + username: 'root', + password: await Setting.loadOneRequired('pveRootPassword'), + }, this.pveId) + } +} diff --git a/src/app/models/Setting.model.ts b/src/app/models/Setting.model.ts new file mode 100644 index 0000000..b4e9ce1 --- /dev/null +++ b/src/app/models/Setting.model.ts @@ -0,0 +1,80 @@ +import {Injectable, Model, Field, FieldType, Collection, ErrorWithContext, make, Application} from '@extollo/lib' +import { JSONString, Settings } from '../types'; + +export class MissingRequiredSettingError extends ErrorWithContext { + constructor(key: string) { + super(`Missing required setting: ${key}`, { key }) + } +} + +/** + * Setting Model + * ----------------------------------- + * Helper for loading various one-off settings. + */ +@Injectable() +export class Setting extends Model> { + protected static table = 'p5x_settings' + protected static key = 'id' + + public static load(key: Key): Promise> { + return Setting.query>() + .where('setting_key', '=', key) + .get() + .map(x => x.value) + } + + public static async loadRequired(key: Key): Promise> { + const load = await this.load(key) + if ( load.isEmpty() ) { + throw new MissingRequiredSettingError(key) + } + return load + } + + public static loadOneRequired(key: Key): Promise { + return this.loadRequired(key).then(x => x.first()!) + } + + public static async set(key: Key, value: Settings[Key]): Promise { + // Delete any existing records w/ this key + await Setting.query().where('settingKey', '=', key).delete() + + // Insert a new one + const setting = Application.getContainer().makeNew>(Setting); + setting.settingKey = key + setting.value = value + await setting.save() + } + + public static async add(key: Key, value: Settings[Key]): Promise { + // Delete any existing records w/ this key and value + await Setting.query() + .where('settingKey', '=', key) + .where('settingValue', '=', JSON.stringify(value)) + .delete() + + // Insert a new one + const setting = new Setting; + setting.settingKey = key + setting.value = value + await setting.save() + } + + @Field(FieldType.serial) + protected id?: number + + @Field(FieldType.varchar, 'setting_key') + protected settingKey!: Key + + @Field(FieldType.text, 'setting_json') + protected settingJson!: JSONString + + public get value(): Settings[Key] { + return JSON.parse(this.settingJson) + } + + public set value(v: Settings[Key]) { + this.settingJson = JSON.stringify(v) as JSONString + } +} diff --git a/src/app/services/Images.service.ts b/src/app/services/Images.service.ts new file mode 100644 index 0000000..136f19c --- /dev/null +++ b/src/app/services/Images.service.ts @@ -0,0 +1,38 @@ +import {appPath, AsyncCollection, collect, Collection, Singleton, UniversalPath, universalPath} from '@extollo/lib' + +export interface LXCImage { + os: string + version: string + arch: 'amd64' | 'arm64' | 'i386' | string + format: 'cloud' | 'default' + timestamp: string + endpoint: string +} + +@Singleton() +export class Images { + private imageServer = 'https://us.lxd.images.canonical.com' + private listEndpoint = 'meta/1.0/index-system' + private imageBinaryName = 'rootfs.tar.xz' + + public async getImages(): Promise> { + const url = universalPath(this.imageServer, this.listEndpoint) + const content = await fetch(url.toRemote).then(x => x.text()) + return collect(content.trim().split('\n')) + .map(row => { + const [os, version, arch, format, timestamp, endpoint] = row.split(';') + return { + os, + version, + arch, + format, + timestamp, + endpoint, + } as LXCImage + }) + } + + public getImageBinaryPath(image: LXCImage): UniversalPath { + return universalPath(this.imageServer, image.endpoint, this.imageBinaryName) + } +} diff --git a/src/app/services/Provisioner.service.ts b/src/app/services/Provisioner.service.ts new file mode 100644 index 0000000..84c4594 --- /dev/null +++ b/src/app/services/Provisioner.service.ts @@ -0,0 +1,228 @@ +import { + Singleton, + Inject, + ErrorWithContext, + objectToKeyValue, + fetch, + Container, + Logging, + universalPath, +} from '@extollo/lib' +import { Node } from "../models/Node.model"; +import {Setting} from '../models/Setting.model' +import {IpRange} from '../models/IpRange.model' +import { Proxmox } from 'proxmox-api' +import {Images, LXCImage} from './Images.service' +import {unsafeESMImport} from '@extollo/lib/lib/util/unsafe' +import * as sshpk from 'sshpk' +import {shellCommand, SSHHost} from '../support/hosts' + +@Singleton() +export class Provisioner { + @Inject() + protected readonly images!: Images + + @Inject() + protected readonly container!: Container + + @Inject() + protected readonly logging!: Logging + + private cachedProxmoxApi?: Proxmox.Api + + public async provisionMasterNode(): Promise { + // Look up the name of the master node from the settings + const pveMasterNode = await Setting.loadOneRequired('pveMasterNode') + + // Look up the P5x storage pool from the settings + const pveStoragePool = await Setting.loadOneRequired('pveStoragePool') + + // Look up the network bridge to which we will join the master node + const nodeNetworkBridge = await Setting.loadOneRequired('nodeNetworkBridge') + + // Look up the primary IP pool range + const ipRange = await IpRange.getDefault() + + // Look up the DNS search domain + const dnsDomain = await Setting.loadOneRequired('dnsDomain') + + // Look up the root password for LXC containers + const rootPassword = await Setting.loadOneRequired('rootPassword') + + // Get the Proxmox API + const proxmox = await this.getApi() + + // Grab the master Proxmox node from the API + const masterNode = proxmox.nodes.$(pveMasterNode) + + // Create a storage mount for the LXC template image + this.logging.info('Creating storage for container templates...') + const imageCacheStorage = await proxmox.storage.$post({ + storage: 'p5x.image-cache', + type: 'dir', + content: ['vztmpl', 'iso'].join(','), + path: '/p5x-images', + }) + const masterNodeStorage = masterNode.storage.$(imageCacheStorage.storage) + + // Download the container template image + this.logging.info('Looking up LXC image for control node...') + const image = await this.images.getImages() + .then(x => + x.where('os', '=', 'ubuntu') + .where('version', '=', 'jammy') // 22.04 LTS + .where('format', '=', 'cloud') + .where('arch', '=', 'amd64') + .sortByDesc('timestamp') + .first() + ) + + if ( !image ) { + throw new ErrorWithContext('Unable to find Debian Bookworm LXC template binary') + } + + const imageUrl = this.images.getImageBinaryPath(image!) + + // Upload the template image to the storage mount + const uploadTaskUPID = await masterNodeStorage['download-url'].$post({ + content: 'vztmpl', + filename: 'p5x-base.tar.xz', + url: imageUrl.toRemote, + }) + + this.logging.info('Waiting for LXC image to upload to master PVE node...') + await this.waitForNodeTask(pveMasterNode, uploadTaskUPID) + + // Get the next vmid to be used by the LXC container + const masterVMID = await proxmox.cluster.nextid.$get() + const masterIP = await ipRange.getNextAvailableOrFail() + + // Create a new LXC container on that node for the control server + const sshPubKey = sshpk.parseKey(await Setting.loadOneRequired('sshPublicKey')) + .toString('ssh') + + const masterTaskUPID = await masterNode.lxc.$post({ + ostemplate: 'p5x.image-cache:vztmpl/p5x-base.tar.xz', + vmid: masterVMID, + cores: 1, + description: 'P5x Control Node', + hostname: 'p5x-control', + memory: 512, // in MB + net0: + objectToKeyValue({ + name: 'eth0', + bridge: nodeNetworkBridge, + firewall: 1, + gw: ipRange.gatewayIp, + ip: `${masterIP}/${ipRange.subnet}`, + }) + .map(x => `${x.key}=${x.value}`) + .join(','), + onboot: true, + password: rootPassword, + rootfs: `${pveStoragePool}:8`, // 8 GiB + searchdomain: dnsDomain, + 'ssh-public-keys': sshPubKey, + start: true, + storage: pveStoragePool, + tags: 'p5x', + }) + + this.logging.info('Waiting for PVE master node to be created...') + await this.waitForNodeTask(pveMasterNode, masterTaskUPID) + + // Save the node + const node = this.container.makeNew(Node) + node.pveId = masterVMID + node.hostname = 'p5x-control' + node.assignedIp = masterIP + node.assignedSubnet = ipRange.subnet + node.isPermanent = true + node.isMaster = true + await node.save() + + // Wait for the host to come online (this will be a PCTHost passed through PVE) + this.logging.info('Waiting for master node to come online...') + const proxyHost = await node.getHost() + await proxyHost.waitForAlive() + + // Configure SSH on the instance + this.logging.info('Configuring SSH access to master node...') + await proxyHost.run(shellCommand('apt update')) + await proxyHost.run(shellCommand('apt install -y openssh-server curl')) + await proxyHost.run(shellCommand('systemctl enable --now ssh')) + await new Promise(res => setTimeout(() => res(), 5000)) + + // Try to re-connect to the instance directly + this.logging.info('Attempting to re-connect to master node via SSH...') + const sshHost = await node.getHost() + if ( !(sshHost instanceof SSHHost) ) { + throw new ErrorWithContext('Failed to establish direct connection to master node', { + node, + proxyHost, + sshHost, + }) + } + + // Install base environment needed to run this control server + await sshHost.run(shellCommand('curl -fsSL https://deb.nodesource.com/setup_20.x | bash -')) + await sshHost.run(shellCommand('apt install git nodejs -y')) + + return node + } + + protected async waitForNodeTask(nodeName: string, taskUPID: string): Promise { + const proxmox = await this.getApi() + const proxmoxNode = proxmox.nodes.$(nodeName) + + while ( true ) { + const status = await proxmoxNode.tasks.$(taskUPID).status.$get() + if ( status.status === 'running' ) { + await new Promise(res => setTimeout(res, 1000)) + continue + } + + if ( status.exitstatus !== 'OK' ) { + throw new ErrorWithContext('PVE task did not succeed!', { + nodeName, + taskUPID, + status, + }) + } + + break + } + } + + public async getApi(): Promise { + // Have to force this to be a runtime ESM import since ts-node + // is re-writing it to a require(...), breaking the package. + const proxmoxApi = await unsafeESMImport('proxmox-api').then(x => x.proxmoxApi) + + // If we have a cached version, just return that + if ( this.cachedProxmoxApi ) { + return this.cachedProxmoxApi + } + + // Look up the master Proxmox node from the settings + const pveHost = await Setting.loadOneRequired('pveApiHost') + + // Look up the Proxmox credentials from the settings + // const pveTokenId = await Setting.loadOneRequired('pveTokenId') + // const pveTokenSecret = await Setting.loadOneRequired('pveTokenSecret') + const pveRootPassword = await Setting.loadOneRequired('pveRootPassword') + + // Initialize the Proxmox API + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + this.cachedProxmoxApi = proxmoxApi({ + host: pveHost, + user: 'root@pam', + password: pveRootPassword, + // tokenID: pveTokenId, + // tokenSecret: pveTokenSecret, + }) as Proxmox.Api + + return this.cachedProxmoxApi + } + +} diff --git a/src/app/support/hosts/ExecutionResult.ts b/src/app/support/hosts/ExecutionResult.ts new file mode 100644 index 0000000..c42288f --- /dev/null +++ b/src/app/support/hosts/ExecutionResult.ts @@ -0,0 +1,36 @@ +export class ExecutionResult { + protected stdout: string[] = [] + protected stderr: string[] = [] + protected mixed: string[] = [] + public exitCode?: number + + out(data: any) { + this.stdout = this.stdout.concat(`${data}`.split('\n')) + this.mixed = this.mixed.concat(`${data}`.split('\n')) + } + + error(data: any) { + this.stderr = this.stderr.concat(`${data}`.split('\n')) + this.mixed = this.mixed.concat(`${data}`.split('\n')) + } + + exit(code: number) { + this.exitCode = code + } + + public wasSuccessful(): boolean { + return this.exitCode === 0 + } + + public get combinedOutput(): string[] { + return this.mixed.filter(Boolean) + } + + public get standardOutput(): string[] { + return this.stdout.filter(Boolean) + } + + public get errorOutput(): string[] { + return this.stderr.filter(Boolean) + } +} diff --git a/src/app/support/hosts/Host.ts b/src/app/support/hosts/Host.ts new file mode 100644 index 0000000..e241778 --- /dev/null +++ b/src/app/support/hosts/Host.ts @@ -0,0 +1,203 @@ +import { + Awaitable, + AwareOfContainerLifecycle, ErrorWithContext, + Filesystem, + infer, + objectToKeyValue, + UniversalPath, + uuid4, +} from '@extollo/lib' +import {CommandPalette, CommandPaletteCommands, OwnershipSpec, shellCommand, ShellCommand} from './types' +import {ExecutionResult} from './ExecutionResult' +import {CommandError} from './errors' +import {SystemMetrics} from './SystemMetrics' + +export class StandardCommandPalette implements CommandPalette { + changeDirectory = shellCommand(`cd "%%PATH%%"`) + cpuPercentage = shellCommand(`grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage}'`) + fileDirectoryDelete = shellCommand(`rm -rf "%%RESOURCE%%"`) + fileDirectoryOwnershipFetch = shellCommand(`stat -c "%U:%G" "%%PATH%%"`) + fileDirectoryOwnershipSetFlat = shellCommand(`chown %%OWNERS%% "%%PATH%%"`) + fileDirectoryOwnershipSetRecursive = shellCommand(`chown -R %%OWNERS%% "%%PATH%%"`) + fileDirectoryPermissionFetch = shellCommand(`stat -c %a "%%PATH%%"`) + fileDirectoryPermissionSetFlat = shellCommand(`chmod %%LEVEL%% "%%PATH%%"`) + fileDirectoryPermissionSetRecursive = shellCommand(`chmod -R %%LEVEL%% "%%PATH%%"`) + listMountPoints = shellCommand(`df -hl | grep '/' | awk '{print $6}`) + mountPointPercentage = shellCommand(`df -hl | grep -w '%%MOUNTPOINT%%$' | awk '{print $5}'`) + ramPercentage = shellCommand(`free | grep Mem | awk '{print $3/$2 * 100.0}'`) + reboot = shellCommand(`reboot`) + resolvePath = shellCommand(`readlink -f "%%PATH%%"`) + tempFile = shellCommand(`mktemp`) + tempPath = shellCommand(`mktemp -d`) + echo = shellCommand(`echo "%%OUTPUT%%"`) + + public format(command: keyof CommandPaletteCommands, substitutions: Record): ShellCommand { + let formatted = `${this[command]}` + + objectToKeyValue(substitutions) + .map(item => + formatted = formatted.replaceAll(`%%${item.key.toUpperCase()}%%`, `${item.value}`)) + + return shellCommand(formatted) + } +} + +export abstract class Host implements AwareOfContainerLifecycle { + awareOfContainerLifecycle: true = true + + public abstract getFilesystem(): Awaitable + + public abstract execute(command: ShellCommand): Awaitable + + close(): Awaitable {} + + protected getCommandPalette(): CommandPalette { + return new StandardCommandPalette() + } + + onContainerDestroy() { + this.close() + } + + onContainerRelease() { + this.close() + } + + /** Runs the provided command and throws if it failed. */ + public async run(command: ShellCommand): Promise { + const result = await this.execute(command) + if ( !result.wasSuccessful() ) { + throw CommandError.make(command, result) + } + return result + } + + /** Runs the provided command, throws if it failed, and returns the `infer(...)` result of the first line otherwise. */ + public async runLineResult(command: ShellCommand): Promise> { + const result = await this.execute(command) + if ( !result.wasSuccessful() || result.standardOutput.length < 1 ) { + throw CommandError.make(command, result) + } + return infer(result.standardOutput[0].trim()) + } + + /** Try to ping the host and verify that it is online & accessible. */ + public async isAlive(): Promise { + const output = uuid4() + const cmd = this.getCommandPalette().format('echo', { output }) + try { + const result = await this.execute(cmd) + return result.wasSuccessful() && result.combinedOutput.length > 0 && result.combinedOutput[0] === output + } catch (e) { + return false + } + } + + public async waitForAlive(maxTries: number = 30): Promise { + let tries = maxTries + while ( tries > 0 ) { + if ( await this.isAlive() ) { + return + } + + tries -= 1 + await new Promise(res => setTimeout(() => res(), 2000)) + } + + throw new ErrorWithContext('Host did not come online before maxTries exceeded', { + host: this, + maxTries, + }) + } + + /** Get the path to a temporary directory on the host. */ + public async getTempDirectory(): Promise { + const cmd = this.getCommandPalette().format('tempPath', {}) + const result = await this.runLineResult(cmd) + return new UniversalPath(`${result}`, await this.getFilesystem()) + } + + /** Get the path to a temporary file on the host. */ + public async getTempFile(): Promise { + const cmd = this.getCommandPalette().format('tempFile', {}) + const result = await this.runLineResult(cmd) + return new UniversalPath(`${result}`, await this.getFilesystem()) + } + + /** Get a list of filesystem mount points on the host. */ + public async getMountPoints(): Promise { + const result = await this.run(this.getCommandPalette().format('listMountPoints', {})) + return result.standardOutput + } + + /** Load standard metrics about the host. */ + public async metrics(): Promise { + const metric = new SystemMetrics() + + const palette = this.getCommandPalette() + const cpuCmd = palette.format('cpuPercentage', {}) + const cpuResult = await this.runLineResult(cpuCmd) + if ( typeof cpuResult === 'number' ) { + metric.cpuPercent = cpuResult + } + + const ramCmd = palette.format('ramPercentage', {}) + const ramResult = await this.runLineResult(ramCmd) + if ( typeof ramResult === 'number' ) { + metric.ramPercent = ramResult + } + + const mountPoints = await this.getMountPoints() + await Promise.all(mountPoints.map(async mountPoint => { + const cmd = palette.format('mountPointPercentage', { mountPoint }) + const result = await this.run(cmd) + const utilization = Number(result.standardOutput[0].replace('%', '')) / 100 + metric.setMount(mountPoint, utilization) + })) + + return metric + } + + /** Get the user/group ownership of the given resource. */ + public async getOwnership(path: UniversalPath): Promise { + const cmd = this.getCommandPalette().format('fileDirectoryOwnershipFetch', { path: path.toLocal }) + const result = `${await this.runLineResult(cmd)}` + const parts = result.split(':') + return {user: parts[0], group: parts[1]} + } + + /** Set the user/group ownership of the given resource. */ + public setOwnership(path: UniversalPath, user: string, group: string, recursive: boolean = false): Awaitable { + const cmd = this.getCommandPalette().format( + recursive ? 'fileDirectoryOwnershipSetRecursive' : 'fileDirectoryOwnershipSetFlat', + { + path: path.toLocal, + owners: `${user}:${group}`, + } + ) + return this.run(cmd) + } + + /** Retrieve the filesystem permissions for the given resource. */ + public async getPermissions(path: UniversalPath): Promise { + const cmd = this.getCommandPalette().format('fileDirectoryPermissionFetch', { path: path.toLocal }) + return `${await this.runLineResult(cmd)}` + } + + /** Set the filesystem permissions for the given resource. */ + public setPermissions(path: UniversalPath, level: string, recursive: boolean = false): Awaitable { + const cmd = this.getCommandPalette().format( + recursive ? 'fileDirectoryPermissionSetRecursive' : 'fileDirectoryPermissionSetFlat', + { + path: path.toLocal, + level, + } + ) + return this.run(cmd) + } + + /** Reboot the host. */ + public reboot(): Awaitable { + return this.run(this.getCommandPalette().format('reboot', {})) + } +} diff --git a/src/app/support/hosts/LocalHost.ts b/src/app/support/hosts/LocalHost.ts new file mode 100644 index 0000000..7ff13c5 --- /dev/null +++ b/src/app/support/hosts/LocalHost.ts @@ -0,0 +1,25 @@ +import {Host} from './Host' +import {ShellCommand} from './types' +import {Application, Awaitable, Filesystem, LocalFilesystem} from '@extollo/lib' +import {ExecutionResult} from './ExecutionResult' +import * as childProcess from 'child_process' + +export class LocalHost extends Host { + async execute(command: ShellCommand): Promise { + const result = new ExecutionResult() + return new Promise(res => { + childProcess.exec(command, (error, stdout, stderr) => { + result.exit(error?.code || 0) + result.out(stdout) + result.error(stderr) + res(result) + }) + }) + } + + getFilesystem(): Awaitable { + return Application.getContainer().makeNew(LocalFilesystem, { + baseDir: '/' + }) + } +} diff --git a/src/app/support/hosts/PCTHost.ts b/src/app/support/hosts/PCTHost.ts new file mode 100644 index 0000000..057220e --- /dev/null +++ b/src/app/support/hosts/PCTHost.ts @@ -0,0 +1,24 @@ +import {SSHHost} from './SSHHost' +import * as ssh2 from 'ssh2' +import {shellCommand, ShellCommand} from './types' +import {ExecutionResult} from './ExecutionResult' +import {ErrorWithContext, Filesystem} from '@extollo/lib' + +export class PCTHost extends SSHHost { + constructor( + config: ssh2.ConnectConfig, + protected readonly vmid: number, + ) { + super(config) + } + + async execute(command: ShellCommand): Promise { + return super.execute(shellCommand('pct exec', `${this.vmid}`, '--', command)) + } + + getFilesystem(): Promise{ + throw new ErrorWithContext('Accessing Filesystem of PCTHost is not supported.', { + vmid: this.vmid, + }) + } +} diff --git a/src/app/support/hosts/SSHHost.ts b/src/app/support/hosts/SSHHost.ts new file mode 100644 index 0000000..7e09d4f --- /dev/null +++ b/src/app/support/hosts/SSHHost.ts @@ -0,0 +1,77 @@ +import {Host} from './Host' +import {Application, Awaitable, Filesystem, SSHFilesystem} from '@extollo/lib' +import {ExecutionResult} from './ExecutionResult' +import {ShellCommand} from './types' +import * as ssh2 from 'ssh2' + +export class SSHHost extends Host { + private sshClient?: ssh2.Client + private filesystem?: Filesystem + + constructor( + protected readonly config: ssh2.ConnectConfig, + ) { + super() + } + + async close() { + this.sshClient?.end() + this.sshClient?.destroy() + this.sshClient = undefined + + this.filesystem?.close() + this.filesystem = undefined + } + + async execute(command: ShellCommand): Promise{ + const client = await this.getSSH() + const result = new ExecutionResult() + return new Promise((res, rej) => { + client.exec(command, (err, stream) => { + if ( err ) { + return rej(err) + } + + stream + .on('close', (code: number) => { + result.exit(code) + res(result) + }) + .on('data', (data: any) => { + result.out(data) + }) + .stderr.on('data', (data: any) => { + result.error(data) + }) + }) + }) + } + + getFilesystem(): Awaitable { + if ( !this.filesystem ) { + this.filesystem = Application.getContainer().makeNew(SSHFilesystem, { + ssh: this.config, + baseDir: '/', + }) + } + + return this.filesystem + } + + protected async getSSH(): Promise { + if ( this.sshClient ) { + return this.sshClient + } + + return new Promise((res, rej) => { + const client = new ssh2.Client() + + client.on('ready', () => { + this.sshClient = client + res(client) + }).connect(this.config) + + client.on('error', rej) + }) + } +} diff --git a/src/app/support/hosts/SystemMetrics.ts b/src/app/support/hosts/SystemMetrics.ts new file mode 100644 index 0000000..39583b8 --- /dev/null +++ b/src/app/support/hosts/SystemMetrics.ts @@ -0,0 +1,15 @@ +import {Maybe} from '@extollo/lib' + +export class SystemMetrics { + public cpuPercent: number = 0 + public ramPercent: number = 0 + protected mountPercents: Record = {} + + public setMount(point: string, percent: number) { + this.mountPercents[point] = percent + } + + public mountPercent(point: string): Maybe { + return this.mountPercents[point] + } +} diff --git a/src/app/support/hosts/errors.ts b/src/app/support/hosts/errors.ts new file mode 100644 index 0000000..9d779da --- /dev/null +++ b/src/app/support/hosts/errors.ts @@ -0,0 +1,51 @@ +import {ErrorWithContext} from '@extollo/lib' +import {ShellCommand} from './types' +import {ExecutionResult} from './ExecutionResult' + +export class CommandError extends ErrorWithContext { + public static make(command: ShellCommand, result: ExecutionResult): CommandError { + const combinedOutput = result.combinedOutput.join(' ').toLowerCase() + + const accessDeniedPhrases = [ + 'not permitted', + 'access denied', + 'insufficient permission', + 'permission denied' + ] + + for ( const phrase of accessDeniedPhrases ) { + if ( combinedOutput.includes(phrase) ) return new PermissionDeniedError(command, result) + } + + const notFoundPhrases = [ + 'command not found', + ] + + for ( const phrase of notFoundPhrases ) { + if ( combinedOutput.includes(phrase) ) return new CommandNotFoundError(command, result) + } + + const resourceNotFoundPhrases = [ + 'no such file', + 'no such directory', + 'no such file or directory', + 'no such directory or file', + ] + + for ( const phrase of resourceNotFoundPhrases ) { + if ( combinedOutput.includes(phrase) ) return new FilesystemResourceNotFoundError(command, result) + } + + return new CommandError(command, result) + } + + constructor(command: ShellCommand, result: ExecutionResult) { + super(`Unable to execute command: ${command}`, { command, result }) + } +} + +export class PermissionDeniedError extends CommandError {} + +export class CommandNotFoundError extends CommandError {} + +export class FilesystemResourceNotFoundError extends CommandError {} diff --git a/src/app/support/hosts/index.ts b/src/app/support/hosts/index.ts new file mode 100644 index 0000000..b1091ea --- /dev/null +++ b/src/app/support/hosts/index.ts @@ -0,0 +1,7 @@ +export * from './types' +export * from './errors' +export * from './ExecutionResult' +export * from './SystemMetrics' +export * from './Host' +export * from './LocalHost' +export * from './SSHHost' diff --git a/src/app/support/hosts/types.ts b/src/app/support/hosts/types.ts new file mode 100644 index 0000000..396935c --- /dev/null +++ b/src/app/support/hosts/types.ts @@ -0,0 +1,34 @@ +import {TypeTag} from '@extollo/lib' + +export type ShellCommand = TypeTag<'p5x.shell-command'> & string + +export const shellCommand = (...parts: string[]): ShellCommand => parts.join(' ') as ShellCommand + +export interface CommandPaletteCommands { + tempPath: ShellCommand + tempFile: ShellCommand + cpuPercentage: ShellCommand + ramPercentage: ShellCommand + mountPointPercentage: ShellCommand + listMountPoints: ShellCommand + fileDirectoryDelete: ShellCommand + resolvePath: ShellCommand + reboot: ShellCommand + changeDirectory: ShellCommand + fileDirectoryPermissionFetch: ShellCommand + fileDirectoryPermissionSetFlat: ShellCommand + fileDirectoryPermissionSetRecursive: ShellCommand + fileDirectoryOwnershipFetch: ShellCommand + fileDirectoryOwnershipSetFlat: ShellCommand + fileDirectoryOwnershipSetRecursive: ShellCommand + echo: ShellCommand +} + +export type CommandPalette = CommandPaletteCommands & { + format(command: keyof CommandPaletteCommands, substitutions: Record): ShellCommand +} + +export interface OwnershipSpec { + user: string + group: string +} diff --git a/src/app/types.ts b/src/app/types.ts new file mode 100644 index 0000000..6a37d50 --- /dev/null +++ b/src/app/types.ts @@ -0,0 +1,31 @@ +import {TypeTag, JSONState, isJSON} from '@extollo/lib' +import * as IPCIDR from 'ip-cidr' + +export type IpAddress = TypeTag<'p5x.ip.address'> & string +export const isIpAddress = (what: unknown): what is IpAddress => + typeof what === 'string' && IPCIDR.isValidAddress(what) + +export type Subnet = TypeTag<'p5x.ip.subnet'> & number +export const isSubnet = (what: unknown): what is Subnet => + typeof what === 'number' && IPCIDR.isValidCIDR(`1.1.1.1/${what}`) + +export type JSONString = TypeTag<'p5x.json'> & string +export const isJSONString = (what: unknown): what is JSONString => + typeof what === 'string' && isJSON(what) + +export type Settings = Record & { + pveMasterNode: string + pveApiHost: string + pveStoragePool: string + // pveTokenId: string + // pveTokenSecret: string + pveRootPassword: string + lxcTemplateFileName: string + rootPassword: string + sshPublicKey: string + sshPrivateKey: string + dnsDomain: string + nodeNetworkBridge: string + nodeCpus: number + nodeRamMib: number +} diff --git a/src/cli.ts b/src/cli.ts index b9b76ec..12041e9 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -12,4 +12,5 @@ globalRegistry.run(async () => { */ const app = cli() await app.run() + await app.destroy() }) diff --git a/src/index.ts b/src/index.ts index 0d7fcef..e6625f3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,5 +9,7 @@ globalRegistry.run(async () => { * ties your entire application together. The app container manages services * and lifecycle. */ - await app().run() + const theApp = app() + await theApp.run() + await theApp.destroy() })