From 6cf5a3c886c2dd8017c2c852c7c392a690ec525a Mon Sep 17 00:00:00 2001 From: ShikharBhatt Date: Thu, 26 Sep 2024 17:08:17 +0530 Subject: [PATCH] chore: use common db for askar and exchanges api - replace better-sqlite3 with sqlite - rename in-memory-db.ts to db-config.ts - TypeOrmSQLiteModule to accept inMemory boolean param; helps in db initialization for app and unit tests Signed-off-by: ShikharBhatt --- apps/vc-api/package.json | 4 +- apps/vc-api/src/app.module.ts | 2 +- .../src/config/env-vars-validation-schema.ts | 4 +- apps/vc-api/src/credo/credo.service.ts | 9 +- apps/vc-api/src/db-config.ts | 25 ++ apps/vc-api/src/did/did.controller.spec.ts | 4 +- apps/vc-api/src/did/did.service.spec.ts | 4 +- apps/vc-api/src/in-memory-db.ts | 19 - apps/vc-api/src/key/key.service.spec.ts | 4 +- common/config/rush/pnpm-lock.yaml | 392 +++++++++++++++++- 10 files changed, 421 insertions(+), 46 deletions(-) create mode 100644 apps/vc-api/src/db-config.ts delete mode 100644 apps/vc-api/src/in-memory-db.ts diff --git a/apps/vc-api/package.json b/apps/vc-api/package.json index 8f613e1..a85fb2b 100644 --- a/apps/vc-api/package.json +++ b/apps/vc-api/package.json @@ -37,7 +37,6 @@ "rimraf": "^4.0.0", "rxjs": "^7.8.1", "typeorm": "^0.3.17", - "better-sqlite3": "~8.4.0", "did-resolver": "~4.1.0", "class-validator": "~0.14.0", "class-transformer": "~0.5.1", @@ -53,7 +52,8 @@ "@credo-ts/core": "^0.5.3", "@credo-ts/node": "^0.5.3", "@hyperledger/aries-askar-nodejs": "^0.2.1", - "@hyperledger/aries-askar-shared": "^0.2.3" + "@hyperledger/aries-askar-shared": "^0.2.3", + "sqlite3": "~5.1.7" }, "devDependencies": { "@nestjs/cli": "^10.1.0", diff --git a/apps/vc-api/src/app.module.ts b/apps/vc-api/src/app.module.ts index 0926f42..8965b2e 100644 --- a/apps/vc-api/src/app.module.ts +++ b/apps/vc-api/src/app.module.ts @@ -8,7 +8,7 @@ import { ConfigModule } from '@nestjs/config'; import { KeyModule } from './key/key.module'; import { DidModule } from './did/did.module'; import { VcApiModule } from './vc-api/vc-api.module'; -import { TypeOrmSQLiteModule } from './in-memory-db'; +import { TypeOrmSQLiteModule } from './db-config'; import { ServeStaticModule } from '@nestjs/serve-static'; import { join } from 'path'; import { SeederModule } from './seeder/seeder.module'; diff --git a/apps/vc-api/src/config/env-vars-validation-schema.ts b/apps/vc-api/src/config/env-vars-validation-schema.ts index f4ca149..e0c8ae6 100644 --- a/apps/vc-api/src/config/env-vars-validation-schema.ts +++ b/apps/vc-api/src/config/env-vars-validation-schema.ts @@ -4,6 +4,7 @@ */ import * as Joi from 'joi'; +import { homedir } from 'os'; export const envVarsValidationSchema = Joi.object({ NODE_ENV: Joi.string().valid('development', 'production', 'test').default('development'), @@ -12,5 +13,6 @@ export const envVarsValidationSchema = Joi.object({ CREDO_LABEL: Joi.string().default('vc-api-agent'), CREDO_WALLET_ID: Joi.string().default('vc-api-wallet'), CREDO_WALLET_KEY: Joi.string().default('vc-api-wallet-key-0001'), - CREDO_WALLET_DB_TYPE: Joi.string().default('sqlite') + CREDO_WALLET_DB_TYPE: Joi.string().default('sqlite'), + DB_BASE_PATH: Joi.string().default(`${homedir}/.vc-api`) }); diff --git a/apps/vc-api/src/credo/credo.service.ts b/apps/vc-api/src/credo/credo.service.ts index 175f3e3..8697698 100644 --- a/apps/vc-api/src/credo/credo.service.ts +++ b/apps/vc-api/src/credo/credo.service.ts @@ -17,7 +17,12 @@ export class CredoService implements OnModuleInit, OnModuleDestroy { id: this.configService.get('CREDO_WALLET_ID'), key: this.configService.get('CREDO_WALLET_KEY'), storage: { - type: this.configService.get('CREDO_WALLET_DB_TYPE') + type: this.configService.get('CREDO_WALLET_DB_TYPE'), + config: { + path: `${this.configService.get('DB_BASE_PATH')}/${this.configService.get( + 'CREDO_WALLET_ID' + )}/sqlite.db` + } } }; @@ -84,7 +89,7 @@ export class CredoService implements OnModuleInit, OnModuleDestroy { private async cleanup() { if (this.agent.isInitialized) { // close askar agent connection - await this.agent.wallet.close(); + await this.wallet.close(); await this.agent.shutdown(); } } diff --git a/apps/vc-api/src/db-config.ts b/apps/vc-api/src/db-config.ts new file mode 100644 index 0000000..218f776 --- /dev/null +++ b/apps/vc-api/src/db-config.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2021 - 2023 Energy Web Foundation + * SPDX-License-Identifier: Apache-2.0 + */ + +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ConfigModule, ConfigService } from '@nestjs/config'; + +/** + * Inspired by https://dev.to/webeleon/unit-testing-nestjs-with-typeorm-in-memory-l6m + * @param inMemory // default set to false; set to true for unit testing + */ +export const TypeOrmSQLiteModule = (inMemory = false) => + TypeOrmModule.forRootAsync({ + imports: [ConfigModule], + useFactory: async (configService: ConfigService) => ({ + type: 'sqlite', + database: !inMemory ? `${configService.get('DB_BASE_PATH')}/exchanges.db` : ':memory:', + // dropSchema: true, // disabling this option to avoid dropping askar tables + autoLoadEntities: true, // https://docs.nestjs.com/techniques/database#auto-load-entities + synchronize: true, + keepConnectionAlive: true // https://github.com/nestjs/typeorm/issues/61 + }), + inject: [ConfigService] + }); diff --git a/apps/vc-api/src/did/did.controller.spec.ts b/apps/vc-api/src/did/did.controller.spec.ts index 346ba56..b933013 100644 --- a/apps/vc-api/src/did/did.controller.spec.ts +++ b/apps/vc-api/src/did/did.controller.spec.ts @@ -5,7 +5,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { TypeOrmSQLiteModule } from '../in-memory-db'; +import { TypeOrmSQLiteModule } from '../db-config'; import { KeyModule } from '../key/key.module'; import { DIDController } from './did.controller'; import { DIDService } from './did.service'; @@ -21,7 +21,7 @@ describe('DidController', () => { imports: [ KeyModule, CredoModule, - TypeOrmSQLiteModule(), + TypeOrmSQLiteModule(true), TypeOrmModule.forFeature([DIDDocumentEntity, VerificationMethodEntity]) ], controllers: [DIDController], diff --git a/apps/vc-api/src/did/did.service.spec.ts b/apps/vc-api/src/did/did.service.spec.ts index a804fab..33817ac 100644 --- a/apps/vc-api/src/did/did.service.spec.ts +++ b/apps/vc-api/src/did/did.service.spec.ts @@ -6,7 +6,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { TypeOrmModule } from '@nestjs/typeorm'; import { DIDKeyFactory } from '@energyweb/ssi-did'; -import { TypeOrmSQLiteModule } from '../in-memory-db'; +import { TypeOrmSQLiteModule } from '../db-config'; import { KeyModule } from '../key/key.module'; import { KeyService } from '../key/key.service'; import { DIDService } from './did.service'; @@ -26,7 +26,7 @@ describe('DIDService', () => { imports: [ KeyModule, CredoModule, - TypeOrmSQLiteModule(), + TypeOrmSQLiteModule(true), TypeOrmModule.forFeature([DIDDocumentEntity, VerificationMethodEntity]) ], providers: [ diff --git a/apps/vc-api/src/in-memory-db.ts b/apps/vc-api/src/in-memory-db.ts deleted file mode 100644 index a776dd9..0000000 --- a/apps/vc-api/src/in-memory-db.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2021 - 2023 Energy Web Foundation - * SPDX-License-Identifier: Apache-2.0 - */ - -import { TypeOrmModule } from '@nestjs/typeorm'; - -/** - * Inspired by https://dev.to/webeleon/unit-testing-nestjs-with-typeorm-in-memory-l6m - */ -export const TypeOrmSQLiteModule = () => - TypeOrmModule.forRoot({ - type: 'better-sqlite3', - database: ':memory:', - dropSchema: true, - autoLoadEntities: true, // https://docs.nestjs.com/techniques/database#auto-load-entities - synchronize: true, - keepConnectionAlive: true // https://github.com/nestjs/typeorm/issues/61 - }); diff --git a/apps/vc-api/src/key/key.service.spec.ts b/apps/vc-api/src/key/key.service.spec.ts index 6cd3bfc..39434d8 100644 --- a/apps/vc-api/src/key/key.service.spec.ts +++ b/apps/vc-api/src/key/key.service.spec.ts @@ -6,7 +6,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { TypeOrmModule } from '@nestjs/typeorm'; import { JWK } from 'jose'; -import { TypeOrmSQLiteModule } from '../in-memory-db'; +import { TypeOrmSQLiteModule } from '../db-config'; import { KeyPair } from './key-pair.entity'; import { KeyService } from './key.service'; import { CredoModule } from '../credo/credo.module'; @@ -22,7 +22,7 @@ describe('KeyService', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - imports: [TypeOrmSQLiteModule(), TypeOrmModule.forFeature([KeyPair]), CredoModule], + imports: [TypeOrmSQLiteModule(true), TypeOrmModule.forFeature([KeyPair]), CredoModule], providers: [ KeyService, { diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index fca94ee..8a39eff 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -66,9 +66,6 @@ importers: axios: specifier: ~1.4.0 version: 1.4.0 - better-sqlite3: - specifier: ~8.4.0 - version: 8.4.0 class-transformer: specifier: ~0.5.1 version: 0.5.1 @@ -93,12 +90,15 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.1 + sqlite3: + specifier: ~5.1.7 + version: 5.1.7 swagger-ui-express: specifier: ~4.6.3 version: 4.6.3(express@4.19.2) typeorm: specifier: ^0.3.17 - version: 0.3.20(better-sqlite3@8.4.0)(ts-node@10.9.2) + version: 0.3.20(sqlite3@5.1.7)(ts-node@10.9.2) uuid: specifier: ~9.0.0 version: 9.0.1 @@ -3100,6 +3100,12 @@ packages: engines: {node: '>=14'} dev: false + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + requiresBuild: true + dev: false + optional: true + /@graphql-typed-document-node/core@3.2.0(graphql@15.8.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -3772,7 +3778,7 @@ packages: '@nestjs/core': 10.4.1(@nestjs/common@10.4.1)(@nestjs/platform-express@10.4.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) reflect-metadata: 0.1.14 rxjs: 7.8.1 - typeorm: 0.3.20(better-sqlite3@8.4.0)(ts-node@10.9.2) + typeorm: 0.3.20(sqlite3@5.1.7)(ts-node@10.9.2) uuid: 9.0.1 dev: false @@ -3807,6 +3813,15 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + requiresBuild: true + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.3 + dev: false + optional: true + /@npmcli/fs@3.1.1: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3815,6 +3830,17 @@ packages: dev: false optional: true + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + requiresBuild: true + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: false + optional: true + /@nuxtjs/opencollective@0.3.2: resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -4719,6 +4745,13 @@ packages: resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} dev: false + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + requiresBuild: true + dev: false + optional: true + /@trust/keyto@1.0.1: resolution: {integrity: sha512-OXTmKkrnkwktCX86XA7eWs1TQ6u64enm0syzAfNhjigbuGLy5aLhbhRYWtjt4zzdG/irWudluheRZ9Ic9pCwsA==} dependencies: @@ -5312,9 +5345,19 @@ packages: - supports-color dev: false + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + requiresBuild: true + dependencies: + humanize-ms: 1.2.1 + dev: false + optional: true + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + requiresBuild: true dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 @@ -5479,6 +5522,17 @@ packages: readable-stream: 3.6.2 dev: false + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + requiresBuild: true + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + optional: true + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -5850,14 +5904,6 @@ packages: dev: false optional: true - /better-sqlite3@8.4.0: - resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.2 - dev: false - /big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -6052,6 +6098,32 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + /cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + requiresBuild: true + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + dev: false + optional: true + /cacache@18.0.4: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -6235,6 +6307,7 @@ packages: /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + requiresBuild: true dev: false optional: true @@ -6972,6 +7045,14 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: false + optional: true + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -7010,6 +7091,12 @@ packages: dev: false optional: true + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + requiresBuild: true + dev: false + optional: true + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -8077,6 +8164,23 @@ packages: wide-align: 1.1.5 dev: false + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + requiresBuild: true + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + optional: true + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -8400,6 +8504,12 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + requiresBuild: true + dev: false + optional: true + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -8410,6 +8520,19 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + requiresBuild: true + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -8424,12 +8547,29 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + requiresBuild: true + dependencies: + ms: 2.1.3 + dev: false + optional: true + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: false + optional: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -8478,6 +8618,13 @@ packages: /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + requiresBuild: true dev: false optional: true @@ -8562,6 +8709,16 @@ packages: dev: false optional: true + /ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + requiresBuild: true + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + dev: false + optional: true + /ip-regex@2.1.0: resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} @@ -8703,6 +8860,12 @@ packages: dev: false optional: true + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + requiresBuild: true + dev: false + optional: true + /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -9398,6 +9561,12 @@ packages: dependencies: argparse: 2.0.1 + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + requiresBuild: true + dev: false + optional: true + /jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} dev: false @@ -9880,6 +10049,32 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + /make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + requiresBuild: true + dependencies: + agentkeepalive: 4.5.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -10272,6 +10467,15 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + dev: false + optional: true + /minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} @@ -10280,6 +10484,19 @@ packages: dev: false optional: true + /minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: false + optional: true + /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} @@ -10296,6 +10513,15 @@ packages: dev: false optional: true + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + dev: false + optional: true + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -10462,6 +10688,10 @@ packages: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} dev: false + /node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + dev: false + /node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -10522,6 +10752,27 @@ packages: hasBin: true dev: false + /node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + requiresBuild: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -10580,6 +10831,19 @@ packages: set-blocking: 2.0.0 dev: false + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + requiresBuild: true + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: false + optional: true + /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} dev: false @@ -11081,6 +11345,22 @@ packages: dev: false optional: true + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + requiresBuild: true + dev: false + optional: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: false + optional: true + /promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: @@ -11564,6 +11844,13 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + requiresBuild: true + dev: false + optional: true + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -11867,6 +12154,36 @@ packages: dev: false optional: true + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + requiresBuild: true + dev: false + optional: true + + /socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + requiresBuild: true + dependencies: + agent-base: 6.0.2 + debug: 4.3.6 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + requiresBuild: true + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + dev: false + optional: true + /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -11916,6 +12233,26 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + requiresBuild: true + dev: false + optional: true + + /sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.2 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - supports-color + dev: false + /ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -11924,6 +12261,15 @@ packages: dev: false optional: true + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + dev: false + optional: true + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -12716,7 +13062,7 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - /typeorm@0.3.20(better-sqlite3@8.4.0)(ts-node@10.9.2): + /typeorm@0.3.20(sqlite3@5.1.7)(ts-node@10.9.2): resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} engines: {node: '>=16.13.0'} hasBin: true @@ -12776,7 +13122,6 @@ packages: dependencies: '@sqltools/formatter': 1.2.5 app-root-path: 3.1.0 - better-sqlite3: 8.4.0 buffer: 6.0.3 chalk: 4.1.2 cli-highlight: 2.1.11 @@ -12787,6 +13132,7 @@ packages: mkdirp: 2.1.6 reflect-metadata: 0.2.2 sha.js: 2.4.11 + sqlite3: 5.1.7 ts-node: 10.9.2(@types/node@20.16.1)(typescript@4.9.5) tslib: 2.6.3 uuid: 9.0.1 @@ -12873,6 +13219,14 @@ packages: dev: false optional: true + /unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + requiresBuild: true + dependencies: + unique-slug: 2.0.2 + dev: false + optional: true + /unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -12881,6 +13235,14 @@ packages: dev: false optional: true + /unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + requiresBuild: true + dependencies: + imurmurhash: 0.1.4 + dev: false + optional: true + /unique-slug@4.0.0: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}