@typed-sql/sqlite 2.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/LICENSE +21 -0
  3. package/README.md +34 -0
  4. package/dist/packages/sqlite/src/index.d.ts +17 -0
  5. package/dist/packages/sqlite/src/index.d.ts.map +1 -0
  6. package/dist/packages/sqlite/src/index.js +72 -0
  7. package/dist/packages/sqlite/src/index.js.map +1 -0
  8. package/dist/packages/sqlite/src/node-sqlite.d.ts +44 -0
  9. package/dist/packages/sqlite/src/node-sqlite.d.ts.map +1 -0
  10. package/dist/packages/sqlite/src/node-sqlite.js +125 -0
  11. package/dist/packages/sqlite/src/node-sqlite.js.map +1 -0
  12. package/dist/packages/sqlite/src/prepared.d.ts +20 -0
  13. package/dist/packages/sqlite/src/prepared.d.ts.map +1 -0
  14. package/dist/packages/sqlite/src/prepared.js +47 -0
  15. package/dist/packages/sqlite/src/prepared.js.map +1 -0
  16. package/dist/packages/sqlite/src/provider.d.ts +21 -0
  17. package/dist/packages/sqlite/src/provider.d.ts.map +1 -0
  18. package/dist/packages/sqlite/src/provider.js +120 -0
  19. package/dist/packages/sqlite/src/provider.js.map +1 -0
  20. package/dist/packages/sqlite/src/resolver.d.ts +26 -0
  21. package/dist/packages/sqlite/src/resolver.d.ts.map +1 -0
  22. package/dist/packages/sqlite/src/resolver.js +664 -0
  23. package/dist/packages/sqlite/src/resolver.js.map +1 -0
  24. package/dist/packages/sqlite/src/runtime.d.ts +27 -0
  25. package/dist/packages/sqlite/src/runtime.d.ts.map +1 -0
  26. package/dist/packages/sqlite/src/runtime.js +288 -0
  27. package/dist/packages/sqlite/src/runtime.js.map +1 -0
  28. package/dist/packages/sqlite/src/semantics.d.ts +5 -0
  29. package/dist/packages/sqlite/src/semantics.d.ts.map +1 -0
  30. package/dist/packages/sqlite/src/semantics.js +206 -0
  31. package/dist/packages/sqlite/src/semantics.js.map +1 -0
  32. package/dist/packages/sqlite/src/snapshot.d.ts +40 -0
  33. package/dist/packages/sqlite/src/snapshot.d.ts.map +1 -0
  34. package/dist/packages/sqlite/src/snapshot.js +131 -0
  35. package/dist/packages/sqlite/src/snapshot.js.map +1 -0
  36. package/dist/packages/sqlite/src/type-policy.d.ts +18 -0
  37. package/dist/packages/sqlite/src/type-policy.d.ts.map +1 -0
  38. package/dist/packages/sqlite/src/type-policy.js +63 -0
  39. package/dist/packages/sqlite/src/type-policy.js.map +1 -0
  40. package/dist/packages/sqlite/src/version.d.ts +2 -0
  41. package/dist/packages/sqlite/src/version.d.ts.map +1 -0
  42. package/dist/packages/sqlite/src/version.js +2 -0
  43. package/dist/packages/sqlite/src/version.js.map +1 -0
  44. package/package.json +53 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,39 @@
