From 0b99c7d667278074805d803f516d536e9b41b074 Mon Sep 17 00:00:00 2001 From: vishalboxyhq <98021568+vishalboxyhq@users.noreply.github.com> Date: Sat, 14 Oct 2023 03:59:21 +0530 Subject: [PATCH] Feature/typeorm migrations (#141) * updated typeorm * renamed connection * updated migration scripts to new TypeORM version (v3) * typeorm and mongo -migrations and namespace column * update the mongo migration file * remove the camelcase * remove camelcase * rename the file * renaming migration files * folder restructuring and add migrate-mongo package * correcting path and minor changes * merging db name with URL * changing ts to js for mongo * migration automation with env variable * using custom scripts for migration * Dockerfile fixes * bootstrap script fixes and still need ts-node migrate-mongo in dockerfile * running migration in CI/CD * turning down planetscale * migration related fixes for namespace * Migration & bootstrap changes * reverting minor change * bootstrap.sh will only run in docker env * bootstrap RUN_MIGRATION env variable will use true * migration fixes * migration changes * removed console logs * planetscale migration fixes * copied back old files, tweaks to filenames * add index for namespace * restore older migration scripts * formatting * aligned timestamps * updated mysql, mariadb, mssql, planetscale namespace migrations * We'll run migrate manually as a separate step/container * forgot to add migrate.sh * bumped up timestamp * Enable planetscale testing * Revert planetscale test and comment config object * Revert deletions in Dockerfile * Update maria, mssql, mysql, ps, pg, sql namespace migrations * Cleanup * Add runMigration env to support manual run * Minor tweak * Ensure sql data migrations run after schema changes * Fix mssql namespace data migration query * Sync lock file * Update mongo timestamp * Set env for npm mongo migration script * [sql] Populate namespace column for synchronize: true instances * Rename `DB_RUN_MIGRATION` -> `DB_MANUAL_MIGRATION` * [mongo] Populate namespace for already deployed instances * Cleanup migrate.sh * [bash -> sh] bash does not work inside docker * Optimise migration artifacts * Source packages from global path * Copy npm from build context - excludes node_modules via .dockerignore * Remove redundant copy step * added swc packages * fresh package-lock * fresh package-lock * added migratepg job to skaffold fixes in migrate.sh to exit with error when migration fails * cleanup * added migratepg to demo skaffold as well * turn on planetscale tests --------- Co-authored-by: Deepak Prabhakara Co-authored-by: Utkarsh Mehta Co-authored-by: Aswin V --- .env.example | 2 + .eslintignore | 3 +- Dockerfile | 11 +- kustomize/base/jackson-deployment.yaml | 2 +- .../overlays/demo/jackson-deployment.yaml | 12 + kustomize/overlays/demo/kustomization.yaml | 4 + kustomize/overlays/demo/migratepg-job.yaml | 18 + .../overlays/postgres/kustomization.yaml | 1 + .../overlays/postgres/migratepg-job.yaml | 18 + kustomize/overlays/postgres/secrets.yaml | 1 + lib/env.ts | 1 + migrate.sh | 21 + npm/migrate-mongo-config.js | 22 + .../mariadb-old/1640877418166-Initial.ts | 23 - .../mariadb-old/1644332636666-createdAt.ts | 16 - .../mariadb/1692767993709-md_namespace.ts | 16 + .../mongo/20230824060000-namespace.js | 23 + .../mssql/1692767993709-mss_namespace.ts | 16 + .../mssql/1692817789888-mss_namespace.ts | 25 + .../mysql-old/1640877358925-Initial.ts | 23 - .../mysql-old/1644332641078-createdAt.ts | 16 - .../mysql/1692767993709-ms_namespace.ts | 16 + .../planetscale/1692767993709-ms_namespace.ts | 16 + .../postgres/1692767993709-pg_namespace.ts | 16 + npm/migration/sql/1692817789888-namespace.ts | 25 + npm/package-lock.json | 471 +++++++++++------- npm/package.json | 6 +- npm/src/db/defaultDb.ts | 1 + npm/src/db/mongo.ts | 34 +- npm/src/db/planetscale/entity/JacksonStore.ts | 10 +- npm/src/db/sql/entity/JacksonStore.ts | 10 +- npm/src/db/sql/mariadb/entity/JacksonStore.ts | 10 +- npm/src/db/sql/mssql/entity/JacksonStore.ts | 10 +- npm/src/db/sql/sql.ts | 41 +- npm/src/typings.ts | 1 + npm/typeorm.ts | 5 +- package-lock.json | 410 +++++++-------- 37 files changed, 894 insertions(+), 462 deletions(-) create mode 100644 kustomize/overlays/demo/jackson-deployment.yaml create mode 100644 kustomize/overlays/demo/migratepg-job.yaml create mode 100644 kustomize/overlays/postgres/migratepg-job.yaml create mode 100755 migrate.sh create mode 100644 npm/migrate-mongo-config.js delete mode 100644 npm/migration/mariadb-old/1640877418166-Initial.ts delete mode 100644 npm/migration/mariadb-old/1644332636666-createdAt.ts create mode 100644 npm/migration/mariadb/1692767993709-md_namespace.ts create mode 100644 npm/migration/mongo/20230824060000-namespace.js create mode 100644 npm/migration/mssql/1692767993709-mss_namespace.ts create mode 100644 npm/migration/mssql/1692817789888-mss_namespace.ts delete mode 100644 npm/migration/mysql-old/1640877358925-Initial.ts delete mode 100644 npm/migration/mysql-old/1644332641078-createdAt.ts create mode 100644 npm/migration/mysql/1692767993709-ms_namespace.ts create mode 100644 npm/migration/planetscale/1692767993709-ms_namespace.ts create mode 100644 npm/migration/postgres/1692767993709-pg_namespace.ts create mode 100644 npm/migration/sql/1692817789888-namespace.ts diff --git a/.env.example b/.env.example index 02e3461be..efdc44fb7 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,8 @@ DB_CLEANUP_LIMIT=1000 DB_PAGE_LIMIT=50 # You can use openssl to generate a random 32 character key: openssl rand -base64 24 DB_ENCRYPTION_KEY= +# Uncomment below if you wish to run DB migrations manually. +#DB_MANUAL_MIGRATION=true # Admin Portal settings # SMTP details for Magic Links diff --git a/.eslintignore b/.eslintignore index a08d5e9c3..ab33389ce 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ node_modules dist -npm/dist \ No newline at end of file +npm/dist +npm/migration \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 138421ec6..14acb3e70 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ WORKDIR /app # Install dependencies based on the preferred package manager COPY package.json package-lock.json ./ COPY npm npm -COPY prebuild.ts prebuild.ts +COPY migrate.sh prebuild.ts ./ RUN npm run custom-install @@ -31,7 +31,6 @@ ENV NEXT_TELEMETRY_DISABLED 1 RUN npm run build - # Production image, copy all the files and run next FROM $NODEJS_IMAGE AS runner WORKDIR /app @@ -53,8 +52,12 @@ COPY --from=builder /app/public ./public # https://nextjs.org/docs/advanced-features/output-file-tracing COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static - - +# Support for DB migration +COPY --from=builder --chown=nextjs:nodejs /app/migrate.sh ./migrate.sh +COPY npm npm +RUN chmod +x migrate.sh +# mongodb peer dependency would be automatically installed for migrate-mongo +RUN npm install -g ts-node migrate-mongo typeorm reflect-metadata mssql mysql2 pg USER nextjs EXPOSE 5225 diff --git a/kustomize/base/jackson-deployment.yaml b/kustomize/base/jackson-deployment.yaml index f451ad9a3..f5eae1f21 100644 --- a/kustomize/base/jackson-deployment.yaml +++ b/kustomize/base/jackson-deployment.yaml @@ -16,7 +16,7 @@ spec: spec: containers: - name: jackson - image: boxyhq/jackson:tagwillbereplaced + image: boxyhq/jackson-local imagePullPolicy: IfNotPresent startupProbe: httpGet: diff --git a/kustomize/overlays/demo/jackson-deployment.yaml b/kustomize/overlays/demo/jackson-deployment.yaml new file mode 100644 index 000000000..570ec8464 --- /dev/null +++ b/kustomize/overlays/demo/jackson-deployment.yaml @@ -0,0 +1,12 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: jackson +spec: + replicas: 1 + template: + spec: + containers: + - name: jackson + image: boxyhq/jackson:tagwillbereplaced + imagePullPolicy: IfNotPresent diff --git a/kustomize/overlays/demo/kustomization.yaml b/kustomize/overlays/demo/kustomization.yaml index 7b85b7acd..76e29832a 100644 --- a/kustomize/overlays/demo/kustomization.yaml +++ b/kustomize/overlays/demo/kustomization.yaml @@ -7,6 +7,10 @@ resources: - ./mocksaml-secrets.yaml - ./mocksaml-deployment.yaml +patches: + - ./jackson-deployment.yaml + - ./migratepg-job.yaml + images: - name: boxyhq/jackson newTag: 1.13.0 diff --git a/kustomize/overlays/demo/migratepg-job.yaml b/kustomize/overlays/demo/migratepg-job.yaml new file mode 100644 index 000000000..0af2b1ff3 --- /dev/null +++ b/kustomize/overlays/demo/migratepg-job.yaml @@ -0,0 +1,18 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: jackson-migrate-pg +spec: + template: + spec: + restartPolicy: 'OnFailure' + containers: + - name: db + image: boxyhq/jackson:tagwillbereplaced + imagePullPolicy: IfNotPresent + command: + - /bin/sh + - migrate.sh + envFrom: + - secretRef: + name: jackson diff --git a/kustomize/overlays/postgres/kustomization.yaml b/kustomize/overlays/postgres/kustomization.yaml index 32a21eb8c..4bb4b9b4d 100644 --- a/kustomize/overlays/postgres/kustomization.yaml +++ b/kustomize/overlays/postgres/kustomization.yaml @@ -6,6 +6,7 @@ bases: resources: - ./secrets.yaml + - ./migratepg-job.yaml commonLabels: jacksondev: '1' diff --git a/kustomize/overlays/postgres/migratepg-job.yaml b/kustomize/overlays/postgres/migratepg-job.yaml new file mode 100644 index 000000000..117e0c2d8 --- /dev/null +++ b/kustomize/overlays/postgres/migratepg-job.yaml @@ -0,0 +1,18 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: jackson-migrate-pg +spec: + template: + spec: + restartPolicy: 'OnFailure' + containers: + - name: db + image: boxyhq/jackson-local + imagePullPolicy: IfNotPresent + command: + - /bin/sh + - migrate.sh + envFrom: + - secretRef: + name: jackson diff --git a/kustomize/overlays/postgres/secrets.yaml b/kustomize/overlays/postgres/secrets.yaml index 231757923..1c5f1d75a 100644 --- a/kustomize/overlays/postgres/secrets.yaml +++ b/kustomize/overlays/postgres/secrets.yaml @@ -34,3 +34,4 @@ stringData: RETRACED_EXTERNAL_URL: 'http://localhost:3000/auditlog' RETRACED_ADMIN_ROOT_TOKEN: 'dev' BOXYHQ_LICENSE_KEY: '' + DB_MANUAL_MIGRATION: 'true' diff --git a/lib/env.ts b/lib/env.ts index ea42f6d29..9652e5922 100644 --- a/lib/env.ts +++ b/lib/env.ts @@ -43,6 +43,7 @@ const db: DatabaseOption = { readCapacityUnits: process.env.DB_DYNAMODB_RCUS ? Number(process.env.DB_DYNAMODB_RCUS) : undefined, writeCapacityUnits: process.env.DB_DYNAMODB_RCUS ? Number(process.env.DB_DYNAMODB_WCUS) : undefined, }, + manualMigration: process.env.DB_MANUAL_MIGRATION === 'true', }; const jacksonOptions: JacksonOption = { diff --git a/migrate.sh b/migrate.sh new file mode 100755 index 000000000..5498bd72a --- /dev/null +++ b/migrate.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +echo "Initiating Migration..." +export NODE_PATH=$(npm root -g) + +cd ./npm +if [ "$DB_ENGINE" = "mongo" ] +then + migrate-mongo up +else + ts-node --transpile-only --project tsconfig.json $NODE_PATH/typeorm/cli.js migration:run -d ./typeorm.ts +fi +if [ $? -eq 1 ] +then + echo "Migration Failed..." + exit 1 +fi +echo "Migration Finished..." + +cd .. + diff --git a/npm/migrate-mongo-config.js b/npm/migrate-mongo-config.js new file mode 100644 index 000000000..72b8caa05 --- /dev/null +++ b/npm/migrate-mongo-config.js @@ -0,0 +1,22 @@ +const config = { + mongodb: { + url: process.env.DB_URL || 'mongodb://localhost:27017/jackson', + options: { + useNewUrlParser: true, // removes a deprecation warning when connecting + useUnifiedTopology: true, // removes a deprecating warning when connecting + // connectTimeoutMS: 3600000, // increase connection timeout to 1 hour + // socketTimeoutMS: 3600000, // increase socket timeout to 1 hour + }, + }, + + migrationsDir: 'migration/mongo', + changelogCollectionName: 'changelog', + migrationFileExtension: '.js', + // Enable the algorithm to create a checksum of the file contents and use that in the comparison to determine + // if the file should be run. Requires that scripts are coded to be run multiple times. + useFileHash: false, + // Don't change this, unless you know what you're doing + moduleSystem: 'commonjs', +}; + +module.exports = config; diff --git a/npm/migration/mariadb-old/1640877418166-Initial.ts b/npm/migration/mariadb-old/1640877418166-Initial.ts deleted file mode 100644 index 74c32dece..000000000 --- a/npm/migration/mariadb-old/1640877418166-Initial.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {MigrationInterface, QueryRunner} from "typeorm"; - -export class Initial1640877418166 implements MigrationInterface { - name = 'Initial1640877418166' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE \`jackson_store\` (\`key\` varchar(1500) NOT NULL, \`value\` text NOT NULL, \`iv\` varchar(64) NULL, \`tag\` varchar(64) NULL, PRIMARY KEY (\`key\`)) ENGINE=InnoDB`); - await queryRunner.query(`CREATE TABLE \`jackson_index\` (\`id\` int NOT NULL AUTO_INCREMENT, \`key\` varchar(1500) NOT NULL, \`storeKey\` varchar(1500) NOT NULL, INDEX \`_jackson_index_key\` (\`key\`), INDEX \`_jackson_index_key_store\` (\`key\`, \`storeKey\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); - await queryRunner.query(`CREATE TABLE \`jackson_ttl\` (\`key\` varchar(1500) NOT NULL, \`expiresAt\` bigint NOT NULL, INDEX \`_jackson_ttl_expires_at\` (\`expiresAt\`), PRIMARY KEY (\`key\`)) ENGINE=InnoDB`); - await queryRunner.query(`ALTER TABLE \`jackson_index\` ADD CONSTRAINT \`FK_937b040fb2592b4671cbde09e83\` FOREIGN KEY (\`storeKey\`) REFERENCES \`jackson_store\`(\`key\`) ON DELETE CASCADE ON UPDATE NO ACTION`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE \`jackson_index\` DROP FOREIGN KEY \`FK_937b040fb2592b4671cbde09e83\``); - await queryRunner.query(`DROP INDEX \`_jackson_ttl_expires_at\` ON \`jackson_ttl\``); - await queryRunner.query(`DROP TABLE \`jackson_ttl\``); - await queryRunner.query(`DROP INDEX \`_jackson_index_key_store\` ON \`jackson_index\``); - await queryRunner.query(`DROP INDEX \`_jackson_index_key\` ON \`jackson_index\``); - await queryRunner.query(`DROP TABLE \`jackson_index\``); - await queryRunner.query(`DROP TABLE \`jackson_store\``); - } - -} diff --git a/npm/migration/mariadb-old/1644332636666-createdAt.ts b/npm/migration/mariadb-old/1644332636666-createdAt.ts deleted file mode 100644 index f1b5c2076..000000000 --- a/npm/migration/mariadb-old/1644332636666-createdAt.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {MigrationInterface, QueryRunner} from "typeorm"; - -export class createdAt1644332636666 implements MigrationInterface { - name = 'createdAt1644332636666' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`createdAt\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP()`); - await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`modifiedAt\` timestamp NULL`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`modifiedAt\``); - await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`createdAt\``); - } - -} diff --git a/npm/migration/mariadb/1692767993709-md_namespace.ts b/npm/migration/mariadb/1692767993709-md_namespace.ts new file mode 100644 index 000000000..2c6c853f5 --- /dev/null +++ b/npm/migration/mariadb/1692767993709-md_namespace.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MdNamespace1692767993709 implements MigrationInterface { + name = 'MdNamespace1692767993709' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`namespace\` varchar(64) NULL`); + await queryRunner.query(`CREATE INDEX \`_jackson_store_namespace\` ON \`jackson_store\` (\`namespace\`)`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`_jackson_store_namespace\` ON \`jackson_store\``); + await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`namespace\``); + } + +} diff --git a/npm/migration/mongo/20230824060000-namespace.js b/npm/migration/mongo/20230824060000-namespace.js new file mode 100644 index 000000000..38975a81e --- /dev/null +++ b/npm/migration/mongo/20230824060000-namespace.js @@ -0,0 +1,23 @@ +module.exports = { + async up(db, client) { + const collection = db.collection('jacksonStore'); + const response = await collection.distinct('_id', {}); + const searchTerm = ':'; + for (const k in response) { + const key = response[k].toString(); + const tokens2 = key.split(searchTerm).slice(0, 2); + const value = tokens2.join(searchTerm); + await db.collection('jacksonStore').updateOne({ _id: key }, {$set: { namespace: value }}); + } + + }, + + async down(db, client) { + const collection = db.collection('jacksonStore'); + const response = await collection.distinct('_id', {}); + for (const k in response) { + const key = response[k].toString(); + await db.collection('jacksonStore').updateOne({ _id: key }, {$set: { namespace: '' }}); + } + } +}; diff --git a/npm/migration/mssql/1692767993709-mss_namespace.ts b/npm/migration/mssql/1692767993709-mss_namespace.ts new file mode 100644 index 000000000..ba5dc4686 --- /dev/null +++ b/npm/migration/mssql/1692767993709-mss_namespace.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MssNamespace1692767993709 implements MigrationInterface { + name = 'MssNamespace1692767993709' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "jackson_store" ADD "namespace" varchar(64)`); + await queryRunner.query(`CREATE INDEX "_jackson_store_namespace" ON "jackson_store" ("namespace") `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "_jackson_store_namespace" ON "jackson_store"`); + await queryRunner.query(`ALTER TABLE "jackson_store" DROP COLUMN "namespace"`); + } + +} diff --git a/npm/migration/mssql/1692817789888-mss_namespace.ts b/npm/migration/mssql/1692817789888-mss_namespace.ts new file mode 100644 index 000000000..8666fd6e3 --- /dev/null +++ b/npm/migration/mssql/1692817789888-mss_namespace.ts @@ -0,0 +1,25 @@ +import { MigrationInterface, QueryRunner } from "typeorm" + +export class namespace1692817789888 implements MigrationInterface { + name = 'namespace1692817789888' + + public async up(queryRunner: QueryRunner): Promise { + const response = await queryRunner.query("select jackson.[key] from jackson_store jackson") + const searchTerm = ':'; + for (const k in response) { + const key = response[k].key; + const tokens2 = key.split(searchTerm).slice(0, 2); + const value = tokens2.join(searchTerm); + queryRunner.query(`update jackson_store set namespace = '${value}' where jackson_store.[key] = '${key}'`) + } + } + + public async down(queryRunner: QueryRunner): Promise { + const response = await queryRunner.query("select jackson.[key] from jackson_store jackson") + for (const k in response) { + const key = response[k].key; + queryRunner.query(`update jackson_store set namespace = NULL where jackson_store.[key] = '${key}'`) + } + } + +} diff --git a/npm/migration/mysql-old/1640877358925-Initial.ts b/npm/migration/mysql-old/1640877358925-Initial.ts deleted file mode 100644 index feef6ad3a..000000000 --- a/npm/migration/mysql-old/1640877358925-Initial.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {MigrationInterface, QueryRunner} from "typeorm"; - -export class Initial1640877358925 implements MigrationInterface { - name = 'Initial1640877358925' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE \`jackson_store\` (\`key\` varchar(1500) NOT NULL, \`value\` text NOT NULL, \`iv\` varchar(64) NULL, \`tag\` varchar(64) NULL, PRIMARY KEY (\`key\`)) ENGINE=InnoDB`); - await queryRunner.query(`CREATE TABLE \`jackson_index\` (\`id\` int NOT NULL AUTO_INCREMENT, \`key\` varchar(1500) NOT NULL, \`storeKey\` varchar(1500) NOT NULL, INDEX \`_jackson_index_key\` (\`key\`), INDEX \`_jackson_index_key_store\` (\`key\`, \`storeKey\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); - await queryRunner.query(`CREATE TABLE \`jackson_ttl\` (\`key\` varchar(1500) NOT NULL, \`expiresAt\` bigint NOT NULL, INDEX \`_jackson_ttl_expires_at\` (\`expiresAt\`), PRIMARY KEY (\`key\`)) ENGINE=InnoDB`); - await queryRunner.query(`ALTER TABLE \`jackson_index\` ADD CONSTRAINT \`FK_937b040fb2592b4671cbde09e83\` FOREIGN KEY (\`storeKey\`) REFERENCES \`jackson_store\`(\`key\`) ON DELETE CASCADE ON UPDATE NO ACTION`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE \`jackson_index\` DROP FOREIGN KEY \`FK_937b040fb2592b4671cbde09e83\``); - await queryRunner.query(`DROP INDEX \`_jackson_ttl_expires_at\` ON \`jackson_ttl\``); - await queryRunner.query(`DROP TABLE \`jackson_ttl\``); - await queryRunner.query(`DROP INDEX \`_jackson_index_key_store\` ON \`jackson_index\``); - await queryRunner.query(`DROP INDEX \`_jackson_index_key\` ON \`jackson_index\``); - await queryRunner.query(`DROP TABLE \`jackson_index\``); - await queryRunner.query(`DROP TABLE \`jackson_store\``); - } - -} diff --git a/npm/migration/mysql-old/1644332641078-createdAt.ts b/npm/migration/mysql-old/1644332641078-createdAt.ts deleted file mode 100644 index 8fe968c93..000000000 --- a/npm/migration/mysql-old/1644332641078-createdAt.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {MigrationInterface, QueryRunner} from "typeorm"; - -export class createdAt1644332641078 implements MigrationInterface { - name = 'createdAt1644332641078' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`createdAt\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP`); - await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`modifiedAt\` timestamp NULL`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`modifiedAt\``); - await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`createdAt\``); - } - -} diff --git a/npm/migration/mysql/1692767993709-ms_namespace.ts b/npm/migration/mysql/1692767993709-ms_namespace.ts new file mode 100644 index 000000000..34d95cefa --- /dev/null +++ b/npm/migration/mysql/1692767993709-ms_namespace.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class msNamespace1692767993709 implements MigrationInterface { + name = 'msNamespace1692767993709' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`namespace\` varchar(64) NULL`); + await queryRunner.query(`CREATE INDEX \`_jackson_store_namespace\` ON \`jackson_store\` (\`namespace\`)`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`_jackson_store_namespace\` ON \`jackson_store\``); + await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`namespace\``); + } + +} diff --git a/npm/migration/planetscale/1692767993709-ms_namespace.ts b/npm/migration/planetscale/1692767993709-ms_namespace.ts new file mode 100644 index 000000000..c8aa46b19 --- /dev/null +++ b/npm/migration/planetscale/1692767993709-ms_namespace.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MsNamespace1692767993709 implements MigrationInterface { + name = 'MsNamespace1692767993709' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`namespace\` varchar(64) NULL`); + await queryRunner.query(`CREATE INDEX \`_jackson_store_namespace\` ON \`jackson_store\` (\`namespace\`)`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`_jackson_store_namespace\` ON \`jackson_store\``); + await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`namespace\``); + } + +} diff --git a/npm/migration/postgres/1692767993709-pg_namespace.ts b/npm/migration/postgres/1692767993709-pg_namespace.ts new file mode 100644 index 000000000..c14d3abea --- /dev/null +++ b/npm/migration/postgres/1692767993709-pg_namespace.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class PgNamespace1692767993709 implements MigrationInterface { + name = 'PgNamespace1692767993709' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "jackson_store" ADD "namespace" character varying(64)`); + await queryRunner.query(`CREATE INDEX "_jackson_store_namespace" ON "jackson_store" ("namespace") `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "public"."_jackson_store_namespace"`); + await queryRunner.query(`ALTER TABLE "jackson_store" DROP COLUMN "namespace"`); + } + +} diff --git a/npm/migration/sql/1692817789888-namespace.ts b/npm/migration/sql/1692817789888-namespace.ts new file mode 100644 index 000000000..9a9fdb3fd --- /dev/null +++ b/npm/migration/sql/1692817789888-namespace.ts @@ -0,0 +1,25 @@ +import { MigrationInterface, QueryRunner } from "typeorm" + +export class namespace1692817789888 implements MigrationInterface { + name = 'namespace1692817789888' + + public async up(queryRunner: QueryRunner): Promise { + const response = await queryRunner.query("select jackson.key from jackson_store jackson") + const searchTerm = ':'; + for (const k in response) { + const key = response[k].key; + const tokens2 = key.split(searchTerm).slice(0, 2); + const value = tokens2.join(searchTerm); + queryRunner.query(`update jackson_store set namespace = '${value}' where jackson_store.key = '${key}'`) + } + } + + public async down(queryRunner: QueryRunner): Promise { + const response = await queryRunner.query("select jackson.key from jackson_store jackson") + for (const k in response) { + const key = response[k].key; + queryRunner.query(`update jackson_store set namespace = NULL where jackson_store.key = '${key}'`) + } + } + +} diff --git a/npm/package-lock.json b/npm/package-lock.json index 1c498cc34..908be4784 100644 --- a/npm/package-lock.json +++ b/npm/package-lock.json @@ -41,6 +41,7 @@ "@types/sinon": "10.0.19", "@types/tap": "15.0.9", "cross-env": "7.0.3", + "migrate-mongo": "10.0.0", "nock": "13.3.4", "sinon": "16.1.0", "tap": "18.5.0", @@ -80,8 +81,7 @@ }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -90,8 +90,7 @@ }, "node_modules/@aws-crypto/crc32/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "license": "0BSD" }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", @@ -509,8 +508,7 @@ }, "node_modules/@aws-sdk/endpoint-cache": { "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.310.0.tgz", - "integrity": "sha512-y3wipforet41EDTI0vnzxILqwAGll1KfI5qcdX9pXF/WF1f+3frcOtPiWtQEZQpy4czRogKm3BHo70QBYAZxlQ==", + "license": "Apache-2.0", "dependencies": { "mnemonist": "0.38.3", "tslib": "^2.5.0" @@ -1032,6 +1030,16 @@ "xmlbuilder": "15.1.1" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "dev": true, @@ -1885,11 +1893,11 @@ "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@smithy/abort-controller": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.10.tgz", - "integrity": "sha512-xn7PnFD3m4rQIG00h1lPuDVnC2QMtTFhzRLX3y56KkgFaCysS7vpNevNBgmNUtmJ4eVFc+66Zucwo2KDLdicOg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.11.tgz", + "integrity": "sha512-MSzE1qR2JNyb7ot3blIOT3O3H0Jn06iNDEgHRaqZUwBgx5EG+VIx24Y21tlKofzYryIOcWpIohLrIIyocD6LMA==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -1897,14 +1905,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.11.tgz", - "integrity": "sha512-q97FnlUmbai1c4JlQJgLVBsvSxgV/7Nvg/JK76E1nRq/U5UM56Eqo3dn2fY7JibqgJLg4LPsGdwtIyqyOk35CQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.14.tgz", + "integrity": "sha512-K1K+FuWQoy8j/G7lAmK85o03O89s2Vvh6kMFmzEmiHUoQCRH1rzbDtMnGNiaMHeSeYJ6y79IyTusdRG+LuWwtg==", "dependencies": { - "@smithy/node-config-provider": "^2.0.13", - "@smithy/types": "^2.3.4", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/types": "^2.3.5", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.3", + "@smithy/util-middleware": "^2.0.4", "tslib": "^2.5.0" }, "engines": { @@ -1912,14 +1920,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.13.tgz", - "integrity": "sha512-/xe3wNoC4j+BeTemH9t2gSKLBfyZmk8LXB2pQm/TOEYi+QhBgT+PSolNDfNAhrR68eggNE17uOimsrnwSkCt4w==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.16.tgz", + "integrity": "sha512-tKa2xF+69TvGxJT+lnJpGrKxUuAZDLYXFhqnPEgnHz+psTpkpcB4QRjHj63+uj83KaeFJdTfW201eLZeRn6FfA==", "dependencies": { - "@smithy/node-config-provider": "^2.0.13", - "@smithy/property-provider": "^2.0.11", - "@smithy/types": "^2.3.4", - "@smithy/url-parser": "^2.0.10", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/property-provider": "^2.0.12", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", "tslib": "^2.5.0" }, "engines": { @@ -1927,34 +1935,34 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.10.tgz", - "integrity": "sha512-3SSDgX2nIsFwif6m+I4+ar4KDcZX463Noes8ekBgQHitULiWvaDZX8XqPaRQSQ4bl1vbeVXHklJfv66MnVO+lw==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.11.tgz", + "integrity": "sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.1.tgz", - "integrity": "sha512-bXyM8PBAIKxVV++2ZSNBEposTDjFQ31XWOdHED+2hWMNvJHUoQqFbECg/uhcVOa6vHie2/UnzIZfXBSTpDBnEw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.2.tgz", + "integrity": "sha512-K7aRtRuaBjzlk+jWWeyfDTLAmRRvmA4fU8eHUXtjsuEDgi3f356ZE32VD2ssxIH13RCLVZbXMt5h7wHzYiSuVA==", "dependencies": { - "@smithy/protocol-http": "^3.0.6", - "@smithy/querystring-builder": "^2.0.10", - "@smithy/types": "^2.3.4", + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.10.tgz", - "integrity": "sha512-jSTf6uzPk/Vf+8aQ7tVXeHfjxe9wRXSCqIZcBymSDTf7/YrVxniBdpyN74iI8ZUOx/Pyagc81OK5FROLaEjbXQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.11.tgz", + "integrity": "sha512-PbleVugN2tbhl1ZoNWVrZ1oTFFas/Hq+s6zGO8B9bv4w/StTriTKA9W+xZJACOj9X7zwfoTLbscM+avCB1KqOQ==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -1964,11 +1972,11 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.10.tgz", - "integrity": "sha512-zw9p/zsmJ2cFcW4KMz3CJoznlbRvEA6HG2mvEaX5eAca5dq4VGI2MwPDTfmteC/GsnURS4ogoMQ0p6aHM2SDVQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.11.tgz", + "integrity": "sha512-zazq99ujxYv/NOf9zh7xXbNgzoVLsqE0wle8P/1zU/XdhPi/0zohTPKWUzIxjGdqb5hkkwfBkNkl5H+LE0mvgw==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" } }, @@ -1983,12 +1991,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.12.tgz", - "integrity": "sha512-QRhJTo5TjG7oF7np6yY4ZO9GDKFVzU/GtcqUqyEa96bLHE3yZHgNmsolOQ97pfxPHmFhH4vDP//PdpAIN3uI1Q==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.13.tgz", + "integrity": "sha512-Md2kxWpaec3bXp1oERFPQPBhOXCkGSAF7uc1E+4rkwjgw3/tqAXRtbjbggu67HJdwaif76As8AV6XxbD1HzqTQ==", "dependencies": { - "@smithy/protocol-http": "^3.0.6", - "@smithy/types": "^2.3.4", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -1996,14 +2004,14 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.10.tgz", - "integrity": "sha512-O6m4puZc16xfenotZUHL4bRlMrwf4gTp+0I5l954M5KNd3dOK18P+FA/IIUgnXF/dX6hlCUcJkBp7nAzwrePKA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.11.tgz", + "integrity": "sha512-mCugsvB15up6fqpzUEpMT4CuJmFkEI+KcozA7QMzYguXCaIilyMKsyxgamwmr+o7lo3QdjN0//XLQ9bWFL129g==", "dependencies": { - "@smithy/middleware-serde": "^2.0.10", - "@smithy/types": "^2.3.4", - "@smithy/url-parser": "^2.0.10", - "@smithy/util-middleware": "^2.0.3", + "@smithy/middleware-serde": "^2.0.11", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-middleware": "^2.0.4", "tslib": "^2.5.0" }, "engines": { @@ -2011,16 +2019,16 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.13.tgz", - "integrity": "sha512-zuOva8xgWC7KYG8rEXyWIcZv2GWszO83DCTU6IKcf/FKu6OBmSE+EYv3EUcCGY+GfiwCX0EyJExC9Lpq9b0w5Q==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.16.tgz", + "integrity": "sha512-Br5+0yoiMS0ugiOAfJxregzMMGIRCbX4PYo1kDHtLgvkA/d++aHbnHB819m5zOIAMPvPE7AThZgcsoK+WOsUTA==", "dependencies": { - "@smithy/node-config-provider": "^2.0.13", - "@smithy/protocol-http": "^3.0.6", - "@smithy/service-error-classification": "^2.0.3", - "@smithy/types": "^2.3.4", - "@smithy/util-middleware": "^2.0.3", - "@smithy/util-retry": "^2.0.3", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/protocol-http": "^3.0.7", + "@smithy/service-error-classification": "^2.0.4", + "@smithy/types": "^2.3.5", + "@smithy/util-middleware": "^2.0.4", + "@smithy/util-retry": "^2.0.4", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -2029,11 +2037,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.10.tgz", - "integrity": "sha512-+A0AFqs768256H/BhVEsBF6HijFbVyAwYRVXY/izJFkTalVWJOp4JA0YdY0dpXQd+AlW0tzs+nMQCE1Ew+DcgQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.11.tgz", + "integrity": "sha512-NuxnjMyf4zQqhwwdh0OTj5RqpnuT6HcH5Xg5GrPijPcKzc2REXVEVK4Yyk8ckj8ez1XSj/bCmJ+oNjmqB02GWA==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2041,11 +2049,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.4.tgz", - "integrity": "sha512-MW0KNKfh8ZGLagMZnxcLJWPNXoKqW6XV/st5NnCBmmA2e2JhrUjU0AJ5Ca/yjTyNEKs3xH7AQDwp1YmmpEpmQQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.5.tgz", + "integrity": "sha512-bVQU/rZzBY7CbSxIrDTGZYnBWKtIw+PL/cRc9B7etZk1IKSOe0NvKMJyWllfhfhrTeMF6eleCzOihIQympAvPw==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2053,13 +2061,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.13.tgz", - "integrity": "sha512-pPpLqYuJcOq1sj1EGu+DoZK47DUS4gepqSTNgRezmrjnzNlSU2/Dcc9Ebzs+WZ0Z5vXKazuE+k+NksFLo07/AA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.1.tgz", + "integrity": "sha512-1lF6s1YWBi1LBu2O30tD3jyTgMtuvk/Z1twzXM4GPYe4dmZix4nNREPJIPOcfFikNU2o0eTYP80+izx5F2jIJA==", "dependencies": { - "@smithy/property-provider": "^2.0.11", - "@smithy/shared-ini-file-loader": "^2.0.12", - "@smithy/types": "^2.3.4", + "@smithy/property-provider": "^2.0.12", + "@smithy/shared-ini-file-loader": "^2.2.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2067,14 +2075,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.6.tgz", - "integrity": "sha512-NspvD3aCwiUNtoSTcVHz0RZz1tQ/SaRIe1KPF+r0mAdCZ9eWuhIeJT8ZNPYa1ITn7/Lgg64IyFjqPynZ8KnYQw==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.7.tgz", + "integrity": "sha512-PQIKZXlp3awCDn/xNlCSTFE7aYG/5Tx33M05NfQmWYeB5yV1GZZOSz4dXpwiNJYTXb9jPqjl+ueXXkwtEluFFA==", "dependencies": { - "@smithy/abort-controller": "^2.0.10", - "@smithy/protocol-http": "^3.0.6", - "@smithy/querystring-builder": "^2.0.10", - "@smithy/types": "^2.3.4", + "@smithy/abort-controller": "^2.0.11", + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2082,11 +2090,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.11.tgz", - "integrity": "sha512-kzuOadu6XvrnlF1iXofpKXYmo4oe19st9/DE8f5gHNaFepb4eTkR8gD8BSdTnNnv7lxfv6uOwZPg4VS6hemX1w==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.12.tgz", + "integrity": "sha512-Un/OvvuQ1Kg8WYtoMCicfsFFuHb/TKL3pCA6ZIo/WvNTJTR94RtoRnL7mY4XkkUAoFMyf6KjcQJ76y1FX7S5rw==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2094,11 +2102,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.6.tgz", - "integrity": "sha512-F0jAZzwznMmHaggiZgc7YoS08eGpmLvhVktY/Taz6+OAOHfyIqWSDNgFqYR+WHW9z5fp2XvY4mEUrQgYMQ71jw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.7.tgz", + "integrity": "sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2106,11 +2114,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.10.tgz", - "integrity": "sha512-uujJGp8jzrrU1UHme8sUKEbawQTcTmUWsh8rbGXYD/lMwNLQ+9jQ9dMDWbbH9Hpoa9RER1BeL/38WzGrbpob2w==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.11.tgz", + "integrity": "sha512-b4kEbVMxpmfv2VWUITn2otckTi7GlMteZQxi+jlwedoATOGEyrCJPfRcYQJjbCi3fZ2QTfh3PcORvB27+j38Yg==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -2119,11 +2127,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.10.tgz", - "integrity": "sha512-WSD4EU60Q8scacT5PIpx4Bahn6nWpt+MiYLcBkFt6fOj7AssrNeaNIU2Z0g40ftVmrwLcEOIKGX92ynbVDb3ZA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.11.tgz", + "integrity": "sha512-YXe7jhi7s3dQ0Fu9dLoY/gLu6NCyy8tBWJL/v2c9i7/RLpHgKT+uT96/OqZkHizCJ4kr0ZD46tzMjql/o60KLg==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2131,22 +2139,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.3.tgz", - "integrity": "sha512-b+m4QCHXb7oKAkM/jHwHrl5gpqhFoMTHF643L0/vAEkegrcUWyh1UjyoHttuHcP5FnHVVy4EtpPtLkEYD+xMFw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.4.tgz", + "integrity": "sha512-77506l12I5gxTZqBkx3Wb0RqMG81bMYLaVQ+EqIWFwQDJRs5UFeXogKxSKojCmz1wLUziHZQXm03MBzPQiumQw==", "dependencies": { - "@smithy/types": "^2.3.4" + "@smithy/types": "^2.3.5" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.12.tgz", - "integrity": "sha512-umi0wc4UBGYullAgYNUVfGLgVpxQyES47cnomTqzCKeKO5oudO4hyDNj+wzrOjqDFwK2nWYGVgS8Y0JgGietrw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.0.tgz", + "integrity": "sha512-xFXqs4vAb5BdkzHSRrTapFoaqS4/3m/CGZzdw46fBjYZ0paYuLAoMY60ICCn1FfGirG+PiJ3eWcqJNe4/SkfyA==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2154,9 +2162,10 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.10", + "version": "2.0.1", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.10.tgz", "integrity": "sha512-S6gcP4IXfO/VMswovrhxPpqvQvMal7ZRjM4NvblHSPpE5aNBYx67UkHFF3kg0hR3tJKqNpBGbxwq0gzpdHKLRA==", + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-codec": "^2.0.10", "@smithy/is-array-buffer": "^2.0.0", @@ -2172,13 +2181,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.9.tgz", - "integrity": "sha512-HTicQSn/lOcXKJT+DKJ4YMu51S6PzbWsO8Z6Pwueo30mSoFKXg5P0BDkg2VCDqCVR0mtddM/F6hKhjW6YAV/yg==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.10.tgz", + "integrity": "sha512-2OEmZDiW1Z196QHuQZ5M6cBE8FCSG0H2HADP1G+DY8P3agsvb0YJyfhyKuJbxIQy15tr3eDAK6FOrlbxgKOOew==", "dependencies": { - "@smithy/middleware-stack": "^2.0.4", - "@smithy/types": "^2.3.4", - "@smithy/util-stream": "^2.0.14", + "@smithy/middleware-stack": "^2.0.5", + "@smithy/types": "^2.3.5", + "@smithy/util-stream": "^2.0.15", "tslib": "^2.5.0" }, "engines": { @@ -2186,9 +2195,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.4.tgz", - "integrity": "sha512-D7xlM9FOMFyFw7YnMXn9dK2KuN6+JhnrZwVt1fWaIu8hCk5CigysweeIT/H/nCo4YV+s8/oqUdLfexbkPZtvqw==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.5.tgz", + "integrity": "sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==", "dependencies": { "tslib": "^2.5.0" }, @@ -2197,12 +2206,12 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.10.tgz", - "integrity": "sha512-4TXQFGjHcqru8aH5VRB4dSnOFKCYNX6SR1Do6fwxZ+ExT2onLsh2W77cHpks7ma26W5jv6rI1u7d0+KX9F0aOw==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.11.tgz", + "integrity": "sha512-h89yXMCCF+S5k9XIoKltMIWTYj+FcEkU/IIFZ6RtE222fskOTL4Iak6ZRG+ehSvZDt8yKEcxqheTDq7JvvtK3g==", "dependencies": { - "@smithy/querystring-parser": "^2.0.10", - "@smithy/types": "^2.3.4", + "@smithy/querystring-parser": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" } }, @@ -2247,8 +2256,7 @@ }, "node_modules/@smithy/util-config-provider": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -2257,13 +2265,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.13.tgz", - "integrity": "sha512-UmmOdUzaQjqdsl1EjbpEaQxM0VDFqTj6zDuI26/hXN7L/a1k1koTwkYpogHMvunDX3fjrQusg5gv1Td4UsGyog==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.14.tgz", + "integrity": "sha512-NupG7SWUucm3vJrvlpt9jG1XeoPJphjcivgcUUXhDJbUPy4F04LhlTiAhWSzwlCNcF8OJsMvZ/DWbpYD3pselw==", "dependencies": { - "@smithy/property-provider": "^2.0.11", - "@smithy/smithy-client": "^2.1.9", - "@smithy/types": "^2.3.4", + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.10", + "@smithy/types": "^2.3.5", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -2272,16 +2280,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.15.tgz", - "integrity": "sha512-g6J7MHAibVPMTlXyH3mL+Iet4lMJKFVhsOhJmn+IKG81uy9m42CkRSDlwdQSJAcprLQBIaOPdFxNXQvrg2w1Uw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.18.tgz", + "integrity": "sha512-+3jMom/b/Cdp21tDnY4vKu249Al+G/P0HbRbct7/aSZDlROzv1tksaYukon6UUv7uoHn+/McqnsvqZHLlqvQ0g==", "dependencies": { - "@smithy/config-resolver": "^2.0.11", - "@smithy/credential-provider-imds": "^2.0.13", - "@smithy/node-config-provider": "^2.0.13", - "@smithy/property-provider": "^2.0.11", - "@smithy/smithy-client": "^2.1.9", - "@smithy/types": "^2.3.4", + "@smithy/config-resolver": "^2.0.14", + "@smithy/credential-provider-imds": "^2.0.16", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.10", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2290,8 +2298,7 @@ }, "node_modules/@smithy/util-hex-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -2300,11 +2307,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.3.tgz", - "integrity": "sha512-+FOCFYOxd2HO7v/0hkFSETKf7FYQWa08wh/x/4KUeoVBnLR4juw8Qi+TTqZI6E2h5LkzD9uOaxC9lAjrpVzaaA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.4.tgz", + "integrity": "sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==", "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2312,12 +2319,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.3.tgz", - "integrity": "sha512-gw+czMnj82i+EaH7NL7XKkfX/ZKrCS2DIWwJFPKs76bMgkhf0y1C94Lybn7f8GkBI9lfIOUdPYtzm19zQOC8sw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.4.tgz", + "integrity": "sha512-b+n1jBBKc77C1E/zfBe1Zo7S9OXGBiGn55N0apfhZHxPUP/fMH5AhFUUcWaJh7NAnah284M5lGkBKuhnr3yK5w==", "dependencies": { - "@smithy/service-error-classification": "^2.0.3", - "@smithy/types": "^2.3.4", + "@smithy/service-error-classification": "^2.0.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2325,13 +2332,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.14.tgz", - "integrity": "sha512-XjvlDYe+9DieXhLf7p+EgkXwFtl34kHZcWfHnc5KaILbhyVfDLWuqKTFx6WwCFqb01iFIig8trGwExRIqqkBYg==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.15.tgz", + "integrity": "sha512-A/hkYJPH2N5MCWYvky4tTpQihpYAEzqnUfxDyG3L/yMndy/2sLvxnyQal9Opuj1e9FiKSTeMyjnU9xxZGs0mRw==", "dependencies": { - "@smithy/fetch-http-handler": "^2.2.1", - "@smithy/node-http-handler": "^2.1.6", - "@smithy/types": "^2.3.4", + "@smithy/fetch-http-handler": "^2.2.2", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/types": "^2.3.5", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -2344,8 +2351,7 @@ }, "node_modules/@smithy/util-uri-escape": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -2365,12 +2371,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.10.tgz", - "integrity": "sha512-yQjwWVrwYw+/f3hFQccE3zZF7lk6N6xtNcA6jvhWFYhnyKAm6B2mX8Gzftl0TbgoPUpzCvKYlvhaEpVtRpVfVw==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.11.tgz", + "integrity": "sha512-8SJWUl9O1YhjC77EccgltI3q4XZQp3vp9DGEW6o0OdkUcwqm/H4qOLnMkA2n+NDojuM5Iia2jWoCdbluIiG7TA==", "dependencies": { - "@smithy/abort-controller": "^2.0.10", - "@smithy/types": "^2.3.4", + "@smithy/abort-controller": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -3285,8 +3291,7 @@ }, "node_modules/bowser": { "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", @@ -3669,6 +3674,21 @@ "node": ">=10" } }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, "node_modules/cli-truncate": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", @@ -4219,6 +4239,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fn-args": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fn-args/-/fn-args-5.0.0.tgz", + "integrity": "sha512-CtbfI3oFFc3nbdIoHycrfbrxiGgxXBXXuyOl49h47JawM1mYrqpiRqnH5CB2mBatdXvHHOUO6a+RiAuuvKt0lw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/follow-redirects": { "version": "1.15.2", "funding": [ @@ -4292,6 +4321,20 @@ } ] }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -4493,6 +4536,8 @@ }, "node_modules/google-auth-library/node_modules/agent-base": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -4503,6 +4548,8 @@ }, "node_modules/google-auth-library/node_modules/gaxios": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -4527,6 +4574,8 @@ }, "node_modules/google-auth-library/node_modules/https-proxy-agent": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "license": "MIT", "dependencies": { "agent-base": "^7.0.2", @@ -4553,6 +4602,8 @@ }, "node_modules/googleapis-common/node_modules/agent-base": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -4563,6 +4614,8 @@ }, "node_modules/googleapis-common/node_modules/gaxios": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -4576,6 +4629,8 @@ }, "node_modules/googleapis-common/node_modules/https-proxy-agent": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "license": "MIT", "dependencies": { "agent-base": "^7.0.2", @@ -4621,6 +4676,8 @@ }, "node_modules/gtoken/node_modules/agent-base": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -4631,6 +4688,8 @@ }, "node_modules/gtoken/node_modules/gaxios": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -4644,6 +4703,8 @@ }, "node_modules/gtoken/node_modules/https-proxy-agent": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "license": "MIT", "dependencies": { "agent-base": "^7.0.2", @@ -4740,6 +4801,8 @@ }, "node_modules/hash-base/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -5456,6 +5519,18 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -5710,6 +5785,39 @@ "version": "1.5.0", "license": "MIT" }, + "node_modules/migrate-mongo": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/migrate-mongo/-/migrate-mongo-10.0.0.tgz", + "integrity": "sha512-QA/bBKNMq/FmuK3fDbgwfNoW2riiU1wLDWGXv/tGhUItPLGqcciPPmu29SrnYAzRKMOVaGEXxzmrBs1zp5cQ7Q==", + "dev": true, + "dependencies": { + "cli-table3": "^0.6.1", + "commander": "^9.1.0", + "date-fns": "^2.28.0", + "fn-args": "^5.0.0", + "fs-extra": "^10.0.1", + "lodash": "^4.17.21", + "p-each-series": "^2.2.0" + }, + "bin": { + "migrate-mongo": "bin/migrate-mongo.js" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "mongodb": "^4.4.1 || ^5.0.0" + } + }, + "node_modules/migrate-mongo/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -5966,8 +6074,7 @@ }, "node_modules/mnemonist": { "version": "0.38.3", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", - "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", + "license": "MIT", "dependencies": { "obliterator": "^1.6.1" } @@ -6486,8 +6593,7 @@ }, "node_modules/obliterator": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", - "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==" + "license": "MIT" }, "node_modules/oidc-token-hash": { "version": "5.0.3", @@ -6556,6 +6662,18 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8432,6 +8550,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/url-template": { "version": "2.0.8", "license": "BSD" @@ -8453,9 +8580,9 @@ "license": "MIT" }, "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.2.tgz", + "integrity": "sha512-ZGBe7VAivuuoQXTeckpbYKTdtjXGcm3ZUHXC0PAk0CzFyuYvwi73a58iEKI3GkGD1c3EHc+EgfR1w5pgbfzJlQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", diff --git a/npm/package.json b/npm/package.json index 4fe62ef9a..264f4c364 100644 --- a/npm/package.json +++ b/npm/package.json @@ -20,13 +20,16 @@ "build": "tsc -p tsconfig.build.json", "db:migration:generate:postgres": "ts-node --transpile-only ./node_modules/typeorm/cli.js migration:generate -d typeorm.ts migration/postgres/pg_${MIGRATION_NAME}", "db:migration:generate:mysql": "cross-env DB_TYPE=mysql DB_URL=mysql://root:mysql@localhost:3307/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:generate -d typeorm.ts migration/mysql/ms_${MIGRATION_NAME}", - "db:migration:generate:planetscale": "cross-env DB_ENGINE=planetscale DB_URL=mysql://root:mysql@localhost:3307/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:generate -d typeorm.ts migration/mysql/ms_${MIGRATION_NAME}", + "db:migration:generate:planetscale": "cross-env DB_ENGINE=planetscale DB_URL=mysql://root:mysql@localhost:3307/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:generate -d typeorm.ts migration/planetscale/ms_${MIGRATION_NAME}", "db:migration:generate:mariadb": "cross-env DB_TYPE=mariadb DB_URL=mariadb://root@localhost:3306/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:generate -d typeorm.ts migration/mariadb/md_${MIGRATION_NAME}", + "db:migration:generate:mongo": "migrate-mongo create ${MIGRATION_NAME}", "db:migration:generate:mssql": "cross-env DB_TYPE=mssql DB_URL='sqlserver://localhost:1433;database=master;username=sa;password=123ABabc!' ts-node --transpile-only ./node_modules/typeorm/cli.js migration:generate -d typeorm.ts migration/mssql/mss_${MIGRATION_NAME}", "db:migration:run:postgres": "ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run -d typeorm.ts", "db:migration:run:mysql": "cross-env DB_TYPE=mysql DB_URL=mysql://root:mysql@localhost:3307/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run -d typeorm.ts", "db:migration:run:planetscale": "cross-env DB_SSL=true DB_ENGINE=planetscale DB_URL=${PLANETSCALE_URL} ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run -d typeorm.ts", "db:migration:run:mariadb": "cross-env DB_TYPE=mariadb DB_URL=mariadb://root@localhost:3306/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run -d typeorm.ts", + "db:migration:run:mongo": "cross-env DB_URL='mongodb://localhost:27017/jackson' migrate-mongo up", + "db:migration:revert:mongo": "cross-env DB_URL='mongodb://localhost:27017/jackson migrate-mongo down", "db:migration:run:mssql": "cross-env DB_TYPE=mssql DB_URL='sqlserver://localhost:1433;database=master;username=sa;password=123ABabc!' ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run -d typeorm.ts", "prepublishOnly": "npm run build", "test": "cross-env BOXYHQ_NO_ANALYTICS=1 tap --timeout=0 --allow-incomplete-coverage --allow-empty-coverage test/**/*.test.ts", @@ -68,6 +71,7 @@ "@types/sinon": "10.0.19", "@types/tap": "15.0.9", "cross-env": "7.0.3", + "migrate-mongo": "10.0.0", "nock": "13.3.4", "sinon": "16.1.0", "tap": "18.5.0", diff --git a/npm/src/db/defaultDb.ts b/npm/src/db/defaultDb.ts index 2e7460b7c..6b935d726 100644 --- a/npm/src/db/defaultDb.ts +++ b/npm/src/db/defaultDb.ts @@ -11,6 +11,7 @@ export default function defaultDb(opts: JacksonOption) { opts.db.dynamodb.region = opts.db.dynamodb.region || 'us-east-1'; opts.db.dynamodb.readCapacityUnits = opts.db.dynamodb.readCapacityUnits || 5; opts.db.dynamodb.writeCapacityUnits = opts.db.dynamodb.writeCapacityUnits || 5; + opts.db.manualMigration = opts.db.manualMigration || false; return opts; } diff --git a/npm/src/db/mongo.ts b/npm/src/db/mongo.ts index c6925b065..105975c0b 100644 --- a/npm/src/db/mongo.ts +++ b/npm/src/db/mongo.ts @@ -6,6 +6,7 @@ type _Document = { value: Encrypted; expiresAt?: Date; modifiedAt: string; + namespace: string; indexes: string[]; }; @@ -34,10 +35,38 @@ class Mongo implements DatabaseDriver { await this.collection.createIndex({ indexes: 1 }); await this.collection.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 1 }); + await this.collection.createIndex({ namespace: 1 }); + + // eslint-disable-next-line no-constant-condition + while (true) { + try { + if (!this.options.manualMigration) { + await this.indexNamespace(); + } + break; + } catch (err) { + console.error( + `error in index namespace execution for db engine: ${this.options.engine}, err: ${err}` + ); + await dbutils.sleep(1000); + continue; + } + } return this; } + async indexNamespace() { + const docs = await this.collection.find({ namespace: { $exists: false } }).toArray(); + const searchTerm = ':'; + + for (const doc of docs || []) { + const tokens2 = doc._id.toString().split(searchTerm).slice(0, 2); + const namespace = tokens2.join(searchTerm); + await this.collection.updateOne({ _id: doc._id }, { $set: { namespace } }); + } + } + async get(namespace: string, key: string): Promise { const res = await this.collection.findOne({ _id: dbutils.key(namespace, key) as any, @@ -51,9 +80,8 @@ class Mongo implements DatabaseDriver { // eslint-disable-next-line @typescript-eslint/no-unused-vars async getAll(namespace: string, pageOffset?: number, pageLimit?: number, _?: string): Promise { - const _namespaceMatch = new RegExp(`^${namespace}:.*`); const docs = await this.collection - .find({ _id: _namespaceMatch }, { sort: { createdAt: -1 }, skip: pageOffset, limit: pageLimit }) + .find({ namespace: namespace }, { sort: { createdAt: -1 }, skip: pageOffset, limit: pageLimit }) .toArray(); if (docs) { @@ -102,7 +130,7 @@ class Mongo implements DatabaseDriver { if (ttl) { doc.expiresAt = new Date(Date.now() + ttl * 1000); } - + doc.namespace = namespace; // no ttl support for secondary indexes for (const idx of indexes || []) { const idxKey = dbutils.keyForIndex(namespace, idx); diff --git a/npm/src/db/planetscale/entity/JacksonStore.ts b/npm/src/db/planetscale/entity/JacksonStore.ts index e2333adee..9325e0468 100644 --- a/npm/src/db/planetscale/entity/JacksonStore.ts +++ b/npm/src/db/planetscale/entity/JacksonStore.ts @@ -1,4 +1,4 @@ -import { Entity, Column } from 'typeorm'; +import { Entity, Column, Index } from 'typeorm'; @Entity({ name: 'jackson_store' }) export class JacksonStore { @@ -40,4 +40,12 @@ export class JacksonStore { nullable: true, }) modifiedAt?: string; + + @Index('_jackson_store_namespace') + @Column({ + type: 'varchar', + length: 64, + nullable: true, + }) + namespace?: string; } diff --git a/npm/src/db/sql/entity/JacksonStore.ts b/npm/src/db/sql/entity/JacksonStore.ts index 634d6263b..5b0fe68ab 100644 --- a/npm/src/db/sql/entity/JacksonStore.ts +++ b/npm/src/db/sql/entity/JacksonStore.ts @@ -1,4 +1,4 @@ -import { Entity, Column } from 'typeorm'; +import { Entity, Column, Index } from 'typeorm'; @Entity({ name: 'jackson_store' }) export class JacksonStore { @@ -40,4 +40,12 @@ export class JacksonStore { nullable: true, }) modifiedAt?: string; + + @Index('_jackson_store_namespace') + @Column({ + type: 'varchar', + length: 64, + nullable: true, + }) + namespace?: string; } diff --git a/npm/src/db/sql/mariadb/entity/JacksonStore.ts b/npm/src/db/sql/mariadb/entity/JacksonStore.ts index e2333adee..9325e0468 100644 --- a/npm/src/db/sql/mariadb/entity/JacksonStore.ts +++ b/npm/src/db/sql/mariadb/entity/JacksonStore.ts @@ -1,4 +1,4 @@ -import { Entity, Column } from 'typeorm'; +import { Entity, Column, Index } from 'typeorm'; @Entity({ name: 'jackson_store' }) export class JacksonStore { @@ -40,4 +40,12 @@ export class JacksonStore { nullable: true, }) modifiedAt?: string; + + @Index('_jackson_store_namespace') + @Column({ + type: 'varchar', + length: 64, + nullable: true, + }) + namespace?: string; } diff --git a/npm/src/db/sql/mssql/entity/JacksonStore.ts b/npm/src/db/sql/mssql/entity/JacksonStore.ts index f05533d2f..3b20fdd38 100644 --- a/npm/src/db/sql/mssql/entity/JacksonStore.ts +++ b/npm/src/db/sql/mssql/entity/JacksonStore.ts @@ -1,4 +1,4 @@ -import { Entity, Column } from 'typeorm'; +import { Entity, Column, Index } from 'typeorm'; @Entity({ name: 'jackson_store' }) export class JacksonStore { @@ -40,4 +40,12 @@ export class JacksonStore { nullable: true, }) modifiedAt?: string; + + @Index('_jackson_store_namespace') + @Column({ + type: 'varchar', + length: 64, + nullable: true, + }) + namespace?: string; } diff --git a/npm/src/db/sql/sql.ts b/npm/src/db/sql/sql.ts index 723540a79..0328129a1 100644 --- a/npm/src/db/sql/sql.ts +++ b/npm/src/db/sql/sql.ts @@ -3,7 +3,7 @@ require('reflect-metadata'); import { DatabaseDriver, DatabaseOption, Index, Encrypted, Records } from '../../typings'; -import { DataSource, DataSourceOptions, Like, In } from 'typeorm'; +import { DataSource, DataSourceOptions, In, IsNull } from 'typeorm'; import * as dbutils from '../utils'; import * as mssql from './mssql'; @@ -26,12 +26,14 @@ class Sql implements DatabaseDriver { async init({ JacksonStore, JacksonIndex, JacksonTTL }): Promise { const sqlType = this.options.engine === 'planetscale' ? 'mysql' : this.options.type!; + // Synchronize by default for non-planetscale engines only if migrations are not set to run + const synchronize = this.options.engine !== 'planetscale' && !this.options.manualMigration; while (true) { try { const baseOpts = { type: sqlType, - synchronize: this.options.engine !== 'planetscale', + synchronize, logging: ['error'], entities: [JacksonStore, JacksonIndex, JacksonTTL], }; @@ -72,6 +74,21 @@ class Sql implements DatabaseDriver { this.indexRepository = this.dataSource.getRepository(JacksonIndex); this.ttlRepository = this.dataSource.getRepository(JacksonTTL); + while (true) { + try { + if (synchronize) { + await this.indexNamespace(); + } + break; + } catch (err) { + console.error( + `error in index namespace execution for engine: ${this.options.engine}, type: ${sqlType} err: ${err}` + ); + await dbutils.sleep(1000); + continue; + } + } + if (this.options.ttl && this.options.cleanupLimit) { this.ttlCleanup = async () => { const now = Date.now(); @@ -110,6 +127,23 @@ class Sql implements DatabaseDriver { return this; } + async indexNamespace() { + const res = await this.storeRepository.find({ + where: { + namespace: IsNull(), + }, + select: ['key'], + }); + const searchTerm = ':'; + + for (const r of res) { + const key = r.key; + const tokens2 = key.split(searchTerm).slice(0, 2); + const value = tokens2.join(searchTerm); + await this.storeRepository.update({ key }, { namespace: value }); + } + } + async get(namespace: string, key: string): Promise { const res = await this.storeRepository.findOneBy({ key: dbutils.key(namespace, key), @@ -130,7 +164,7 @@ class Sql implements DatabaseDriver { async getAll(namespace: string, pageOffset?: number, pageLimit?: number, _?: string): Promise { const skipOffsetAndLimitValue = !dbutils.isNumeric(pageOffset) && !dbutils.isNumeric(pageLimit); const res = await this.storeRepository.find({ - where: { key: Like(`%${namespace}%`) }, + where: { namespace: namespace }, select: ['value', 'iv', 'tag'], order: { ['createdAt']: 'DESC', @@ -194,6 +228,7 @@ class Sql implements DatabaseDriver { store.iv = val.iv; store.tag = val.tag; store.modifiedAt = new Date().toISOString(); + store.namespace = namespace; await transactionalEntityManager.save(store); if (ttl) { diff --git a/npm/src/typings.ts b/npm/src/typings.ts index 430a93ccc..579348680 100644 --- a/npm/src/typings.ts +++ b/npm/src/typings.ts @@ -378,6 +378,7 @@ export interface DatabaseOption { readCapacityUnits?: number; writeCapacityUnits?: number; }; + manualMigration?: boolean; } export interface JacksonOption { diff --git a/npm/typeorm.ts b/npm/typeorm.ts index 0eeeece00..9f44026e8 100644 --- a/npm/typeorm.ts +++ b/npm/typeorm.ts @@ -43,7 +43,10 @@ const baseOpts = { migrationsTableName: '_jackson_migrations', logging: 'all', entities: [`src/db/${entitiesDir}/entity/**/*.ts`], - migrations: [`migration/${migrationsDir}/**/*.ts`], + migrations: + type === 'mssql' + ? [`migration/${migrationsDir}/**/*.ts`] + : [`migration/${migrationsDir}/**/*.ts`, `migration/sql/**/*.ts`], }; if (type === 'mssql') { diff --git a/package-lock.json b/package-lock.json index 80977189c..923484b8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,9 +80,8 @@ }, "node_modules/@alcalzone/ansi-tokenize": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", - "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^4.0.0" @@ -93,9 +92,8 @@ }, "node_modules/@alcalzone/ansi-tokenize/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -105,9 +103,8 @@ }, "node_modules/@alcalzone/ansi-tokenize/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -263,8 +260,7 @@ }, "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.427.0.tgz", - "integrity": "sha512-9brRaNnl6haE7R3R43A5CSNw0k1YtB3xjuArbMg/p6NDUpvRSRgOVNWu2R02Yjh/j2ZuaLOCPLuCipb+PHQPKQ==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -310,8 +306,7 @@ }, "node_modules/@aws-sdk/client-dynamodb": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.427.0.tgz", - "integrity": "sha512-mE435f9oDZDXJA6/Ws+Z53D+U3lh64n6p1AYKOm1IsvAzEZx2/Xf1DBQnSyqwOpVgE2vi+j/vW7yWxMmEulZLw==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -360,8 +355,7 @@ }, "node_modules/@aws-sdk/client-sso": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.427.0.tgz", - "integrity": "sha512-sFVFEmsQ1rmgYO1SgrOTxE/MTKpeE4hpOkm1WqhLQK7Ij136vXpjCxjH1JYZiHiUzO1wr9t4ex4dlB5J3VS/Xg==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -404,8 +398,7 @@ }, "node_modules/@aws-sdk/client-sts": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.427.0.tgz", - "integrity": "sha512-le2wLJKILyWuRfPz2HbyaNtu5kEki+ojUkTqCU6FPDRrqUvEkaaCBH9Awo/2AtrCfRkiobop8RuTTj6cAnpiJg==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -452,8 +445,7 @@ }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.427.0.tgz", - "integrity": "sha512-BQNzNrMJlBAfXhYNdAUqaVASpT9Aho5swj7glZKxx4Uds1w5Pih2e14JWgnl8XgUWAZ36pchTrV1aA4JT7N8vw==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-cognito-identity": "3.427.0", "@aws-sdk/types": "3.425.0", @@ -467,8 +459,7 @@ }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.425.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.425.0.tgz", - "integrity": "sha512-J20etnLvMKXRVi5FK4F8yOCNm2RTaQn5psQTGdDEPWJNGxohcSpzzls8U2KcMyUJ+vItlrThr4qwgpHG3i/N0w==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.425.0", "@smithy/property-provider": "^2.0.0", @@ -497,8 +488,7 @@ }, "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.427.0.tgz", - "integrity": "sha512-NmH1cO/w98CKMltYec3IrJIIco19wRjATFNiw83c+FGXZ+InJwReqBnruxIOmKTx2KDzd6fwU1HOewS7UjaaaQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.425.0", "@aws-sdk/credential-provider-process": "3.425.0", @@ -517,8 +507,7 @@ }, "node_modules/@aws-sdk/credential-provider-node": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.427.0.tgz", - "integrity": "sha512-wYYbQ57nKL8OfgRbl8k6uXcdnYml+p3LSSfDUAuUEp1HKlQ8lOXFJ3BdLr5qrk7LhpyppSRnWBmh2c3kWa7ANQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.425.0", "@aws-sdk/credential-provider-ini": "3.427.0", @@ -538,8 +527,7 @@ }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.425.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.425.0.tgz", - "integrity": "sha512-YY6tkLdvtb1Fgofp3b1UWO+5vwS14LJ/smGmuGpSba0V7gFJRdcrJ9bcb9vVgAGuMdjzRJ+bUKlLLtqXkaykEw==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.425.0", "@smithy/property-provider": "^2.0.0", @@ -553,8 +541,7 @@ }, "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.427.0.tgz", - "integrity": "sha512-c+tXyS/i49erHs4bAp6vKNYeYlyQ0VNMBgoco0LCn1rL0REtHbfhWMnqDLF6c2n3yIWDOTrQu0D73Idnpy16eA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.427.0", "@aws-sdk/token-providers": "3.427.0", @@ -570,8 +557,7 @@ }, "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.425.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.425.0.tgz", - "integrity": "sha512-/0R65TgRzL01JU3SzloivWNwdkbIhr06uY/F5pBHf/DynQqaspKNfdHn6AiozgSVDfwRHFjKBTUy6wvf3QFkuA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.425.0", "@smithy/property-provider": "^2.0.0", @@ -584,8 +570,7 @@ }, "node_modules/@aws-sdk/credential-providers": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.427.0.tgz", - "integrity": "sha512-rKKohSHju462vo+uQnPjcEZPBAfAMgGH6K1XyyCNpuOC0yYLkG87PYpvAQeb8riTrkHPX0dYUHuTHZ6zQgMGjA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-cognito-identity": "3.427.0", "@aws-sdk/client-sso": "3.427.0", @@ -674,8 +659,7 @@ }, "node_modules/@aws-sdk/middleware-sdk-sts": { "version": "3.425.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.425.0.tgz", - "integrity": "sha512-JFojrg76oKAoBknnr9EL5N2aJ1mRCtBqXoZYST58GSx8uYdFQ89qS65VNQ8JviBXzsrCNAn4vDhZ5Ch5E6TxGQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-signing": "3.425.0", "@aws-sdk/types": "3.425.0", @@ -704,8 +688,7 @@ }, "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.427.0.tgz", - "integrity": "sha512-y9HxYsNvnA3KqDl8w1jHeCwz4P9CuBEtu/G+KYffLeAMBsMZmh4SIkFFCO9wE/dyYg6+yo07rYcnnIfy7WA0bw==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.425.0", "@aws-sdk/util-endpoints": "3.427.0", @@ -733,8 +716,7 @@ }, "node_modules/@aws-sdk/token-providers": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.427.0.tgz", - "integrity": "sha512-4E5E+4p8lJ69PBY400dJXF06LUHYx5lkKzBEsYqWWhoZcoftrvi24ltIhUDoGVLkrLcTHZIWSdFAWSos4hXqeg==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -789,8 +771,7 @@ }, "node_modules/@aws-sdk/util-dynamodb": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.427.0.tgz", - "integrity": "sha512-eXPdPM7ZIS4DfRJrGeWQJjcxnNAaioRrtgNpRoVy1HwMVYPtUvIyTuUWY8xIeJyXnX3/JrBJWCDoQPxkrp9T2w==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -803,8 +784,7 @@ }, "node_modules/@aws-sdk/util-endpoints": { "version": "3.427.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.427.0.tgz", - "integrity": "sha512-rSyiAIFF/EVvity/+LWUqoTMJ0a25RAc9iqx0WZ4tf1UjuEXRRXxZEb+jEZg1bk+pY84gdLdx9z5E+MSJCZxNQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.425.0", "@smithy/node-config-provider": "^2.0.13", @@ -1214,9 +1194,8 @@ }, "node_modules/@base2/pretty-print-object": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", - "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", @@ -1271,6 +1250,16 @@ "xmlbuilder": "15.1.1" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "devOptional": true, @@ -1373,9 +1362,8 @@ }, "node_modules/@eslint/js": { "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1519,9 +1507,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -1536,9 +1523,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1548,9 +1534,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1560,9 +1545,8 @@ }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -1577,9 +1561,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1592,9 +1575,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -2495,9 +2477,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -3450,9 +3431,8 @@ }, "node_modules/@tapjs/config/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -3724,9 +3704,8 @@ }, "node_modules/@tapjs/reporter/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -3736,9 +3715,8 @@ }, "node_modules/@tapjs/reporter/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tapjs/run": { "version": "1.4.7", @@ -3932,9 +3910,8 @@ }, "node_modules/@tapjs/stack": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-1.2.5.tgz", - "integrity": "sha512-fJNI6kmqo1FuXzVkQ1cFL5FcWYamiql5lTDbA2VuOkQ7z3/Zoitnq+B9rBf28ltmZYFMsk5lEEW8mlaxvCyHiA==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=16" }, @@ -4278,8 +4255,7 @@ }, "node_modules/@types/node": { "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "license": "MIT", "dependencies": { "undici-types": "~5.25.1" } @@ -4310,9 +4286,8 @@ }, "node_modules/@types/sinon": { "version": "10.0.19", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", - "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/sinonjs__fake-timers": "*" } @@ -4969,9 +4944,8 @@ }, "node_modules/auto-bind": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", - "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5324,8 +5298,8 @@ }, "node_modules/bson": { "version": "5.5.0", + "devOptional": true, "license": "Apache-2.0", - "optional": true, "peer": true, "engines": { "node": ">=14.20.1" @@ -5874,11 +5848,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, "node_modules/cli-truncate": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -5892,9 +5880,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5904,9 +5891,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5916,9 +5902,8 @@ }, "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5928,9 +5913,8 @@ }, "node_modules/cli-truncate/node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -5944,9 +5928,8 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -5961,9 +5944,8 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -6012,9 +5994,8 @@ }, "node_modules/code-excerpt": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, + "license": "MIT", "dependencies": { "convert-to-spaces": "^2.0.1" }, @@ -6138,9 +6119,8 @@ }, "node_modules/convert-to-spaces": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -6967,9 +6947,8 @@ }, "node_modules/eslint": { "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7565,9 +7544,8 @@ }, "node_modules/events-to-array": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz", - "integrity": "sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -7695,8 +7673,6 @@ }, "node_modules/fast-xml-parser": { "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", "funding": [ { "type": "paypal", @@ -7707,6 +7683,7 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], + "license": "MIT", "dependencies": { "strnum": "^1.0.5" }, @@ -7837,6 +7814,15 @@ "dev": true, "license": "ISC" }, + "node_modules/fn-args": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fn-args/-/fn-args-5.0.0.tgz", + "integrity": "sha512-CtbfI3oFFc3nbdIoHycrfbrxiGgxXBXXuyOl49h47JawM1mYrqpiRqnH5CB2mBatdXvHHOUO6a+RiAuuvKt0lw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/follow-redirects": { "version": "1.15.2", "funding": [ @@ -8844,9 +8830,8 @@ }, "node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8872,9 +8857,8 @@ }, "node_modules/ink": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ink/-/ink-4.4.1.tgz", - "integrity": "sha512-rXckvqPBB0Krifk5rn/5LvQGmyXwCUpBfmTwbkQNBY9JY8RSl3b8OftBNEYxg4+SWUhEKcPifgope28uL9inlA==", "dev": true, + "license": "MIT", "dependencies": { "@alcalzone/ansi-tokenize": "^0.1.3", "ansi-escapes": "^6.0.0", @@ -8921,9 +8905,8 @@ }, "node_modules/ink/node_modules/ansi-escapes": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^3.0.0" }, @@ -8936,9 +8919,8 @@ }, "node_modules/ink/node_modules/ansi-escapes/node_modules/type-fest": { "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=14.16" }, @@ -8948,9 +8930,8 @@ }, "node_modules/ink/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8960,9 +8941,8 @@ }, "node_modules/ink/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8972,9 +8952,8 @@ }, "node_modules/ink/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -8984,9 +8963,8 @@ }, "node_modules/ink/node_modules/cli-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^4.0.0" }, @@ -8999,18 +8977,16 @@ }, "node_modules/ink/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ink/node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -9023,9 +8999,8 @@ }, "node_modules/ink/node_modules/restore-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -9039,9 +9014,8 @@ }, "node_modules/ink/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -9056,9 +9030,8 @@ }, "node_modules/ink/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -9071,9 +9044,8 @@ }, "node_modules/ink/node_modules/type-fest": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -9083,9 +9055,8 @@ }, "node_modules/ink/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -9562,9 +9533,8 @@ }, "node_modules/is-lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", - "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -9774,9 +9744,8 @@ }, "node_modules/is-upper-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", - "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -9937,9 +9906,8 @@ }, "node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -11599,6 +11567,74 @@ "node": ">=8.6" } }, + "node_modules/migrate-mongo": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/migrate-mongo/-/migrate-mongo-10.0.0.tgz", + "integrity": "sha512-QA/bBKNMq/FmuK3fDbgwfNoW2riiU1wLDWGXv/tGhUItPLGqcciPPmu29SrnYAzRKMOVaGEXxzmrBs1zp5cQ7Q==", + "dev": true, + "dependencies": { + "cli-table3": "^0.6.1", + "commander": "^9.1.0", + "date-fns": "^2.28.0", + "fn-args": "^5.0.0", + "fs-extra": "^10.0.1", + "lodash": "^4.17.21", + "p-each-series": "^2.2.0" + }, + "bin": { + "migrate-mongo": "bin/migrate-mongo.js" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "mongodb": "^4.4.1 || ^5.0.0" + } + }, + "node_modules/migrate-mongo/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/migrate-mongo/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/migrate-mongo/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/migrate-mongo/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -11656,9 +11692,8 @@ }, "node_modules/minipass": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -11872,8 +11907,8 @@ }, "node_modules/mongodb": { "version": "5.9.0", + "devOptional": true, "license": "Apache-2.0", - "optional": true, "peer": true, "dependencies": { "bson": "^5.5.0", @@ -12992,6 +13027,18 @@ "node": ">=12.20" } }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-limit": { "version": "3.1.0", "dev": true, @@ -13274,9 +13321,8 @@ }, "node_modules/patch-console": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", - "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -13493,9 +13539,8 @@ }, "node_modules/polite-json": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/polite-json/-/polite-json-4.0.1.tgz", - "integrity": "sha512-8LI5ZeCPBEb4uBbcYKNVwk4jgqNx1yHReWoW4H4uUihWlSqZsUDfSITrRhjliuPgxsNPFhNSudGO2Zu4cbWinQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, @@ -13817,9 +13862,8 @@ }, "node_modules/prismjs-terminal": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prismjs-terminal/-/prismjs-terminal-1.2.3.tgz", - "integrity": "sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "chalk": "^5.2.0", "prismjs": "^1.29.0", @@ -13834,9 +13878,8 @@ }, "node_modules/prismjs-terminal/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -14224,9 +14267,8 @@ }, "node_modules/react-element-to-jsx-string": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", - "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", "dev": true, + "license": "MIT", "dependencies": { "@base2/pretty-print-object": "1.0.1", "is-plain-object": "5.0.0", @@ -14239,9 +14281,8 @@ }, "node_modules/react-element-to-jsx-string/node_modules/react-is": { "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", - "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/react-fast-compare": { "version": "3.2.2", @@ -14352,9 +14393,8 @@ }, "node_modules/react-reconciler": { "version": "0.29.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz", - "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==", "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -15545,9 +15585,8 @@ }, "node_modules/slice-ansi": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-6.0.0.tgz", - "integrity": "sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^4.0.0" @@ -15561,9 +15600,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -15573,9 +15611,8 @@ }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -15725,9 +15762,8 @@ }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -15737,9 +15773,8 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -15840,9 +15875,8 @@ }, "node_modules/string-length": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", - "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", "dev": true, + "license": "MIT", "dependencies": { "strip-ansi": "^7.1.0" }, @@ -15855,9 +15889,8 @@ }, "node_modules/string-length/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -15867,9 +15900,8 @@ }, "node_modules/string-length/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -15895,9 +15927,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15909,9 +15940,8 @@ }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", @@ -16008,9 +16038,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16042,8 +16071,7 @@ }, "node_modules/strnum": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "license": "MIT" }, "node_modules/style-to-object": { "version": "0.4.1", @@ -16426,9 +16454,8 @@ }, "node_modules/tap-yaml": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-2.2.0.tgz", - "integrity": "sha512-o8I7WDNiGpuF04tGAVaNYY5rX9waCtqw9A7Y0YVSQBGcFwNUJWUPLkr2lbhgLRTxc+Tpnw4xUXlIanZc+ZAGnw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "yaml": "^2.3.0", "yaml-types": "^0.3.0" @@ -16439,18 +16466,16 @@ }, "node_modules/tap-yaml/node_modules/yaml": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/tap-yaml/node_modules/yaml-types": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yaml-types/-/yaml-types-0.3.0.tgz", - "integrity": "sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A==", "dev": true, + "license": "ISC", "engines": { "node": ">= 16", "npm": ">= 7" @@ -17352,8 +17377,7 @@ }, "node_modules/undici-types": { "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "license": "MIT" }, "node_modules/unified": { "version": "10.1.2", @@ -17783,9 +17807,8 @@ }, "node_modules/walk-up-path": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/warning": { "version": "4.0.3", @@ -18122,9 +18145,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -18404,9 +18426,8 @@ }, "node_modules/yoga-wasm-web": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", - "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/z-schema": { "version": "5.0.5", @@ -18489,6 +18510,7 @@ "@types/sinon": "10.0.19", "@types/tap": "15.0.9", "cross-env": "7.0.3", + "migrate-mongo": "10.0.0", "nock": "13.3.4", "sinon": "16.1.0", "tap": "18.5.0",