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 <deepak@boxyhq.com>
Co-authored-by: Utkarsh Mehta <ukrocks.mehta@gmail.com>
Co-authored-by: Aswin V <vaswin91@gmail.com>
This commit is contained in:
vishalboxyhq 2023-10-14 03:59:21 +05:30 committed by GitHub
parent aa83c4f477
commit 0b99c7d667
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 894 additions and 462 deletions

View File

@ -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

View File

@ -1,3 +1,4 @@
node_modules
dist
npm/dist
npm/dist
npm/migration

View File

@ -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

View File

@ -16,7 +16,7 @@ spec:
spec:
containers:
- name: jackson
image: boxyhq/jackson:tagwillbereplaced
image: boxyhq/jackson-local
imagePullPolicy: IfNotPresent
startupProbe:
httpGet:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -6,6 +6,7 @@ bases:
resources:
- ./secrets.yaml
- ./migratepg-job.yaml
commonLabels:
jacksondev: '1'

View File

@ -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

View File

@ -34,3 +34,4 @@ stringData:
RETRACED_EXTERNAL_URL: 'http://localhost:3000/auditlog'
RETRACED_ADMIN_ROOT_TOKEN: 'dev'
BOXYHQ_LICENSE_KEY: ''
DB_MANUAL_MIGRATION: 'true'

View File

@ -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 = {

21
migrate.sh Executable file
View File

@ -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 ..

View File

@ -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;

View File

@ -1,23 +0,0 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class Initial1640877418166 implements MigrationInterface {
name = 'Initial1640877418166'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
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\``);
}
}

View File

@ -1,16 +0,0 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class createdAt1644332636666 implements MigrationInterface {
name = 'createdAt1644332636666'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`modifiedAt\``);
await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`createdAt\``);
}
}

View File

@ -0,0 +1,16 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class MdNamespace1692767993709 implements MigrationInterface {
name = 'MdNamespace1692767993709'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
await queryRunner.query(`DROP INDEX \`_jackson_store_namespace\` ON \`jackson_store\``);
await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`namespace\``);
}
}

View File

@ -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: '' }});
}
}
};

View File

@ -0,0 +1,16 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class MssNamespace1692767993709 implements MigrationInterface {
name = 'MssNamespace1692767993709'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
await queryRunner.query(`DROP INDEX "_jackson_store_namespace" ON "jackson_store"`);
await queryRunner.query(`ALTER TABLE "jackson_store" DROP COLUMN "namespace"`);
}
}

View File

@ -0,0 +1,25 @@
import { MigrationInterface, QueryRunner } from "typeorm"
export class namespace1692817789888 implements MigrationInterface {
name = 'namespace1692817789888'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
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}'`)
}
}
}

View File

@ -1,23 +0,0 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class Initial1640877358925 implements MigrationInterface {
name = 'Initial1640877358925'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
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\``);
}
}

View File

@ -1,16 +0,0 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class createdAt1644332641078 implements MigrationInterface {
name = 'createdAt1644332641078'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`modifiedAt\``);
await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`createdAt\``);
}
}

View File

@ -0,0 +1,16 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class msNamespace1692767993709 implements MigrationInterface {
name = 'msNamespace1692767993709'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
await queryRunner.query(`DROP INDEX \`_jackson_store_namespace\` ON \`jackson_store\``);
await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`namespace\``);
}
}

View File

@ -0,0 +1,16 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class MsNamespace1692767993709 implements MigrationInterface {
name = 'MsNamespace1692767993709'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
await queryRunner.query(`DROP INDEX \`_jackson_store_namespace\` ON \`jackson_store\``);
await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`namespace\``);
}
}

View File

@ -0,0 +1,16 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class PgNamespace1692767993709 implements MigrationInterface {
name = 'PgNamespace1692767993709'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
await queryRunner.query(`DROP INDEX "public"."_jackson_store_namespace"`);
await queryRunner.query(`ALTER TABLE "jackson_store" DROP COLUMN "namespace"`);
}
}

View File

@ -0,0 +1,25 @@
import { MigrationInterface, QueryRunner } from "typeorm"
export class namespace1692817789888 implements MigrationInterface {
name = 'namespace1692817789888'
public async up(queryRunner: QueryRunner): Promise<void> {
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<void> {
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}'`)
}
}
}

471
npm/package-lock.json generated
View File

@ -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",

View File

@ -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",

View File

@ -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;
}

View File

@ -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<any> {
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<Records> {
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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<Sql> {
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<any> {
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<Records> {
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) {

View File

@ -378,6 +378,7 @@ export interface DatabaseOption {
readCapacityUnits?: number;
writeCapacityUnits?: number;
};
manualMigration?: boolean;
}
export interface JacksonOption {

View File

@ -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') {

410
package-lock.json generated

File diff suppressed because it is too large Load Diff