1
+ # @typed-sql/sqlite
2
+
3
+ ## 2.0.0-rc.0
4
+
5
+ ### Minor Changes
6
+
7
+ - af27a0e: Add the experimental SQLite grammar with sound flexible-table storage unions, precise STRICT-table
8
+ types, catalog snapshots for views, generated columns, indexes, foreign keys, and attached schemas,
9
+ compound-query and RETURNING inference, and an optional application-owned `node:sqlite` adapter for
10
+ prepared execution, nested transactions, ordered batches, and typed streams.
11
+ - e654fae: Add opt-in Standard Schema V1 result validation with compile-time output compatibility, immutable
12
+ query attachment, sync and async validators, redacted fingerprinted errors, and consistent decoded-row
13
+ handling across buffered cardinality methods, batches, PostgreSQL pipelines, streams, and transactions.
14
+
15
+ ### Patch Changes
16
+
17
+ - 7023011: Support Node.js 22.11 and 22.12 by normalizing file URLs before opening `DatabaseSync` and using a
18
+ buffered iterator when those Node releases do not yet provide `StatementSync.iterate()`.
19
+ - Updated dependencies [29afc3d]
20
+ - Updated dependencies [3f063f6]
21
+ - Updated dependencies [6a7ae58]
22
+ - Updated dependencies [af27a0e]
23
+ - Updated dependencies [b06fd0a]
24
+ - Updated dependencies [3050209]
25
+ - Updated dependencies [1b054b6]
26
+ - Updated dependencies [b4f1b6e]
27
+ - Updated dependencies [87189c3]
28
+ - Updated dependencies [e654fae]
29
+ - Updated dependencies [b2ec119]
30
+ - @typed-sql/ast@2.0.0-rc.0
31
+ - @typed-sql/core@2.0.0-rc.0
32
+ - @typed-sql/schema@2.0.0-rc.0
33
+
34
+ ## 1.0.0-rc.0
35
+
36
+ ### Minor Changes
37
+
38
+ - Add the preview SQLite grammar, sound flexible-table typing, catalog introspection, and optional
39
+ application-owned `node:sqlite` adapter.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 typed-sql contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # @typed-sql/sqlite
2
+
3
+ The preview SQLite grammar for typed-sql. It provides sound inference for SQLite's dynamic type
4
+ system, schema introspection, and an optional application-owned `node:sqlite` adapter.
5
+
6
+ ```sh
7
+ pnpm add @typed-sql/core @typed-sql/sqlite
8
+ pnpm add -D @typed-sql/cli typescript@7.0.2
9
+ ```
10
+
11
+ ```ts
12
+ import { sql, typePolicy } from "@typed-sql/sqlite";
13
+ import { createNodeSqliteDatabase } from "@typed-sql/sqlite/node-sqlite";
14
+
15
+ const query = sql`
16
+ SELECT account.id, account.email
17
+ FROM account
18
+ WHERE account.id = ${42n}
19
+ `;
20
+
21
+ const database = await createNodeSqliteDatabase({ path: "app.db", typePolicy });
22
+ const accounts = await database.execute(query);
23
+ await database.close();
24
+ ```
25
+
26
+ The package root has no database-driver dependency. `/node-sqlite` loads the built-in Node module
27
+ only when the application selects that adapter. STRICT tables receive precise declared types;
28
+ ordinary SQLite tables use a storage-class union because their declared affinity does not constrain
29
+ the values they may contain.
30
+
31
+ SQLite support remains on the experimental release track while its grammar and adapter contracts
32
+ are exercised by early adopters.
33
+
34
+ MIT © typed-sql contributors
@@ -0,0 +1,17 @@
1
+ import { type DialectPlugin } from "@typed-sql/core";
2
+ import { type SqliteSchemaSnapshot } from "./snapshot.js";
3
+ import { type SqliteTypePolicy } from "./type-policy.js";
4
+ export interface SqliteDialectOptions {
5
+ readonly typePolicy?: SqliteTypePolicy;
6
+ }
7
+ export declare function sqlite(options?: SqliteDialectOptions): DialectPlugin<SqliteSchemaSnapshot, SqliteTypePolicy>;
8
+ export { sql } from "@typed-sql/core";
9
+ export type { FunctionSnapshot, SchemaSnapshot } from "@typed-sql/schema";
10
+ export type { SqliteQueryable, SqliteSchemaProviderOptions } from "./provider.js";
11
+ export { introspectSqlite, SqliteSchemaProvider } from "./provider.js";
12
+ export type { SqliteColumnSnapshot, SqliteForeignKeySnapshot, SqliteIndexColumnSnapshot, SqliteIndexSnapshot, SqliteSchemaSnapshot, SqliteTableSnapshot, } from "./snapshot.js";
13
+ export { parseSqliteSchemaSnapshot } from "./snapshot.js";
14
+ export type { SqliteAffinity, SqliteTypePolicy } from "./type-policy.js";
15
+ export { defaultSqliteTypePolicy, defaultSqliteTypePolicy as typePolicy, isKnownSqliteType, isKnownStrictSqliteType, mapSqliteCastType, mapSqliteType, sqliteAffinity, sqliteFlexibleType, } from "./type-policy.js";
16
+ export { SQLITE_DIALECT_VERSION } from "./version.js";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,aAAa,EAAyB,MAAM,iBAAiB,CAAC;AAGtG,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGlF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CACxC;AAcD,wBAAgB,MAAM,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CA8ChH;AAED,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,uBAAuB,EACvB,uBAAuB,IAAI,UAAU,EACrC,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { parseStatement, SqlParseError } from "@typed-sql/ast";
2
+ import { DIALECT_CONTRACT_VERSION, unknownQuerySemantics } from "@typed-sql/core";
3
+ import { resolveSqliteStatement } from "./resolver.js";
4
+ import { analyzeSqliteSemantics } from "./semantics.js";
5
+ import { parseSqliteSchemaSnapshot } from "./snapshot.js";
6
+ import { defaultSqliteTypePolicy } from "./type-policy.js";
7
+ import { SQLITE_DIALECT_VERSION } from "./version.js";
8
+ const capabilities = Object.freeze({
9
+ aggregateFilter: true,
10
+ arrays: false,
11
+ distinctOn: false,
12
+ fullJoins: true,
13
+ lockingReads: false,
14
+ recursiveCtes: false,
15
+ returning: true,
16
+ setOperations: true,
17
+ strictTables: true,
18
+ });
19
+ export function sqlite(options = {}) {
20
+ const defaultTypePolicy = options.typePolicy ?? defaultSqliteTypePolicy;
21
+ return Object.freeze({
22
+ contractVersion: DIALECT_CONTRACT_VERSION,
23
+ id: "sqlite",
24
+ grammarVersion: SQLITE_DIALECT_VERSION,
25
+ sqlModule: "@typed-sql/sqlite",
26
+ capabilities,
27
+ defaultTypePolicy,
28
+ placeholder(index) {
29
+ if (!Number.isInteger(index) || index < 1)
30
+ throw new RangeError("SQLite parameter indexes start at 1");
31
+ return "?";
32
+ },
33
+ quoteIdentifier(identifier) {
34
+ return `"${identifier.replaceAll('"', '""')}"`;
35
+ },
36
+ analyze(sql, snapshot, policy = defaultTypePolicy) {
37
+ try {
38
+ const statement = parseStatement(sql, { syntax: "sqlite" });
39
+ const resolved = resolveSqliteStatement(statement, snapshot, { typePolicy: policy });
40
+ return {
41
+ ...resolved,
42
+ semantics: resolved.diagnostics.some(({ severity }) => severity === "error")
43
+ ? unknownQuerySemantics(statement.range, "SQLite semantic analysis reported an error.")
44
+ : analyzeSqliteSemantics(statement, snapshot),
45
+ };
46
+ }
47
+ catch (error) {
48
+ if (!(error instanceof SqlParseError))
49
+ throw error;
50
+ return {
51
+ columns: [],
52
+ parameters: [],
53
+ diagnostics: [{ code: error.code, message: error.message, severity: "error", range: error.range }],
54
+ semantics: unknownQuerySemantics(error.range, "The SQL could not be parsed by the SQLite grammar."),
55
+ };
56
+ }
57
+ },
58
+ validateSnapshot(value) {
59
+ const snapshot = parseSqliteSchemaSnapshot(value);
60
+ if (snapshot.dialectVersion !== undefined && snapshot.dialectVersion !== SQLITE_DIALECT_VERSION) {
61
+ throw new TypeError(`@typed-sql/sqlite grammar ${SQLITE_DIALECT_VERSION} cannot use snapshot dialectVersion ${snapshot.dialectVersion}`);
62
+ }
63
+ return snapshot;
64
+ },
65
+ });
66
+ }
67
+ export { sql } from "@typed-sql/core";
68
+ export { introspectSqlite, SqliteSchemaProvider } from "./provider.js";
69
+ export { parseSqliteSchemaSnapshot } from "./snapshot.js";
70
+ export { defaultSqliteTypePolicy, defaultSqliteTypePolicy as typePolicy, isKnownSqliteType, isKnownStrictSqliteType, mapSqliteCastType, mapSqliteType, sqliteAffinity, sqliteFlexibleType, } from "./type-policy.js";
71
+ export { SQLITE_DIALECT_VERSION } from "./version.js";
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { PathLike } from "node:fs";
2
+ import { SqliteSchemaProvider } from "./provider.js";
3
+ import { type SqliteConnectionLike, type SqliteDatabase } from "./runtime.js";
4
+ import type { SqliteSchemaSnapshot } from "./snapshot.js";
5
+ import { type SqliteTypePolicy } from "./type-policy.js";
6
+ type SqliteInput = null | number | bigint | string | ArrayBufferView;
7
+ export interface NodeSqliteStatementLike {
8
+ all(...values: readonly SqliteInput[]): Record<string, unknown>[];
9
+ iterate?(...values: readonly SqliteInput[]): IterableIterator<Record<string, unknown>>;
10
+ setReadBigInts(enabled: boolean): void;
11
+ }
12
+ export interface NodeSqliteDatabaseLike {
13
+ prepare(sql: string): NodeSqliteStatementLike;
14
+ exec(sql: string): void;
15
+ close(): void;
16
+ }
17
+ export interface NodeSqliteModuleLike {
18
+ readonly DatabaseSync: new (path: PathLike, options?: Readonly<Record<string, unknown>>) => NodeSqliteDatabaseLike;
19
+ }
20
+ export interface NodeSqliteDatabaseOptions {
21
+ readonly path: PathLike;
22
+ readonly databaseOptions?: Readonly<Record<string, unknown>>;
23
+ readonly typePolicy?: SqliteTypePolicy;
24
+ readonly statementCacheSize?: number;
25
+ /** Test or host-injected loader. Applications normally leave this unset. */
26
+ readonly driverImporter?: () => Promise<NodeSqliteModuleLike>;
27
+ }
28
+ export interface NodeSqliteSchemaProviderOptions extends Omit<NodeSqliteDatabaseOptions, "path"> {
29
+ readonly path?: PathLike;
30
+ readonly database?: NodeSqliteDatabaseLike;
31
+ readonly schemas?: readonly string[];
32
+ readonly functions?: ConstructorParameters<typeof SqliteSchemaProvider>[0]["functions"];
33
+ }
34
+ export declare function adaptNodeSqliteDatabase(database: NodeSqliteDatabaseLike, options?: {
35
+ readonly typePolicy?: SqliteTypePolicy;
36
+ readonly statementCacheSize?: number;
37
+ }): SqliteConnectionLike;
38
+ export declare function loadNodeSqlite(importer?: () => Promise<NodeSqliteModuleLike>): Promise<NodeSqliteModuleLike>;
39
+ export declare function createNodeSqliteDatabase(options: NodeSqliteDatabaseOptions): Promise<SqliteDatabase>;
40
+ export declare function nodeSqlite(options: NodeSqliteSchemaProviderOptions): {
41
+ introspect(): Promise<SqliteSchemaSnapshot>;
42
+ };
43
+ export {};
44
+ //# sourceMappingURL=node-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-sqlite.d.ts","sourceRoot":"","sources":["../../../../src/node-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAwB,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAwB,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAElF,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,GAAG,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAClE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvF,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,sBAAsB,CAAC;CACpH;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,+BAAgC,SAAQ,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC9F,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;CACzF;AAsDD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,sBAAsB,EAChC,OAAO,GAAE;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7F,oBAAoB,CAsBtB;AAED,wBAAsB,cAAc,CAClC,QAAQ,GAAE,MAAM,OAAO,CAAC,oBAAoB,CAA+B,GAC1E,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAWD,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAM1G;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,+BAA+B,GAAG;IAAE,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAA;CAAE,CA0BpH"}
@@ -0,0 +1,125 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { SqliteSchemaProvider } from "./provider.js";
3
+ import { createSqliteDatabase } from "./runtime.js";
4
+ import { defaultSqliteTypePolicy } from "./type-policy.js";
5
+ function validateCacheSize(value) {
6
+ const size = value ?? 256;
7
+ if (!Number.isSafeInteger(size) || size < 1) {
8
+ throw new TypeError("node:sqlite statementCacheSize must be a positive safe integer");
9
+ }
10
+ return size;
11
+ }
12
+ function validateDatabaseOptions(options) {
13
+ if (options?.returnArrays !== undefined) {
14
+ throw new TypeError("node:sqlite returnArrays is owned by @typed-sql/sqlite and cannot be configured");
15
+ }
16
+ if (options?.readBigInts !== undefined) {
17
+ throw new TypeError("node:sqlite readBigInts is owned by @typed-sql/sqlite typePolicy and cannot be configured");
18
+ }
19
+ }
20
+ function input(value) {
21
+ if (value === null ||
22
+ typeof value === "number" ||
23
+ typeof value === "bigint" ||
24
+ typeof value === "string" ||
25
+ ArrayBuffer.isView(value)) {
26
+ return value;
27
+ }
28
+ if (typeof value === "boolean")
29
+ return value ? 1n : 0n;
30
+ throw new TypeError(`node:sqlite cannot bind ${value === undefined ? "undefined" : typeof value}`);
31
+ }
32
+ function statementCache(database, policy, maximum) {
33
+ const statements = new Map();
34
+ return (sql) => {
35
+ const cached = statements.get(sql);
36
+ if (cached !== undefined) {
37
+ statements.delete(sql);
38
+ statements.set(sql, cached);
39
+ return cached;
40
+ }
41
+ const prepared = database.prepare(sql);
42
+ prepared.setReadBigInts(policy.integer === "bigint");
43
+ statements.set(sql, prepared);
44
+ if (statements.size > maximum)
45
+ statements.delete(statements.keys().next().value);
46
+ return prepared;
47
+ };
48
+ }
49
+ export function adaptNodeSqliteDatabase(database, options = {}) {
50
+ const prepared = statementCache(database, options.typePolicy ?? defaultSqliteTypePolicy, validateCacheSize(options.statementCacheSize));
51
+ return {
52
+ all(sql, values = []) {
53
+ return prepared(sql).all(...values.map(input));
54
+ },
55
+ exec(sql) {
56
+ database.exec(sql);
57
+ },
58
+ iterate(sql, values = []) {
59
+ const statement = prepared(sql);
60
+ const inputs = values.map(input);
61
+ return statement.iterate?.(...inputs) ?? statement.all(...inputs)[Symbol.iterator]();
62
+ },
63
+ close() {
64
+ database.close();
65
+ },
66
+ };
67
+ }
68
+ export async function loadNodeSqlite(importer = () => import("node:sqlite")) {
69
+ try {
70
+ return await importer();
71
+ }
72
+ catch (error) {
73
+ if (error instanceof Error && "code" in error && error.code === "ERR_UNKNOWN_BUILTIN_MODULE") {
74
+ throw new Error("@typed-sql/sqlite/node-sqlite requires a Node.js release that provides node:sqlite", {
75
+ cause: error,
76
+ });
77
+ }
78
+ throw error;
79
+ }
80
+ }
81
+ async function open(options) {
82
+ validateDatabaseOptions(options.databaseOptions);
83
+ validateCacheSize(options.statementCacheSize);
84
+ const driver = await loadNodeSqlite(options.driverImporter);
85
+ return new driver.DatabaseSync(options.path instanceof URL ? fileURLToPath(options.path) : options.path, {
86
+ ...options.databaseOptions,
87
+ });
88
+ }
89
+ export async function createNodeSqliteDatabase(options) {
90
+ const database = await open(options);
91
+ return createSqliteDatabase({
92
+ connection: adaptNodeSqliteDatabase(database, options),
93
+ ownsConnection: true,
94
+ });
95
+ }
96
+ export function nodeSqlite(options) {
97
+ return {
98
+ async introspect() {
99
+ const ownsDatabase = options.database === undefined;
100
+ if (ownsDatabase && options.path === undefined) {
101
+ throw new TypeError("node:sqlite schema provider requires path or database");
102
+ }
103
+ const database = options.database ?? (await open({ ...options, path: options.path }));
104
+ const connection = adaptNodeSqliteDatabase(database, options);
105
+ const client = {
106
+ async all(sql, values) {
107
+ return (await connection.all(sql, values));
108
+ },
109
+ };
110
+ try {
111
+ return await new SqliteSchemaProvider({
112
+ client,
113
+ ...(options.schemas === undefined ? {} : { schemas: options.schemas }),
114
+ ...(options.functions === undefined ? {} : { functions: options.functions }),
115
+ ...(options.typePolicy === undefined ? {} : { typePolicy: options.typePolicy }),
116
+ }).introspect();
117
+ }
118
+ finally {
119
+ if (ownsDatabase)
120
+ await connection.close?.();
121
+ }
122
+ },
123
+ };
124
+ }
125
+ //# sourceMappingURL=node-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-sqlite.js","sourceRoot":"","sources":["../../../../src/node-sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type Query, type QueryRenderSkeleton, type RenderedQuery, type SqlRenderer } from "@typed-sql/core";
2
+ export interface SqlitePreparedQueryFactory<Arguments extends readonly unknown[], Row, Params extends readonly unknown[]> {
3
+ (...args: Arguments): Query<Row, Params>;
4
+ readonly statementName: string;
5
+ }
6
+ export interface SqlitePreparedQueryMetadata {
7
+ readonly statementName: string;
8
+ readonly rendered: RenderedQuery;
9
+ }
10
+ interface PreparedStatement {
11
+ skeleton: QueryRenderSkeleton | undefined;
12
+ }
13
+ export interface SqlitePreparedQueryState {
14
+ readonly statements: Map<string, PreparedStatement>;
15
+ readonly queries: WeakMap<object, SqlitePreparedQueryMetadata>;
16
+ }
17
+ export declare function createSqlitePreparedQueryState(): SqlitePreparedQueryState;
18
+ export declare function prepareSqliteQuery<Arguments extends readonly unknown[], Row, Params extends readonly unknown[]>(state: SqlitePreparedQueryState, renderer: SqlRenderer, statementName: string, factory: (...args: Arguments) => Query<Row, Params>): SqlitePreparedQueryFactory<Arguments, Row, Params>;
19
+ export {};
20
+ //# sourceMappingURL=prepared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepared.d.ts","sourceRoot":"","sources":["../../../../src/prepared.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,0BAA0B,CACzC,SAAS,SAAS,SAAS,OAAO,EAAE,EACpC,GAAG,EACH,MAAM,SAAS,SAAS,OAAO,EAAE;IAEjC,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CAChE;AAED,wBAAgB,8BAA8B,IAAI,wBAAwB,CAKzE;AAQD,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,SAAS,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,EAC7G,KAAK,EAAE,wBAAwB,EAC/B,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,GAClD,0BAA0B,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAwCpD"}
@@ -0,0 +1,47 @@
1
+ import { bindQueryRenderSkeleton, compileQueryRenderSkeleton, } from "@typed-sql/core";
2
+ export function createSqlitePreparedQueryState() {
3
+ return {
4
+ statements: new Map(),
5
+ queries: new WeakMap(),
6
+ };
7
+ }
8
+ function validateStatementName(statementName) {
9
+ if (typeof statementName !== "string" || statementName.length === 0 || statementName.includes("\0")) {
10
+ throw new TypeError("Prepared statement names must be non-empty and cannot contain NUL");
11
+ }
12
+ }
13
+ export function prepareSqliteQuery(state, renderer, statementName, factory) {
14
+ validateStatementName(statementName);
15
+ if (state.statements.has(statementName)) {
16
+ throw new TypeError(`Prepared statement name ${JSON.stringify(statementName)} is already registered`);
17
+ }
18
+ const statement = { skeleton: undefined };
19
+ state.statements.set(statementName, statement);
20
+ const prepared = (...args) => {
21
+ const query = factory(...args);
22
+ const existing = state.queries.get(query);
23
+ if (existing !== undefined && existing.statementName !== statementName) {
24
+ throw new TypeError(`A query cannot use both prepared statement ${JSON.stringify(existing.statementName)} and ${JSON.stringify(statementName)}`);
25
+ }
26
+ let rendered = existing?.rendered;
27
+ const skeleton = statement.skeleton;
28
+ if (rendered === undefined) {
29
+ if (skeleton === undefined) {
30
+ const compiled = compileQueryRenderSkeleton(query, renderer);
31
+ statement.skeleton = compiled.skeleton;
32
+ rendered = compiled.rendered;
33
+ }
34
+ else {
35
+ rendered = bindQueryRenderSkeleton(query, skeleton);
36
+ }
37
+ }
38
+ if (rendered === undefined) {
39
+ throw new TypeError(`Prepared statement ${JSON.stringify(statementName)} must always render the same SQL text and structure`);
40
+ }
41
+ if (existing === undefined)
42
+ state.queries.set(query, { statementName, rendered });
43
+ return query;
44
+ };
45
+ return Object.freeze(Object.assign(prepared, { statementName }));
46
+ }
47
+ //# sourceMappingURL=prepared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepared.js","sourceRoot":"","sources":["../../../../src/prepared.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAK3B,MAAM,iBAAiB,CAAC;AAyBzB,MAAM,UAAU,8BAA8B;IAC5C,OAAO;QACL,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,OAAO,EAAE,IAAI,OAAO,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,aAAqB;IAClD,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAA+B,EAC/B,QAAqB,EACrB,aAAqB,EACrB,OAAmD;IAEnD,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,SAAS,GAAsB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAe,EAAsB,EAAE;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YACvE,MAAM,IAAI,SAAS,CACjB,8CAA8C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAC5H,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC7D,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACvC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,SAAS,CACjB,sBAAsB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,qDAAqD,CACzG,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { FunctionSnapshot, SchemaInput, SchemaProvider } from "@typed-sql/schema";
2
+ import type { SqliteSchemaSnapshot } from "./snapshot.js";
3
+ import { type SqliteTypePolicy } from "./type-policy.js";
4
+ type MaybePromise<Value> = Value | Promise<Value>;
5
+ export interface SqliteQueryable {
6
+ all<Row extends Record<string, unknown>>(sql: string, values?: readonly unknown[]): MaybePromise<readonly Row[]>;
7
+ }
8
+ export interface SqliteSchemaProviderOptions {
9
+ readonly client: SqliteQueryable;
10
+ readonly schemas?: readonly string[];
11
+ readonly functions?: Readonly<Record<string, FunctionSnapshot>>;
12
+ readonly typePolicy?: SqliteTypePolicy;
13
+ }
14
+ export declare class SqliteSchemaProvider implements SchemaProvider {
15
+ #private;
16
+ constructor(options: SqliteSchemaProviderOptions);
17
+ introspect(_input?: SchemaInput): Promise<SqliteSchemaSnapshot>;
18
+ }
19
+ export declare function introspectSqlite(options: SqliteSchemaProviderOptions): Promise<SqliteSchemaSnapshot>;
20
+ export {};
21
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAGV,oBAAoB,EAErB,MAAM,eAAe,CAAC;AACvB,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGjG,KAAK,YAAY,CAAC,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;CAClH;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CACxC;AA2HD,qBAAa,oBAAqB,YAAW,cAAc;;IAMzD,YAAY,OAAO,EAAE,2BAA2B,EAK/C;IAEK,UAAU,CAAC,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoDxE;CACF;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE1G"}
@@ -0,0 +1,120 @@
1
+ import { defaultSqliteTypePolicy, mapSqliteType } from "./type-policy.js";
2
+ import { SQLITE_DIALECT_VERSION } from "./version.js";
3
+ function identifier(value) {
4
+ if (value.length === 0 || value.includes("\0"))
5
+ throw new TypeError("SQLite identifiers must be non-empty and omit NUL");
6
+ return `"${value.replaceAll('"', '""')}"`;
7
+ }
8
+ function integer(value) {
9
+ return typeof value === "bigint" ? Number(value) : value;
10
+ }
11
+ async function all(client, sql, values) {
12
+ return await client.all(sql, values);
13
+ }
14
+ function indexOrigin(origin) {
15
+ return origin === "pk" ? "primary-key" : origin === "u" ? "unique" : "create";
16
+ }
17
+ async function indexes(client, schema, table) {
18
+ const rows = await all(client, `PRAGMA ${identifier(schema)}.index_list(${identifier(table)})`);
19
+ return await Promise.all(rows.map(async (row) => {
20
+ const columns = await all(client, `PRAGMA ${identifier(schema)}.index_xinfo(${identifier(row.name)})`);
21
+ return {
22
+ name: row.name,
23
+ unique: integer(row.unique) === 1,
24
+ partial: integer(row.partial) === 1,
25
+ origin: indexOrigin(row.origin),
26
+ columns: columns
27
+ .filter(({ key }) => integer(key) === 1)
28
+ .map((column) => ({
29
+ ...(column.name === null ? {} : { name: column.name }),
30
+ ...(integer(column.cid) < 0 ? { expression: true } : {}),
31
+ ...(integer(column.desc) === 1 ? { descending: true } : {}),
32
+ })),
33
+ };
34
+ }));
35
+ }
36
+ async function foreignKeys(client, schema, table) {
37
+ const rows = await all(client, `PRAGMA ${identifier(schema)}.foreign_key_list(${identifier(table)})`);
38
+ const groups = new Map();
39
+ for (const row of rows) {
40
+ const group = groups.get(row.id);
41
+ if (group === undefined)
42
+ groups.set(row.id, [row]);
43
+ else
44
+ group.push(row);
45
+ }
46
+ return [...groups.values()].map((group) => {
47
+ group.sort((left, right) => integer(left.seq) - integer(right.seq));
48
+ const first = group[0];
49
+ return {
50
+ columns: group.map((row) => row.from),
51
+ referencedTable: first.table,
52
+ referencedColumns: group.flatMap((row) => (row.to === null ? [] : [row.to])),
53
+ onUpdate: first.on_update,
54
+ onDelete: first.on_delete,
55
+ };
56
+ });
57
+ }
58
+ export class SqliteSchemaProvider {
59
+ #client;
60
+ #schemas;
61
+ #functions;
62
+ #policy;
63
+ constructor(options) {
64
+ this.#client = options.client;
65
+ this.#schemas = options.schemas;
66
+ this.#functions = options.functions;
67
+ this.#policy = options.typePolicy ?? defaultSqliteTypePolicy;
68
+ }
69
+ async introspect(_input = {}) {
70
+ const version = (await all(this.#client, "SELECT sqlite_version() AS version"))[0]?.version;
71
+ const listed = await all(this.#client, "PRAGMA table_list");
72
+ const requested = this.#schemas === undefined ? new Set(["main"]) : new Set(this.#schemas);
73
+ if (requested.size === 0)
74
+ throw new TypeError("SQLite schema introspection requires at least one schema");
75
+ const selected = listed.filter((row) => requested.has(row.schema) && !row.name.startsWith("sqlite_") && row.type !== "shadow");
76
+ const tables = {};
77
+ for (const row of selected) {
78
+ const columns = await all(this.#client, `PRAGMA ${identifier(row.schema)}.table_xinfo(${identifier(row.name)})`);
79
+ const key = requested.size === 1 && row.schema === "main" ? row.name : `${row.schema}.${row.name}`;
80
+ const strict = integer(row.strict) === 1;
81
+ tables[key] = {
82
+ schema: row.schema,
83
+ name: row.name,
84
+ kind: row.type === "view" ? "view" : columns.some(({ hidden }) => integer(hidden) === 1) ? "virtual" : "table",
85
+ strict,
86
+ withoutRowid: integer(row.wr) === 1,
87
+ columns: Object.fromEntries(columns.map((column) => [
88
+ column.name,
89
+ {
90
+ name: column.name,
91
+ databaseType: column.type,
92
+ tsType: mapSqliteType(column.type, this.#policy, { strict }),
93
+ nullable: integer(column.notnull) !== 1 && integer(column.pk) === 0,
94
+ ...(column.dflt_value === null ? {} : { defaultExpression: column.dflt_value }),
95
+ ...(integer(column.hidden) === 1 ? { hidden: true } : {}),
96
+ ...(integer(column.hidden) === 2 ? { generated: "virtual" } : {}),
97
+ ...(integer(column.hidden) === 3 ? { generated: "stored" } : {}),
98
+ ...(integer(column.pk) === 0 ? {} : { primaryKeyPosition: integer(column.pk) }),
99
+ },
100
+ ])),
101
+ indexes: await indexes(this.#client, row.schema, row.name),
102
+ foreignKeys: await foreignKeys(this.#client, row.schema, row.name),
103
+ };
104
+ }
105
+ return {
106
+ formatVersion: 1,
107
+ dialect: "sqlite",
108
+ dialectVersion: SQLITE_DIALECT_VERSION,
109
+ ...(version === undefined ? {} : { version }),
110
+ tables,
111
+ ...(this.#functions === undefined || Object.keys(this.#functions).length === 0
112
+ ? {}
113
+ : { functions: this.#functions }),
114
+ };
115
+ }
116
+ }
117
+ export async function introspectSqlite(options) {
118
+ return new SqliteSchemaProvider(options).introspect();
119
+ }
120
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../src/provider.ts"],"names":[],"mappings":"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"}