From 53d4dd29b6db4a7c62a71970cd2cadf9a42535df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0vanda?= <46406259+Papooch@users.noreply.github.com> Date: Mon, 22 Jan 2024 20:59:04 +0100 Subject: [PATCH] feat: add Knex transactional adapter (#107) --- .../01-transactional/02-knex-adapter.md | 95 ++++ .../01-transactional/index.md | 3 +- .../transactional-adapter-knex/.gitignore | 1 + .../transactional-adapter-knex/README.md | 5 + .../transactional-adapter-knex/jest.config.js | 17 + .../transactional-adapter-knex/package.json | 67 +++ .../transactional-adapter-knex/src/index.ts | 1 + .../src/lib/transactional-adapter-knex.ts | 33 ++ .../test/docker-compose.yml | 10 + .../test/transactional-adapter-knex.spec.ts | 181 +++++++ .../transactional-adapter-knex/tsconfig.json | 8 + tsconfig.json | 5 +- yarn.lock | 511 +++++++++++++++++- 13 files changed, 921 insertions(+), 16 deletions(-) create mode 100644 docs/docs/06_plugins/01_available-plugins/01-transactional/02-knex-adapter.md create mode 100644 packages/transactional-adapters/transactional-adapter-knex/.gitignore create mode 100644 packages/transactional-adapters/transactional-adapter-knex/README.md create mode 100644 packages/transactional-adapters/transactional-adapter-knex/jest.config.js create mode 100644 packages/transactional-adapters/transactional-adapter-knex/package.json create mode 100644 packages/transactional-adapters/transactional-adapter-knex/src/index.ts create mode 100644 packages/transactional-adapters/transactional-adapter-knex/src/lib/transactional-adapter-knex.ts create mode 100644 packages/transactional-adapters/transactional-adapter-knex/test/docker-compose.yml create mode 100644 packages/transactional-adapters/transactional-adapter-knex/test/transactional-adapter-knex.spec.ts create mode 100644 packages/transactional-adapters/transactional-adapter-knex/tsconfig.json diff --git a/docs/docs/06_plugins/01_available-plugins/01-transactional/02-knex-adapter.md b/docs/docs/06_plugins/01_available-plugins/01-transactional/02-knex-adapter.md new file mode 100644 index 0000000..13b54d1 --- /dev/null +++ b/docs/docs/06_plugins/01_available-plugins/01-transactional/02-knex-adapter.md @@ -0,0 +1,95 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Knex adapter + +## Installation + + + + +```bash +npm install @nestjs-cls/transactional-adapter-knex +``` + + + + +```bash +yarn add @nestjs-cls/transactional-adapter-knex +``` + + + + +```bash +pnpm add @nestjs-cls/transactional-adapter-knex +``` + + + + +## Registration + +```ts +ClsModule.forRoot({ + plugins: [ + new ClsPluginTransactional({ + imports: [ + // module in which the Knex is provided + KnexModule + ], + adapter: new TransactionalAdapterKnex({ + // the injection token of the Knex client + knexInstanceToken: KNEX, + }), + }), + ], +}), +``` + +## Typing & usage + +The `tx` property on the `TransactionHost` is typed as `Knex`. + +## Example + +```ts title="user.service.ts" +@Injectable() +class UserService { + constructor(private readonly userRepository: UserRepository) {} + + @Transactional() + async runTransaction() { + // highlight-start + // both methods are executed in the same transaction + const user = await this.userRepository.createUser('John'); + const foundUser = await this.userRepository.getUserById(r1.id); + // highlight-end + assert(foundUser.id === user.id); + } +} +``` + +```ts title="user.repository.ts" +@Injectable() +class UserRepository { + constructor( + private readonly txHost: TransactionHost, + ) {} + + async getUserById(id: number) { + // highlight-start + // txHost.tx is typed as Knex + return this.txHost.tx('user').where({ id }).first(); + // highlight-end + } + + async createUser(name: string) { + return this.txHost + .tx('user') + .insert({ name: name, email: `${name}@email.com` }) + .returning('*'); + } +} +``` diff --git a/docs/docs/06_plugins/01_available-plugins/01-transactional/index.md b/docs/docs/06_plugins/01_available-plugins/01-transactional/index.md index 1ec6e23..bd586ca 100644 --- a/docs/docs/06_plugins/01_available-plugins/01-transactional/index.md +++ b/docs/docs/06_plugins/01_available-plugins/01-transactional/index.md @@ -38,7 +38,8 @@ The plugin works in conjunction with various adapters that provide the actual tr Adapters for the following libraries are available: -- Prisma (see [prisma-adapter](./01-prisma-adapter.md)) +- Prisma (see [@nestjs-cls/transactional-adapter-prisma](./01-prisma-adapter.md)) +- Knex (see [@nestjs-cls/transactional-adapter-knex](./02-knex-adapter.md)) Adapters _will not_ be implemented for the following libraries: diff --git a/packages/transactional-adapters/transactional-adapter-knex/.gitignore b/packages/transactional-adapters/transactional-adapter-knex/.gitignore new file mode 100644 index 0000000..884e3de --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/.gitignore @@ -0,0 +1 @@ +test.db \ No newline at end of file diff --git a/packages/transactional-adapters/transactional-adapter-knex/README.md b/packages/transactional-adapters/transactional-adapter-knex/README.md new file mode 100644 index 0000000..2c5eecc --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/README.md @@ -0,0 +1,5 @@ +# @nestjs-cls/transactional-adapter-prisma + +Pg (node-postgres) adapter for the `@nestjs-cls/transactional` plugin. + +### ➡️ [Go to the documentation website](https://papooch.github.io/nestjs-cls/plugins/available-plugins/transactional) 📖 diff --git a/packages/transactional-adapters/transactional-adapter-knex/jest.config.js b/packages/transactional-adapters/transactional-adapter-knex/jest.config.js new file mode 100644 index 0000000..61cb57e --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/jest.config.js @@ -0,0 +1,17 @@ +module.exports = { + moduleFileExtensions: ['js', 'json', 'ts'], + rootDir: '.', + testRegex: '.*\\.spec\\.ts$', + transform: { + '^.+\\.ts$': 'ts-jest', + }, + collectCoverageFrom: ['src/**/*.ts'], + coverageDirectory: '../coverage', + testEnvironment: 'node', + globals: { + 'ts-jest': { + isolatedModules: true, + maxWorkers: 1, + }, + }, +}; diff --git a/packages/transactional-adapters/transactional-adapter-knex/package.json b/packages/transactional-adapters/transactional-adapter-knex/package.json new file mode 100644 index 0000000..bf54451 --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/package.json @@ -0,0 +1,67 @@ +{ + "name": "@nestjs-cls/transactional-adapter-knex", + "version": "1.0.0", + "description": "A Knex adapter for @nestjs-cls/transactional", + "author": "papooch", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Papooch/nestjs-cls.git" + }, + "homepage": "https://papooch.github.io/nestjs-cls/", + "keywords": [ + "nest", + "nestjs", + "cls", + "continuation-local-storage", + "als", + "AsyncLocalStorage", + "async_hooks", + "request context", + "async context" + ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist/src/**/!(*.spec).d.ts", + "dist/src/**/!(*.spec).js" + ], + "scripts": { + "prepack": "cp ../../../LICENSE ./LICENSE", + "prebuild": "rimraf dist", + "build": "tsc", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage" + }, + "peerDependencies": { + "@nestjs-cls/transactional": "workspace:^1", + "knex": "^3", + "nestjs-cls": "workspace:^4" + }, + "devDependencies": { + "@nestjs/cli": "^10.0.2", + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/testing": "^10.0.0", + "@types/jest": "^28.1.2", + "@types/node": "^18.0.0", + "jest": "^28.1.1", + "knex": "^3.1.0", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.5.5", + "sqlite3": "^5.1.7", + "ts-jest": "^28.0.5", + "ts-loader": "^9.3.0", + "ts-node": "^10.8.1", + "tsconfig-paths": "^4.0.0", + "typescript": "~4.8.0" + } +} \ No newline at end of file diff --git a/packages/transactional-adapters/transactional-adapter-knex/src/index.ts b/packages/transactional-adapters/transactional-adapter-knex/src/index.ts new file mode 100644 index 0000000..c5026f1 --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/src/index.ts @@ -0,0 +1 @@ +export * from './lib/transactional-adapter-knex'; diff --git a/packages/transactional-adapters/transactional-adapter-knex/src/lib/transactional-adapter-knex.ts b/packages/transactional-adapters/transactional-adapter-knex/src/lib/transactional-adapter-knex.ts new file mode 100644 index 0000000..39a3bc3 --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/src/lib/transactional-adapter-knex.ts @@ -0,0 +1,33 @@ +import { TransactionalAdapter } from '@nestjs-cls/transactional'; +import { Knex } from 'knex'; + +export interface KnexTransactionalAdapterOptions { + /** + * The injection token for the Knex instance. + */ + knexInstanceToken: any; +} + +export class TransactionalAdapterKnex + implements TransactionalAdapter +{ + connectionToken: any; + + constructor(options: KnexTransactionalAdapterOptions) { + this.connectionToken = options.knexInstanceToken; + } + + optionsFactory = (knexInstance: Knex) => ({ + wrapWithTransaction: async ( + options: Knex.TransactionConfig, + fn: (...args: any[]) => Promise, + setClient: (client?: Knex) => void, + ) => { + return knexInstance.transaction((trx) => { + setClient(trx); + return fn(); + }, options); + }, + getFallbackInstance: () => knexInstance, + }); +} diff --git a/packages/transactional-adapters/transactional-adapter-knex/test/docker-compose.yml b/packages/transactional-adapters/transactional-adapter-knex/test/docker-compose.yml new file mode 100644 index 0000000..d28f3da --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/test/docker-compose.yml @@ -0,0 +1,10 @@ +services: + db: + image: postgres:15 + ports: + - 5432:5432 + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + \ No newline at end of file diff --git a/packages/transactional-adapters/transactional-adapter-knex/test/transactional-adapter-knex.spec.ts b/packages/transactional-adapters/transactional-adapter-knex/test/transactional-adapter-knex.spec.ts new file mode 100644 index 0000000..0c05cf0 --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/test/transactional-adapter-knex.spec.ts @@ -0,0 +1,181 @@ +import { + ClsPluginTransactional, + Transactional, + TransactionHost, +} from '@nestjs-cls/transactional'; +import { Inject, Injectable, Module } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { ClsModule } from 'nestjs-cls'; +import Knex from 'knex'; +import { TransactionalAdapterKnex } from '../src'; + +const KNEX = 'KNEX'; + +@Injectable() +class UserRepository { + constructor( + private readonly txHost: TransactionHost, + ) {} + + async getUserById(id: number) { + return this.txHost.tx('user').where({ id }).first(); + } + + async createUser(name: string) { + const created = await this.txHost + .tx('user') + .insert({ name: name, email: `${name}@email.com` }) + .returning('*'); + return created[0] ?? null; + } +} + +@Injectable() +class UserService { + constructor( + private readonly userRepository: UserRepository, + private readonly txHost: TransactionHost, + @Inject(KNEX) + private readonly knex: Knex.Knex, + ) {} + + @Transactional() + async transactionWithDecorator() { + const r1 = await this.userRepository.createUser('John'); + const r2 = await this.userRepository.getUserById(r1.id); + return { r1, r2 }; + } + + @Transactional({ + isolationLevel: 'serializable', + }) + async transactionWithDecoratorWithOptions() { + const r1 = await this.userRepository.createUser('James'); + const r2 = + (await this.knex('user').where({ id: r1.id }).first()) ?? null; + const r3 = await this.userRepository.getUserById(r1.id); + return { r1, r2, r3 }; + } + + async transactionWithFunctionWrapper() { + return this.txHost.withTransaction( + { + isolationLevel: 'serializable', + }, + async () => { + const r1 = await this.userRepository.createUser('Joe'); + const r2 = + (await this.knex('user').where({ id: r1.id }).first()) ?? + null; + const r3 = await this.userRepository.getUserById(r1.id); + return { r1, r2, r3 }; + }, + ); + } + + @Transactional() + async transactionWithDecoratorError() { + await this.userRepository.createUser('Nobody'); + throw new Error('Rollback'); + } +} + +const knex = Knex({ + client: 'sqlite', + connection: { + filename: 'test.db', + }, + useNullAsDefault: true, + pool: { min: 1, max: 2 }, +}); + +@Module({ + providers: [ + { + provide: KNEX, + useValue: knex, + }, + ], + exports: [KNEX], +}) +class KnexModule {} + +@Module({ + imports: [ + KnexModule, + ClsModule.forRoot({ + plugins: [ + new ClsPluginTransactional({ + imports: [KnexModule], + adapter: new TransactionalAdapterKnex({ + knexInstanceToken: KNEX, + }), + }), + ], + }), + ], + providers: [UserService, UserRepository], +}) +class AppModule {} + +describe('Transactional', () => { + let module: TestingModule; + let callingService: UserService; + + beforeAll(async () => { + await knex.schema.dropTableIfExists('user'); + await knex.schema.createTable('user', (table) => { + table.increments('id'); + table.string('name'); + table.string('email'); + }); + }); + + beforeEach(async () => { + module = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + await module.init(); + callingService = module.get(UserService); + }); + + afterAll(async () => { + await knex.destroy(); + }); + + describe('TransactionalAdapterKnex', () => { + it('should run a transaction with the default options with a decorator', async () => { + const { r1, r2 } = await callingService.transactionWithDecorator(); + expect(r1).toEqual(r2); + const users = await knex('user'); + expect(users).toEqual(expect.arrayContaining([r1])); + }); + + it('should run a transaction with the specified options with a decorator', async () => { + const { r1, r2, r3 } = + await callingService.transactionWithDecoratorWithOptions(); + expect(r1).toEqual(r3); + expect(r2).toBeNull(); + const users = await knex('user'); + expect(users).toEqual(expect.arrayContaining([r1])); + }); + it('should run a transaction with the specified options with a function wrapper', async () => { + const { r1, r2, r3 } = + await callingService.transactionWithFunctionWrapper(); + expect(r1).toEqual(r3); + expect(r2).toBeNull(); + const users = await knex('user'); + expect(users).toEqual(expect.arrayContaining([r1])); + }); + + it('should rollback a transaction on error', async () => { + await expect( + callingService.transactionWithDecoratorError(), + ).rejects.toThrow(new Error('Rollback')); + const users = await knex('user'); + expect(users).toEqual( + expect.not.arrayContaining([{ name: 'Nobody' }]), + ); + }); + }); +}); diff --git a/packages/transactional-adapters/transactional-adapter-knex/tsconfig.json b/packages/transactional-adapters/transactional-adapter-knex/tsconfig.json new file mode 100644 index 0000000..bbc28fb --- /dev/null +++ b/packages/transactional-adapters/transactional-adapter-knex/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src/**/*.ts", "test/**/*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json index 1e036ee..d181c78 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,8 +28,11 @@ { "path": "packages/transactional" }, + { + "path": "packages/transactional-adapters/transactional-adapter-knex" + }, { "path": "packages/transactional-adapters/transactional-adapter-prisma" } ] -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 5d27887..b4fad24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3886,6 +3886,13 @@ __metadata: languageName: node linkType: hard +"@gar/promisify@npm:^1.0.1": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 0b3c9958d3cd17f4add3574975e3115ae05dc7f1298a60810414b16f6f558c137b5fb3cd3905df380bacfd955ec13f67c1e6710cbb5c246a7e8d65a8289b2bff + languageName: node + linkType: hard + "@goldstack/utils-typescript-references@npm:^0.3.9": version: 0.3.9 resolution: "@goldstack/utils-typescript-references@npm:0.3.9" @@ -4645,6 +4652,34 @@ __metadata: languageName: node linkType: hard +"@nestjs-cls/transactional-adapter-knex@workspace:packages/transactional-adapters/transactional-adapter-knex": + version: 0.0.0-use.local + resolution: "@nestjs-cls/transactional-adapter-knex@workspace:packages/transactional-adapters/transactional-adapter-knex" + dependencies: + "@nestjs/cli": "npm:^10.0.2" + "@nestjs/common": "npm:^10.0.0" + "@nestjs/core": "npm:^10.0.0" + "@nestjs/testing": "npm:^10.0.0" + "@types/jest": "npm:^28.1.2" + "@types/node": "npm:^18.0.0" + jest: "npm:^28.1.1" + knex: "npm:^3.1.0" + reflect-metadata: "npm:^0.1.13" + rimraf: "npm:^3.0.2" + rxjs: "npm:^7.5.5" + sqlite3: "npm:^5.1.7" + ts-jest: "npm:^28.0.5" + ts-loader: "npm:^9.3.0" + ts-node: "npm:^10.8.1" + tsconfig-paths: "npm:^4.0.0" + typescript: "npm:~4.8.0" + peerDependencies: + "@nestjs-cls/transactional": "workspace:^1" + knex: ^3 + nestjs-cls: "workspace:^4" + languageName: unknown + linkType: soft + "@nestjs-cls/transactional-adapter-prisma@workspace:packages/transactional-adapters/transactional-adapter-prisma": version: 0.0.0-use.local resolution: "@nestjs-cls/transactional-adapter-prisma@workspace:packages/transactional-adapters/transactional-adapter-prisma" @@ -4667,9 +4702,9 @@ __metadata: tsconfig-paths: "npm:^4.0.0" typescript: "npm:~4.8.0" peerDependencies: - "@nestjs-cls/transactional": "workspace:^1.0.1" + "@nestjs-cls/transactional": "workspace:^1" "@prisma/client": "> 4 < 6" - nestjs-cls: "workspace:^4.0.1" + nestjs-cls: "workspace:^4" prisma: "> 4 < 6" languageName: unknown linkType: soft @@ -4697,7 +4732,7 @@ __metadata: peerDependencies: "@nestjs/common": "> 7.0.0 < 11" "@nestjs/core": "> 7.0.0 < 11" - nestjs-cls: "workspace:^4.0.1" + nestjs-cls: "workspace:^4" reflect-metadata: "*" rxjs: ">= 7" languageName: unknown @@ -5013,6 +5048,16 @@ __metadata: languageName: node linkType: hard +"@npmcli/fs@npm:^1.0.0": + version: 1.1.1 + resolution: "@npmcli/fs@npm:1.1.1" + dependencies: + "@gar/promisify": "npm:^1.0.1" + semver: "npm:^7.3.5" + checksum: 4143c317a7542af9054018b71601e3c3392e6704e884561229695f099a71336cbd580df9a9ffb965d0024bf0ed593189ab58900fd1714baef1c9ee59c738c3e2 + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": version: 3.1.0 resolution: "@npmcli/fs@npm:3.1.0" @@ -5022,6 +5067,16 @@ __metadata: languageName: node linkType: hard +"@npmcli/move-file@npm:^1.0.1": + version: 1.1.2 + resolution: "@npmcli/move-file@npm:1.1.2" + dependencies: + mkdirp: "npm:^1.0.4" + rimraf: "npm:^3.0.2" + checksum: 02e946f3dafcc6743132fe2e0e2b585a96ca7265653a38df5a3e53fcf26c7c7a57fc0f861d7c689a23fdb6d6836c7eea5050c8086abf3c994feb2208d1514ff0 + languageName: node + linkType: hard + "@nuxtjs/opencollective@npm:0.3.2": version: 0.3.2 resolution: "@nuxtjs/opencollective@npm:0.3.2" @@ -5566,6 +5621,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/once@npm:1": + version: 1.1.2 + resolution: "@tootallnate/once@npm:1.1.2" + checksum: 8fe4d006e90422883a4fa9339dd05a83ff626806262e1710cee5758d493e8cbddf2db81c0e4690636dc840b02c9fda62877866ea774ebd07c1777ed5fafbdec6 + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -7303,6 +7365,15 @@ __metadata: languageName: node linkType: hard +"agentkeepalive@npm:^4.1.3": + version: 4.5.0 + resolution: "agentkeepalive@npm:4.5.0" + dependencies: + humanize-ms: "npm:^1.2.1" + checksum: 394ea19f9710f230722996e156607f48fdf3a345133b0b1823244b7989426c16019a428b56c82d3eabef616e938812981d9009f4792ecc66bd6a59e991c62612 + languageName: node + linkType: hard + "agentkeepalive@npm:^4.2.1": version: 4.3.0 resolution: "agentkeepalive@npm:4.3.0" @@ -7976,6 +8047,15 @@ __metadata: languageName: node linkType: hard +"bindings@npm:^1.5.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba + languageName: node + linkType: hard + "bl@npm:^4.0.3, bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -8209,6 +8289,32 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^15.2.0": + version: 15.3.0 + resolution: "cacache@npm:15.3.0" + dependencies: + "@npmcli/fs": "npm:^1.0.0" + "@npmcli/move-file": "npm:^1.0.1" + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + glob: "npm:^7.1.4" + infer-owner: "npm:^1.0.4" + lru-cache: "npm:^6.0.0" + minipass: "npm:^3.1.1" + minipass-collect: "npm:^1.0.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.2" + mkdirp: "npm:^1.0.3" + p-map: "npm:^4.0.0" + promise-inflight: "npm:^1.0.1" + rimraf: "npm:^3.0.2" + ssri: "npm:^8.0.1" + tar: "npm:^6.0.2" + unique-filename: "npm:^1.1.1" + checksum: 886fcc0acc4f6fd5cd142d373d8276267bc6d655d7c4ce60726fbbec10854de3395ee19bbf9e7e73308cdca9fdad0ad55060ff3bd16c6d4165c5b8d21515e1d8 + languageName: node + linkType: hard + "cacache@npm:^17.0.0": version: 17.1.3 resolution: "cacache@npm:17.1.3" @@ -8493,6 +8599,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -8772,6 +8885,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:2.0.19": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 2bcc9134095750fece6e88167011499b964b78bf0ea953469130ddb1dba3c8fe6c03debb0ae181e710e2be10900d117460f980483a7df4ba4a1bac3b182ecb64 + languageName: node + linkType: hard + "colorette@npm:^2.0.10": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -9473,7 +9593,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -9697,6 +9817,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.0": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: a9f4ffcd2701525c589617d98afe5a5d0676c8ea82bcc4ed6f3747241b79f781d36437c59a5e855254c864d36a3e9f8276568b6b531c28d6e53b093a15703f11 + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -10050,7 +10177,7 @@ __metadata: languageName: node linkType: hard -"encoding@npm:^0.1.13": +"encoding@npm:^0.1.12, encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: @@ -10291,6 +10418,13 @@ __metadata: languageName: node linkType: hard +"esm@npm:^3.2.25": + version: 3.2.25 + resolution: "esm@npm:3.2.25" + checksum: 8e60e8075506a7ce28681c30c8f54623fe18a251c364cd481d86719fc77f58aa055b293d80632d9686d5408aaf865ffa434897dc9fd9153c8b3f469fad23f094 + languageName: node + linkType: hard + "espree@npm:^9.6.0": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -10512,6 +10646,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + "expect@npm:^28.0.0, expect@npm:^28.1.3": version: 28.1.3 resolution: "expect@npm:28.1.3" @@ -10855,6 +10996,13 @@ __metadata: languageName: node linkType: hard +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: 3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 + languageName: node + linkType: hard + "filesize@npm:^8.0.6": version: 8.0.7 resolution: "filesize@npm:8.0.7" @@ -11319,6 +11467,13 @@ __metadata: languageName: node linkType: hard +"getopts@npm:2.3.0": + version: 2.3.0 + resolution: "getopts@npm:2.3.0" + checksum: edbcbd7020e9d87dc41e4ad9add5eb3873ae61339a62431bd92a461be2c0eaa9ec33b6fd0d67fa1b44feedffcf1cf28d6f9dbdb7d604cb1617eaba146a33cbca + languageName: node + linkType: hard + "git-up@npm:^7.0.0": version: 7.0.0 resolution: "git-up@npm:7.0.0" @@ -11338,6 +11493,13 @@ __metadata: languageName: node linkType: hard +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + "github-slugger@npm:^1.5.0": version: 1.5.0 resolution: "github-slugger@npm:1.5.0" @@ -12182,7 +12344,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc @@ -12228,6 +12390,17 @@ __metadata: languageName: node linkType: hard +"http-proxy-agent@npm:^4.0.1": + version: 4.0.1 + resolution: "http-proxy-agent@npm:4.0.1" + dependencies: + "@tootallnate/once": "npm:1" + agent-base: "npm:6" + debug: "npm:4" + checksum: 4fa4774d65b5331814b74ac05cefea56854fc0d5989c80b13432c1b0d42a14c9f4342ca3ad9f0359a52e78da12b1744c9f8a28e50042136ea9171675d972a5fd + languageName: node + linkType: hard + "http-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "http-proxy-agent@npm:5.0.0" @@ -12430,6 +12603,13 @@ __metadata: languageName: node linkType: hard +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: a7b241e3149c26e37474e3435779487f42f36883711f198c45794703c7556bc38af224088bd4d1a221a45b8208ae2c2bcf86200383621434d0c099304481c5b9 + languageName: node + linkType: hard + "infima@npm:0.2.0-alpha.43": version: 0.2.0-alpha.43 resolution: "infima@npm:0.2.0-alpha.43" @@ -13752,6 +13932,45 @@ __metadata: languageName: node linkType: hard +"knex@npm:^3.1.0": + version: 3.1.0 + resolution: "knex@npm:3.1.0" + dependencies: + colorette: "npm:2.0.19" + commander: "npm:^10.0.0" + debug: "npm:4.3.4" + escalade: "npm:^3.1.1" + esm: "npm:^3.2.25" + get-package-type: "npm:^0.1.0" + getopts: "npm:2.3.0" + interpret: "npm:^2.2.0" + lodash: "npm:^4.17.21" + pg-connection-string: "npm:2.6.2" + rechoir: "npm:^0.8.0" + resolve-from: "npm:^5.0.0" + tarn: "npm:^3.0.2" + tildify: "npm:2.0.0" + peerDependenciesMeta: + better-sqlite3: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + sqlite3: + optional: true + tedious: + optional: true + bin: + knex: bin/cli.js + checksum: d8a1f99fad143c6057e94759b2ae700ae661a0b0b2385f643011962ef501dcc7b32cfdb5bda66ef81283ca56f13630f47691c579ce66ad0e8128e209533c3785 + languageName: node + linkType: hard + "latest-version@npm:^7.0.0": version: 7.0.0 resolution: "latest-version@npm:7.0.0" @@ -14097,6 +14316,30 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^9.1.0": + version: 9.1.0 + resolution: "make-fetch-happen@npm:9.1.0" + dependencies: + agentkeepalive: "npm:^4.1.3" + cacache: "npm:^15.2.0" + http-cache-semantics: "npm:^4.1.0" + http-proxy-agent: "npm:^4.0.1" + https-proxy-agent: "npm:^5.0.0" + is-lambda: "npm:^1.0.1" + lru-cache: "npm:^6.0.0" + minipass: "npm:^3.1.3" + minipass-collect: "npm:^1.0.2" + minipass-fetch: "npm:^1.3.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.2" + promise-retry: "npm:^2.0.1" + socks-proxy-agent: "npm:^6.0.0" + ssri: "npm:^8.0.0" + checksum: 2c737faf6a7f67077679da548b5bfeeef890595bf8c4323a1f76eae355d27ebb33dcf9cf1a673f944cf2f2a7cbf4e2b09f0a0a62931737728f210d902c6be966 + languageName: node + linkType: hard + "makeerror@npm:1.0.12": version: 1.0.12 resolution: "makeerror@npm:1.0.12" @@ -15162,7 +15405,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -15178,6 +15421,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^1.3.2": + version: 1.4.1 + resolution: "minipass-fetch@npm:1.4.1" + dependencies: + encoding: "npm:^0.1.12" + minipass: "npm:^3.1.0" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.0.0" + dependenciesMeta: + encoding: + optional: true + checksum: a43da7401cd7c4f24b993887d41bd37d097356083b0bb836fd655916467463a1e6e9e553b2da4fcbe8745bf23d40c8b884eab20745562199663b3e9060cd8e7a + languageName: node + linkType: hard + "minipass-fetch@npm:^3.0.0": version: 3.0.3 resolution: "minipass-fetch@npm:3.0.3" @@ -15202,7 +15460,7 @@ __metadata: languageName: node linkType: hard -"minipass-pipeline@npm:^1.2.4": +"minipass-pipeline@npm:^1.2.2, minipass-pipeline@npm:^1.2.4": version: 1.2.4 resolution: "minipass-pipeline@npm:1.2.4" dependencies: @@ -15220,7 +15478,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0": +"minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: @@ -15250,7 +15508,7 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": +"minizlib@npm:^2.0.0, minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" dependencies: @@ -15260,6 +15518,13 @@ __metadata: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + "mkdirp@npm:0.3.0": version: 0.3.0 resolution: "mkdirp@npm:0.3.0" @@ -15278,7 +15543,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -15404,6 +15669,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 37fd2cd0ff2ad20073ce78d83fd718a740d568b225924e753ae51cb69d68f330c80544d487e5e5bd18e28702ed2ca469c2424ad948becd1862c1b0209542b2e9 + languageName: node + linkType: hard + "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -15418,7 +15690,7 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3, negotiator@npm:^0.6.2, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 @@ -15518,6 +15790,15 @@ __metadata: languageName: node linkType: hard +"node-abi@npm:^3.3.0": + version: 3.54.0 + resolution: "node-abi@npm:3.54.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 9ebbb21e6951aa51e831549ed62b68dc56bcc10f6b21ffd04195a16a6abf5ddfc48b6ae5e3334720fe4459cafde5ec8103025902efff5599d0539f8656fc694e + languageName: node + linkType: hard + "node-abort-controller@npm:^3.0.1, node-abort-controller@npm:^3.1.1": version: 3.1.1 resolution: "node-abort-controller@npm:3.1.1" @@ -15525,6 +15806,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.1.0 + resolution: "node-addon-api@npm:7.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 2e096ab079e3c46d33b0e252386e9c239c352f7cc6d75363d9a3c00bdff34c1a5da170da861917512843f213c32d024ced9dc9552b968029786480d18727ec66 + languageName: node + linkType: hard + "node-emoji@npm:1.11.0": version: 1.11.0 resolution: "node-emoji@npm:1.11.0" @@ -15567,6 +15857,26 @@ __metadata: languageName: node linkType: hard +"node-gyp@npm:8.x": + version: 8.4.1 + resolution: "node-gyp@npm:8.4.1" + dependencies: + env-paths: "npm:^2.2.0" + glob: "npm:^7.1.4" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^9.1.0" + nopt: "npm:^5.0.0" + npmlog: "npm:^6.0.0" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^2.0.2" + bin: + node-gyp: bin/node-gyp.js + checksum: 80ef333b3a882eb6a2695a8e08f31d618f4533eff192864e4a3a16b67ff0abc9d8c1d5fac0395550ec699326b9248c5e2b3be178492f7f4d1ccf97d2cf948021 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 9.4.0 resolution: "node-gyp@npm:9.4.0" @@ -15627,6 +15937,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^5.0.0": + version: 5.0.0 + resolution: "nopt@npm:5.0.0" + dependencies: + abbrev: "npm:1" + bin: + nopt: bin/nopt.js + checksum: fc5c4f07155cb455bf5fc3dd149fac421c1a40fd83c6bfe83aa82b52f02c17c5e88301321318adaa27611c8a6811423d51d29deaceab5fa158b585a61a551061 + languageName: node + linkType: hard + "nopt@npm:^6.0.0": version: 6.0.0 resolution: "nopt@npm:6.0.0" @@ -16241,6 +16562,13 @@ __metadata: languageName: node linkType: hard +"pg-connection-string@npm:2.6.2": + version: 2.6.2 + resolution: "pg-connection-string@npm:2.6.2" + checksum: e8fdea74fcc8bdc3d7c5c6eadd9425fdba7e67fb7fe836f9c0cecad94c8984e435256657d1d8ce0483d1fedef667e7a57e32449a63cb805cb0289fc34b62da35 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -16790,6 +17118,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.1": + version: 7.1.1 + resolution: "prebuild-install@npm:7.1.1" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 6dc70f36b0f4adcb2fe0ed38d874ab28b571fb1a9725d769e8ba3f64a15831e58462de09f3e6e64569bcc4a3e03b9328b56faa0d45fe10ae1574478814536c76 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -16895,6 +17245,13 @@ __metadata: languageName: node linkType: hard +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -17123,7 +17480,7 @@ __metadata: languageName: node linkType: hard -"rc@npm:1.2.8": +"rc@npm:1.2.8, rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: @@ -18349,6 +18706,24 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + "single-user-cache@npm:^0.6.0": version: 0.6.0 resolution: "single-user-cache@npm:0.6.0" @@ -18442,6 +18817,17 @@ __metadata: languageName: node linkType: hard +"socks-proxy-agent@npm:^6.0.0": + version: 6.2.1 + resolution: "socks-proxy-agent@npm:6.2.1" + dependencies: + agent-base: "npm:^6.0.2" + debug: "npm:^4.3.3" + socks: "npm:^2.6.2" + checksum: d75c1cf1fdd7f8309a43a77f84409b793fc0f540742ef915154e70ac09a08b0490576fe85d4f8d68bbf80e604a62957a17ab5ef50d312fe1442b0ab6f8f6e6f6 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -18618,6 +19004,27 @@ __metadata: languageName: node linkType: hard +"sqlite3@npm:^5.1.7": + version: 5.1.7 + resolution: "sqlite3@npm:5.1.7" + dependencies: + bindings: "npm:^1.5.0" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:8.x" + prebuild-install: "npm:^7.1.1" + tar: "npm:^6.1.11" + peerDependencies: + node-gyp: 8.x + dependenciesMeta: + node-gyp: + optional: true + peerDependenciesMeta: + node-gyp: + optional: true + checksum: 10daab5d7854bd0ec3c7690c00359cd3444eabc869b68c68dcb61374a8fa5e2f4be06cf0aba78f7a16336d49e83e4631e8af98f8bd33c772fe8d60b45fa60bc1 + languageName: node + linkType: hard + "srcset@npm:^4.0.0": version: 4.0.0 resolution: "srcset@npm:4.0.0" @@ -18643,6 +19050,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^8.0.0, ssri@npm:^8.0.1": + version: 8.0.1 + resolution: "ssri@npm:8.0.1" + dependencies: + minipass: "npm:^3.1.1" + checksum: 5cfae216ae02dcd154d1bbed2d0a60038a4b3a2fcaac3c7e47401ff4e058e551ee74cfdba618871bf168cd583db7b8324f94af6747d4303b73cd4c3f6dc5c9c2 + languageName: node + linkType: hard + "stable@npm:^0.1.8": version: 0.1.8 resolution: "stable@npm:0.1.8" @@ -18996,7 +19412,19 @@ __metadata: languageName: node linkType: hard -"tar-stream@npm:^2.0.1": +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 871d26a934bfb7beeae4c4d8a09689f530b565f79bd0cf489823ff0efa3705da01278160da10bb006d1a793fa0425cf316cec029b32a9159eacbeaff4965fb6d + languageName: node + linkType: hard + +"tar-stream@npm:^2.0.1, tar-stream@npm:^2.1.4": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" dependencies: @@ -19009,6 +19437,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^6.0.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 02ca064a1a6b4521fef88c07d389ac0936730091f8c02d30ea60d472e0378768e870769ab9e986d87807bfee5654359cf29ff4372746cc65e30cbddc352660d8 + languageName: node + linkType: hard + "tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.15 resolution: "tar@npm:6.1.15" @@ -19023,6 +19465,13 @@ __metadata: languageName: node linkType: hard +"tarn@npm:^3.0.2": + version: 3.0.2 + resolution: "tarn@npm:3.0.2" + checksum: ea2344e3d21936111176375bd6f34eba69a38ef1bc59434d523fd313166f8a28a47b0a847846c119f72dcf2c1e1231596d74ac3fcfc3cc73966b3d293a327269 + languageName: node + linkType: hard + "tau-prolog@npm:^0.2.66": version: 0.2.81 resolution: "tau-prolog@npm:0.2.81" @@ -19186,6 +19635,13 @@ __metadata: languageName: node linkType: hard +"tildify@npm:2.0.0": + version: 2.0.0 + resolution: "tildify@npm:2.0.0" + checksum: 57961810a6915f47bdba7da7fa66a5f12597a0495fa016785de197b02e7ba9994ffebb30569294061bbf6d9395c6b1319d830076221e5a3f49f1318bc749565c + languageName: node + linkType: hard + "tiny-glob@npm:0.2.9": version: 0.2.9 resolution: "tiny-glob@npm:0.2.9" @@ -19482,6 +19938,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + "tunnel@npm:^0.0.6": version: 0.0.6 resolution: "tunnel@npm:0.0.6" @@ -19762,6 +20227,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^1.1.1": + version: 1.1.1 + resolution: "unique-filename@npm:1.1.1" + dependencies: + unique-slug: "npm:^2.0.0" + checksum: d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -19771,6 +20245,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^2.0.0": + version: 2.0.2 + resolution: "unique-slug@npm:2.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 + languageName: node + linkType: hard + "unique-slug@npm:^4.0.0": version: 4.0.0 resolution: "unique-slug@npm:4.0.0"