diff --git a/common/node/scripts/add-shebang.sh b/common/node/scripts/add-shebang.sh new file mode 100644 index 00000000..07bea053 --- /dev/null +++ b/common/node/scripts/add-shebang.sh @@ -0,0 +1 @@ +echo -e '#!/usr/bin/env node\n'"$(cat app/index.js)" > app/index.js \ No newline at end of file diff --git a/common/node/scripts/generate-database-migration.sh b/common/node/scripts/generate-database-migration.sh new file mode 100755 index 00000000..341c1736 --- /dev/null +++ b/common/node/scripts/generate-database-migration.sh @@ -0,0 +1,14 @@ +#!/usr/bin/bash + +sudo service mysql start + +sudo mysql -e "DROP DATABASE IF EXISTS database_migration;" +sudo mysql -e "CREATE DATABASE database_migration DEFAULT CHARSET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;" +sudo mysql -e "CREATE USER IF NOT EXISTS 'service'@localhost IDENTIFIED BY 'service';" +sudo mysql -e "GRANT ALL PRIVILEGES ON database_migration.* to 'service'@'localhost';" +sudo mysql -e "FLUSH PRIVILEGES;" + +npx env-cmd -e database_migration npx typeorm-ts-node-commonjs migration:run -d ./src/database/dataSource.ts +npx env-cmd -e database_migration npx typeorm-ts-node-commonjs migration:generate ./src/database/migrations/$1 -d ./src/database/dataSource.ts + +sudo mysql -e "DROP DATABASE database_migration" \ No newline at end of file diff --git a/common/node/scripts/init-db.sh b/common/node/scripts/init-db.sh new file mode 100755 index 00000000..37f6d0c0 --- /dev/null +++ b/common/node/scripts/init-db.sh @@ -0,0 +1,8 @@ +#!/usr/bin/bash + +sudo service mysql start + +sudo mysql -e "CREATE DATABASE IF NOT EXISTS $1 DEFAULT CHARSET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;" +sudo mysql -e "CREATE USER IF NOT EXISTS '$2'@localhost IDENTIFIED BY '$3';" +sudo mysql -e "GRANT ALL PRIVILEGES ON $1.* to '$2'@'localhost';" +sudo mysql -e "FLUSH PRIVILEGES;" \ No newline at end of file diff --git a/integration-test/package.json b/integration-test/package.json index 94a8a84d..74011c68 100644 --- a/integration-test/package.json +++ b/integration-test/package.json @@ -3,7 +3,9 @@ "description": "This project contains test cases for the APIs of the different microservices of the crosslab infrastructure.", "private": true, "scripts": { + "pretest": "bash scripts/pre_test.sh", "test": "mocha --nolazy --require mocha-steps -r ts-node/register -r src/fixtures/debug.ts -r src/fixtures/localServer.ts src/**/*.spec.ts", + "pretest:debug": "bash scripts/pre_test.sh", "test:debug": "mocha --inspect=9101 --nolazy --require mocha-steps -r ts-node/register -r src/fixtures/debug.ts -r src/fixtures/localServer.ts src/**/*.spec.ts", "lint": "eslint ." }, diff --git a/integration-test/scripts/pre_test.sh b/integration-test/scripts/pre_test.sh new file mode 100644 index 00000000..9c210cb0 --- /dev/null +++ b/integration-test/scripts/pre_test.sh @@ -0,0 +1,21 @@ +sudo service mysql start + +sudo mysql -e "DROP USER IF EXISTS 'service'@localhost;" +sudo mysql -e "DROP DATABASE IF EXISTS auth_service;" +sudo mysql -e "DROP DATABASE IF EXISTS device_service;" +sudo mysql -e "DROP DATABASE IF EXISTS experiment_service;" +sudo mysql -e "DROP DATABASE IF EXISTS federation_service;" + +sudo mysql -e "CREATE DATABASE IF NOT EXISTS auth_service DEFAULT CHARSET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;" +sudo mysql -e "CREATE DATABASE IF NOT EXISTS device_service DEFAULT CHARSET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;" +sudo mysql -e "CREATE DATABASE IF NOT EXISTS experiment_service DEFAULT CHARSET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;" +sudo mysql -e "CREATE DATABASE IF NOT EXISTS federation_service DEFAULT CHARSET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;" + +sudo mysql -e "CREATE USER IF NOT EXISTS 'service'@localhost IDENTIFIED BY 'service';" + +sudo mysql -e "GRANT ALL PRIVILEGES ON auth_service.* to 'service'@'localhost';" +sudo mysql -e "GRANT ALL PRIVILEGES ON device_service.* to 'service'@'localhost';" +sudo mysql -e "GRANT ALL PRIVILEGES ON experiment_service.* to 'service'@'localhost';" +sudo mysql -e "GRANT ALL PRIVILEGES ON federation_service.* to 'service'@'localhost';" + +sudo mysql -e "FLUSH PRIVILEGES;" \ No newline at end of file diff --git a/integration-test/src/fixtures/localServer.config.ts b/integration-test/src/fixtures/localServer.config.ts index d0f045fd..28f4372c 100644 --- a/integration-test/src/fixtures/localServer.config.ts +++ b/integration-test/src/fixtures/localServer.config.ts @@ -1,3 +1,10 @@ +const DB_COMMON = { + DB_HOST: 'localhost', + DB_PORT: '3306', + DB_USERNAME: 'service', + DB_PASSWORD: 'service', +}; + export const ENV = { common: { SECURITY_ISSUER: 'http://localhost', @@ -15,18 +22,26 @@ export const ENV = { 'federationservice:local:federationservice', ].join(','), API_TOKEN: 'authservice', + DB_NAME: 'auth_service', + ...DB_COMMON, }, device: { PORT: '3001', API_TOKEN: 'deviceservice', + DB_NAME: 'device_service', + ...DB_COMMON, }, experiment: { PORT: '3002', API_TOKEN: 'experimentservice', + DB_NAME: 'experiment_service', + ...DB_COMMON, }, federation: { PORT: '3003', API_TOKEN: 'federationservice', + DB_NAME: 'federation_service', + ...DB_COMMON, }, gateway: { AUTH_SERVICE_URL: '127.0.0.1:3000', diff --git a/services/auth/.env-cmdrc b/services/auth/.env-cmdrc index bddc47e5..c9e64112 100644 --- a/services/auth/.env-cmdrc +++ b/services/auth/.env-cmdrc @@ -1,5 +1,23 @@ { "development": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "auth_service", + "SECURITY_ISSUER": "http://localhost", + "SECURITY_AUDIENCE": "http://localhost", + "BASE_URL": "http://localhost", + "PORT": "3000", + "ALLOWLIST": "auth-service-dev-token:local:authservice,device-service-dev-token:local:deviceservice,experiment-service-dev-token:local:experimentservice,superadmin-test-token:local:superadmin", + "API_TOKEN": "auth-service-dev-token" + }, + "database_migration": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "database_migration", "SECURITY_ISSUER": "http://localhost", "SECURITY_AUDIENCE": "http://localhost", "BASE_URL": "http://localhost", diff --git a/services/auth/addShebang.js b/services/auth/addShebang.js deleted file mode 100644 index 1bfabec9..00000000 --- a/services/auth/addShebang.js +++ /dev/null @@ -1,4 +0,0 @@ -const fs = require("fs") - -const indexJS = fs.readFileSync("./app/index.js") -fs.writeFileSync("./app/index.js", "#!/usr/bin/env node\n" + indexJS) \ No newline at end of file diff --git a/services/auth/package.json b/services/auth/package.json index 655d87ea..2e0d9db5 100644 --- a/services/auth/package.json +++ b/services/auth/package.json @@ -17,9 +17,10 @@ "build:generate:test": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service:test -o test/generated", "build:generate": "npm-run-all build:generate:*", "build:compile": "tsc --project tsconfig.build.json", - "build:add-shebang": "node addShebang.js", + "build:add-shebang": "bash scripts/add-shebang.sh", "build": "npm-run-all build:*", "start": "node app/index.js", + "predev": "bash scripts/init-db.sh auth_service service service", "dev": "env-cmd -e development npx nodemon src/index.ts", "format:src": "npx prettier src --write", "format:test": "npx prettier test --write", diff --git a/services/auth/scripts/add-shebang.sh b/services/auth/scripts/add-shebang.sh new file mode 120000 index 00000000..b9819153 --- /dev/null +++ b/services/auth/scripts/add-shebang.sh @@ -0,0 +1 @@ +../../../common/node/scripts/add-shebang.sh \ No newline at end of file diff --git a/services/auth/scripts/generate-database-migration.sh b/services/auth/scripts/generate-database-migration.sh new file mode 120000 index 00000000..1891d496 --- /dev/null +++ b/services/auth/scripts/generate-database-migration.sh @@ -0,0 +1 @@ +../../../common/node/scripts/generate-database-migration.sh \ No newline at end of file diff --git a/services/auth/scripts/init-db.sh b/services/auth/scripts/init-db.sh new file mode 120000 index 00000000..547d2439 --- /dev/null +++ b/services/auth/scripts/init-db.sh @@ -0,0 +1 @@ +../../../common/node/scripts/init-db.sh \ No newline at end of file diff --git a/services/auth/src/config.ts b/services/auth/src/config.ts index 5c5e8e09..a81c10d4 100644 --- a/services/auth/src/config.ts +++ b/services/auth/src/config.ts @@ -38,9 +38,13 @@ function initializeAppConfiguration(): AppConfiguration { export const config: AppConfiguration = initializeAppConfiguration() export const dataSourceConfig: DataSourceOptions = { - type: 'sqlite', - database: 'db/auth.db', - entities: [ScopeModel, RoleModel, UserModel, KeyModel, ActiveKeyModel, TokenModel], - migrationsRun: true, + type: 'mariadb', + host: process.env.DB_HOST, + port: parseInt(process.env.DB_PORT ?? '3306'), + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, migrations: [...Migrations], + migrationsRun: true, + entities: [ScopeModel, RoleModel, UserModel, KeyModel, ActiveKeyModel, TokenModel], } diff --git a/services/auth/src/database/migrations/1683553925586-SetupMigration.ts b/services/auth/src/database/migrations/1683553925586-SetupMigration.ts deleted file mode 100644 index 53370fc6..00000000 --- a/services/auth/src/database/migrations/1683553925586-SetupMigration.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class SetupMigration1683553925586 implements MigrationInterface { - name = 'SetupMigration1683553925586' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "scope_model" ("name" varchar PRIMARY KEY NOT NULL)`); - await queryRunner.query(`CREATE TABLE "role_model" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL)`); - await queryRunner.query(`CREATE UNIQUE INDEX "IDX_df2ff801b57740d027c942334f" ON "role_model" ("name") `); - await queryRunner.query(`CREATE TABLE "user_model" ("uuid" varchar PRIMARY KEY NOT NULL, "username" varchar NOT NULL, "password" varchar)`); - await queryRunner.query(`CREATE UNIQUE INDEX "IDX_180abb555e21d4825693f11b94" ON "user_model" ("username") `); - await queryRunner.query(`CREATE TABLE "token_model" ("token" varchar PRIMARY KEY NOT NULL, "expiresOn" datetime, "device" varchar, "userUuid" varchar)`); - await queryRunner.query(`CREATE TABLE "key_model" ("uuid" varchar PRIMARY KEY NOT NULL, "use" varchar NOT NULL, "alg" varchar NOT NULL, "public_key" text NOT NULL, "private_key" text NOT NULL)`); - await queryRunner.query(`CREATE TABLE "active_key_model" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "use" varchar NOT NULL, "keyUuid" varchar)`); - await queryRunner.query(`CREATE TABLE "role_model_scopes_scope_model" ("roleModelUuid" varchar NOT NULL, "scopeModelName" varchar NOT NULL, PRIMARY KEY ("roleModelUuid", "scopeModelName"))`); - await queryRunner.query(`CREATE INDEX "IDX_f9bcfb53e221f55fffe76d9566" ON "role_model_scopes_scope_model" ("roleModelUuid") `); - await queryRunner.query(`CREATE INDEX "IDX_40ca823e227f9c76cb07cbdbca" ON "role_model_scopes_scope_model" ("scopeModelName") `); - await queryRunner.query(`CREATE TABLE "user_model_roles_role_model" ("userModelUuid" varchar NOT NULL, "roleModelUuid" varchar NOT NULL, PRIMARY KEY ("userModelUuid", "roleModelUuid"))`); - await queryRunner.query(`CREATE INDEX "IDX_013a8f388c7121d66a25dc13c1" ON "user_model_roles_role_model" ("userModelUuid") `); - await queryRunner.query(`CREATE INDEX "IDX_dc7d14d6beccedf8df39de0cb6" ON "user_model_roles_role_model" ("roleModelUuid") `); - await queryRunner.query(`CREATE TABLE "token_model_scopes_scope_model" ("tokenModelToken" varchar NOT NULL, "scopeModelName" varchar NOT NULL, PRIMARY KEY ("tokenModelToken", "scopeModelName"))`); - await queryRunner.query(`CREATE INDEX "IDX_eae199f8e25d1860598be961e8" ON "token_model_scopes_scope_model" ("tokenModelToken") `); - await queryRunner.query(`CREATE INDEX "IDX_3d94644f4da2c0d34b8e409009" ON "token_model_scopes_scope_model" ("scopeModelName") `); - await queryRunner.query(`CREATE TABLE "token_model_roles_role_model" ("tokenModelToken" varchar NOT NULL, "roleModelUuid" varchar NOT NULL, PRIMARY KEY ("tokenModelToken", "roleModelUuid"))`); - await queryRunner.query(`CREATE INDEX "IDX_29cb7647f58fc7cf48a87a57f0" ON "token_model_roles_role_model" ("tokenModelToken") `); - await queryRunner.query(`CREATE INDEX "IDX_8d393cfb87d9f600ea660b16fa" ON "token_model_roles_role_model" ("roleModelUuid") `); - await queryRunner.query(`CREATE TABLE "temporary_token_model" ("token" varchar PRIMARY KEY NOT NULL, "expiresOn" datetime, "device" varchar, "userUuid" varchar, CONSTRAINT "FK_2bd73082743f5f721e92a3ee109" FOREIGN KEY ("userUuid") REFERENCES "user_model" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_token_model"("token", "expiresOn", "device", "userUuid") SELECT "token", "expiresOn", "device", "userUuid" FROM "token_model"`); - await queryRunner.query(`DROP TABLE "token_model"`); - await queryRunner.query(`ALTER TABLE "temporary_token_model" RENAME TO "token_model"`); - await queryRunner.query(`CREATE TABLE "temporary_active_key_model" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "use" varchar NOT NULL, "keyUuid" varchar, CONSTRAINT "FK_b22053e2e4c267713fbd8e1f241" FOREIGN KEY ("keyUuid") REFERENCES "key_model" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_active_key_model"("id", "use", "keyUuid") SELECT "id", "use", "keyUuid" FROM "active_key_model"`); - await queryRunner.query(`DROP TABLE "active_key_model"`); - await queryRunner.query(`ALTER TABLE "temporary_active_key_model" RENAME TO "active_key_model"`); - await queryRunner.query(`DROP INDEX "IDX_f9bcfb53e221f55fffe76d9566"`); - await queryRunner.query(`DROP INDEX "IDX_40ca823e227f9c76cb07cbdbca"`); - await queryRunner.query(`CREATE TABLE "temporary_role_model_scopes_scope_model" ("roleModelUuid" varchar NOT NULL, "scopeModelName" varchar NOT NULL, CONSTRAINT "FK_f9bcfb53e221f55fffe76d95669" FOREIGN KEY ("roleModelUuid") REFERENCES "role_model" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT "FK_40ca823e227f9c76cb07cbdbcad" FOREIGN KEY ("scopeModelName") REFERENCES "scope_model" ("name") ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY ("roleModelUuid", "scopeModelName"))`); - await queryRunner.query(`INSERT INTO "temporary_role_model_scopes_scope_model"("roleModelUuid", "scopeModelName") SELECT "roleModelUuid", "scopeModelName" FROM "role_model_scopes_scope_model"`); - await queryRunner.query(`DROP TABLE "role_model_scopes_scope_model"`); - await queryRunner.query(`ALTER TABLE "temporary_role_model_scopes_scope_model" RENAME TO "role_model_scopes_scope_model"`); - await queryRunner.query(`CREATE INDEX "IDX_f9bcfb53e221f55fffe76d9566" ON "role_model_scopes_scope_model" ("roleModelUuid") `); - await queryRunner.query(`CREATE INDEX "IDX_40ca823e227f9c76cb07cbdbca" ON "role_model_scopes_scope_model" ("scopeModelName") `); - await queryRunner.query(`DROP INDEX "IDX_013a8f388c7121d66a25dc13c1"`); - await queryRunner.query(`DROP INDEX "IDX_dc7d14d6beccedf8df39de0cb6"`); - await queryRunner.query(`CREATE TABLE "temporary_user_model_roles_role_model" ("userModelUuid" varchar NOT NULL, "roleModelUuid" varchar NOT NULL, CONSTRAINT "FK_013a8f388c7121d66a25dc13c19" FOREIGN KEY ("userModelUuid") REFERENCES "user_model" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT "FK_dc7d14d6beccedf8df39de0cb6e" FOREIGN KEY ("roleModelUuid") REFERENCES "role_model" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION, PRIMARY KEY ("userModelUuid", "roleModelUuid"))`); - await queryRunner.query(`INSERT INTO "temporary_user_model_roles_role_model"("userModelUuid", "roleModelUuid") SELECT "userModelUuid", "roleModelUuid" FROM "user_model_roles_role_model"`); - await queryRunner.query(`DROP TABLE "user_model_roles_role_model"`); - await queryRunner.query(`ALTER TABLE "temporary_user_model_roles_role_model" RENAME TO "user_model_roles_role_model"`); - await queryRunner.query(`CREATE INDEX "IDX_013a8f388c7121d66a25dc13c1" ON "user_model_roles_role_model" ("userModelUuid") `); - await queryRunner.query(`CREATE INDEX "IDX_dc7d14d6beccedf8df39de0cb6" ON "user_model_roles_role_model" ("roleModelUuid") `); - await queryRunner.query(`DROP INDEX "IDX_eae199f8e25d1860598be961e8"`); - await queryRunner.query(`DROP INDEX "IDX_3d94644f4da2c0d34b8e409009"`); - await queryRunner.query(`CREATE TABLE "temporary_token_model_scopes_scope_model" ("tokenModelToken" varchar NOT NULL, "scopeModelName" varchar NOT NULL, CONSTRAINT "FK_eae199f8e25d1860598be961e86" FOREIGN KEY ("tokenModelToken") REFERENCES "token_model" ("token") ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT "FK_3d94644f4da2c0d34b8e4090096" FOREIGN KEY ("scopeModelName") REFERENCES "scope_model" ("name") ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY ("tokenModelToken", "scopeModelName"))`); - await queryRunner.query(`INSERT INTO "temporary_token_model_scopes_scope_model"("tokenModelToken", "scopeModelName") SELECT "tokenModelToken", "scopeModelName" FROM "token_model_scopes_scope_model"`); - await queryRunner.query(`DROP TABLE "token_model_scopes_scope_model"`); - await queryRunner.query(`ALTER TABLE "temporary_token_model_scopes_scope_model" RENAME TO "token_model_scopes_scope_model"`); - await queryRunner.query(`CREATE INDEX "IDX_eae199f8e25d1860598be961e8" ON "token_model_scopes_scope_model" ("tokenModelToken") `); - await queryRunner.query(`CREATE INDEX "IDX_3d94644f4da2c0d34b8e409009" ON "token_model_scopes_scope_model" ("scopeModelName") `); - await queryRunner.query(`DROP INDEX "IDX_29cb7647f58fc7cf48a87a57f0"`); - await queryRunner.query(`DROP INDEX "IDX_8d393cfb87d9f600ea660b16fa"`); - await queryRunner.query(`CREATE TABLE "temporary_token_model_roles_role_model" ("tokenModelToken" varchar NOT NULL, "roleModelUuid" varchar NOT NULL, CONSTRAINT "FK_29cb7647f58fc7cf48a87a57f0a" FOREIGN KEY ("tokenModelToken") REFERENCES "token_model" ("token") ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT "FK_8d393cfb87d9f600ea660b16fa4" FOREIGN KEY ("roleModelUuid") REFERENCES "role_model" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY ("tokenModelToken", "roleModelUuid"))`); - await queryRunner.query(`INSERT INTO "temporary_token_model_roles_role_model"("tokenModelToken", "roleModelUuid") SELECT "tokenModelToken", "roleModelUuid" FROM "token_model_roles_role_model"`); - await queryRunner.query(`DROP TABLE "token_model_roles_role_model"`); - await queryRunner.query(`ALTER TABLE "temporary_token_model_roles_role_model" RENAME TO "token_model_roles_role_model"`); - await queryRunner.query(`CREATE INDEX "IDX_29cb7647f58fc7cf48a87a57f0" ON "token_model_roles_role_model" ("tokenModelToken") `); - await queryRunner.query(`CREATE INDEX "IDX_8d393cfb87d9f600ea660b16fa" ON "token_model_roles_role_model" ("roleModelUuid") `); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP INDEX "IDX_8d393cfb87d9f600ea660b16fa"`); - await queryRunner.query(`DROP INDEX "IDX_29cb7647f58fc7cf48a87a57f0"`); - await queryRunner.query(`ALTER TABLE "token_model_roles_role_model" RENAME TO "temporary_token_model_roles_role_model"`); - await queryRunner.query(`CREATE TABLE "token_model_roles_role_model" ("tokenModelToken" varchar NOT NULL, "roleModelUuid" varchar NOT NULL, PRIMARY KEY ("tokenModelToken", "roleModelUuid"))`); - await queryRunner.query(`INSERT INTO "token_model_roles_role_model"("tokenModelToken", "roleModelUuid") SELECT "tokenModelToken", "roleModelUuid" FROM "temporary_token_model_roles_role_model"`); - await queryRunner.query(`DROP TABLE "temporary_token_model_roles_role_model"`); - await queryRunner.query(`CREATE INDEX "IDX_8d393cfb87d9f600ea660b16fa" ON "token_model_roles_role_model" ("roleModelUuid") `); - await queryRunner.query(`CREATE INDEX "IDX_29cb7647f58fc7cf48a87a57f0" ON "token_model_roles_role_model" ("tokenModelToken") `); - await queryRunner.query(`DROP INDEX "IDX_3d94644f4da2c0d34b8e409009"`); - await queryRunner.query(`DROP INDEX "IDX_eae199f8e25d1860598be961e8"`); - await queryRunner.query(`ALTER TABLE "token_model_scopes_scope_model" RENAME TO "temporary_token_model_scopes_scope_model"`); - await queryRunner.query(`CREATE TABLE "token_model_scopes_scope_model" ("tokenModelToken" varchar NOT NULL, "scopeModelName" varchar NOT NULL, PRIMARY KEY ("tokenModelToken", "scopeModelName"))`); - await queryRunner.query(`INSERT INTO "token_model_scopes_scope_model"("tokenModelToken", "scopeModelName") SELECT "tokenModelToken", "scopeModelName" FROM "temporary_token_model_scopes_scope_model"`); - await queryRunner.query(`DROP TABLE "temporary_token_model_scopes_scope_model"`); - await queryRunner.query(`CREATE INDEX "IDX_3d94644f4da2c0d34b8e409009" ON "token_model_scopes_scope_model" ("scopeModelName") `); - await queryRunner.query(`CREATE INDEX "IDX_eae199f8e25d1860598be961e8" ON "token_model_scopes_scope_model" ("tokenModelToken") `); - await queryRunner.query(`DROP INDEX "IDX_dc7d14d6beccedf8df39de0cb6"`); - await queryRunner.query(`DROP INDEX "IDX_013a8f388c7121d66a25dc13c1"`); - await queryRunner.query(`ALTER TABLE "user_model_roles_role_model" RENAME TO "temporary_user_model_roles_role_model"`); - await queryRunner.query(`CREATE TABLE "user_model_roles_role_model" ("userModelUuid" varchar NOT NULL, "roleModelUuid" varchar NOT NULL, PRIMARY KEY ("userModelUuid", "roleModelUuid"))`); - await queryRunner.query(`INSERT INTO "user_model_roles_role_model"("userModelUuid", "roleModelUuid") SELECT "userModelUuid", "roleModelUuid" FROM "temporary_user_model_roles_role_model"`); - await queryRunner.query(`DROP TABLE "temporary_user_model_roles_role_model"`); - await queryRunner.query(`CREATE INDEX "IDX_dc7d14d6beccedf8df39de0cb6" ON "user_model_roles_role_model" ("roleModelUuid") `); - await queryRunner.query(`CREATE INDEX "IDX_013a8f388c7121d66a25dc13c1" ON "user_model_roles_role_model" ("userModelUuid") `); - await queryRunner.query(`DROP INDEX "IDX_40ca823e227f9c76cb07cbdbca"`); - await queryRunner.query(`DROP INDEX "IDX_f9bcfb53e221f55fffe76d9566"`); - await queryRunner.query(`ALTER TABLE "role_model_scopes_scope_model" RENAME TO "temporary_role_model_scopes_scope_model"`); - await queryRunner.query(`CREATE TABLE "role_model_scopes_scope_model" ("roleModelUuid" varchar NOT NULL, "scopeModelName" varchar NOT NULL, PRIMARY KEY ("roleModelUuid", "scopeModelName"))`); - await queryRunner.query(`INSERT INTO "role_model_scopes_scope_model"("roleModelUuid", "scopeModelName") SELECT "roleModelUuid", "scopeModelName" FROM "temporary_role_model_scopes_scope_model"`); - await queryRunner.query(`DROP TABLE "temporary_role_model_scopes_scope_model"`); - await queryRunner.query(`CREATE INDEX "IDX_40ca823e227f9c76cb07cbdbca" ON "role_model_scopes_scope_model" ("scopeModelName") `); - await queryRunner.query(`CREATE INDEX "IDX_f9bcfb53e221f55fffe76d9566" ON "role_model_scopes_scope_model" ("roleModelUuid") `); - await queryRunner.query(`ALTER TABLE "active_key_model" RENAME TO "temporary_active_key_model"`); - await queryRunner.query(`CREATE TABLE "active_key_model" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "use" varchar NOT NULL, "keyUuid" varchar)`); - await queryRunner.query(`INSERT INTO "active_key_model"("id", "use", "keyUuid") SELECT "id", "use", "keyUuid" FROM "temporary_active_key_model"`); - await queryRunner.query(`DROP TABLE "temporary_active_key_model"`); - await queryRunner.query(`ALTER TABLE "token_model" RENAME TO "temporary_token_model"`); - await queryRunner.query(`CREATE TABLE "token_model" ("token" varchar PRIMARY KEY NOT NULL, "expiresOn" datetime, "device" varchar, "userUuid" varchar)`); - await queryRunner.query(`INSERT INTO "token_model"("token", "expiresOn", "device", "userUuid") SELECT "token", "expiresOn", "device", "userUuid" FROM "temporary_token_model"`); - await queryRunner.query(`DROP TABLE "temporary_token_model"`); - await queryRunner.query(`DROP INDEX "IDX_8d393cfb87d9f600ea660b16fa"`); - await queryRunner.query(`DROP INDEX "IDX_29cb7647f58fc7cf48a87a57f0"`); - await queryRunner.query(`DROP TABLE "token_model_roles_role_model"`); - await queryRunner.query(`DROP INDEX "IDX_3d94644f4da2c0d34b8e409009"`); - await queryRunner.query(`DROP INDEX "IDX_eae199f8e25d1860598be961e8"`); - await queryRunner.query(`DROP TABLE "token_model_scopes_scope_model"`); - await queryRunner.query(`DROP INDEX "IDX_dc7d14d6beccedf8df39de0cb6"`); - await queryRunner.query(`DROP INDEX "IDX_013a8f388c7121d66a25dc13c1"`); - await queryRunner.query(`DROP TABLE "user_model_roles_role_model"`); - await queryRunner.query(`DROP INDEX "IDX_40ca823e227f9c76cb07cbdbca"`); - await queryRunner.query(`DROP INDEX "IDX_f9bcfb53e221f55fffe76d9566"`); - await queryRunner.query(`DROP TABLE "role_model_scopes_scope_model"`); - await queryRunner.query(`DROP TABLE "active_key_model"`); - await queryRunner.query(`DROP TABLE "key_model"`); - await queryRunner.query(`DROP TABLE "token_model"`); - await queryRunner.query(`DROP INDEX "IDX_180abb555e21d4825693f11b94"`); - await queryRunner.query(`DROP TABLE "user_model"`); - await queryRunner.query(`DROP INDEX "IDX_df2ff801b57740d027c942334f"`); - await queryRunner.query(`DROP TABLE "role_model"`); - await queryRunner.query(`DROP TABLE "scope_model"`); - } - -} diff --git a/services/auth/src/database/migrations/1683562636793-UpdateLocalUsers.ts b/services/auth/src/database/migrations/1683562636793-UpdateLocalUsers.ts deleted file mode 100644 index 9419512a..00000000 --- a/services/auth/src/database/migrations/1683562636793-UpdateLocalUsers.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { UserModel } from '../model' -import { MigrationInterface, QueryRunner } from 'typeorm' - -export class UpdateLocalUsers1683562636793 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const userRepository = queryRunner.connection.getRepository(UserModel) - const users = await userRepository.find() - for (const user of users) { - if ( - !user.username.startsWith('tui:') && - !user.username.startsWith('local:') - ) { - user.username = `local:${user.username}` - await userRepository.save(user) - } - } - } - - public async down(queryRunner: QueryRunner): Promise { - const userRepository = queryRunner.connection.getRepository(UserModel) - const users = await userRepository.find() - for (const user of users) { - if (user.username.startsWith('local:')) { - user.username = user.username.replace('local:', '') - await userRepository.save(user) - } - } - } -} diff --git a/services/auth/src/database/migrations/1690276344665-Setup.ts b/services/auth/src/database/migrations/1690276344665-Setup.ts new file mode 100644 index 00000000..63ccc43d --- /dev/null +++ b/services/auth/src/database/migrations/1690276344665-Setup.ts @@ -0,0 +1,62 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Setup1690276344665 implements MigrationInterface { + name = 'Setup1690276344665' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE \`scope_model\` (\`name\` varchar(255) NOT NULL, PRIMARY KEY (\`name\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`role_model\` (\`uuid\` varchar(36) NOT NULL, \`name\` varchar(255) NOT NULL, UNIQUE INDEX \`IDX_df2ff801b57740d027c942334f\` (\`name\`), PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`user_model\` (\`uuid\` varchar(36) NOT NULL, \`username\` varchar(255) NOT NULL, \`password\` varchar(255) NULL, UNIQUE INDEX \`IDX_180abb555e21d4825693f11b94\` (\`username\`), PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`token_model\` (\`token\` varchar(36) NOT NULL, \`expiresOn\` datetime NULL, \`device\` varchar(255) NULL, \`userUuid\` varchar(36) NULL, PRIMARY KEY (\`token\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`key_model\` (\`uuid\` varchar(36) NOT NULL, \`use\` varchar(255) NOT NULL, \`alg\` varchar(255) NOT NULL, \`public_key\` text NOT NULL, \`private_key\` text NOT NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`active_key_model\` (\`id\` int NOT NULL AUTO_INCREMENT, \`use\` varchar(255) NOT NULL, \`keyUuid\` varchar(36) NULL, PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`role_model_scopes_scope_model\` (\`roleModelUuid\` varchar(36) NOT NULL, \`scopeModelName\` varchar(255) NOT NULL, INDEX \`IDX_f9bcfb53e221f55fffe76d9566\` (\`roleModelUuid\`), INDEX \`IDX_40ca823e227f9c76cb07cbdbca\` (\`scopeModelName\`), PRIMARY KEY (\`roleModelUuid\`, \`scopeModelName\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`user_model_roles_role_model\` (\`userModelUuid\` varchar(36) NOT NULL, \`roleModelUuid\` varchar(36) NOT NULL, INDEX \`IDX_013a8f388c7121d66a25dc13c1\` (\`userModelUuid\`), INDEX \`IDX_dc7d14d6beccedf8df39de0cb6\` (\`roleModelUuid\`), PRIMARY KEY (\`userModelUuid\`, \`roleModelUuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`token_model_scopes_scope_model\` (\`tokenModelToken\` varchar(36) NOT NULL, \`scopeModelName\` varchar(255) NOT NULL, INDEX \`IDX_eae199f8e25d1860598be961e8\` (\`tokenModelToken\`), INDEX \`IDX_3d94644f4da2c0d34b8e409009\` (\`scopeModelName\`), PRIMARY KEY (\`tokenModelToken\`, \`scopeModelName\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`token_model_roles_role_model\` (\`tokenModelToken\` varchar(36) NOT NULL, \`roleModelUuid\` varchar(36) NOT NULL, INDEX \`IDX_29cb7647f58fc7cf48a87a57f0\` (\`tokenModelToken\`), INDEX \`IDX_8d393cfb87d9f600ea660b16fa\` (\`roleModelUuid\`), PRIMARY KEY (\`tokenModelToken\`, \`roleModelUuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`ALTER TABLE \`token_model\` ADD CONSTRAINT \`FK_2bd73082743f5f721e92a3ee109\` FOREIGN KEY (\`userUuid\`) REFERENCES \`user_model\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`active_key_model\` ADD CONSTRAINT \`FK_b22053e2e4c267713fbd8e1f241\` FOREIGN KEY (\`keyUuid\`) REFERENCES \`key_model\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`role_model_scopes_scope_model\` ADD CONSTRAINT \`FK_f9bcfb53e221f55fffe76d95669\` FOREIGN KEY (\`roleModelUuid\`) REFERENCES \`role_model\`(\`uuid\`) ON DELETE CASCADE ON UPDATE CASCADE`); + await queryRunner.query(`ALTER TABLE \`role_model_scopes_scope_model\` ADD CONSTRAINT \`FK_40ca823e227f9c76cb07cbdbcad\` FOREIGN KEY (\`scopeModelName\`) REFERENCES \`scope_model\`(\`name\`) ON DELETE CASCADE ON UPDATE CASCADE`); + await queryRunner.query(`ALTER TABLE \`user_model_roles_role_model\` ADD CONSTRAINT \`FK_013a8f388c7121d66a25dc13c19\` FOREIGN KEY (\`userModelUuid\`) REFERENCES \`user_model\`(\`uuid\`) ON DELETE CASCADE ON UPDATE CASCADE`); + await queryRunner.query(`ALTER TABLE \`user_model_roles_role_model\` ADD CONSTRAINT \`FK_dc7d14d6beccedf8df39de0cb6e\` FOREIGN KEY (\`roleModelUuid\`) REFERENCES \`role_model\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`token_model_scopes_scope_model\` ADD CONSTRAINT \`FK_eae199f8e25d1860598be961e86\` FOREIGN KEY (\`tokenModelToken\`) REFERENCES \`token_model\`(\`token\`) ON DELETE CASCADE ON UPDATE CASCADE`); + await queryRunner.query(`ALTER TABLE \`token_model_scopes_scope_model\` ADD CONSTRAINT \`FK_3d94644f4da2c0d34b8e4090096\` FOREIGN KEY (\`scopeModelName\`) REFERENCES \`scope_model\`(\`name\`) ON DELETE CASCADE ON UPDATE CASCADE`); + await queryRunner.query(`ALTER TABLE \`token_model_roles_role_model\` ADD CONSTRAINT \`FK_29cb7647f58fc7cf48a87a57f0a\` FOREIGN KEY (\`tokenModelToken\`) REFERENCES \`token_model\`(\`token\`) ON DELETE CASCADE ON UPDATE CASCADE`); + await queryRunner.query(`ALTER TABLE \`token_model_roles_role_model\` ADD CONSTRAINT \`FK_8d393cfb87d9f600ea660b16fa4\` FOREIGN KEY (\`roleModelUuid\`) REFERENCES \`role_model\`(\`uuid\`) ON DELETE CASCADE ON UPDATE CASCADE`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`token_model_roles_role_model\` DROP FOREIGN KEY \`FK_8d393cfb87d9f600ea660b16fa4\``); + await queryRunner.query(`ALTER TABLE \`token_model_roles_role_model\` DROP FOREIGN KEY \`FK_29cb7647f58fc7cf48a87a57f0a\``); + await queryRunner.query(`ALTER TABLE \`token_model_scopes_scope_model\` DROP FOREIGN KEY \`FK_3d94644f4da2c0d34b8e4090096\``); + await queryRunner.query(`ALTER TABLE \`token_model_scopes_scope_model\` DROP FOREIGN KEY \`FK_eae199f8e25d1860598be961e86\``); + await queryRunner.query(`ALTER TABLE \`user_model_roles_role_model\` DROP FOREIGN KEY \`FK_dc7d14d6beccedf8df39de0cb6e\``); + await queryRunner.query(`ALTER TABLE \`user_model_roles_role_model\` DROP FOREIGN KEY \`FK_013a8f388c7121d66a25dc13c19\``); + await queryRunner.query(`ALTER TABLE \`role_model_scopes_scope_model\` DROP FOREIGN KEY \`FK_40ca823e227f9c76cb07cbdbcad\``); + await queryRunner.query(`ALTER TABLE \`role_model_scopes_scope_model\` DROP FOREIGN KEY \`FK_f9bcfb53e221f55fffe76d95669\``); + await queryRunner.query(`ALTER TABLE \`active_key_model\` DROP FOREIGN KEY \`FK_b22053e2e4c267713fbd8e1f241\``); + await queryRunner.query(`ALTER TABLE \`token_model\` DROP FOREIGN KEY \`FK_2bd73082743f5f721e92a3ee109\``); + await queryRunner.query(`DROP INDEX \`IDX_8d393cfb87d9f600ea660b16fa\` ON \`token_model_roles_role_model\``); + await queryRunner.query(`DROP INDEX \`IDX_29cb7647f58fc7cf48a87a57f0\` ON \`token_model_roles_role_model\``); + await queryRunner.query(`DROP TABLE \`token_model_roles_role_model\``); + await queryRunner.query(`DROP INDEX \`IDX_3d94644f4da2c0d34b8e409009\` ON \`token_model_scopes_scope_model\``); + await queryRunner.query(`DROP INDEX \`IDX_eae199f8e25d1860598be961e8\` ON \`token_model_scopes_scope_model\``); + await queryRunner.query(`DROP TABLE \`token_model_scopes_scope_model\``); + await queryRunner.query(`DROP INDEX \`IDX_dc7d14d6beccedf8df39de0cb6\` ON \`user_model_roles_role_model\``); + await queryRunner.query(`DROP INDEX \`IDX_013a8f388c7121d66a25dc13c1\` ON \`user_model_roles_role_model\``); + await queryRunner.query(`DROP TABLE \`user_model_roles_role_model\``); + await queryRunner.query(`DROP INDEX \`IDX_40ca823e227f9c76cb07cbdbca\` ON \`role_model_scopes_scope_model\``); + await queryRunner.query(`DROP INDEX \`IDX_f9bcfb53e221f55fffe76d9566\` ON \`role_model_scopes_scope_model\``); + await queryRunner.query(`DROP TABLE \`role_model_scopes_scope_model\``); + await queryRunner.query(`DROP TABLE \`active_key_model\``); + await queryRunner.query(`DROP TABLE \`key_model\``); + await queryRunner.query(`DROP TABLE \`token_model\``); + await queryRunner.query(`DROP INDEX \`IDX_180abb555e21d4825693f11b94\` ON \`user_model\``); + await queryRunner.query(`DROP TABLE \`user_model\``); + await queryRunner.query(`DROP INDEX \`IDX_df2ff801b57740d027c942334f\` ON \`role_model\``); + await queryRunner.query(`DROP TABLE \`role_model\``); + await queryRunner.query(`DROP TABLE \`scope_model\``); + } + +} diff --git a/services/auth/src/database/migrations/index.ts b/services/auth/src/database/migrations/index.ts index bfcc6f7d..3ff74784 100644 --- a/services/auth/src/database/migrations/index.ts +++ b/services/auth/src/database/migrations/index.ts @@ -1,4 +1,3 @@ -import { SetupMigration1683553925586 } from './1683553925586-SetupMigration' -import { UpdateLocalUsers1683562636793 } from './1683562636793-UpdateLocalUsers' +import { Setup1690276344665 } from './1690276344665-Setup' -export const Migrations = [SetupMigration1683553925586, UpdateLocalUsers1683562636793] +export const Migrations = [Setup1690276344665] diff --git a/services/auth/test/index.spec.ts b/services/auth/test/index.spec.ts index 9334d658..d6d96597 100644 --- a/services/auth/test/index.spec.ts +++ b/services/auth/test/index.spec.ts @@ -20,9 +20,11 @@ describe('Index', function () { const indexModule = rewire('../src/index.ts') startAuthenticationService = indexModule.__get__('startAuthenticationService') await startAuthenticationService(config, { - ...dataSourceConfig, - database: './test/db/index_test.db', + type: 'sqlite', + database: ':memory:', dropSchema: true, + synchronize: true, + entities: dataSourceConfig.entities, }) assert(appListenStub.called) }) @@ -41,9 +43,11 @@ describe('Index', function () { await AppDataSource.teardown() await startAuthenticationService(config, { - ...dataSourceConfig, - database: './test/db/index_test.db', + type: 'sqlite', + database: ':memory:', + dropSchema: true, synchronize: true, + entities: dataSourceConfig.entities, }) assert(activeKeyModels.length > 0) }) diff --git a/services/device/.env-cmdrc b/services/device/.env-cmdrc index 1a19f723..8c229660 100644 --- a/services/device/.env-cmdrc +++ b/services/device/.env-cmdrc @@ -1,5 +1,22 @@ { "development": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "device_service", + "SECURITY_ISSUER": "http://localhost", + "SECURITY_AUDIENCE": "http://localhost", + "BASE_URL": "http://localhost", + "PORT": "3001", + "API_TOKEN": "device-service-dev-token" + }, + "database_migration": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "database_migration", "SECURITY_ISSUER": "http://localhost", "SECURITY_AUDIENCE": "http://localhost", "BASE_URL": "http://localhost", diff --git a/services/device/package.json b/services/device/package.json index 76d6c5b1..2e8d9439 100644 --- a/services/device/package.json +++ b/services/device/package.json @@ -13,12 +13,14 @@ "openapi-bundle": "npx --yes @redocly/cli bundle ./api/openapi.yml --output dist/openapi.json", "watch-openapi": "npx --yes chokidar-cli 'api/**/*.yml' -c 'npm run openapi-bundle'", "watch-rapidoc": "npx --yes browser-sync start --server --startPath 'api/rapidoc.html' --files 'dist/openapi.json'", - "build": "npm-run-all build:generate build:compile", - "build:compile": "tsc --project tsconfig.build.json", "build:generate": "npm-run-all build:generate:*", "build:generate:code": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service -o src/generated", "build:generate:test": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service:test -o test/generated", + "build:compile": "tsc --project tsconfig.build.json", + "build:add-shebang": "bash scripts/add-shebang.sh", + "build": "npm-run-all build:*", "start": "node app/index.js", + "predev": "bash scripts/init-db.sh device_service service", "dev": "env-cmd -e development npx nodemon src/index.ts", "format": "npx prettier src --write", "lint": "eslint .", diff --git a/services/device/scripts/add-shebang.sh b/services/device/scripts/add-shebang.sh new file mode 120000 index 00000000..b9819153 --- /dev/null +++ b/services/device/scripts/add-shebang.sh @@ -0,0 +1 @@ +../../../common/node/scripts/add-shebang.sh \ No newline at end of file diff --git a/services/device/scripts/generate-database-migration.sh b/services/device/scripts/generate-database-migration.sh new file mode 120000 index 00000000..1891d496 --- /dev/null +++ b/services/device/scripts/generate-database-migration.sh @@ -0,0 +1 @@ +../../../common/node/scripts/generate-database-migration.sh \ No newline at end of file diff --git a/services/device/scripts/init-db.sh b/services/device/scripts/init-db.sh new file mode 120000 index 00000000..547d2439 --- /dev/null +++ b/services/device/scripts/init-db.sh @@ -0,0 +1 @@ +../../../common/node/scripts/init-db.sh \ No newline at end of file diff --git a/services/device/src/config.ts b/services/device/src/config.ts index 12d7303b..a13a6847 100644 --- a/services/device/src/config.ts +++ b/services/device/src/config.ts @@ -51,8 +51,14 @@ function initializeAppConfiguration(): AppConfiguration { export const config = initializeAppConfiguration() export const dataSourceConfig: DataSourceOptions = { - type: 'sqlite', - database: 'db/device.db', + type: 'mariadb', + host: process.env.DB_HOST, + port: parseInt(process.env.DB_PORT ?? '3306'), + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + migrations: [...Migrations], + migrationsRun: true, entities: [ DeviceOverviewModel, ConcreteDeviceModel, @@ -62,6 +68,4 @@ export const dataSourceConfig: DataSourceOptions = { DeviceGroupModel, PeerconnectionModel, ], - migrations: Migrations, - migrationsRun: true, } diff --git a/services/device/src/database/migrations/1684337213423-SetupMigration.ts b/services/device/src/database/migrations/1684337213423-SetupMigration.ts deleted file mode 100644 index 303ab760..00000000 --- a/services/device/src/database/migrations/1684337213423-SetupMigration.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class SetupMigration1684337213423 implements MigrationInterface { - name = 'SetupMigration1684337213423' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" varchar, "type" varchar NOT NULL, "owner" varchar, "deletedAt" datetime, "connected" boolean, "announcedAvailability" text, "availabilityRules" text, "experiment" varchar, "token" varchar, "services" text, "devices" text, "instantiateUrl" varchar, "codeUrl" varchar, "instanceOfUuid" varchar)`); - await queryRunner.query(`CREATE INDEX "IDX_41fd67cfa14290cc8dc11f12df" ON "Device" ("type") `); - await queryRunner.query(`CREATE TABLE "Peerconnection" ("uuid" varchar PRIMARY KEY NOT NULL, "type" varchar NOT NULL, "status" varchar NOT NULL, "deviceA" text NOT NULL, "deviceB" text NOT NULL, "deletedAt" datetime)`); - await queryRunner.query(`DROP INDEX "IDX_41fd67cfa14290cc8dc11f12df"`); - await queryRunner.query(`CREATE TABLE "temporary_Device" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" varchar, "type" varchar NOT NULL, "owner" varchar, "deletedAt" datetime, "connected" boolean, "announcedAvailability" text, "availabilityRules" text, "experiment" varchar, "token" varchar, "services" text, "devices" text, "instantiateUrl" varchar, "codeUrl" varchar, "instanceOfUuid" varchar, CONSTRAINT "FK_2f318c27d7d5c9441431f910fd4" FOREIGN KEY ("instanceOfUuid") REFERENCES "Device" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Device"("uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid") SELECT "uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid" FROM "Device"`); - await queryRunner.query(`DROP TABLE "Device"`); - await queryRunner.query(`ALTER TABLE "temporary_Device" RENAME TO "Device"`); - await queryRunner.query(`CREATE INDEX "IDX_41fd67cfa14290cc8dc11f12df" ON "Device" ("type") `); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP INDEX "IDX_41fd67cfa14290cc8dc11f12df"`); - await queryRunner.query(`ALTER TABLE "Device" RENAME TO "temporary_Device"`); - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" varchar, "type" varchar NOT NULL, "owner" varchar, "deletedAt" datetime, "connected" boolean, "announcedAvailability" text, "availabilityRules" text, "experiment" varchar, "token" varchar, "services" text, "devices" text, "instantiateUrl" varchar, "codeUrl" varchar, "instanceOfUuid" varchar)`); - await queryRunner.query(`INSERT INTO "Device"("uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid") SELECT "uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid" FROM "temporary_Device"`); - await queryRunner.query(`DROP TABLE "temporary_Device"`); - await queryRunner.query(`CREATE INDEX "IDX_41fd67cfa14290cc8dc11f12df" ON "Device" ("type") `); - await queryRunner.query(`DROP TABLE "Peerconnection"`); - await queryRunner.query(`DROP INDEX "IDX_41fd67cfa14290cc8dc11f12df"`); - await queryRunner.query(`DROP TABLE "Device"`); - } - -} diff --git a/services/device/src/database/migrations/1687441347129-DeviceVisibility.ts b/services/device/src/database/migrations/1687441347129-DeviceVisibility.ts deleted file mode 100644 index f108cd2d..00000000 --- a/services/device/src/database/migrations/1687441347129-DeviceVisibility.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class DeviceVisibility1687441347129 implements MigrationInterface { - name = 'DeviceVisibility1687441347129' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP INDEX "IDX_41fd67cfa14290cc8dc11f12df"`); - await queryRunner.query(`CREATE TABLE "temporary_Device" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" varchar, "type" varchar NOT NULL, "owner" varchar, "deletedAt" datetime, "connected" boolean, "announcedAvailability" text, "availabilityRules" text, "experiment" varchar, "token" varchar, "services" text, "devices" text, "instantiateUrl" varchar, "codeUrl" varchar, "instanceOfUuid" varchar, "isPublic" boolean NOT NULL DEFAULT (0), CONSTRAINT "FK_2f318c27d7d5c9441431f910fd4" FOREIGN KEY ("instanceOfUuid") REFERENCES "Device" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Device"("uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid") SELECT "uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid" FROM "Device"`); - await queryRunner.query(`DROP TABLE "Device"`); - await queryRunner.query(`ALTER TABLE "temporary_Device" RENAME TO "Device"`); - await queryRunner.query(`CREATE INDEX "IDX_41fd67cfa14290cc8dc11f12df" ON "Device" ("type") `); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP INDEX "IDX_41fd67cfa14290cc8dc11f12df"`); - await queryRunner.query(`ALTER TABLE "Device" RENAME TO "temporary_Device"`); - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" varchar, "type" varchar NOT NULL, "owner" varchar, "deletedAt" datetime, "connected" boolean, "announcedAvailability" text, "availabilityRules" text, "experiment" varchar, "token" varchar, "services" text, "devices" text, "instantiateUrl" varchar, "codeUrl" varchar, "instanceOfUuid" varchar, CONSTRAINT "FK_2f318c27d7d5c9441431f910fd4" FOREIGN KEY ("instanceOfUuid") REFERENCES "Device" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "Device"("uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid") SELECT "uuid", "name", "description", "type", "owner", "deletedAt", "connected", "announcedAvailability", "availabilityRules", "experiment", "token", "services", "devices", "instantiateUrl", "codeUrl", "instanceOfUuid" FROM "temporary_Device"`); - await queryRunner.query(`DROP TABLE "temporary_Device"`); - await queryRunner.query(`CREATE INDEX "IDX_41fd67cfa14290cc8dc11f12df" ON "Device" ("type") `); - } - -} diff --git a/services/device/src/database/migrations/1690370717132-Setup.ts b/services/device/src/database/migrations/1690370717132-Setup.ts new file mode 100644 index 00000000..897e769b --- /dev/null +++ b/services/device/src/database/migrations/1690370717132-Setup.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Setup1690370717132 implements MigrationInterface { + name = 'Setup1690370717132' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE \`Device\` (\`uuid\` varchar(36) NOT NULL, \`name\` varchar(255) NOT NULL, \`description\` varchar(255) NULL, \`type\` varchar(255) NOT NULL, \`owner\` varchar(255) NULL, \`isPublic\` tinyint NOT NULL DEFAULT 0, \`deletedAt\` datetime(6) NULL, \`connected\` tinyint NULL, \`announcedAvailability\` text NULL, \`availabilityRules\` text NULL, \`experiment\` varchar(255) NULL, \`token\` varchar(255) NULL, \`services\` text NULL, \`devices\` text NULL, \`instantiateUrl\` varchar(255) NULL, \`codeUrl\` varchar(255) NULL, \`instanceOfUuid\` varchar(36) NULL, INDEX \`IDX_41fd67cfa14290cc8dc11f12df\` (\`type\`), PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`Peerconnection\` (\`uuid\` varchar(36) NOT NULL, \`type\` varchar(255) NOT NULL, \`status\` varchar(255) NOT NULL, \`deviceA\` text NOT NULL, \`deviceB\` text NOT NULL, \`deletedAt\` datetime(6) NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`ALTER TABLE \`Device\` ADD CONSTRAINT \`FK_2f318c27d7d5c9441431f910fd4\` FOREIGN KEY (\`instanceOfUuid\`) REFERENCES \`Device\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`Device\` DROP FOREIGN KEY \`FK_2f318c27d7d5c9441431f910fd4\``); + await queryRunner.query(`DROP TABLE \`Peerconnection\``); + await queryRunner.query(`DROP INDEX \`IDX_41fd67cfa14290cc8dc11f12df\` ON \`Device\``); + await queryRunner.query(`DROP TABLE \`Device\``); + } + +} diff --git a/services/device/src/database/migrations/index.ts b/services/device/src/database/migrations/index.ts index 44083fd3..d714c8ff 100644 --- a/services/device/src/database/migrations/index.ts +++ b/services/device/src/database/migrations/index.ts @@ -1,4 +1,3 @@ -import { SetupMigration1684337213423 } from './1684337213423-SetupMigration' -import { DeviceVisibility1687441347129 } from './1687441347129-DeviceVisibility' +import { Setup1690370717132 } from './1690370717132-Setup' -export const Migrations = [SetupMigration1684337213423, DeviceVisibility1687441347129] +export const Migrations = [Setup1690370717132] diff --git a/services/device/src/index.ts b/services/device/src/index.ts index 7c8fca68..b392df99 100644 --- a/services/device/src/index.ts +++ b/services/device/src/index.ts @@ -1,4 +1,3 @@ -#!/usr/bin/env node import { config, dataSourceConfig } from './config' import { AppDataSource } from './database/dataSource' import { app } from './generated/index' diff --git a/services/device/src/methods/signaling/signalingQueue.ts b/services/device/src/methods/signaling/signalingQueue.ts index a382929f..61e02039 100644 --- a/services/device/src/methods/signaling/signalingQueue.ts +++ b/services/device/src/methods/signaling/signalingQueue.ts @@ -17,7 +17,7 @@ export class SignalingQueue { | 'peerconnection-created' | 'peerconnection-closed' = 'new' private _isStopped = false - public _onClose: () => void + private _onClose: () => void constructor(peerconnectionUrl: string, deviceUrl: string) { this.deviceUrl = deviceUrl @@ -44,6 +44,7 @@ export class SignalingQueue { public set onClose(onClose: (() => void) | undefined) { this._onClose = () => { + this._state = 'peerconnection-closed' this.queue.end() if (onClose) onClose() } diff --git a/services/device/src/methods/signaling/signalingQueueManager.ts b/services/device/src/methods/signaling/signalingQueueManager.ts index 678f37e4..753498c9 100644 --- a/services/device/src/methods/signaling/signalingQueueManager.ts +++ b/services/device/src/methods/signaling/signalingQueueManager.ts @@ -184,7 +184,7 @@ export class SignalingQueueManager { ) } - public closeSignalingQueues(peerconnectionId: string) { + public async closeSignalingQueues(peerconnectionId: string) { const peerconnectionUrl = peerconnectionUrlFromId(peerconnectionId) const queues = this.queueMap.get(peerconnectionUrl) @@ -201,13 +201,29 @@ export class SignalingQueueManager { connectionUrl: peerconnectionUrl, } - if (queues.deviceA.queue.state === 'new' && queues.deviceA.queue.onClose) - queues.deviceA.queue.onClose() - else queues.deviceA.queue.add(closePeerconnectionMessage) + const promiseA = new Promise((resolve) => { + const originalOnClose = queues.deviceA.queue.onClose + queues.deviceA.queue.onClose = () => { + if (originalOnClose) originalOnClose() + resolve() + } + if (queues.deviceA.queue.state === 'new' && queues.deviceA.queue.onClose) + queues.deviceA.queue.onClose() + else queues.deviceA.queue.add(closePeerconnectionMessage) + }) + + const promiseB = new Promise((resolve) => { + const originalOnClose = queues.deviceB.queue.onClose + queues.deviceB.queue.onClose = () => { + if (originalOnClose) originalOnClose() + resolve() + } + if (queues.deviceB.queue.state === 'new' && queues.deviceB.queue.onClose) + queues.deviceB.queue.onClose() + else queues.deviceB.queue.add(closePeerconnectionMessage) + }) - if (queues.deviceB.queue.state === 'new' && queues.deviceB.queue.onClose) - queues.deviceB.queue.onClose() - else queues.deviceB.queue.add(closePeerconnectionMessage) + return Promise.all([promiseA, promiseB]) } } diff --git a/services/device/src/operations/callbacks/event/deviceChanged.ts b/services/device/src/operations/callbacks/event/deviceChanged.ts index 4846cbc9..3f91a59a 100644 --- a/services/device/src/operations/callbacks/event/deviceChanged.ts +++ b/services/device/src/operations/callbacks/event/deviceChanged.ts @@ -11,7 +11,6 @@ import { signalingQueueManager } from '../../../methods/signaling/signalingQueue export async function handleDeviceChangedEventCallback( callback: DeviceChangedEventCallback ): Promise<200 | 410> { - console.log(callback.device.type) switch (callback.device.type) { case 'device': return await handleConcreteDevice(callback.device) diff --git a/services/device/src/operations/devices/websocket/index.ts b/services/device/src/operations/devices/websocket/index.ts index d2d22d20..7f37727d 100644 --- a/services/device/src/operations/devices/websocket/index.ts +++ b/services/device/src/operations/devices/websocket/index.ts @@ -61,17 +61,18 @@ export function websocketHandling(app: Express.Application) { return ws.close(1002, 'No device found with matching websocket token') } + deviceModel.connected = true + connectedDevices.set(deviceModel.uuid, ws) + await repositories.concreteDevice.save(deviceModel) + ws.send( JSON.stringify({ messageType: 'authenticate', authenticated: true, }) ) - - deviceModel.connected = true - connectedDevices.set(deviceModel.uuid, ws) - await repositories.concreteDevice.save(deviceModel) await sendChangedCallback(deviceModel) + logger.log( 'info', `device '${deviceUrlFromId(deviceModel.uuid)}' connected` diff --git a/services/device/src/operations/peerconnections/peerconnection/delete.ts b/services/device/src/operations/peerconnections/peerconnection/delete.ts index 0a2cd8bb..aebfbf99 100644 --- a/services/device/src/operations/peerconnections/peerconnection/delete.ts +++ b/services/device/src/operations/peerconnections/peerconnection/delete.ts @@ -1,11 +1,8 @@ import { repositories } from '../../../database/dataSource' import { deletePeerconnectionsByPeerconnectionIdSignature } from '../../../generated/signatures' import { signalingQueueManager } from '../../../methods/signaling/signalingQueueManager' -import { peerconnectionUrlFromId } from '../../../methods/urlFromId' import { logger } from '@crosslab/service-common' -export const deleteOnClose: Set = new Set() - /** * This function implements the functionality for handling DELETE requests on /peerconnection/{peerconnection_id} endpoint. * @param parameters The parameters of the request. @@ -19,35 +16,13 @@ export const deletePeerconnectionsByPeerconnectionId: deletePeerconnectionsByPee where: { uuid: parameters.peerconnection_id }, }) - if ( - peerconnectionModel.deviceA.status === 'closed' && - peerconnectionModel.deviceB.status === 'closed' - ) { - signalingQueueManager.setOnCloseHandler( - peerconnectionModel.uuid, - async () => { - try { - await repositories.peerconnection.remove(peerconnectionModel) - } catch (error) { - logger.log( - 'error', - `Something went wrong while trying to delete peerconnection '${peerconnectionUrlFromId( - peerconnectionModel.uuid - )}'`, - { data: { error } } - ) - } - } - ) - signalingQueueManager.closeSignalingQueues(peerconnectionModel.uuid) - } else { - deleteOnClose.add(peerconnectionModel.uuid) - signalingQueueManager.closeSignalingQueues(peerconnectionModel.uuid) - } + await signalingQueueManager.closeSignalingQueues(peerconnectionModel.uuid) + + await repositories.peerconnection.remove(peerconnectionModel) logger.log('info', 'deletePeerconnectionsByPeerconnectionId succeeded') return { - status: 202, + status: 204, } } diff --git a/services/device/src/operations/peerconnections/peerconnection/device_status/patch.ts b/services/device/src/operations/peerconnections/peerconnection/device_status/patch.ts index 6273ca79..57ba3e29 100644 --- a/services/device/src/operations/peerconnections/peerconnection/device_status/patch.ts +++ b/services/device/src/operations/peerconnections/peerconnection/device_status/patch.ts @@ -3,7 +3,6 @@ import { patchPeerconnectionsByPeerconnectionIdDeviceStatusSignature } from '../ import { mutexManager } from '../../../../methods/mutexManager' import { peerconnectionUrlFromId } from '../../../../methods/urlFromId' import { sendClosedCallback, sendStatusChangedCallback } from '../../../callbacks' -import { deleteOnClose } from '../delete' import { UnrelatedPeerconnectionError, logger } from '@crosslab/service-common' /** @@ -87,24 +86,16 @@ export const patchPeerconnectionsByPeerconnectionIdDeviceStatus: patchPeerconnec await sendClosedCallback(peerconnectionModel) } - logger.log('info', 'DEVICE STATUS INFO', { + logger.log('info', 'peerconnection devices status info', { data: { peerconnection: peerconnectionModel.uuid, statusDeviceA: peerconnectionModel.deviceA.status, statusDeviceB: peerconnectionModel.deviceB.status, - toBeDeleted: deleteOnClose.has(peerconnectionModel.uuid), }, }) - if ( - peerconnectionModel.deviceA.status === 'closed' && - peerconnectionModel.deviceB.status === 'closed' && - deleteOnClose.has(peerconnectionModel.uuid) - ) { - await repositories.peerconnection.remove(peerconnectionModel) - } else { - await repositories.peerconnection.save(peerconnectionModel) - } + await repositories.peerconnection.save(peerconnectionModel) + logger.log( 'info', 'patchPeerconnectionsByPeerconnectionIdDeviceStatus succeeded' diff --git a/services/device/test/database/repositories/index.spec.ts b/services/device/test/database/repositories/index.spec.ts index 400f83a2..78a9d8ce 100644 --- a/services/device/test/database/repositories/index.spec.ts +++ b/services/device/test/database/repositories/index.spec.ts @@ -1,5 +1,4 @@ import { AppDataSource, repositories } from '../../../src/database/dataSource' -import { Migrations } from '../../../src/database/migrations' import { DeviceOverviewModel, ConcreteDeviceModel, @@ -58,8 +57,7 @@ export async function initTestDatabase(): Promise { DeviceGroupModel, PeerconnectionModel, ], - migrations: Migrations, - migrationsRun: true, + synchronize: true, } const testData = prepareTestData() diff --git a/services/device/test/methods/callbacks.spec.ts b/services/device/test/methods/callbacks.spec.ts index df7ede15..5d9a4f88 100644 --- a/services/device/test/methods/callbacks.spec.ts +++ b/services/device/test/methods/callbacks.spec.ts @@ -37,6 +37,7 @@ export default () => availabilityRules: [], connected: false, services: [], + isPublic: true, } TEST_PEERCONNECTION_MODEL = { uuid: 'ea2a852d-b16c-45e0-819f-0af793bb596e', diff --git a/services/device/test/methods/index.spec.ts b/services/device/test/methods/index.spec.ts index 4809c0b1..de4aa427 100644 --- a/services/device/test/methods/index.spec.ts +++ b/services/device/test/methods/index.spec.ts @@ -1,4 +1,4 @@ -import { AppDataSource } from '../../src/database/dataSource' +import { initTestDatabase } from '../database/repositories/index.spec' import availabilitySpec from './availability.spec' import callbacksSpec from './callbacks.spec' // import signalingSpec from './signaling.spec' @@ -10,7 +10,7 @@ const tests = [availabilitySpec, callbacksSpec, urlFromIdSpec] describe('Methods', function () { this.beforeAll(async function () { - await AppDataSource.initialize() + await initTestDatabase() logger.transports.forEach((transport) => (transport.silent = true)) }) diff --git a/services/experiment/.env-cmdrc b/services/experiment/.env-cmdrc index da12e704..9996be32 100644 --- a/services/experiment/.env-cmdrc +++ b/services/experiment/.env-cmdrc @@ -1,5 +1,22 @@ { "development": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "experiment_service", + "SECURITY_ISSUER": "http://localhost", + "SECURITY_AUDIENCE": "http://localhost", + "BASE_URL": "http://localhost", + "PORT": "3002", + "API_TOKEN": "experiment-service-dev-token" + }, + "database_migration": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "database_migration", "SECURITY_ISSUER": "http://localhost", "SECURITY_AUDIENCE": "http://localhost", "BASE_URL": "http://localhost", diff --git a/services/experiment/package-lock.json b/services/experiment/package-lock.json index 504ec12a..5d26bab2 100644 --- a/services/experiment/package-lock.json +++ b/services/experiment/package-lock.json @@ -16,7 +16,6 @@ "jose": "^4.10.0", "node-fetch": "^2.6.7", "sqlite3": "^5.1.6", - "tiny-typed-emitter": "^2.1.0", "typeorm": "^0.3.15", "winston": "^3.8.2" }, @@ -37,6 +36,7 @@ "env-cmd": "^10.1.0", "eslint": "^8.34.0", "nodemon": "^2.0.19", + "npm-run-all": "^4.1.5", "prettier": "^2.7.1", "ts-node": "^10.9.1", "typedoc": "^0.23.20", @@ -1828,6 +1828,19 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "devOptional": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1842,6 +1855,26 @@ "node": ">=8" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -1853,6 +1886,18 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2437,6 +2482,22 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2607,6 +2668,105 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "optional": true }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3206,6 +3366,15 @@ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -3271,6 +3440,33 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -3308,18 +3504,35 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3360,6 +3573,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3380,11 +3608,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "optional": true + "devOptional": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -3403,6 +3643,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3411,6 +3660,29 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3422,6 +3694,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -3435,6 +3722,12 @@ "node": "*" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -3590,6 +3883,20 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -3604,11 +3911,37 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3621,6 +3954,61 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3656,6 +4044,18 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "optional": true }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3665,6 +4065,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3674,17 +4089,108 @@ "node": ">=8" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3733,6 +4239,12 @@ "node": ">=4" } }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -3780,6 +4292,21 @@ "node": ">= 0.8.0" } }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3929,6 +4456,15 @@ "node": ">= 0.6" } }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -4162,6 +4698,12 @@ "node": ">= 0.6" } }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node_modules/node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", @@ -4379,6 +4921,27 @@ "node": ">=6" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4388,6 +4951,98 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -4415,6 +5070,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4516,6 +5198,19 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -4568,6 +5263,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -4600,6 +5301,27 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -4750,6 +5472,32 @@ "node": ">= 0.8" } }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4767,6 +5515,23 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -4795,6 +5560,23 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4860,6 +5642,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4879,6 +5679,20 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", @@ -4998,6 +5812,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shiki": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", @@ -5131,6 +5954,38 @@ "dev": true, "peer": true }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "node_modules/sqlite3": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", @@ -5194,6 +6049,68 @@ "node": ">=8" } }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5205,6 +6122,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5228,6 +6154,18 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tar": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", @@ -5287,11 +6225,6 @@ "node": ">=0.8" } }, - "node_modules/tiny-typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -5458,6 +6391,71 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedoc": { "version": "0.23.25", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.25.tgz", @@ -5740,6 +6738,21 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -5833,6 +6846,16 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "devOptional": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5882,6 +6905,41 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/services/experiment/package.json b/services/experiment/package.json index 743d0103..a2d1fc26 100644 --- a/services/experiment/package.json +++ b/services/experiment/package.json @@ -13,10 +13,13 @@ "openapi-bundle": "npx --yes @redocly/cli bundle ./api/openapi.yml --output dist/openapi.json", "watch-openapi": "npx --yes chokidar-cli 'api/**/*.yml' -c 'npm run openapi-bundle'", "watch-rapidoc": "npx --yes browser-sync start --server --startPath 'api/rapidoc.html' --files 'dist/openapi.json'", - "build-generate-code": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service -o src/generated", - "build-compile": "tsc", - "build": "npm run build-generate-code && npm run build-compile", + "build:generate:code": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service -o src/generated", + "build:generate": "npm-run-all build:generate:*", + "build:compile": "tsc", + "build:add-shebang": "bash scripts/add-shebang.sh", + "build": "npm-run-all build:*", "start": "node app/index.js", + "predev": "bash scripts/init-db.sh experiment_service service service", "dev": "env-cmd -e development npx nodemon src/index.ts", "format": "npx prettier src --write", "doc": "typedoc --options ./typedoc.json", @@ -38,6 +41,7 @@ "env-cmd": "^10.1.0", "eslint": "^8.34.0", "nodemon": "^2.0.19", + "npm-run-all": "^4.1.5", "prettier": "^2.7.1", "ts-node": "^10.9.1", "typedoc": "^0.23.20", diff --git a/services/experiment/scripts/add-shebang.sh b/services/experiment/scripts/add-shebang.sh new file mode 120000 index 00000000..b9819153 --- /dev/null +++ b/services/experiment/scripts/add-shebang.sh @@ -0,0 +1 @@ +../../../common/node/scripts/add-shebang.sh \ No newline at end of file diff --git a/services/experiment/scripts/generate-database-migration.sh b/services/experiment/scripts/generate-database-migration.sh new file mode 120000 index 00000000..1891d496 --- /dev/null +++ b/services/experiment/scripts/generate-database-migration.sh @@ -0,0 +1 @@ +../../../common/node/scripts/generate-database-migration.sh \ No newline at end of file diff --git a/services/experiment/scripts/init-db.sh b/services/experiment/scripts/init-db.sh new file mode 120000 index 00000000..547d2439 --- /dev/null +++ b/services/experiment/scripts/init-db.sh @@ -0,0 +1 @@ +../../../common/node/scripts/init-db.sh \ No newline at end of file diff --git a/services/experiment/src/config.ts b/services/experiment/src/config.ts index 4d59b768..bf25d3d7 100644 --- a/services/experiment/src/config.ts +++ b/services/experiment/src/config.ts @@ -48,8 +48,14 @@ function initializeAppConfiguration(): AppConfiguration { export const config = initializeAppConfiguration() export const dataSourceConfig: DataSourceOptions = { - type: 'sqlite', - database: 'db/experiment.db', + type: 'mariadb', + host: process.env.DB_HOST, + port: parseInt(process.env.DB_PORT ?? '3306'), + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + migrations: [...Migrations], + migrationsRun: true, entities: [ ExperimentModel, DeviceModel, @@ -59,6 +65,4 @@ export const dataSourceConfig: DataSourceOptions = { ParticipantModel, RoleModel, ], - migrations: [...Migrations], - migrationsRun: true, } diff --git a/services/experiment/src/database/migrations/1684154140619-SetupMigration.ts b/services/experiment/src/database/migrations/1684154140619-SetupMigration.ts deleted file mode 100644 index 3e22e016..00000000 --- a/services/experiment/src/database/migrations/1684154140619-SetupMigration.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class SetupMigration1684154140619 implements MigrationInterface { - name = 'SetupMigration1684154140619' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "Experiment" ("uuid" varchar PRIMARY KEY NOT NULL, "status" varchar NOT NULL, "bookingStart" varchar NOT NULL, "bookingEnd" varchar NOT NULL, "bookingID" varchar, "deletedAt" datetime)`); - await queryRunner.query(`CREATE TABLE "Role" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" text, "experimentUuid" varchar)`); - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "additionalProperties" text, "experimentUuid" varchar)`); - await queryRunner.query(`CREATE TABLE "Peerconnection" ("url" varchar PRIMARY KEY NOT NULL, "experimentUuid" varchar)`); - await queryRunner.query(`CREATE TABLE "ServiceConfiguration" ("uuid" varchar PRIMARY KEY NOT NULL, "serviceType" varchar NOT NULL, "configuration" text NOT NULL, "experimentUuid" varchar)`); - await queryRunner.query(`CREATE TABLE "Participant" ("uuid" varchar PRIMARY KEY NOT NULL, "role" varchar NOT NULL, "serviceId" varchar NOT NULL, "config" text NOT NULL, "serviceConfigurationUuid" varchar)`); - await queryRunner.query(`CREATE TABLE "temporary_Role" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" text, "experimentUuid" varchar, CONSTRAINT "FK_b38fd4254dd804639ca683339d6" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Role"("uuid", "name", "description", "experimentUuid") SELECT "uuid", "name", "description", "experimentUuid" FROM "Role"`); - await queryRunner.query(`DROP TABLE "Role"`); - await queryRunner.query(`ALTER TABLE "temporary_Role" RENAME TO "Role"`); - await queryRunner.query(`CREATE TABLE "temporary_Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "additionalProperties" text, "experimentUuid" varchar, CONSTRAINT "FK_8507dafa0a52f17a0bf75102d18" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Device"("uuid", "url", "role", "additionalProperties", "experimentUuid") SELECT "uuid", "url", "role", "additionalProperties", "experimentUuid" FROM "Device"`); - await queryRunner.query(`DROP TABLE "Device"`); - await queryRunner.query(`ALTER TABLE "temporary_Device" RENAME TO "Device"`); - await queryRunner.query(`CREATE TABLE "temporary_Peerconnection" ("url" varchar PRIMARY KEY NOT NULL, "experimentUuid" varchar, CONSTRAINT "FK_567f562e05a548fab2546eb98d0" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Peerconnection"("url", "experimentUuid") SELECT "url", "experimentUuid" FROM "Peerconnection"`); - await queryRunner.query(`DROP TABLE "Peerconnection"`); - await queryRunner.query(`ALTER TABLE "temporary_Peerconnection" RENAME TO "Peerconnection"`); - await queryRunner.query(`CREATE TABLE "temporary_ServiceConfiguration" ("uuid" varchar PRIMARY KEY NOT NULL, "serviceType" varchar NOT NULL, "configuration" text NOT NULL, "experimentUuid" varchar, CONSTRAINT "FK_2c1228b4b9d46d3183a3f28ca93" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_ServiceConfiguration"("uuid", "serviceType", "configuration", "experimentUuid") SELECT "uuid", "serviceType", "configuration", "experimentUuid" FROM "ServiceConfiguration"`); - await queryRunner.query(`DROP TABLE "ServiceConfiguration"`); - await queryRunner.query(`ALTER TABLE "temporary_ServiceConfiguration" RENAME TO "ServiceConfiguration"`); - await queryRunner.query(`CREATE TABLE "temporary_Participant" ("uuid" varchar PRIMARY KEY NOT NULL, "role" varchar NOT NULL, "serviceId" varchar NOT NULL, "config" text NOT NULL, "serviceConfigurationUuid" varchar, CONSTRAINT "FK_b64091febbaddc32901e7341f51" FOREIGN KEY ("serviceConfigurationUuid") REFERENCES "ServiceConfiguration" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Participant"("uuid", "role", "serviceId", "config", "serviceConfigurationUuid") SELECT "uuid", "role", "serviceId", "config", "serviceConfigurationUuid" FROM "Participant"`); - await queryRunner.query(`DROP TABLE "Participant"`); - await queryRunner.query(`ALTER TABLE "temporary_Participant" RENAME TO "Participant"`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "Participant" RENAME TO "temporary_Participant"`); - await queryRunner.query(`CREATE TABLE "Participant" ("uuid" varchar PRIMARY KEY NOT NULL, "role" varchar NOT NULL, "serviceId" varchar NOT NULL, "config" text NOT NULL, "serviceConfigurationUuid" varchar)`); - await queryRunner.query(`INSERT INTO "Participant"("uuid", "role", "serviceId", "config", "serviceConfigurationUuid") SELECT "uuid", "role", "serviceId", "config", "serviceConfigurationUuid" FROM "temporary_Participant"`); - await queryRunner.query(`DROP TABLE "temporary_Participant"`); - await queryRunner.query(`ALTER TABLE "ServiceConfiguration" RENAME TO "temporary_ServiceConfiguration"`); - await queryRunner.query(`CREATE TABLE "ServiceConfiguration" ("uuid" varchar PRIMARY KEY NOT NULL, "serviceType" varchar NOT NULL, "configuration" text NOT NULL, "experimentUuid" varchar)`); - await queryRunner.query(`INSERT INTO "ServiceConfiguration"("uuid", "serviceType", "configuration", "experimentUuid") SELECT "uuid", "serviceType", "configuration", "experimentUuid" FROM "temporary_ServiceConfiguration"`); - await queryRunner.query(`DROP TABLE "temporary_ServiceConfiguration"`); - await queryRunner.query(`ALTER TABLE "Peerconnection" RENAME TO "temporary_Peerconnection"`); - await queryRunner.query(`CREATE TABLE "Peerconnection" ("url" varchar PRIMARY KEY NOT NULL, "experimentUuid" varchar)`); - await queryRunner.query(`INSERT INTO "Peerconnection"("url", "experimentUuid") SELECT "url", "experimentUuid" FROM "temporary_Peerconnection"`); - await queryRunner.query(`DROP TABLE "temporary_Peerconnection"`); - await queryRunner.query(`ALTER TABLE "Device" RENAME TO "temporary_Device"`); - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "additionalProperties" text, "experimentUuid" varchar)`); - await queryRunner.query(`INSERT INTO "Device"("uuid", "url", "role", "additionalProperties", "experimentUuid") SELECT "uuid", "url", "role", "additionalProperties", "experimentUuid" FROM "temporary_Device"`); - await queryRunner.query(`DROP TABLE "temporary_Device"`); - await queryRunner.query(`ALTER TABLE "Role" RENAME TO "temporary_Role"`); - await queryRunner.query(`CREATE TABLE "Role" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "description" text, "experimentUuid" varchar)`); - await queryRunner.query(`INSERT INTO "Role"("uuid", "name", "description", "experimentUuid") SELECT "uuid", "name", "description", "experimentUuid" FROM "temporary_Role"`); - await queryRunner.query(`DROP TABLE "temporary_Role"`); - await queryRunner.query(`DROP TABLE "Participant"`); - await queryRunner.query(`DROP TABLE "ServiceConfiguration"`); - await queryRunner.query(`DROP TABLE "Peerconnection"`); - await queryRunner.query(`DROP TABLE "Device"`); - await queryRunner.query(`DROP TABLE "Role"`); - await queryRunner.query(`DROP TABLE "Experiment"`); - } - -} diff --git a/services/experiment/src/database/migrations/1688732725993-ExperimentStatusAndInstances.ts b/services/experiment/src/database/migrations/1688732725993-ExperimentStatusAndInstances.ts deleted file mode 100644 index dfc5d827..00000000 --- a/services/experiment/src/database/migrations/1688732725993-ExperimentStatusAndInstances.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class ExperimentStatusAndInstances1688732725993 implements MigrationInterface { - name = 'ExperimentStatusAndInstances1688732725993' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "temporary_Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "instanceUuid" text, "experimentUuid" varchar, CONSTRAINT "FK_8507dafa0a52f17a0bf75102d18" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Device"("uuid", "url", "role", "instanceUuid", "experimentUuid") SELECT "uuid", "url", "role", "additionalProperties", "experimentUuid" FROM "Device"`); - await queryRunner.query(`DROP TABLE "Device"`); - await queryRunner.query(`ALTER TABLE "temporary_Device" RENAME TO "Device"`); - await queryRunner.query(`CREATE TABLE "Instance" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "token" varchar NOT NULL)`); - await queryRunner.query(`CREATE TABLE "temporary_Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "instanceUuid" varchar, "experimentUuid" varchar, CONSTRAINT "UQ_4b7d77031fb21a7ebd09431fa01" UNIQUE ("instanceUuid"), CONSTRAINT "FK_8507dafa0a52f17a0bf75102d18" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Device"("uuid", "url", "role", "instanceUuid", "experimentUuid") SELECT "uuid", "url", "role", "instanceUuid", "experimentUuid" FROM "Device"`); - await queryRunner.query(`DROP TABLE "Device"`); - await queryRunner.query(`ALTER TABLE "temporary_Device" RENAME TO "Device"`); - await queryRunner.query(`CREATE TABLE "temporary_Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "instanceUuid" varchar, "experimentUuid" varchar, CONSTRAINT "UQ_4b7d77031fb21a7ebd09431fa01" UNIQUE ("instanceUuid"), CONSTRAINT "FK_8507dafa0a52f17a0bf75102d18" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_fbe04f9943ff77c7384afb4a24e" FOREIGN KEY ("instanceUuid") REFERENCES "Instance" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "temporary_Device"("uuid", "url", "role", "instanceUuid", "experimentUuid") SELECT "uuid", "url", "role", "instanceUuid", "experimentUuid" FROM "Device"`); - await queryRunner.query(`DROP TABLE "Device"`); - await queryRunner.query(`ALTER TABLE "temporary_Device" RENAME TO "Device"`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "Device" RENAME TO "temporary_Device"`); - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "instanceUuid" varchar, "experimentUuid" varchar, CONSTRAINT "UQ_4b7d77031fb21a7ebd09431fa01" UNIQUE ("instanceUuid"), CONSTRAINT "FK_8507dafa0a52f17a0bf75102d18" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "Device"("uuid", "url", "role", "instanceUuid", "experimentUuid") SELECT "uuid", "url", "role", "instanceUuid", "experimentUuid" FROM "temporary_Device"`); - await queryRunner.query(`DROP TABLE "temporary_Device"`); - await queryRunner.query(`ALTER TABLE "Device" RENAME TO "temporary_Device"`); - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "instanceUuid" text, "experimentUuid" varchar, CONSTRAINT "FK_8507dafa0a52f17a0bf75102d18" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "Device"("uuid", "url", "role", "instanceUuid", "experimentUuid") SELECT "uuid", "url", "role", "instanceUuid", "experimentUuid" FROM "temporary_Device"`); - await queryRunner.query(`DROP TABLE "temporary_Device"`); - await queryRunner.query(`DROP TABLE "Instance"`); - await queryRunner.query(`ALTER TABLE "Device" RENAME TO "temporary_Device"`); - await queryRunner.query(`CREATE TABLE "Device" ("uuid" varchar PRIMARY KEY NOT NULL, "url" varchar NOT NULL, "role" varchar NOT NULL, "additionalProperties" text, "experimentUuid" varchar, CONSTRAINT "FK_8507dafa0a52f17a0bf75102d18" FOREIGN KEY ("experimentUuid") REFERENCES "Experiment" ("uuid") ON DELETE NO ACTION ON UPDATE NO ACTION)`); - await queryRunner.query(`INSERT INTO "Device"("uuid", "url", "role", "additionalProperties", "experimentUuid") SELECT "uuid", "url", "role", "instanceUuid", "experimentUuid" FROM "temporary_Device"`); - await queryRunner.query(`DROP TABLE "temporary_Device"`); - } - -} diff --git a/services/experiment/src/database/migrations/1690372222602-Setup.ts b/services/experiment/src/database/migrations/1690372222602-Setup.ts new file mode 100644 index 00000000..d9ca7450 --- /dev/null +++ b/services/experiment/src/database/migrations/1690372222602-Setup.ts @@ -0,0 +1,39 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Setup1690372222602 implements MigrationInterface { + name = 'Setup1690372222602' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE \`Experiment\` (\`uuid\` varchar(36) NOT NULL, \`status\` varchar(255) NOT NULL, \`bookingStart\` varchar(255) NOT NULL, \`bookingEnd\` varchar(255) NOT NULL, \`bookingID\` varchar(255) NULL, \`deletedAt\` datetime(6) NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`Role\` (\`uuid\` varchar(36) NOT NULL, \`name\` varchar(255) NOT NULL, \`description\` text NULL, \`experimentUuid\` varchar(36) NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`Instance\` (\`uuid\` varchar(36) NOT NULL, \`url\` varchar(255) NOT NULL, \`token\` varchar(255) NOT NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`Device\` (\`uuid\` varchar(36) NOT NULL, \`url\` varchar(255) NOT NULL, \`role\` varchar(255) NOT NULL, \`experimentUuid\` varchar(36) NULL, \`instanceUuid\` varchar(36) NULL, UNIQUE INDEX \`REL_fbe04f9943ff77c7384afb4a24\` (\`instanceUuid\`), PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`Peerconnection\` (\`url\` varchar(255) NOT NULL, \`experimentUuid\` varchar(36) NULL, PRIMARY KEY (\`url\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`ServiceConfiguration\` (\`uuid\` varchar(36) NOT NULL, \`serviceType\` varchar(255) NOT NULL, \`configuration\` text NOT NULL, \`experimentUuid\` varchar(36) NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`Participant\` (\`uuid\` varchar(36) NOT NULL, \`role\` varchar(255) NOT NULL, \`serviceId\` varchar(255) NOT NULL, \`config\` text NOT NULL, \`serviceConfigurationUuid\` varchar(36) NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + await queryRunner.query(`ALTER TABLE \`Role\` ADD CONSTRAINT \`FK_b38fd4254dd804639ca683339d6\` FOREIGN KEY (\`experimentUuid\`) REFERENCES \`Experiment\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`Device\` ADD CONSTRAINT \`FK_8507dafa0a52f17a0bf75102d18\` FOREIGN KEY (\`experimentUuid\`) REFERENCES \`Experiment\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`Device\` ADD CONSTRAINT \`FK_fbe04f9943ff77c7384afb4a24e\` FOREIGN KEY (\`instanceUuid\`) REFERENCES \`Instance\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`Peerconnection\` ADD CONSTRAINT \`FK_567f562e05a548fab2546eb98d0\` FOREIGN KEY (\`experimentUuid\`) REFERENCES \`Experiment\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`ServiceConfiguration\` ADD CONSTRAINT \`FK_2c1228b4b9d46d3183a3f28ca93\` FOREIGN KEY (\`experimentUuid\`) REFERENCES \`Experiment\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`Participant\` ADD CONSTRAINT \`FK_b64091febbaddc32901e7341f51\` FOREIGN KEY (\`serviceConfigurationUuid\`) REFERENCES \`ServiceConfiguration\`(\`uuid\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`Participant\` DROP FOREIGN KEY \`FK_b64091febbaddc32901e7341f51\``); + await queryRunner.query(`ALTER TABLE \`ServiceConfiguration\` DROP FOREIGN KEY \`FK_2c1228b4b9d46d3183a3f28ca93\``); + await queryRunner.query(`ALTER TABLE \`Peerconnection\` DROP FOREIGN KEY \`FK_567f562e05a548fab2546eb98d0\``); + await queryRunner.query(`ALTER TABLE \`Device\` DROP FOREIGN KEY \`FK_fbe04f9943ff77c7384afb4a24e\``); + await queryRunner.query(`ALTER TABLE \`Device\` DROP FOREIGN KEY \`FK_8507dafa0a52f17a0bf75102d18\``); + await queryRunner.query(`ALTER TABLE \`Role\` DROP FOREIGN KEY \`FK_b38fd4254dd804639ca683339d6\``); + await queryRunner.query(`DROP TABLE \`Participant\``); + await queryRunner.query(`DROP TABLE \`ServiceConfiguration\``); + await queryRunner.query(`DROP TABLE \`Peerconnection\``); + await queryRunner.query(`DROP INDEX \`REL_fbe04f9943ff77c7384afb4a24\` ON \`Device\``); + await queryRunner.query(`DROP TABLE \`Device\``); + await queryRunner.query(`DROP TABLE \`Instance\``); + await queryRunner.query(`DROP TABLE \`Role\``); + await queryRunner.query(`DROP TABLE \`Experiment\``); + } + +} diff --git a/services/experiment/src/database/migrations/index.ts b/services/experiment/src/database/migrations/index.ts index d35a73de..c1418373 100644 --- a/services/experiment/src/database/migrations/index.ts +++ b/services/experiment/src/database/migrations/index.ts @@ -1,7 +1,3 @@ -import { SetupMigration1684154140619 } from './1684154140619-SetupMigration' -import { ExperimentStatusAndInstances1688732725993 } from './1688732725993-ExperimentStatusAndInstances' +import { Setup1690372222602 } from "./1690372222602-Setup"; -export const Migrations = [ - SetupMigration1684154140619, - ExperimentStatusAndInstances1688732725993, -] +export const Migrations = [Setup1690372222602] diff --git a/services/experiment/src/index.ts b/services/experiment/src/index.ts index b26f9a26..d1bbfc13 100644 --- a/services/experiment/src/index.ts +++ b/services/experiment/src/index.ts @@ -1,4 +1,3 @@ -#!/usr/bin/env node import { config, dataSourceConfig } from './config' import { AppDataSource } from './database/dataSource' import { app } from './generated/index' diff --git a/services/federation/.env-cmdrc b/services/federation/.env-cmdrc index 7190bd04..6f353141 100644 --- a/services/federation/.env-cmdrc +++ b/services/federation/.env-cmdrc @@ -1,5 +1,21 @@ { "development": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "federation_service", + "SECURITY_ISSUER": "http://localhost", + "SECURITY_AUDIENCE": "http://localhost", + "BASE_URL": "http://localhost", + "PORT": "3003" + }, + "database_migration": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "database_migration", "SECURITY_ISSUER": "http://localhost", "SECURITY_AUDIENCE": "http://localhost", "BASE_URL": "http://localhost", diff --git a/services/federation/package-lock.json b/services/federation/package-lock.json index a96d15a3..172cdfbf 100644 --- a/services/federation/package-lock.json +++ b/services/federation/package-lock.json @@ -33,6 +33,7 @@ "env-cmd": "^10.1.0", "eslint": "^8.34.0", "nodemon": "^2.0.19", + "npm-run-all": "^4.1.5", "prettier": "^2.7.1", "ts-node": "^10.9.1", "typescript": "^4.7.3" @@ -1754,6 +1755,19 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "devOptional": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1768,12 +1782,44 @@ "node": ">=8" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2347,6 +2393,22 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2512,6 +2574,99 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "optional": true }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3087,6 +3242,15 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -3152,6 +3316,33 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -3189,18 +3380,35 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3241,6 +3449,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3261,11 +3484,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "optional": true + "devOptional": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -3284,6 +3519,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3293,6 +3537,29 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3304,6 +3571,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -3317,6 +3599,12 @@ "node": "*" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -3472,6 +3760,20 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -3486,6 +3788,38 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3498,6 +3832,61 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3533,6 +3922,18 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "optional": true }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3542,6 +3943,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3551,14 +3967,99 @@ "node": ">=8" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "devOptional": true }, @@ -3604,6 +4105,12 @@ "node": ">=4" } }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -3640,6 +4147,21 @@ "node": ">= 0.8.0" } }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3759,6 +4281,15 @@ "node": ">= 0.6" } }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -4011,6 +4542,12 @@ "node": ">= 0.6" } }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node_modules/node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", @@ -4219,6 +4756,27 @@ "node": ">=6" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4228,6 +4786,98 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -4255,6 +4905,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4348,6 +5025,19 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -4400,6 +5090,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -4432,6 +5128,27 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -4587,6 +5304,32 @@ "node": ">= 0.8" } }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4623,6 +5366,23 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -4651,6 +5411,23 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4716,6 +5493,30 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4735,6 +5536,20 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4846,6 +5661,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -4959,6 +5783,38 @@ "dev": true, "peer": true }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "node_modules/sqlite3": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", @@ -5035,6 +5891,68 @@ "node": ">=8" } }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5046,6 +5964,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5070,6 +5997,18 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tar": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", @@ -5285,6 +6224,71 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typeorm": { "version": "0.3.15", "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.15.tgz", @@ -5522,6 +6526,21 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -5615,6 +6634,16 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "devOptional": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5652,6 +6681,41 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/services/federation/package.json b/services/federation/package.json index 21a4b66e..d4a28ba2 100644 --- a/services/federation/package.json +++ b/services/federation/package.json @@ -12,10 +12,13 @@ "openapi-bundle": "npx --yes @redocly/cli bundle ./api/openapi.yml --output dist/openapi.json", "watch-openapi": "npx --yes chokidar-cli 'api/**/*.yml' -c 'npm run openapi-bundle'", "watch-rapidoc": "npx --yes browser-sync start --server --startPath 'api/rapidoc.html' --files 'dist/openapi.json'", - "build-generate-code": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service -o src/generated", - "build-compile": "tsc", - "build": "npm run build-generate-code && npm run build-compile", + "build:generate:code": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service -o src/generated", + "build:generate": "npm-run-all build:generate:*", + "build:compile": "tsc", + "build:add-shebang": "bash scripts/add-shebang.sh", + "build": "npm-run-all build:*", "start": "node app/index.js", + "predev": "bash scripts/init-db.sh federation_service service service", "dev": "env-cmd -e development npx nodemon src/index.ts", "format": "npx prettier src --write", "lint": "eslint ." @@ -35,6 +38,7 @@ "env-cmd": "^10.1.0", "eslint": "^8.34.0", "nodemon": "^2.0.19", + "npm-run-all": "^4.1.5", "prettier": "^2.7.1", "ts-node": "^10.9.1", "typescript": "^4.7.3" @@ -50,4 +54,4 @@ "sqlite3": "^5.1.6", "typeorm": "^0.3.15" } -} \ No newline at end of file +} diff --git a/services/federation/scripts/add-shebang.sh b/services/federation/scripts/add-shebang.sh new file mode 120000 index 00000000..b9819153 --- /dev/null +++ b/services/federation/scripts/add-shebang.sh @@ -0,0 +1 @@ +../../../common/node/scripts/add-shebang.sh \ No newline at end of file diff --git a/services/federation/scripts/generate-database-migration.sh b/services/federation/scripts/generate-database-migration.sh new file mode 120000 index 00000000..1891d496 --- /dev/null +++ b/services/federation/scripts/generate-database-migration.sh @@ -0,0 +1 @@ +../../../common/node/scripts/generate-database-migration.sh \ No newline at end of file diff --git a/services/federation/scripts/init-db.sh b/services/federation/scripts/init-db.sh new file mode 120000 index 00000000..547d2439 --- /dev/null +++ b/services/federation/scripts/init-db.sh @@ -0,0 +1 @@ +../../../common/node/scripts/init-db.sh \ No newline at end of file diff --git a/services/federation/src/config.ts b/services/federation/src/config.ts index cf87b82b..a57b2e1c 100644 --- a/services/federation/src/config.ts +++ b/services/federation/src/config.ts @@ -1,5 +1,8 @@ import { logger } from '@crosslab/service-common' import { exit } from 'process' +import { InstitutionModel } from './model' +import { Migrations } from './database/migrations' +import { DataSourceOptions } from 'typeorm' function die(reason: string): string { logger.log('error', reason) @@ -18,3 +21,15 @@ export const config = { process.env.SECURITY_AUDIENCE ?? die('the environment variable SECURITY_AUDIENCE is not defined!'), } + +export const dataSourceConfig: DataSourceOptions = { + type: 'mariadb', + host: process.env.DB_HOST, + port: parseInt(process.env.DB_PORT ?? '3306'), + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + migrations: [...Migrations], + migrationsRun: true, + entities: [InstitutionModel], +} diff --git a/services/federation/src/data_source.ts b/services/federation/src/data_source.ts deleted file mode 100644 index 8a52773a..00000000 --- a/services/federation/src/data_source.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Migrations } from './database/migrations' -import { InstitutionModel } from './model' -import { DataSource } from 'typeorm' - -export const AppDataSource = new DataSource({ - type: 'sqlite', - database: 'db/federation.db', - entities: [InstitutionModel], - migrations: Migrations, - migrationsRun: true, -}) diff --git a/services/federation/src/database/dataSource.ts b/services/federation/src/database/dataSource.ts new file mode 100644 index 00000000..10f3692c --- /dev/null +++ b/services/federation/src/database/dataSource.ts @@ -0,0 +1,4 @@ +import { dataSourceConfig } from '../config' +import { DataSource } from 'typeorm' + +export const AppDataSource = new DataSource(dataSourceConfig) diff --git a/services/federation/src/database/migrations/1684337775585-SetupMigration.ts b/services/federation/src/database/migrations/1684337775585-SetupMigration.ts deleted file mode 100644 index ddb931c8..00000000 --- a/services/federation/src/database/migrations/1684337775585-SetupMigration.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class SetupMigration1684337775585 implements MigrationInterface { - name = 'SetupMigration1684337775585' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "institution_model" ("uuid" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "api" varchar NOT NULL, "apiToken" varchar NOT NULL, "homepage" varchar NOT NULL, "federatedApi" varchar NOT NULL, "deletedAt" datetime)`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP TABLE "institution_model"`); - } - -} diff --git a/services/federation/src/database/migrations/1690372749445-Setup.ts b/services/federation/src/database/migrations/1690372749445-Setup.ts new file mode 100644 index 00000000..5cbedb24 --- /dev/null +++ b/services/federation/src/database/migrations/1690372749445-Setup.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Setup1690372749445 implements MigrationInterface { + name = 'Setup1690372749445' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE \`institution_model\` (\`uuid\` varchar(36) NOT NULL, \`name\` varchar(255) NOT NULL, \`api\` varchar(255) NOT NULL, \`apiToken\` varchar(255) NOT NULL, \`homepage\` varchar(255) NOT NULL, \`federatedApi\` varchar(255) NOT NULL, \`deletedAt\` datetime(6) NULL, PRIMARY KEY (\`uuid\`)) ENGINE=InnoDB`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE \`institution_model\``); + } + +} diff --git a/services/federation/src/database/migrations/index.ts b/services/federation/src/database/migrations/index.ts index 932eae7a..5e47afb4 100644 --- a/services/federation/src/database/migrations/index.ts +++ b/services/federation/src/database/migrations/index.ts @@ -1,3 +1,3 @@ -import { SetupMigration1684337775585 } from './1684337775585-SetupMigration' +import { Setup1690372749445 } from './1690372749445-Setup' -export const Migrations = [SetupMigration1684337775585] +export const Migrations = [Setup1690372749445] diff --git a/services/federation/src/index.ts b/services/federation/src/index.ts index cdf0b053..5a9bc756 100644 --- a/services/federation/src/index.ts +++ b/services/federation/src/index.ts @@ -1,6 +1,5 @@ -#!/usr/bin/env node import { config } from './config' -import { AppDataSource } from './data_source' +import { AppDataSource } from './database/dataSource' import { app } from './generated/index' import { isUserTypeJWT } from './generated/types' import { diff --git a/services/federation/src/operations/institutions.ts b/services/federation/src/operations/institutions.ts index fadb9b3a..622c54de 100644 --- a/services/federation/src/operations/institutions.ts +++ b/services/federation/src/operations/institutions.ts @@ -1,15 +1,21 @@ -import { MissingEntityError, InconsistentDatabaseError } from "@crosslab/service-common" -import { AppDataSource } from "../data_source" -import { getInstitutionsSignature, postInstitutionsSignature, getInstitutionsByInstitutionIdSignature, patchInstitutionsByInstitutionIdSignature, deleteInstitutionsByInstitutionIdSignature } from "../generated/signatures" -import { formatInstitution } from "../methods/format" -import { writeInstitution } from "../methods/write" -import { InstitutionModel } from "../model" +import { MissingEntityError, InconsistentDatabaseError } from '@crosslab/service-common' +import { AppDataSource } from '../database/dataSource' +import { + getInstitutionsSignature, + postInstitutionsSignature, + getInstitutionsByInstitutionIdSignature, + patchInstitutionsByInstitutionIdSignature, + deleteInstitutionsByInstitutionIdSignature, +} from '../generated/signatures' +import { formatInstitution } from '../methods/format' +import { writeInstitution } from '../methods/write' +import { InstitutionModel } from '../model' /** * This function implements the functionality for handling GET requests on /institutions endpoint. * @param _user The user submitting the request. */ - export const getInstitutions: getInstitutionsSignature = async (_user) => { +export const getInstitutions: getInstitutionsSignature = async (_user) => { const institutionRepository = AppDataSource.getRepository(InstitutionModel) const institutions = await institutionRepository.find() return { @@ -112,4 +118,4 @@ export const deleteInstitutionsByInstitutionId: deleteInstitutionsByInstitutionI return { status: 204, } - } \ No newline at end of file + } diff --git a/services/federation/src/operations/proxy.ts b/services/federation/src/operations/proxy.ts index f56fadcf..1042e279 100644 --- a/services/federation/src/operations/proxy.ts +++ b/services/federation/src/operations/proxy.ts @@ -1,4 +1,4 @@ -import { AppDataSource } from '../data_source' +import { AppDataSource } from '../database/dataSource' import { getProxySignature, postProxySignature, diff --git a/services/update/.env-cmdrc b/services/update/.env-cmdrc index 5ac0ea26..6c7055a6 100644 --- a/services/update/.env-cmdrc +++ b/services/update/.env-cmdrc @@ -1,5 +1,21 @@ { "development": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "update_service", + "SECURITY_ISSUER": "http://localhost", + "SECURITY_AUDIENCE": "http://localhost", + "BASE_URL": "http://localhost", + "PORT": "3004" + }, + "database_migration": { + "DB_HOST": "localhost", + "DB_PORT": "3306", + "DB_USERNAME": "service", + "DB_PASSWORD": "service", + "DB_NAME": "database_migration", "SECURITY_ISSUER": "http://localhost", "SECURITY_AUDIENCE": "http://localhost", "BASE_URL": "http://localhost", diff --git a/services/update/package-lock.json b/services/update/package-lock.json index fefcd6ab..1885a3b8 100644 --- a/services/update/package-lock.json +++ b/services/update/package-lock.json @@ -37,6 +37,7 @@ "env-cmd": "^10.1.0", "eslint": "^8.34.0", "nodemon": "^2.0.19", + "npm-run-all": "^4.1.5", "prettier": "^2.7.1", "ts-node": "^10.9.1", "typescript": "^4.7.3" @@ -1781,6 +1782,19 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "devOptional": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1795,6 +1809,26 @@ "node": ">=8" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -1817,6 +1851,18 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/backoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", @@ -2401,6 +2447,22 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2566,6 +2628,99 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "optional": true }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3149,6 +3304,15 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -3214,6 +3378,33 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -3251,18 +3442,35 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3303,6 +3511,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3323,11 +3546,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "optional": true + "devOptional": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -3346,6 +3581,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3355,6 +3599,29 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3366,6 +3633,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -3379,6 +3661,12 @@ "node": "*" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -3534,6 +3822,20 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -3548,6 +3850,38 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3560,6 +3894,61 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3595,6 +3984,18 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "optional": true }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3604,6 +4005,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3613,13 +4029,98 @@ "node": ">=8" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "devOptional": true @@ -3666,6 +4167,12 @@ "node": ">=4" } }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -3731,6 +4238,21 @@ "node": ">= 0.8.0" } }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3850,6 +4372,15 @@ "node": ">= 0.6" } }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -4102,6 +4633,12 @@ "node": ">= 0.6" } }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node_modules/node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", @@ -4310,6 +4847,27 @@ "node": ">=6" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4319,6 +4877,98 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -4346,6 +4996,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4439,6 +5116,19 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -4491,6 +5181,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -4523,6 +5219,27 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -4686,6 +5403,32 @@ "node": ">= 0.8" } }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4722,6 +5465,23 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -4750,6 +5510,23 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4815,6 +5592,30 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4834,6 +5635,20 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4945,6 +5760,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5058,6 +5882,38 @@ "dev": true, "peer": true }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "node_modules/sqlite3": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", @@ -5134,6 +5990,68 @@ "node": ">=8" } }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5145,6 +6063,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5169,6 +6096,18 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tar": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", @@ -5384,6 +6323,71 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typeorm": { "version": "0.3.15", "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.15.tgz", @@ -5621,6 +6625,21 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -5714,6 +6733,16 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "devOptional": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5798,6 +6827,41 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/services/update/package.json b/services/update/package.json index fe9525f1..3845b215 100644 --- a/services/update/package.json +++ b/services/update/package.json @@ -13,10 +13,12 @@ "openapi-bundle": "npx --yes @redocly/cli bundle ./api/openapi.yml --output dist/openapi.json", "watch-openapi": "npx --yes chokidar-cli 'api/**/*.yml' -c 'npm run openapi-bundle'", "watch-rapidoc": "npx --yes browser-sync start --server --startPath 'api/rapidoc.html' --files 'dist/openapi.json'", - "build-generate-code": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service -o src/generated", - "build-compile": "tsc", - "build": "npm run build-generate-code && npm run build-compile", + "build:generate:code": "npx openapi-codegen -i dist/openapi.json -p @cross-lab-project/codegen-typescript-addon:preset:service -o src/generated", + "build:generate": "npm-run-all build:generate:*", + "build:compile": "tsc", + "build": "npm-run-all build:*", "start": "node app/index.js", + "predev": "bash scripts/init-db.sh update_service service service", "dev": "env-cmd -e development npx nodemon src/index.ts", "format": "npx prettier src --write", "lint": "eslint ." @@ -38,6 +40,7 @@ "env-cmd": "^10.1.0", "eslint": "^8.34.0", "nodemon": "^2.0.19", + "npm-run-all": "^4.1.5", "prettier": "^2.7.1", "ts-node": "^10.9.1", "typescript": "^4.7.3" @@ -55,4 +58,4 @@ "typeorm": "^0.3.15", "ws": "^8.8.0" } -} \ No newline at end of file +} diff --git a/services/update/scripts/add-shebang.sh b/services/update/scripts/add-shebang.sh new file mode 120000 index 00000000..b9819153 --- /dev/null +++ b/services/update/scripts/add-shebang.sh @@ -0,0 +1 @@ +../../../common/node/scripts/add-shebang.sh \ No newline at end of file diff --git a/services/update/scripts/generate-database-migration.sh b/services/update/scripts/generate-database-migration.sh new file mode 120000 index 00000000..1891d496 --- /dev/null +++ b/services/update/scripts/generate-database-migration.sh @@ -0,0 +1 @@ +../../../common/node/scripts/generate-database-migration.sh \ No newline at end of file diff --git a/services/update/scripts/init-db.sh b/services/update/scripts/init-db.sh new file mode 120000 index 00000000..547d2439 --- /dev/null +++ b/services/update/scripts/init-db.sh @@ -0,0 +1 @@ +../../../common/node/scripts/init-db.sh \ No newline at end of file diff --git a/services/update/src/config.ts b/services/update/src/config.ts index 5902d37f..48e38391 100644 --- a/services/update/src/config.ts +++ b/services/update/src/config.ts @@ -1,5 +1,8 @@ import { logger } from '@crosslab/service-common' import { exit } from 'process' +import { UpdateInformationModel } from './model' +import { DataSourceOptions } from 'typeorm' +import { Migrations } from './database/migrations' function die(reason: string): string { logger.log('error', reason) @@ -20,3 +23,15 @@ export const config = { process.env.SECURITY_AUDIENCE ?? die('the environment variable SECURITY_AUDIENCE is not define!'), } + +export const dataSourceConfig: DataSourceOptions = { + type: 'mariadb', + host: process.env.DB_HOST, + port: parseInt(process.env.DB_PORT ?? '3306'), + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + migrations: [...Migrations], + migrationsRun: true, + entities: [UpdateInformationModel], +} diff --git a/services/update/src/data_source.ts b/services/update/src/data_source.ts deleted file mode 100644 index 24409de1..00000000 --- a/services/update/src/data_source.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Migrations } from './database/migrations' -import { UpdateInformationModel } from './model' -import { DataSource } from 'typeorm' - -export const AppDataSource = new DataSource({ - type: 'sqlite', - database: 'db/update.db', - entities: [UpdateInformationModel], - migrations: Migrations, - migrationsRun: true, -}) diff --git a/services/update/src/database/dataSource.ts b/services/update/src/database/dataSource.ts new file mode 100644 index 00000000..44202804 --- /dev/null +++ b/services/update/src/database/dataSource.ts @@ -0,0 +1,4 @@ +import { DataSource } from 'typeorm' +import { dataSourceConfig } from '../config' + +export const AppDataSource = new DataSource(dataSourceConfig) diff --git a/services/update/src/database/migrations/1684337905803-SetupMigration.ts b/services/update/src/database/migrations/1684337905803-SetupMigration.ts deleted file mode 100644 index f5d7f8cf..00000000 --- a/services/update/src/database/migrations/1684337905803-SetupMigration.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class SetupMigration1684337905803 implements MigrationInterface { - name = 'SetupMigration1684337905803' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "update_information_model" ("device_id" varchar PRIMARY KEY NOT NULL, "latest_version" varchar NOT NULL, "latest_version_link" varchar NOT NULL)`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP TABLE "update_information_model"`); - } - -} diff --git a/services/update/src/database/migrations/1690373116167-Setup.ts b/services/update/src/database/migrations/1690373116167-Setup.ts new file mode 100644 index 00000000..a5d3495d --- /dev/null +++ b/services/update/src/database/migrations/1690373116167-Setup.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Setup1690373116167 implements MigrationInterface { + name = 'Setup1690373116167' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE \`update_information_model\` (\`device_id\` varchar(255) NOT NULL, \`latest_version\` varchar(255) NOT NULL, \`latest_version_link\` varchar(255) NOT NULL, PRIMARY KEY (\`device_id\`)) ENGINE=InnoDB`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE \`update_information_model\``); + } + +} diff --git a/services/update/src/database/migrations/index.ts b/services/update/src/database/migrations/index.ts index 635265f5..9a269091 100644 --- a/services/update/src/database/migrations/index.ts +++ b/services/update/src/database/migrations/index.ts @@ -1,3 +1,3 @@ -import { SetupMigration1684337905803 } from './1684337905803-SetupMigration' +import { Setup1690373116167 } from './1690373116167-Setup' -export const Migrations = [SetupMigration1684337905803] +export const Migrations = [Setup1690373116167] diff --git a/services/update/src/index.ts b/services/update/src/index.ts index 4254da10..091d513d 100644 --- a/services/update/src/index.ts +++ b/services/update/src/index.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node import { config } from './config' -import { AppDataSource } from './data_source' +import { AppDataSource } from './database/dataSource' import { app } from './generated/index' import { isUserTypeJWT } from './generated/types' import { diff --git a/services/update/src/operations/updates.ts b/services/update/src/operations/updates.ts index c6dd9506..96b89233 100644 --- a/services/update/src/operations/updates.ts +++ b/services/update/src/operations/updates.ts @@ -1,4 +1,4 @@ -import { AppDataSource } from '../data_source' +import { AppDataSource } from '../database/dataSource' import { getUpdatesSignature, deleteUpdatesByDeviceIdSignature,