From b5045ed4c81659f367931e321fdf706a262de61a Mon Sep 17 00:00:00 2001 From: Pablo Baleztena Date: Tue, 17 Sep 2024 17:23:57 -0300 Subject: [PATCH] Add basic sqlite-driver --- .../fabric/core/src/domain/events/event.ts | 4 +- packages/fabric/core/src/domain/index.ts | 1 + .../core/src/domain/models/fields/index.ts | 5 +- .../src/domain/models/fields/string-field.ts | 2 +- .../src/domain/models/fields/uuid-field.ts | 4 +- .../fabric/core/src/domain/models/index.ts | 4 + packages/fabric/core/src/error/index.ts | 1 + .../fabric/core/src/error/unexpected-error.ts | 7 +- packages/fabric/core/src/index.ts | 1 + packages/fabric/core/src/storage/driver.ts | 54 -- .../errors/circular-dependency-error.ts | 9 + .../fabric/core/src/storage/errors/index.ts | 2 + .../core/src/storage/errors/query-error.ts | 11 + .../fabric/core/src/storage/event-store.ts | 43 + packages/fabric/core/src/storage/index.ts | 5 + .../fabric/core/src/storage/query/index.ts | 4 + .../core/src/storage/query/query-builder.ts | 7 +- .../fabric/core/src/storage/query/query.ts | 50 +- .../fabric/core/src/storage/storage-driver.ts | 62 ++ .../utils/sort-by-dependencies.spec.ts | 6 +- .../src/storage/utils/sort-by-dependencies.ts | 10 +- packages/fabric/core/src/types/index.ts | 1 + .../fabric/core/src/types/maybe-promise.ts | 1 + packages/fabric/store-sqlite/README.md | 1 + packages/fabric/store-sqlite/package.json | 23 + packages/fabric/store-sqlite/src/index.ts | 0 .../fabric/store-sqlite/src/model-to-sql.ts | 45 + .../fabric/store-sqlite/src/record-utils.ts | 26 + .../store-sqlite/src/sqlite-driver.spec.ts | 93 +++ .../fabric/store-sqlite/src/sqlite-driver.ts | 207 +++++ .../fabric/store-sqlite/src/sqlite-wrapper.ts | 89 ++ .../fabric/store-sqlite/tsconfig.build.json | 15 + packages/fabric/store-sqlite/tsconfig.json | 4 + packages/fabric/store-sqlite/vitest.config.ts | 10 + yarn.lock | 788 +++++++++++++++++- 35 files changed, 1486 insertions(+), 109 deletions(-) create mode 100644 packages/fabric/core/src/domain/models/index.ts delete mode 100644 packages/fabric/core/src/storage/driver.ts create mode 100644 packages/fabric/core/src/storage/errors/circular-dependency-error.ts create mode 100644 packages/fabric/core/src/storage/errors/index.ts create mode 100644 packages/fabric/core/src/storage/errors/query-error.ts create mode 100644 packages/fabric/core/src/storage/event-store.ts create mode 100644 packages/fabric/core/src/storage/index.ts create mode 100644 packages/fabric/core/src/storage/query/index.ts create mode 100644 packages/fabric/core/src/storage/storage-driver.ts create mode 100644 packages/fabric/core/src/types/maybe-promise.ts create mode 100644 packages/fabric/store-sqlite/README.md create mode 100644 packages/fabric/store-sqlite/package.json create mode 100644 packages/fabric/store-sqlite/src/index.ts create mode 100644 packages/fabric/store-sqlite/src/model-to-sql.ts create mode 100644 packages/fabric/store-sqlite/src/record-utils.ts create mode 100644 packages/fabric/store-sqlite/src/sqlite-driver.spec.ts create mode 100644 packages/fabric/store-sqlite/src/sqlite-driver.ts create mode 100644 packages/fabric/store-sqlite/src/sqlite-wrapper.ts create mode 100644 packages/fabric/store-sqlite/tsconfig.build.json create mode 100644 packages/fabric/store-sqlite/tsconfig.json create mode 100644 packages/fabric/store-sqlite/vitest.config.ts diff --git a/packages/fabric/core/src/domain/events/event.ts b/packages/fabric/core/src/domain/events/event.ts index 1663011..05b78da 100644 --- a/packages/fabric/core/src/domain/events/event.ts +++ b/packages/fabric/core/src/domain/events/event.ts @@ -1,12 +1,12 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { TaggedVariant } from "../../variant/variant.js"; import { UUID } from "../types/uuid.js"; /** * An event is a tagged variant with a payload and a timestamp. */ -export interface Event +export interface Event extends TaggedVariant { streamId: UUID; payload: TPayload; - timestamp: number; } diff --git a/packages/fabric/core/src/domain/index.ts b/packages/fabric/core/src/domain/index.ts index c92f44f..f227b7a 100644 --- a/packages/fabric/core/src/domain/index.ts +++ b/packages/fabric/core/src/domain/index.ts @@ -1,4 +1,5 @@ export * from "./entity/index.js"; +export * from "./models/index.js"; export * from "./security/index.js"; export * from "./types/index.js"; export * from "./use-case/index.js"; diff --git a/packages/fabric/core/src/domain/models/fields/index.ts b/packages/fabric/core/src/domain/models/fields/index.ts index 67b0fa4..a1833fd 100644 --- a/packages/fabric/core/src/domain/models/fields/index.ts +++ b/packages/fabric/core/src/domain/models/fields/index.ts @@ -1,7 +1,8 @@ import { createStringField, StringField } from "./string-field.js"; -import { createUUIDField } from "./uuid-field.js"; +import { createUUIDField, UUIDField } from "./uuid-field.js"; +export * from "./base-field.js"; -export type FieldDefinition = StringField; +export type FieldDefinition = StringField | UUIDField; export namespace Field { export const string = createStringField; diff --git a/packages/fabric/core/src/domain/models/fields/string-field.ts b/packages/fabric/core/src/domain/models/fields/string-field.ts index d615dd9..b15f2e5 100644 --- a/packages/fabric/core/src/domain/models/fields/string-field.ts +++ b/packages/fabric/core/src/domain/models/fields/string-field.ts @@ -11,7 +11,7 @@ export interface StringField StringFieldOptions {} export function createStringField( - opts: T, + opts: T = {} as T, ): StringField & T { return { [VariantTag]: "StringField", diff --git a/packages/fabric/core/src/domain/models/fields/uuid-field.ts b/packages/fabric/core/src/domain/models/fields/uuid-field.ts index 0e55212..2a7a75c 100644 --- a/packages/fabric/core/src/domain/models/fields/uuid-field.ts +++ b/packages/fabric/core/src/domain/models/fields/uuid-field.ts @@ -5,11 +5,11 @@ export interface UUIDOptions extends BaseField { isPrimaryKey?: boolean; } -export interface UUIDField extends TaggedVariant<"UUID_FIELD">, UUIDOptions {} +export interface UUIDField extends TaggedVariant<"UUIDField">, UUIDOptions {} export function createUUIDField(opts: UUIDOptions): UUIDField { return { - [VariantTag]: "UUID_FIELD", + [VariantTag]: "UUIDField", ...opts, }; } diff --git a/packages/fabric/core/src/domain/models/index.ts b/packages/fabric/core/src/domain/models/index.ts new file mode 100644 index 0000000..d7b9d1f --- /dev/null +++ b/packages/fabric/core/src/domain/models/index.ts @@ -0,0 +1,4 @@ +export * from "./create-model.js"; +export * from "./fields/index.js"; +export * from "./model-to-type.js"; +export * from "./relations/index.js"; diff --git a/packages/fabric/core/src/error/index.ts b/packages/fabric/core/src/error/index.ts index 7008925..5d2ab53 100644 --- a/packages/fabric/core/src/error/index.ts +++ b/packages/fabric/core/src/error/index.ts @@ -1,2 +1,3 @@ +export * from "./is-error.js"; export * from "./tagged-error.js"; export * from "./unexpected-error.js"; diff --git a/packages/fabric/core/src/error/unexpected-error.ts b/packages/fabric/core/src/error/unexpected-error.ts index de2dee6..ba9fa23 100644 --- a/packages/fabric/core/src/error/unexpected-error.ts +++ b/packages/fabric/core/src/error/unexpected-error.ts @@ -8,7 +8,12 @@ import { TaggedError } from "./tagged-error.js"; * we must be prepared to handle. */ export class UnexpectedError extends TaggedError<"UnexpectedError"> { - constructor() { + constructor(readonly context: Record = {}) { super("UnexpectedError"); + this.message = "An unexpected error occurred"; + } + + toString() { + return `UnexpectedError: ${this.message}\n${JSON.stringify(this.context, null, 2)}`; } } diff --git a/packages/fabric/core/src/index.ts b/packages/fabric/core/src/index.ts index 83a7a19..ef61d0a 100644 --- a/packages/fabric/core/src/index.ts +++ b/packages/fabric/core/src/index.ts @@ -3,6 +3,7 @@ export * from "./domain/index.js"; export * from "./error/index.js"; export * from "./record/index.js"; export * from "./result/index.js"; +export * from "./storage/index.js"; export * from "./time/index.js"; export * from "./types/index.js"; export * from "./variant/index.js"; diff --git a/packages/fabric/core/src/storage/driver.ts b/packages/fabric/core/src/storage/driver.ts deleted file mode 100644 index 36f6503..0000000 --- a/packages/fabric/core/src/storage/driver.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import { ModelDefinition } from "../domain/models/create-model.js"; -import { TaggedError } from "../error/tagged-error.js"; -import { AsyncResult } from "../result/async-result.js"; -import { QueryDefinition } from "./query/query.js"; -import { CircularDependencyError } from "./utils/sort-by-dependencies.js"; - -export interface StorageDriver { - /** - * Insert data into the store - */ - insert(collectionName: string, record: any): AsyncResult; - - /** - * Run a select query against the store. - */ - select(query: QueryDefinition): AsyncResult; - - /** - * Run a select query against the store. - */ - selectOne(query: QueryDefinition): AsyncResult; - - /** - * Sincronice the store with the schema. - */ - sync( - schema: ModelDefinition[], - ): AsyncResult; - - /** - * Drop the store. This is a destructive operation. - */ - drop(): AsyncResult; - - /** - * Update a record in the store. - */ - update( - collectionName: string, - id: string, - record: Record, - ): AsyncResult; -} - -export class QueryError extends TaggedError<"QueryError"> { - constructor( - public message: string, - public context: any, - ) { - super("QueryError"); - } -} diff --git a/packages/fabric/core/src/storage/errors/circular-dependency-error.ts b/packages/fabric/core/src/storage/errors/circular-dependency-error.ts new file mode 100644 index 0000000..0896c8f --- /dev/null +++ b/packages/fabric/core/src/storage/errors/circular-dependency-error.ts @@ -0,0 +1,9 @@ +import { TaggedError } from "../../error/tagged-error.js"; + +export class CircularDependencyError extends TaggedError<"CircularDependencyError"> { + context: { key: string; dep: string }; + constructor(key: string, dep: string) { + super("CircularDependencyError"); + this.context = { key, dep }; + } +} diff --git a/packages/fabric/core/src/storage/errors/index.ts b/packages/fabric/core/src/storage/errors/index.ts new file mode 100644 index 0000000..ad34939 --- /dev/null +++ b/packages/fabric/core/src/storage/errors/index.ts @@ -0,0 +1,2 @@ +export * from "./circular-dependency-error.js"; +export * from "./query-error.js"; diff --git a/packages/fabric/core/src/storage/errors/query-error.ts b/packages/fabric/core/src/storage/errors/query-error.ts new file mode 100644 index 0000000..9c3dc83 --- /dev/null +++ b/packages/fabric/core/src/storage/errors/query-error.ts @@ -0,0 +1,11 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { TaggedError } from "../../error/tagged-error.js"; + +export class StoreQueryError extends TaggedError<"StoreQueryError"> { + constructor( + public message: string, + public context: any, + ) { + super("StoreQueryError"); + } +} diff --git a/packages/fabric/core/src/storage/event-store.ts b/packages/fabric/core/src/storage/event-store.ts new file mode 100644 index 0000000..c0fe1d3 --- /dev/null +++ b/packages/fabric/core/src/storage/event-store.ts @@ -0,0 +1,43 @@ +import { Event } from "../domain/events/event.js"; +import { UUID } from "../domain/index.js"; +import { AsyncResult } from "../result/async-result.js"; +import { PosixDate } from "../time/posix-date.js"; +import { MaybePromise } from "../types/maybe-promise.js"; +import { StoreQueryError } from "./errors/query-error.js"; + +export interface EventStore { + getStream( + streamId: UUID, + ): AsyncResult, StoreQueryError>; + + appendToStream( + streamId: UUID, + events: TEvent, + ): AsyncResult; +} + +export interface EventStream { + getCurrentVersion(): bigint; + + append(events: TEvent): AsyncResult, StoreQueryError>; + + subscribe(callback: (event: StoredEvent) => MaybePromise): void; + + getEvents( + opts?: EventFilterOptions, + ): AsyncResult[], StoreQueryError>; +} + +export interface EventFilterOptions { + fromDate?: PosixDate; + toDate?: PosixDate; + fromVersion?: number; + toVersion?: number; + limit?: number; + offset?: number; +} + +export type StoredEvent = TEvent & { + version: bigint; + timestamp: number; +}; diff --git a/packages/fabric/core/src/storage/index.ts b/packages/fabric/core/src/storage/index.ts new file mode 100644 index 0000000..a22b9df --- /dev/null +++ b/packages/fabric/core/src/storage/index.ts @@ -0,0 +1,5 @@ +export * from "./errors/index.js"; +export * from "./event-store.js"; +export * from "./query/index.js"; +export * from "./state-store.js"; +export * from "./storage-driver.js"; diff --git a/packages/fabric/core/src/storage/query/index.ts b/packages/fabric/core/src/storage/query/index.ts new file mode 100644 index 0000000..1aa861d --- /dev/null +++ b/packages/fabric/core/src/storage/query/index.ts @@ -0,0 +1,4 @@ +export * from "./filter-options.js"; +export * from "./order-by-options.js"; +export * from "./query-builder.js"; +export * from "./query.js"; diff --git a/packages/fabric/core/src/storage/query/query-builder.ts b/packages/fabric/core/src/storage/query/query-builder.ts index cc4ba86..2232682 100644 --- a/packages/fabric/core/src/storage/query/query-builder.ts +++ b/packages/fabric/core/src/storage/query/query-builder.ts @@ -6,7 +6,8 @@ import { import { ModelToType } from "../../domain/models/model-to-type.js"; import { AsyncResult } from "../../result/async-result.js"; import { Keyof } from "../../types/index.js"; -import { QueryError, StorageDriver } from "../driver.js"; +import { StoreQueryError } from "../errors/query-error.js"; +import { StorageDriver } from "../storage-driver.js"; import { FilterOptions } from "./filter-options.js"; import { OrderByOptions } from "./order-by-options.js"; import { @@ -56,7 +57,7 @@ export class QueryBuilder< select>( keys?: K[], - ): AsyncResult[], QueryError> { + ): AsyncResult[], StoreQueryError> { return this.driver.select({ ...this.query, keys, @@ -65,7 +66,7 @@ export class QueryBuilder< selectOne>( keys?: K[], - ): AsyncResult, QueryError> { + ): AsyncResult, StoreQueryError> { return this.driver.selectOne({ ...this.query, keys, diff --git a/packages/fabric/core/src/storage/query/query.ts b/packages/fabric/core/src/storage/query/query.ts index 10a5b19..608b7af 100644 --- a/packages/fabric/core/src/storage/query/query.ts +++ b/packages/fabric/core/src/storage/query/query.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { AsyncResult } from "../../result/async-result.js"; import { Keyof } from "../../types/keyof.js"; -import { QueryError } from "../driver.js"; +import { StoreQueryError } from "../errors/query-error.js"; import { FilterOptions } from "./filter-options.js"; import { OrderByOptions } from "./order-by-options.js"; @@ -10,40 +10,56 @@ export interface StoreQuery { orderBy(opts: OrderByOptions): StoreLimitableQuery; limit(limit: number, offset?: number): SelectableQuery; - select(): AsyncResult; - select>(keys: K[]): AsyncResult[], QueryError>; + select(): AsyncResult; + select>( + keys: K[], + ): AsyncResult[], StoreQueryError>; - selectOne(): AsyncResult; - selectOne>(keys: K[]): AsyncResult, QueryError>; + selectOne(): AsyncResult; + selectOne>( + keys: K[], + ): AsyncResult, StoreQueryError>; } export interface StoreSortableQuery { orderBy(opts: OrderByOptions): StoreLimitableQuery; limit(limit: number, offset?: number): SelectableQuery; - select(): AsyncResult; - select>(keys: K[]): AsyncResult[], QueryError>; + select(): AsyncResult; + select>( + keys: K[], + ): AsyncResult[], StoreQueryError>; - selectOne(): AsyncResult; - selectOne>(keys: K[]): AsyncResult, QueryError>; + selectOne(): AsyncResult; + selectOne>( + keys: K[], + ): AsyncResult, StoreQueryError>; } export interface StoreLimitableQuery { limit(limit: number, offset?: number): SelectableQuery; - select(): AsyncResult; - select>(keys: K[]): AsyncResult[], QueryError>; + select(): AsyncResult; + select>( + keys: K[], + ): AsyncResult[], StoreQueryError>; - selectOne(): AsyncResult; - selectOne>(keys: K[]): AsyncResult, QueryError>; + selectOne(): AsyncResult; + selectOne>( + keys: K[], + ): AsyncResult, StoreQueryError>; } export interface SelectableQuery { - select(): AsyncResult; - select>(keys: K[]): AsyncResult[], QueryError>; + select(): AsyncResult; + select>( + keys: K[], + ): AsyncResult[], StoreQueryError>; - selectOne(): AsyncResult; - selectOne>(keys: K[]): AsyncResult, QueryError>; + selectOne(): AsyncResult; + selectOne>( + keys: K[], + ): AsyncResult, StoreQueryError>; } export interface QueryDefinition { diff --git a/packages/fabric/core/src/storage/storage-driver.ts b/packages/fabric/core/src/storage/storage-driver.ts new file mode 100644 index 0000000..8055183 --- /dev/null +++ b/packages/fabric/core/src/storage/storage-driver.ts @@ -0,0 +1,62 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { ModelDefinition } from "../domain/models/create-model.js"; +import { UnexpectedError } from "../error/unexpected-error.js"; +import { AsyncResult } from "../result/async-result.js"; +import { CircularDependencyError } from "./errors/circular-dependency-error.js"; +import { StoreQueryError } from "./errors/query-error.js"; +import { QueryDefinition } from "./query/query.js"; + +export interface StorageDriver { + /** + * Insert data into the store + */ + insert( + collectionName: string, + record: Record, + ): AsyncResult; + + /** + * Run a select query against the store. + */ + select(query: QueryDefinition): AsyncResult; + + /** + * Run a select query against the store. + */ + selectOne(query: QueryDefinition): AsyncResult; + + /** + * Sincronice the store with the schema. + */ + sync( + schema: ModelDefinition[], + ): AsyncResult; + + /** + * Drop the store. This is a destructive operation. + */ + drop(): AsyncResult; + + /** + * Close the store. + */ + close(): AsyncResult; + + /** + * Update a record in the store. + */ + update( + collectionName: string, + id: string, + record: Record, + ): AsyncResult; + + /** + * Delete a record from the store. + */ + delete( + collectionName: string, + id: string, + ): AsyncResult; +} diff --git a/packages/fabric/core/src/storage/utils/sort-by-dependencies.spec.ts b/packages/fabric/core/src/storage/utils/sort-by-dependencies.spec.ts index 9ac3ad5..904cc84 100644 --- a/packages/fabric/core/src/storage/utils/sort-by-dependencies.spec.ts +++ b/packages/fabric/core/src/storage/utils/sort-by-dependencies.spec.ts @@ -1,9 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { describe, expect, it } from "vitest"; -import { - CircularDependencyError, - sortByDependencies, -} from "./sort-by-dependencies.js"; +import { CircularDependencyError } from "../errors/circular-dependency-error.js"; +import { sortByDependencies } from "./sort-by-dependencies.js"; describe("sortByDependencies", () => { it("should sort an array of objects by their dependencies", () => { diff --git a/packages/fabric/core/src/storage/utils/sort-by-dependencies.ts b/packages/fabric/core/src/storage/utils/sort-by-dependencies.ts index 11b28fc..17bf35e 100644 --- a/packages/fabric/core/src/storage/utils/sort-by-dependencies.ts +++ b/packages/fabric/core/src/storage/utils/sort-by-dependencies.ts @@ -1,5 +1,5 @@ -import { TaggedError } from "../../error/tagged-error.js"; import { Result } from "../../result/result.js"; +import { CircularDependencyError } from "../errors/circular-dependency-error.js"; export function sortByDependencies( array: T[], @@ -45,11 +45,3 @@ export function sortByDependencies( (key) => array.find((element) => keyGetter(element) === key) as T, ); } - -export class CircularDependencyError extends TaggedError<"CircularDependencyError"> { - context: { key: string; dep: string }; - constructor(key: string, dep: string) { - super("CircularDependencyError"); - this.context = { key, dep }; - } -} diff --git a/packages/fabric/core/src/types/index.ts b/packages/fabric/core/src/types/index.ts index 2e9bdd3..20f6f8c 100644 --- a/packages/fabric/core/src/types/index.ts +++ b/packages/fabric/core/src/types/index.ts @@ -1,4 +1,5 @@ export * from "./enum.js"; export * from "./fn.js"; export * from "./keyof.js"; +export * from "./maybe-promise.js"; export * from "./optional.js"; diff --git a/packages/fabric/core/src/types/maybe-promise.ts b/packages/fabric/core/src/types/maybe-promise.ts new file mode 100644 index 0000000..9cd354b --- /dev/null +++ b/packages/fabric/core/src/types/maybe-promise.ts @@ -0,0 +1 @@ +export type MaybePromise = T | Promise; diff --git a/packages/fabric/store-sqlite/README.md b/packages/fabric/store-sqlite/README.md new file mode 100644 index 0000000..dcb7d5a --- /dev/null +++ b/packages/fabric/store-sqlite/README.md @@ -0,0 +1 @@ +# store-sqlite diff --git a/packages/fabric/store-sqlite/package.json b/packages/fabric/store-sqlite/package.json new file mode 100644 index 0000000..0e25aba --- /dev/null +++ b/packages/fabric/store-sqlite/package.json @@ -0,0 +1,23 @@ +{ + "name": "@ulthar/store-sqlite", + "type": "module", + "module": "dist/index.js", + "main": "dist/index.js", + "files": [ + "dist" + ], + "private": true, + "packageManager": "yarn@4.1.1", + "devDependencies": { + "typescript": "^5.6.2", + "vitest": "^2.1.1" + }, + "dependencies": { + "@ulthar/fabric-core": "workspace:^", + "sqlite3": "^5.1.7" + }, + "scripts": { + "test": "vitest", + "build": "tsc -p tsconfig.build.json" + } +} diff --git a/packages/fabric/store-sqlite/src/index.ts b/packages/fabric/store-sqlite/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/fabric/store-sqlite/src/model-to-sql.ts b/packages/fabric/store-sqlite/src/model-to-sql.ts new file mode 100644 index 0000000..e596463 --- /dev/null +++ b/packages/fabric/store-sqlite/src/model-to-sql.ts @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { + BaseField, + FieldDefinition, + ModelDefinition, + VariantTag, +} from "@ulthar/fabric-core"; + +type FieldMap = { + [K in FieldDefinition[VariantTag]]: ( + field: Extract, + ) => string; +}; + +const FieldMap: FieldMap = { + StringField: (f) => { + return "TEXT" + modifiersFromOpts(f); + }, + UUIDField: (f) => { + return [ + "TEXT", + f.isPrimaryKey ? "PRIMARY KEY" : "", + modifiersFromOpts(f), + ].join(" "); + }, +}; + +function modifiersFromOpts(options: BaseField) { + return [ + !options.isOptional ? "NOT NULL" : "", + options.isUnique ? "UNIQUE" : "", + ].join(" "); +} + +function fieldDefinitionToSQL(field: FieldDefinition) { + return FieldMap[field[VariantTag]](field as any); +} + +export function modelToSql( + model: ModelDefinition>, +) { + return Object.entries(model.fields) + .map(([name, type]) => `${name} ${fieldDefinitionToSQL(type)}`) + .join(", "); +} diff --git a/packages/fabric/store-sqlite/src/record-utils.ts b/packages/fabric/store-sqlite/src/record-utils.ts new file mode 100644 index 0000000..66bc001 --- /dev/null +++ b/packages/fabric/store-sqlite/src/record-utils.ts @@ -0,0 +1,26 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/** + * Unfold a record into a string of it's keys separated by commas. + */ +export function recordToKeys(record: Record, prefix = "") { + return Object.keys(record) + .map((key) => `${prefix}${key}`) + .join(", "); +} + +/** + * Unfold a record into a string of it's keys separated by commas. + */ +export function recordToParams(record: Record) { + return Object.keys(record).reduce( + (acc, key) => ({ ...acc, [`:${key}`]: record[key] }), + {}, + ); +} + +export function recordToSQLSet(record: Record) { + return Object.keys(record) + .map((key) => `${key} = :${key}`) + .join(", "); +} diff --git a/packages/fabric/store-sqlite/src/sqlite-driver.spec.ts b/packages/fabric/store-sqlite/src/sqlite-driver.spec.ts new file mode 100644 index 0000000..4331d9f --- /dev/null +++ b/packages/fabric/store-sqlite/src/sqlite-driver.spec.ts @@ -0,0 +1,93 @@ +import { createModel, Field, isError } from "@ulthar/fabric-core"; +import { afterEach, beforeEach, describe, expect, test } from "vitest"; +import { SQLiteStorageDriver } from "./sqlite-driver.js"; + +describe("SQLite Store Driver", () => { + const model = createModel({ + name: "test", + fields: { + id: Field.uuid({}), + name: Field.string(), + }, + }); + + let store: SQLiteStorageDriver; + + beforeEach(() => { + store = new SQLiteStorageDriver(":memory:"); + }); + + afterEach(async () => { + const result = await store.close(); + if (isError(result)) throw result; + }); + + test("should be able to synchronize the store and insert a record", async () => { + const result = await store.sync([model]); + + if (isError(result)) throw result; + + await store.insert("test", { id: "1", name: "test" }); + + const records = await store.select({ from: "test" }); + + expect(records).toEqual([{ id: "1", name: "test" }]); + }); + + test("should be able to update a record", async () => { + const result = await store.sync([model]); + + if (isError(result)) throw result; + + await store.insert("test", { id: "1", name: "test" }); + + await store.update("test", "1", { name: "updated" }); + + const records = await store.select({ from: "test" }); + + expect(records).toEqual([{ id: "1", name: "updated" }]); + }); + + test("should be able to delete a record", async () => { + const result = await store.sync([model]); + + if (isError(result)) throw result; + + await store.insert("test", { id: "1", name: "test" }); + + await store.delete("test", "1"); + + const records = await store.select({ from: "test" }); + + expect(records).toEqual([]); + }); + + test("should be able to select records", async () => { + const result = await store.sync([model]); + + if (isError(result)) throw result; + + await store.insert("test", { id: "1", name: "test" }); + await store.insert("test", { id: "2", name: "test" }); + + const records = await store.select({ from: "test" }); + + expect(records).toEqual([ + { id: "1", name: "test" }, + { id: "2", name: "test" }, + ]); + }); + + test("should be able to select one record", async () => { + const result = await store.sync([model]); + + if (isError(result)) throw result; + + await store.insert("test", { id: "1", name: "test" }); + await store.insert("test", { id: "2", name: "test" }); + + const record = await store.selectOne({ from: "test" }); + + expect(record).toEqual({ id: "1", name: "test" }); + }); +}); diff --git a/packages/fabric/store-sqlite/src/sqlite-driver.ts b/packages/fabric/store-sqlite/src/sqlite-driver.ts new file mode 100644 index 0000000..25e8b26 --- /dev/null +++ b/packages/fabric/store-sqlite/src/sqlite-driver.ts @@ -0,0 +1,207 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { + AsyncResult, + CircularDependencyError, + ModelDefinition, + QueryDefinition, + StorageDriver, + StoreQueryError, + UnexpectedError, +} from "@ulthar/fabric-core"; +import { unlink } from "fs/promises"; + +import { Database, Statement } from "sqlite3"; +import { modelToSql } from "./model-to-sql.js"; +import { + recordToKeys, + recordToParams, + recordToSQLSet, +} from "./record-utils.js"; +import { + dbClose, + dbRun, + finalize, + getAll, + getOne, + prepare, + run, +} from "./sqlite-wrapper.js"; + +export class SQLiteStorageDriver implements StorageDriver { + private db: Database; + + private cachedStatements = new Map(); + + constructor(private path: string) { + this.db = new Database(path); + + // Enable Write-Ahead Logging, which is faster and more reliable. + this.db.run("PRAGMA journal_mode= WAL;"); + } + + /** + * Get a statement from the cache or prepare a new one. + */ + private async getOrCreatePreparedStatement(sql: string): Promise { + if (this.cachedStatements.has(sql)) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- We know it's there. + return this.cachedStatements.get(sql)!; + } + + const stmt = await prepare(this.db, sql); + this.cachedStatements.set(sql, stmt); + + return stmt; + } + + /** + * Insert data into the store + */ + async insert( + collectionName: string, + record: Record, + ): AsyncResult { + try { + const sql = `INSERT INTO ${collectionName} (${recordToKeys(record)}) VALUES (${recordToKeys(record, ":")})`; + const stmt = await this.getOrCreatePreparedStatement(sql); + return await run(stmt, recordToParams(record)); + } catch (error: any) { + return new StoreQueryError(error.message, { + error, + collectionName, + record, + }); + } + } + + /** + * Run a select query against the store. + */ + async select(query: QueryDefinition): AsyncResult { + try { + const sql = `SELECT * FROM ${query.from}`; + const stmt = await this.getOrCreatePreparedStatement(sql); + return await getAll(stmt); + } catch (error: any) { + return new StoreQueryError(error.message, { + error, + query, + }); + } + } + + /** + * Run a select query against the store. + */ + async selectOne(query: QueryDefinition): AsyncResult { + try { + const sql = `SELECT * FROM ${query.from}`; + const stmt = await this.getOrCreatePreparedStatement(sql); + + return await getOne(stmt); + } catch (error: any) { + return new StoreQueryError(error.message, { + error, + query, + }); + } + } + + /** + * Sincronice the store with the schema. + */ + async sync( + schema: ModelDefinition[], + ): AsyncResult { + try { + await dbRun(this.db, "BEGIN TRANSACTION;"); + for (const model of schema) { + const query = `CREATE TABLE ${model.name} (${modelToSql(model)});`; + await dbRun(this.db, query); + } + await dbRun(this.db, "COMMIT;"); + } catch (error: any) { + await dbRun(this.db, "ROLLBACK;"); + return new StoreQueryError(error.message, { + error, + schema, + }); + } + } + + /** + * Drop the store. This is a destructive operation. + */ + async drop(): AsyncResult { + try { + if (this.path === ":memory:") { + return new StoreQueryError("Cannot drop in-memory database", {}); + } else { + await unlink(this.path); + } + } catch (error: any) { + return new StoreQueryError(error.message, { + error, + }); + } + } + + async close(): AsyncResult { + try { + for (const stmt of this.cachedStatements.values()) { + await finalize(stmt); + } + await dbClose(this.db); + } catch (error: any) { + return new UnexpectedError({ error }); + } + } + + /** + * Update a record in the store. + */ + async update( + collectionName: string, + id: string, + record: Record, + ): AsyncResult { + try { + const sql = `UPDATE ${collectionName} SET ${recordToSQLSet(record)} WHERE id = :id`; + const stmt = await this.getOrCreatePreparedStatement(sql); + return await run( + stmt, + recordToParams({ + ...record, + id, + }), + ); + } catch (error: any) { + return new StoreQueryError(error.message, { + error, + collectionName, + record, + }); + } + } + + /** + * Delete a record from the store. + */ + + async delete( + collectionName: string, + id: string, + ): AsyncResult { + try { + const sql = `DELETE FROM ${collectionName} WHERE id = :id`; + const stmt = await this.getOrCreatePreparedStatement(sql); + return await run(stmt, { ":id": id }); + } catch (error: any) { + return new StoreQueryError(error.message, { + error, + collectionName, + id, + }); + } + } +} diff --git a/packages/fabric/store-sqlite/src/sqlite-wrapper.ts b/packages/fabric/store-sqlite/src/sqlite-wrapper.ts new file mode 100644 index 0000000..ecc12a8 --- /dev/null +++ b/packages/fabric/store-sqlite/src/sqlite-wrapper.ts @@ -0,0 +1,89 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { Database, Statement } from "sqlite3"; + +export function dbRun(db: Database, statement: string): Promise { + return new Promise((resolve, reject) => { + db.run(statement, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +} + +export function dbClose(db: Database): Promise { + return new Promise((resolve, reject) => { + db.close((err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +} + +export function prepare(db: Database, statement: string): Promise { + return new Promise((resolve, reject) => { + const stmt = db.prepare(statement, (err) => { + if (err) { + reject(err); + } else { + resolve(stmt); + } + }); + }); +} + +export function run( + stmt: Statement, + params: Record, +): Promise { + return new Promise((resolve, reject) => { + stmt.run(params, (err: Error | null) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +} + +export function getAll(stmt: Statement): Promise[]> { + return new Promise((resolve, reject) => { + stmt.all((err: Error | null, rows: Record[]) => { + if (err) { + reject(err); + } else { + resolve(rows); + } + }); + }); +} + +export function getOne(stmt: Statement): Promise> { + return new Promise((resolve, reject) => { + stmt.get((err: Error | null, row: Record) => { + if (err) { + reject(err); + } else { + resolve(row); + } + }); + }); +} + +export function finalize(stmt: Statement): Promise { + return new Promise((resolve, reject) => { + stmt.finalize((err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +} diff --git a/packages/fabric/store-sqlite/tsconfig.build.json b/packages/fabric/store-sqlite/tsconfig.build.json new file mode 100644 index 0000000..7706c0e --- /dev/null +++ b/packages/fabric/store-sqlite/tsconfig.build.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "allowImportingTsExtensions": false, + "outDir": "dist" + }, + "exclude": [ + "src/**/*.spec.ts", + "dist", + "node_modules", + "coverage", + "vitest.config.ts" + ] +} diff --git a/packages/fabric/store-sqlite/tsconfig.json b/packages/fabric/store-sqlite/tsconfig.json new file mode 100644 index 0000000..7a7fde8 --- /dev/null +++ b/packages/fabric/store-sqlite/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../../tsconfig.json", + "exclude": ["dist", "node_modules"] +} diff --git a/packages/fabric/store-sqlite/vitest.config.ts b/packages/fabric/store-sqlite/vitest.config.ts new file mode 100644 index 0000000..f1362e1 --- /dev/null +++ b/packages/fabric/store-sqlite/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + exclude: ["**/index.ts"], + }, + passWithNoTests: true, + }, +}); diff --git a/yarn.lock b/yarn.lock index 26c9dbe..abc51d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -403,6 +403,13 @@ __metadata: languageName: node linkType: hard +"@gar/promisify@npm:^1.0.1": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 10c0/0b3c9958d3cd17f4add3574975e3115ae05dc7f1298a60810414b16f6f558c137b5fb3cd3905df380bacfd955ec13f67c1e6710cbb5c246a7e8d65a8289b2bff + languageName: node + linkType: hard + "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" @@ -478,6 +485,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: 10c0/4143c317a7542af9054018b71601e3c3392e6704e884561229695f099a71336cbd580df9a9ffb965d0024bf0ed593189ab58900fd1714baef1c9ee59c738c3e2 + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": version: 3.1.1 resolution: "@npmcli/fs@npm:3.1.1" @@ -487,6 +504,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: 10c0/02e946f3dafcc6743132fe2e0e2b585a96ca7265653a38df5a3e53fcf26c7c7a57fc0f861d7c689a23fdb6d6836c7eea5050c8086abf3c994feb2208d1514ff0 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -606,6 +633,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/once@npm:1": + version: 1.1.2 + resolution: "@tootallnate/once@npm:1.1.2" + checksum: 10c0/8fe4d006e90422883a4fa9339dd05a83ff626806262e1710cee5758d493e8cbddf2db81c0e4690636dc840b02c9fda62877866ea774ebd07c1777ed5fafbdec6 + languageName: node + linkType: hard + "@types/eslint@npm:*, @types/eslint@npm:^9.6.1": version: 9.6.1 resolution: "@types/eslint@npm:9.6.1" @@ -811,6 +845,17 @@ __metadata: languageName: unknown linkType: soft +"@ulthar/store-sqlite@workspace:packages/fabric/store-sqlite": + version: 0.0.0-use.local + resolution: "@ulthar/store-sqlite@workspace:packages/fabric/store-sqlite" + dependencies: + "@ulthar/fabric-core": "workspace:^" + sqlite3: "npm:^5.1.7" + typescript: "npm:^5.6.2" + vitest: "npm:^2.1.1" + languageName: unknown + linkType: soft + "@ulthar/template-domain@workspace:packages/templates/domain": version: 0.0.0-use.local resolution: "@ulthar/template-domain@workspace:packages/templates/domain" @@ -903,6 +948,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:1": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: 10c0/3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -928,6 +980,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": version: 7.1.1 resolution: "agent-base@npm:7.1.1" @@ -937,6 +998,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: 10c0/394ea19f9710f230722996e156607f48fdf3a345133b0b1823244b7989426c16019a428b56c82d3eabef616e938812981d9009f4792ecc66bd6a59e991c62612 + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -998,6 +1068,23 @@ __metadata: languageName: node linkType: hard +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 10c0/d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: "npm:^1.0.0" + readable-stream: "npm:^3.6.0" + checksum: 10c0/8373f289ba42e4b5ec713bb585acdac14b5702c75f2a458dc985b9e4fa5762bc5b46b40a21b72418a3ed0cfb5e35bdc317ef1ae132f3035f633d581dd03168c3 + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -1019,6 +1106,33 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + 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: 10c0/3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba + languageName: node + linkType: hard + +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1047,6 +1161,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -1054,6 +1178,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: 10c0/886fcc0acc4f6fd5cd142d373d8276267bc6d655d7c4ce60726fbbec10854de3395ee19bbf9e7e73308cdca9fdad0ad55060ff3bd16c6d4165c5b8d21515e1d8 + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -1118,6 +1268,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -1167,6 +1324,15 @@ __metadata: languageName: node linkType: hard +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 10c0/8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 + languageName: node + linkType: hard + "colorette@npm:^2.0.20": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -1188,6 +1354,13 @@ __metadata: languageName: node linkType: hard +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 + languageName: node + linkType: hard + "cross-env@npm:^7.0.3": version: 7.0.3 resolution: "cross-env@npm:7.0.3" @@ -1211,7 +1384,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:~4.3.6": +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:~4.3.6": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -1223,6 +1396,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + "deep-eql@npm:^5.0.1": version: 5.0.2 resolution: "deep-eql@npm:5.0.2" @@ -1230,6 +1412,13 @@ __metadata: languageName: node linkType: hard +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -1237,6 +1426,20 @@ __metadata: languageName: node linkType: hard +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -1265,7 +1468,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: @@ -1274,6 +1477,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -1614,6 +1826,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -1673,6 +1892,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: 10c0/3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 + languageName: node + linkType: hard + "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -1719,6 +1945,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -1737,6 +1970,13 @@ __metadata: languageName: node linkType: hard +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + "fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -1756,6 +1996,22 @@ __metadata: languageName: node linkType: hard +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: "npm:^1.0.3 || ^2.0.0" + color-support: "npm:^1.1.3" + console-control-strings: "npm:^1.1.0" + has-unicode: "npm:^2.0.1" + signal-exit: "npm:^3.0.7" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wide-align: "npm:^1.1.5" + checksum: 10c0/ef10d7981113d69225135f994c9f8c4369d945e64a8fc721d655a3a38421b738c9fe899951721d1b47b73c41fdb5404ac87cc8903b2ecbed95d2800363e7e58c + languageName: node + linkType: hard + "get-east-asian-width@npm:^1.0.0": version: 1.2.0 resolution: "get-east-asian-width@npm:1.2.0" @@ -1786,6 +2042,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: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -1820,6 +2083,20 @@ __metadata: languageName: node linkType: hard +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -1848,13 +2125,31 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c + languageName: node + linkType: hard + +"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: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc 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: 10c0/4fa4774d65b5331814b74ac05cefea56854fc0d5989c80b13432c1b0d42a14c9f4342ca3ad9f0359a52e78da12b1744c9f8a28e50042136ea9171675d972a5fd + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -1865,6 +2160,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + "https-proxy-agent@npm:^7.0.1": version: 7.0.5 resolution: "https-proxy-agent@npm:7.0.5" @@ -1882,6 +2187,15 @@ __metadata: languageName: node linkType: hard +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: "npm:^2.0.0" + checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a + languageName: node + linkType: hard + "husky@npm:^9.1.6": version: 9.1.6 resolution: "husky@npm:9.1.6" @@ -1900,6 +2214,13 @@ __metadata: languageName: node linkType: hard +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "ignore@npm:^5.2.0, ignore@npm:^5.3.1": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -1931,6 +2252,37 @@ __metadata: languageName: node linkType: hard +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 10c0/a7b241e3149c26e37474e3435779487f42f36883711f198c45794703c7556bc38af224088bd4d1a221a45b8208ae2c2bcf86200383621434d0c099304481c5b9 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -2179,6 +2531,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + "magic-string@npm:^0.30.11": version: 0.30.11 resolution: "magic-string@npm:0.30.11" @@ -2208,6 +2569,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: 10c0/2c737faf6a7f67077679da548b5bfeeef890595bf8c4323a1f76eae355d27ebb33dcf9cf1a673f944cf2f2a7cbf4e2b09f0a0a62931737728f210d902c6be966 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -2246,7 +2631,14 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.1.2": +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -2264,6 +2656,22 @@ __metadata: languageName: node linkType: hard +"minimist@npm:^1.2.0, minimist@npm:^1.2.3": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/8f82bd1f3095b24f53a991b04b67f4c710c894e518b813f0864a31de5570441a509be1ca17e0bb92b047591a8fdbeb886f502764fefb00d2f144f4011791e898 + languageName: node + linkType: hard + "minipass-collect@npm:^2.0.1": version: 2.0.1 resolution: "minipass-collect@npm:2.0.1" @@ -2273,6 +2681,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: 10c0/a43da7401cd7c4f24b993887d41bd37d097356083b0bb836fd655916467463a1e6e9e553b2da4fcbe8745bf23d40c8b884eab20745562199663b3e9060cd8e7a + languageName: node + linkType: hard + "minipass-fetch@npm:^3.0.0": version: 3.0.5 resolution: "minipass-fetch@npm:3.0.5" @@ -2297,7 +2720,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: @@ -2315,7 +2738,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: @@ -2338,7 +2761,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: @@ -2348,7 +2771,14 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -2357,7 +2787,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.1.3": +"ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -2373,6 +2803,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: 10c0/37fd2cd0ff2ad20073ce78d83fd718a740d568b225924e753ae51cb69d68f330c80544d487e5e5bd18e28702ed2ca469c2424ad948becd1862c1b0209542b2e9 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -2380,13 +2817,51 @@ __metadata: languageName: node linkType: hard -"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: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 languageName: node linkType: hard +"node-abi@npm:^3.3.0": + version: 3.67.0 + resolution: "node-abi@npm:3.67.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/72ce2edbdfb84745bc201a4e48aa7146fd88a0d2c80046b6b17f28439c9a7683eab846f40f1e819349c31f7d9331ed5c50d1e741208d938dd5f38b29cab2275e + languageName: node + linkType: hard + +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 + 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: 10c0/80ef333b3a882eb6a2695a8e08f31d618f4533eff192864e4a3a16b67ff0abc9d8c1d5fac0395550ec699326b9248c5e2b3be178492f7f4d1ccf97d2cf948021 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.2.0 resolution: "node-gyp@npm:10.2.0" @@ -2407,6 +2882,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: 10c0/fc5c4f07155cb455bf5fc3dd149fac421c1a40fd83c6bfe83aa82b52f02c17c5e88301321318adaa27611c8a6811423d51d29deaceab5fa158b585a61a551061 + languageName: node + linkType: hard + "nopt@npm:^7.0.0": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -2427,6 +2913,27 @@ __metadata: languageName: node linkType: hard +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: "npm:^3.0.0" + console-control-strings: "npm:^1.1.0" + gauge: "npm:^4.0.3" + set-blocking: "npm:^2.0.0" + checksum: 10c0/0cacedfbc2f6139c746d9cd4a85f62718435ad0ca4a2d6459cd331dd33ae58206e91a0742c1558634efcde3f33f8e8e7fd3adf1bfe7978310cf00bd55cccf890 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + "onetime@npm:^6.0.0": version: 6.0.0 resolution: "onetime@npm:6.0.0" @@ -2509,6 +3016,13 @@ __metadata: languageName: node linkType: hard +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -2581,6 +3095,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.1": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" + 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: 10c0/e64868ba9ef2068fd7264f5b03e5298a901e02a450acdb1f56258d88c09dea601eefdb3d1dfdff8513fdd230a92961712be0676192626a3b4d01ba154d48bdd3 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -2604,6 +3140,13 @@ __metadata: languageName: node linkType: hard +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 10c0/d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -2614,6 +3157,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.2 + resolution: "pump@npm:3.0.2" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -2628,6 +3181,31 @@ __metadata: languageName: node linkType: hard +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -2673,6 +3251,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + "rollup@npm:^4.20.0": version: 4.21.2 resolution: "rollup@npm:4.21.2" @@ -2745,6 +3334,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -2761,6 +3357,13 @@ __metadata: languageName: node linkType: hard +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -2784,6 +3387,13 @@ __metadata: languageName: node linkType: hard +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + "signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" @@ -2791,6 +3401,24 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10c0/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: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + "slice-ansi@npm:^5.0.0": version: 5.0.0 resolution: "slice-ansi@npm:5.0.0" @@ -2818,6 +3446,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: 10c0/d75c1cf1fdd7f8309a43a77f84409b793fc0f540742ef915154e70ac09a08b0490576fe85d4f8d68bbf80e604a62957a17ab5ef50d312fe1442b0ab6f8f6e6f6 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^8.0.3": version: 8.0.4 resolution: "socks-proxy-agent@npm:8.0.4" @@ -2829,7 +3468,7 @@ __metadata: languageName: node linkType: hard -"socks@npm:^2.8.3": +"socks@npm:^2.6.2, socks@npm:^2.8.3": version: 2.8.3 resolution: "socks@npm:2.8.3" dependencies: @@ -2853,6 +3492,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: 10c0/10daab5d7854bd0ec3c7690c00359cd3444eabc869b68c68dcb61374a8fa5e2f4be06cf0aba78f7a16336d49e83e4631e8af98f8bd33c772fe8d60b45fa60bc1 + languageName: node + linkType: hard + "ssri@npm:^10.0.0": version: 10.0.6 resolution: "ssri@npm:10.0.6" @@ -2862,6 +3522,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: 10c0/5cfae216ae02dcd154d1bbed2d0a60038a4b3a2fcaac3c7e47401ff4e058e551ee74cfdba618871bf168cd583db7b8324f94af6747d4303b73cd4c3f6dc5c9c2 + languageName: node + linkType: hard + "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -2883,7 +3552,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -2916,6 +3585,15 @@ __metadata: languageName: node linkType: hard +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -2948,6 +3626,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -2957,7 +3642,32 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.2.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: 10c0/871d26a934bfb7beeae4c4d8a09689f530b565f79bd0cf489823ff0efa3705da01278160da10bb006d1a793fa0425cf316cec029b32a9159eacbeaff4965fb6d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + +"tar@npm:^6.0.2, tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -3047,6 +3757,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: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -3116,6 +3835,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: 10c0/d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -3125,6 +3853,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: 10c0/9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 + languageName: node + linkType: hard + "unique-slug@npm:^4.0.0": version: 4.0.0 resolution: "unique-slug@npm:4.0.0" @@ -3143,6 +3880,13 @@ __metadata: languageName: node linkType: hard +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + "validator@npm:^13.12.0": version: 13.12.0 resolution: "validator@npm:13.12.0" @@ -3256,7 +4000,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^2.0.1": +"which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: @@ -3290,6 +4034,15 @@ __metadata: languageName: node linkType: hard +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: "npm:^1.0.2 || 2 || 3 || 4" + checksum: 10c0/1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -3330,6 +4083,13 @@ __metadata: languageName: node linkType: hard +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0"