@nicia-ai/typegraph 0.21.0 → 0.22.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 (43) hide show
  1. package/dist/backend/postgres/index.cjs +33 -33
  2. package/dist/backend/postgres/index.js +4 -4
  3. package/dist/backend/sqlite/index.cjs +14 -14
  4. package/dist/backend/sqlite/index.d.cts +11 -0
  5. package/dist/backend/sqlite/index.d.ts +11 -0
  6. package/dist/backend/sqlite/index.js +4 -4
  7. package/dist/backend/sqlite/libsql.cjs +7 -7
  8. package/dist/backend/sqlite/libsql.js +4 -4
  9. package/dist/backend/sqlite/local.cjs +26 -9
  10. package/dist/backend/sqlite/local.cjs.map +1 -1
  11. package/dist/backend/sqlite/local.js +21 -5
  12. package/dist/backend/sqlite/local.js.map +1 -1
  13. package/dist/{chunk-FQCQM3KG.cjs → chunk-3JK66E3I.cjs} +4 -2
  14. package/dist/chunk-3JK66E3I.cjs.map +1 -0
  15. package/dist/{chunk-SMMOAVJ5.js → chunk-3PPEHLGK.js} +3 -3
  16. package/dist/{chunk-SMMOAVJ5.js.map → chunk-3PPEHLGK.js.map} +1 -1
  17. package/dist/{chunk-UQVBVBVG.js → chunk-5ZMMHUWR.js} +53 -7
  18. package/dist/chunk-5ZMMHUWR.js.map +1 -0
  19. package/dist/{chunk-4XNE2JG3.js → chunk-753F33CV.js} +4 -2
  20. package/dist/chunk-753F33CV.js.map +1 -0
  21. package/dist/{chunk-CQL6FOTT.cjs → chunk-GUYI6VAS.cjs} +43 -24
  22. package/dist/chunk-GUYI6VAS.cjs.map +1 -0
  23. package/dist/{chunk-NRNJ52AA.js → chunk-NSLTDXVH.js} +26 -7
  24. package/dist/chunk-NSLTDXVH.js.map +1 -0
  25. package/dist/{chunk-2X7P7AD5.cjs → chunk-PEE4EWXZ.cjs} +22 -22
  26. package/dist/{chunk-2X7P7AD5.cjs.map → chunk-PEE4EWXZ.cjs.map} +1 -1
  27. package/dist/{chunk-Q73OWTJY.cjs → chunk-SCXOGKLD.cjs} +112 -66
  28. package/dist/chunk-SCXOGKLD.cjs.map +1 -0
  29. package/dist/index.cjs +135 -54
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +45 -1
  32. package/dist/index.d.ts +45 -1
  33. package/dist/index.js +115 -36
  34. package/dist/index.js.map +1 -1
  35. package/dist/indexes/index.cjs +16 -16
  36. package/dist/indexes/index.js +2 -2
  37. package/package.json +1 -1
  38. package/dist/chunk-4XNE2JG3.js.map +0 -1
  39. package/dist/chunk-CQL6FOTT.cjs.map +0 -1
  40. package/dist/chunk-FQCQM3KG.cjs.map +0 -1
  41. package/dist/chunk-NRNJ52AA.js.map +0 -1
  42. package/dist/chunk-Q73OWTJY.cjs.map +0 -1
  43. package/dist/chunk-UQVBVBVG.js.map +0 -1
@@ -394,6 +394,7 @@ var postgresDialect = {
394
394
  recursiveQueryStrategy: "recursive_cte",
395
395
  setOperationStrategy: "standard_parenthesized",
396
396
  materializeIntermediateTraversalCtes: false,
397
+ emitNotMaterializedHint: true,
397
398
  forceRecursiveWorktableOuterJoinOrder: false,
398
399
  vectorPredicateStrategy: "native",
399
400
  vectorMetrics: ["cosine", "l2", "inner_product"],
@@ -572,6 +573,7 @@ var sqliteDialect = {
572
573
  recursiveQueryStrategy: "recursive_cte",
573
574
  setOperationStrategy: "sqlite_compound",
574
575
  materializeIntermediateTraversalCtes: true,
576
+ emitNotMaterializedHint: false,
575
577
  forceRecursiveWorktableOuterJoinOrder: true,
576
578
  vectorPredicateStrategy: "native",
577
579
  vectorMetrics: ["cosine", "l2"],
@@ -769,5 +771,5 @@ var EDGE_META_KEYS = [
769
771
  ];
770
772
 
771
773
  export { DEFAULT_PAGINATION_LIMIT, DEFAULT_STREAM_BATCH_SIZE, EDGE_INDEX_TYPE_MARKER, EDGE_META_KEYS, IDENTIFIER_COMPONENT_MAX_LENGTH, MAX_PG_IDENTIFIER_LENGTH, NODE_INDEX_TYPE_MARKER, NODE_META_KEYS, PG_ARRAY_END, PG_ARRAY_START, PG_PATH_ELEMENT_SEPARATOR, SQLITE_PATH_DELIMITER, TRUNCATED_IDENTIFIER_MAX_LENGTH, buildFulltextCapabilities, edgeColumnList, fnv1aBase36, fts5Strategy, getDialect, nodeColumnList, quotedColumn, quotedTableName, sqlNull, tsvectorStrategy };
772
- //# sourceMappingURL=chunk-4XNE2JG3.js.map
773
- //# sourceMappingURL=chunk-4XNE2JG3.js.map
774
+ //# sourceMappingURL=chunk-753F33CV.js.map
775
+ //# sourceMappingURL=chunk-753F33CV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/backend/drizzle/operations/shared.ts","../src/query/dialect/fulltext-strategy.ts","../src/constants.ts","../src/query/dialect/postgres.ts","../src/query/dialect/sqlite.ts","../src/query/dialect/index.ts","../src/utils/hash.ts","../src/system-fields.ts"],"names":["sql"],"mappings":"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","file":"chunk-753F33CV.js","sourcesContent":["import { type SQL, sql } from \"drizzle-orm\";\n\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\n\nexport type Tables = SqliteTables | PostgresTables;\n\n/**\n * Converts undefined to SQL NULL for use in template literals.\n * Drizzle doesn't handle undefined in sql`` templates correctly.\n */\nexport function sqlNull(value: string | undefined): SQL | string {\n return value ?? sql.raw(\"NULL\");\n}\n\nexport function quotedColumn(column: { name: string }): SQL {\n return sql.raw(`\"${column.name.replaceAll('\"', '\"\"')}\"`);\n}\n\n/**\n * Returns a quoted SQL identifier for a bare table name string.\n * Use when the operation targets a table that isn't represented as a\n * Drizzle table object (e.g. the FTS5 virtual table).\n */\nexport function quotedTableName(tableName: string): SQL {\n return sql.raw(`\"${tableName.replaceAll('\"', '\"\"')}\"`);\n}\n\nexport function nodeColumnList(nodes: Tables[\"nodes\"]): SQL {\n return sql.raw(`\"${nodes.graphId.name}\", \"${nodes.kind.name}\", \"${nodes.id.name}\", \"${nodes.props.name}\", \"${nodes.version.name}\", \"${nodes.validFrom.name}\", \"${nodes.validTo.name}\", \"${nodes.createdAt.name}\", \"${nodes.updatedAt.name}\"`);\n}\n\nexport function edgeColumnList(edges: Tables[\"edges\"]): SQL {\n return sql.raw(`\"${edges.graphId.name}\", \"${edges.id.name}\", \"${edges.kind.name}\", \"${edges.fromKind.name}\", \"${edges.fromId.name}\", \"${edges.toKind.name}\", \"${edges.toId.name}\", \"${edges.props.name}\", \"${edges.validFrom.name}\", \"${edges.validTo.name}\", \"${edges.createdAt.name}\", \"${edges.updatedAt.name}\"`);\n}\n","/**\n * Fulltext Strategy — pluggable DDL + SQL generation for a dialect's\n * fulltext stack. A strategy owns every SQL statement that touches its\n * backing table: DDL, upsert (single + batch), delete (single + batch),\n * MATCH condition, rank expression, and snippet expression.\n *\n * A dialect picks one as its default; `createPostgresBackend` /\n * `createSqliteBackend` accept an override for alternate Postgres stacks\n * (pg_trgm, ParadeDB/pg_search, pgroonga) to swap the entire fulltext\n * pipeline without forking TypeGraph.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { quotedTableName } from \"../../backend/drizzle/operations/shared\";\nimport {\n type DeleteFulltextBatchParams,\n type DeleteFulltextParams,\n type FulltextBatchRow,\n type FulltextCapabilities,\n type FulltextQueryMode,\n type UpsertFulltextBatchParams,\n type UpsertFulltextParams,\n} from \"../../backend/types\";\n\n/**\n * Every `FulltextQueryMode` both shipped strategies accept.\n */\nexport const ALL_FULLTEXT_MODES: readonly FulltextQueryMode[] = [\n \"websearch\",\n \"phrase\",\n \"plain\",\n \"raw\",\n] as const;\n\n/**\n * Derives the `FulltextCapabilities` backends advertise from the active\n * strategy, so the two never drift.\n */\nexport function buildFulltextCapabilities(\n strategy: FulltextStrategy,\n): FulltextCapabilities {\n return {\n supported: true,\n languages: strategy.languages,\n phraseQueries: strategy.supportedModes.includes(\"phrase\"),\n prefixQueries: strategy.supportsPrefix,\n highlighting: strategy.supportsSnippets,\n };\n}\n\n/**\n * A pluggable fulltext implementation. Each strategy is expected to be\n * self-contained: given a table name, a query string, and a parse mode,\n * it emits every SQL statement the compiler and backend need — DDL,\n * reads, and writes. No out-of-band conventions across layers.\n */\nexport interface FulltextStrategy {\n /** Human-readable identifier used in error messages and telemetry. */\n readonly name: string;\n\n /**\n * Parse modes this strategy can translate. Callers validate against\n * this list before emitting SQL; a mode outside the set means the\n * strategy rejects the query at compile time.\n */\n readonly supportedModes: readonly FulltextQueryMode[];\n\n /**\n * Whether the strategy can emit a per-row highlighted snippet. When\n * false, `snippetExpression` returns a literal `NULL` so callers can\n * leave the `snippet` column in place without a branch.\n */\n readonly supportsSnippets: boolean;\n\n /**\n * Whether the strategy supports prefix queries (`foo*`). Used to\n * populate `BackendCapabilities.fulltext.prefixQueries`. A strategy\n * may support prefix queries via dedicated syntax without advertising\n * \"raw\" mode (and vice-versa).\n */\n readonly supportsPrefix: boolean;\n\n /**\n * Whether a per-query `language` override is honored. Postgres' tsvector\n * accepts any installed regconfig at query time; SQLite FTS5's tokenizer\n * is fixed at table-create time, so the override is silently ignored.\n * Callers may surface a warning when the user passes `language` to a\n * strategy that doesn't honor it.\n */\n readonly supportsLanguageOverride: boolean;\n\n /**\n * Languages / tokenizer names understood by the strategy. Advisory — a\n * runtime backend like Postgres may accept other installed regconfigs.\n * Used to populate `BackendCapabilities.fulltext.languages`.\n */\n readonly languages: readonly string[];\n\n /**\n * Emits the WHERE-side MATCH expression.\n *\n * @example\n * tsvector: `\"typegraph_node_fulltext\".\"tsv\" @@ websearch_to_tsquery('english', 'cats')`\n * fts5: `\"typegraph_node_fulltext\" MATCH '\"cats\"'`\n */\n matchCondition(\n tableName: string,\n query: string,\n mode: FulltextQueryMode,\n language?: string,\n ): SQL;\n\n /**\n * Emits the relevance expression. Higher values = more relevant. The\n * compiler orders by this expression DESC, and both builder and\n * backend-direct paths use the same form so their top-k results agree.\n */\n rankExpression(\n tableName: string,\n query: string,\n mode: FulltextQueryMode,\n language?: string,\n ): SQL;\n\n /**\n * Emits a per-row highlighted snippet expression, or `NULL` when\n * `supportsSnippets` is false. Snippet markup is `<mark>…</mark>` in\n * both shipped strategies so consumers can apply one stylesheet.\n */\n snippetExpression(\n tableName: string,\n query: string,\n mode: FulltextQueryMode,\n language?: string,\n ): SQL;\n\n /**\n * DDL statements to create the backing table and any supporting\n * indexes. Idempotent (`CREATE ... IF NOT EXISTS`). Called once from\n * `bootstrapTables()` on a fresh database.\n */\n generateDdl(tableName: string): readonly string[];\n\n /**\n * Emits the statements that upsert a single fulltext row. Returns one\n * or more statements — some backends (SQLite FTS5) cannot emulate\n * upsert in a single statement and need DELETE + INSERT.\n */\n buildUpsert(\n tableName: string,\n params: UpsertFulltextParams,\n timestamp: string,\n ): readonly SQL[];\n\n /**\n * Emits the statements that upsert many fulltext rows at once. Input\n * rows are expected to be de-duplicated last-write-wins by the\n * strategy if the underlying SQL statement cannot tolerate duplicate\n * conflict keys. Returns `[]` when `params.rows` is empty.\n */\n buildBatchUpsert(\n tableName: string,\n params: UpsertFulltextBatchParams,\n timestamp: string,\n ): readonly SQL[];\n\n /**\n * Emits the statements that delete a single fulltext row. Normally a\n * single PK-scoped DELETE, but strategies that maintain auxiliary\n * indexes (delete-triggered external stores, ParadeDB-style secondary\n * structures) may need more.\n */\n buildDelete(tableName: string, params: DeleteFulltextParams): readonly SQL[];\n\n /**\n * Emits the statements that delete many fulltext rows at once. Returns\n * `[]` when `params.nodeIds` is empty.\n */\n buildBatchDelete(\n tableName: string,\n params: DeleteFulltextBatchParams,\n ): readonly SQL[];\n}\n\n// ============================================================\n// Internal helpers\n// ============================================================\n\nfunction quoteIdentifier(name: string): string {\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction tsvectorColumn(tableName: string): SQL {\n return sql`${quotedTableName(tableName)}.\"tsv\"`;\n}\n\n/**\n * Dedupes batch rows last-write-wins by nodeId. Returns a plain array\n * in insertion order of the last occurrence of each id. Shared by both\n * shipped strategies.\n */\nfunction dedupeFulltextBatchRows(\n rows: readonly FulltextBatchRow[],\n): FulltextBatchRow[] {\n const seen = new Map<string, FulltextBatchRow>();\n for (const row of rows) seen.set(row.nodeId, row);\n return [...seen.values()];\n}\n\nfunction buildPkScopedDelete(\n tableName: string,\n params: DeleteFulltextParams,\n): SQL {\n const table = quotedTableName(tableName);\n return sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId}\n AND \"node_kind\" = ${params.nodeKind}\n AND \"node_id\" = ${params.nodeId}\n `;\n}\n\nfunction buildPkScopedBatchDelete(\n tableName: string,\n params: DeleteFulltextBatchParams,\n): SQL | undefined {\n if (params.nodeIds.length === 0) return undefined;\n const unique = [...new Set(params.nodeIds)];\n const table = quotedTableName(tableName);\n return sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId}\n AND \"node_kind\" = ${params.nodeKind}\n AND \"node_id\" IN (${sql.join(\n unique.map((id) => sql`${id}`),\n sql`, `,\n )})\n `;\n}\n\n// ============================================================\n// tsvector strategy (PostgreSQL built-in)\n// ============================================================\n\nfunction postgresTsquery(\n mode: FulltextQueryMode,\n query: string,\n language: string | undefined,\n): SQL {\n // The `language` column is already `regconfig`, so the non-override\n // path references the column directly. The per-query override path\n // still arrives as a bound text parameter and needs the cast.\n const langExpr: SQL =\n language === undefined ? sql`\"language\"` : sql`${language}::regconfig`;\n switch (mode) {\n case \"websearch\": {\n return sql`websearch_to_tsquery(${langExpr}, ${query})`;\n }\n case \"phrase\": {\n return sql`phraseto_tsquery(${langExpr}, ${query})`;\n }\n case \"plain\": {\n return sql`plainto_tsquery(${langExpr}, ${query})`;\n }\n case \"raw\": {\n return sql`to_tsquery(${langExpr}, ${query})`;\n }\n default: {\n const _exhaustive: never = mode;\n throw new Error(`Unsupported fulltext mode: ${String(_exhaustive)}`);\n }\n }\n}\n\nexport const tsvectorStrategy: FulltextStrategy = {\n name: \"tsvector\",\n supportedModes: ALL_FULLTEXT_MODES,\n supportsSnippets: true,\n // `raw` mode exposes `foo:*` prefix-match syntax to callers.\n supportsPrefix: true,\n supportsLanguageOverride: true,\n // Canonical Postgres stemmers; every stock install ships these plus a\n // few others. Runtime `to_tsvector` accepts any installed regconfig\n // name — this list is advisory for capability discovery.\n languages: [\n \"simple\",\n \"english\",\n \"french\",\n \"german\",\n \"italian\",\n \"portuguese\",\n \"russian\",\n \"spanish\",\n \"swedish\",\n ] as const,\n\n matchCondition(tableName, query, mode, language) {\n const q = postgresTsquery(mode, query, language);\n return sql`${tsvectorColumn(tableName)} @@ ${q}`;\n },\n\n rankExpression(tableName, query, mode, language) {\n const q = postgresTsquery(mode, query, language);\n return sql`ts_rank_cd(${tsvectorColumn(tableName)}, ${q})`;\n },\n\n snippetExpression(_tableName, query, mode, language) {\n const langExpr: SQL =\n language === undefined ? sql`\"language\"` : sql`${language}::regconfig`;\n const q = postgresTsquery(mode, query, language);\n return sql`ts_headline(${langExpr}, \"content\", ${q}, 'StartSel=<mark>,StopSel=</mark>,MaxFragments=1,MinWords=5,MaxWords=30,ShortWord=3')`;\n },\n\n generateDdl(tableName) {\n const name = quoteIdentifier(tableName);\n const gin = quoteIdentifier(`${tableName}_tsv_idx`);\n const kind = quoteIdentifier(`${tableName}_kind_idx`);\n // `language` is `regconfig` so `to_tsvector(\"language\", \"content\")`\n // is an immutable expression — Postgres can then compute `tsv` as a\n // GENERATED STORED column and own the `content → tsv` invariant.\n // (The text→regconfig cast happens once at INSERT time against the\n // bound parameter, which is fine because it's not inside the\n // generated expression.)\n return [\n `CREATE TABLE IF NOT EXISTS ${name} (\n \"graph_id\" TEXT NOT NULL,\n \"node_kind\" TEXT NOT NULL,\n \"node_id\" TEXT NOT NULL,\n \"content\" TEXT NOT NULL,\n \"language\" regconfig NOT NULL,\n \"tsv\" tsvector NOT NULL\n GENERATED ALWAYS AS (to_tsvector(\"language\", \"content\")) STORED,\n \"updated_at\" TIMESTAMPTZ NOT NULL,\n PRIMARY KEY (\"graph_id\", \"node_kind\", \"node_id\")\n);`,\n `CREATE INDEX IF NOT EXISTS ${gin} ON ${name} USING GIN (\"tsv\");`,\n `CREATE INDEX IF NOT EXISTS ${kind} ON ${name} (\"graph_id\", \"node_kind\");`,\n ];\n },\n\n buildUpsert(tableName, params, timestamp) {\n const table = quotedTableName(tableName);\n // `tsv` is a GENERATED STORED column — Postgres computes it from\n // `content` + `language`, so it must not appear in the column list\n // or the ON CONFLICT update set.\n return [\n sql`\n INSERT INTO ${table} (\"graph_id\", \"node_kind\", \"node_id\", \"content\", \"language\", \"updated_at\")\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.nodeId},\n ${params.content}, ${params.language}::regconfig,\n ${timestamp}\n )\n ON CONFLICT (\"graph_id\", \"node_kind\", \"node_id\")\n DO UPDATE SET\n \"content\" = EXCLUDED.\"content\",\n \"language\" = EXCLUDED.\"language\",\n \"updated_at\" = EXCLUDED.\"updated_at\"\n `,\n ];\n },\n\n buildBatchUpsert(tableName, params, timestamp) {\n const rows = dedupeFulltextBatchRows(params.rows);\n if (rows.length === 0) return [];\n\n const table = quotedTableName(tableName);\n const valueTuples = rows.map(\n (row) => sql`\n (\n ${params.graphId}, ${params.nodeKind}, ${row.nodeId},\n ${row.content}, ${row.language}::regconfig,\n ${timestamp}\n )\n `,\n );\n\n return [\n sql`\n INSERT INTO ${table} (\"graph_id\", \"node_kind\", \"node_id\", \"content\", \"language\", \"updated_at\")\n VALUES ${sql.join(valueTuples, sql`, `)}\n ON CONFLICT (\"graph_id\", \"node_kind\", \"node_id\")\n DO UPDATE SET\n \"content\" = EXCLUDED.\"content\",\n \"language\" = EXCLUDED.\"language\",\n \"updated_at\" = EXCLUDED.\"updated_at\"\n `,\n ];\n },\n\n buildDelete(tableName, params) {\n return [buildPkScopedDelete(tableName, params)];\n },\n\n buildBatchDelete(tableName, params) {\n const stmt = buildPkScopedBatchDelete(tableName, params);\n return stmt === undefined ? [] : [stmt];\n },\n};\n\n// ============================================================\n// FTS5 strategy (SQLite)\n// ============================================================\n\nfunction translateToFts5Query(query: string, mode: FulltextQueryMode): string {\n switch (mode) {\n case \"phrase\": {\n return `\"${query.replaceAll('\"', '\"\"')}\"`;\n }\n case \"plain\": {\n return query\n .trim()\n .split(/\\s+/u)\n .filter((token) => token.length > 0)\n .map((token) => `\"${token.replaceAll('\"', '\"\"')}\"`)\n .join(\" \");\n }\n case \"websearch\": {\n return translateWebsearchToFts5(query);\n }\n case \"raw\": {\n return query;\n }\n default: {\n const _exhaustive: never = mode;\n throw new Error(`Unsupported fulltext mode: ${String(_exhaustive)}`);\n }\n }\n}\n\nfunction translateWebsearchToFts5(query: string): string {\n const tokens: string[] = [];\n let index = 0;\n\n function skipWhitespace(): void {\n while (index < query.length && /\\s/u.test(query[index] ?? \"\")) {\n index += 1;\n }\n }\n\n function readPhrase(): string {\n index += 1;\n let content = \"\";\n while (index < query.length && query[index] !== '\"') {\n content += query[index] ?? \"\";\n index += 1;\n }\n if (query[index] === '\"') index += 1;\n return `\"${content.replaceAll('\"', '\"\"')}\"`;\n }\n\n function readBareTerm(): string {\n let term = \"\";\n while (index < query.length && !/\\s/u.test(query[index] ?? \"\")) {\n term += query[index] ?? \"\";\n index += 1;\n }\n return term;\n }\n\n while (index < query.length) {\n skipWhitespace();\n if (index >= query.length) break;\n const ch = query[index];\n if (ch === '\"') {\n tokens.push(readPhrase());\n continue;\n }\n if (ch === \"-\") {\n index += 1;\n const term =\n query[index] === '\"' ?\n readPhrase()\n : `\"${readBareTerm().replaceAll('\"', '\"\"')}\"`;\n tokens.push(`NOT ${term}`);\n continue;\n }\n if (ch === \"+\") {\n index += 1;\n continue;\n }\n const bare = readBareTerm();\n if (bare.length === 0) continue;\n if (bare.toUpperCase() === \"OR\") {\n tokens.push(\"OR\");\n continue;\n }\n tokens.push(`\"${bare.replaceAll('\"', '\"\"')}\"`);\n }\n\n if (tokens.length > 0 && tokens[0]?.startsWith(\"NOT \")) {\n tokens.shift();\n }\n\n return tokens.join(\" \");\n}\n\nexport const fts5Strategy: FulltextStrategy = {\n name: \"fts5\",\n supportedModes: ALL_FULLTEXT_MODES,\n supportsSnippets: true,\n // FTS5 supports `foo*` prefix matching natively.\n supportsPrefix: true,\n // FTS5 tokenizer is fixed at table-create time; per-row / per-query\n // language metadata is stored but not consulted.\n supportsLanguageOverride: false,\n // The built-in tokenizer is `porter unicode61 remove_diacritics 2`; the\n // `language` field on searchable() is recorded for future use but not\n // applied at query time.\n languages: [\"porter\", \"unicode61\", \"trigram\"] as const,\n\n matchCondition(tableName, query, mode, _language) {\n const matchExpression = translateToFts5Query(query, mode);\n return sql`${quotedTableName(tableName)} MATCH ${matchExpression}`;\n },\n\n rankExpression(tableName, _query, _mode, _language) {\n // FTS5 bm25() returns a negative score where lower = more relevant.\n // Negate so callers see higher = better (uniform with tsvector).\n return sql`-bm25(${quotedTableName(tableName)})`;\n },\n\n snippetExpression(tableName, _query, _mode, _language) {\n return sql`snippet(${quotedTableName(tableName)}, -1, '<mark>', '</mark>', '…', 20)`;\n },\n\n generateDdl(tableName) {\n const name = quoteIdentifier(tableName);\n return [\n `CREATE VIRTUAL TABLE IF NOT EXISTS ${name} USING fts5(\n graph_id UNINDEXED,\n node_kind UNINDEXED,\n node_id UNINDEXED,\n language UNINDEXED,\n updated_at UNINDEXED,\n content,\n tokenize='porter unicode61 remove_diacritics 2'\n);`,\n ];\n },\n\n buildUpsert(tableName, params, timestamp) {\n const table = quotedTableName(tableName);\n // FTS5 virtual tables don't support ON CONFLICT — emulate with\n // DELETE + INSERT, atomic under the caller's outer transaction.\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId}\n AND \"node_kind\" = ${params.nodeKind}\n AND \"node_id\" = ${params.nodeId}\n `,\n sql`\n INSERT INTO ${table} (graph_id, node_kind, node_id, content, language, updated_at)\n VALUES (${params.graphId}, ${params.nodeKind}, ${params.nodeId}, ${params.content}, ${params.language}, ${timestamp})\n `,\n ];\n },\n\n buildBatchUpsert(tableName, params, timestamp) {\n const rows = dedupeFulltextBatchRows(params.rows);\n if (rows.length === 0) return [];\n\n const table = quotedTableName(tableName);\n const nodeIds = rows.map((row) => row.nodeId);\n\n const deleteStmt = sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId}\n AND \"node_kind\" = ${params.nodeKind}\n AND \"node_id\" IN (${sql.join(\n nodeIds.map((id) => sql`${id}`),\n sql`, `,\n )})\n `;\n\n const valueTuples = rows.map(\n (row) => sql`\n (\n ${params.graphId}, ${params.nodeKind}, ${row.nodeId},\n ${row.content}, ${row.language}, ${timestamp}\n )\n `,\n );\n\n const insertStmt = sql`\n INSERT INTO ${table} (graph_id, node_kind, node_id, content, language, updated_at)\n VALUES ${sql.join(valueTuples, sql`, `)}\n `;\n\n return [deleteStmt, insertStmt];\n },\n\n buildDelete(tableName, params) {\n return [buildPkScopedDelete(tableName, params)];\n },\n\n buildBatchDelete(tableName, params) {\n const stmt = buildPkScopedBatchDelete(tableName, params);\n return stmt === undefined ? [] : [stmt];\n },\n};\n","/**\n * Shared constants used across the TypeGraph codebase.\n */\n\n// ============================================================\n// PostgreSQL Limits\n// ============================================================\n\n/**\n * PostgreSQL truncates identifiers longer than 63 bytes.\n * Used for column aliases, index names, and other generated identifiers.\n */\nexport const MAX_PG_IDENTIFIER_LENGTH = 63;\n\n/** Maximum byte length for the truncated portion of a generated identifier. */\nexport const TRUNCATED_IDENTIFIER_MAX_LENGTH = 54;\n\n/** Maximum length for a single component (kind name, field name) in a generated identifier. */\nexport const IDENTIFIER_COMPONENT_MAX_LENGTH = 20;\n\n// ============================================================\n// FNV-1a Hash Constants\n// ============================================================\n\n/** FNV-1a 32-bit offset basis. */\nexport const FNV1A_OFFSET_BASIS = 0x81_1c_9d_c5;\n\n/** FNV-1a 32-bit prime. */\nexport const FNV1A_PRIME = 0x01_00_01_93;\n\n// ============================================================\n// Pagination\n// ============================================================\n\n/** Default page size for paginate() and cursor-based pagination. */\nexport const DEFAULT_PAGINATION_LIMIT = 20;\n\n/** Default batch size for streaming query results. */\nexport const DEFAULT_STREAM_BATCH_SIZE = 1000;\n\n// ============================================================\n// Index Type Markers\n// ============================================================\n\nexport const NODE_INDEX_TYPE_MARKER = \"typegraph_node_index\" as const;\nexport const EDGE_INDEX_TYPE_MARKER = \"typegraph_edge_index\" as const;\n\n// ============================================================\n// Path Delimiters\n// ============================================================\n\n/** SQLite stores array paths as pipe-delimited strings: |id1|id2|id3| */\nexport const SQLITE_PATH_DELIMITER = \"|\";\n\n/** PostgreSQL text arrays use comma-separated elements: {id1,id2,id3} */\nexport const PG_PATH_ELEMENT_SEPARATOR = \",\";\n\n/** PostgreSQL text array start delimiter. */\nexport const PG_ARRAY_START = \"{\";\n\n/** PostgreSQL text array end delimiter. */\nexport const PG_ARRAY_END = \"}\";\n","/**\n * PostgreSQL Dialect Adapter\n *\n * Implements dialect-specific SQL generation for PostgreSQL databases.\n * Uses PostgreSQL's native JSONB operators for JSON operations.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type JsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { tsvectorStrategy } from \"./fulltext-strategy\";\nimport { type DialectAdapter } from \"./types\";\n\n/**\n * Escapes a string for use in a PostgreSQL string literal.\n * Uses single quotes and escapes embedded single quotes.\n */\nfunction escapePostgresLiteral(value: string): string {\n // PostgreSQL uses '' to escape single quotes inside string literals\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\n/**\n * Converts a JSON pointer to PostgreSQL's text array path.\n *\n * Uses raw SQL (non-parameterized) to ensure the same expression text\n * is generated when the same field is used in multiple clauses (SELECT, GROUP BY).\n * This is safe because JSON pointers come from schema definitions, not user input.\n *\n * @example\n * \"/name\" → ARRAY['name']\n * \"/items/0\" → ARRAY['items', '0']\n * \"/a/b/c\" → ARRAY['a', 'b', 'c']\n */\nfunction toPostgresPath(pointer: JsonPointer): SQL {\n if (!pointer || pointer === \"\" || pointer === \"/\") {\n return sql.raw(\"ARRAY[]::text[]\");\n }\n\n const segments = parseJsonPointer(pointer);\n if (segments.length === 0) {\n return sql.raw(\"ARRAY[]::text[]\");\n }\n\n // Use raw SQL for path segments to ensure identical SQL text\n // when the same field is used in multiple clauses (e.g., SELECT and GROUP BY)\n const escapedSegments = segments\n .map((segment) => escapePostgresLiteral(segment))\n .join(\", \");\n return sql.raw(`ARRAY[${escapedSegments}]`);\n}\n\n/**\n * PostgreSQL dialect adapter implementation.\n */\nexport const postgresDialect: DialectAdapter = {\n name: \"postgres\",\n capabilities: {\n standardQueryStrategy: \"cte_project\",\n recursiveQueryStrategy: \"recursive_cte\",\n setOperationStrategy: \"standard_parenthesized\",\n materializeIntermediateTraversalCtes: false,\n emitNotMaterializedHint: true,\n forceRecursiveWorktableOuterJoinOrder: false,\n vectorPredicateStrategy: \"native\",\n vectorMetrics: [\"cosine\", \"l2\", \"inner_product\"] as const,\n supportsFulltext: true,\n },\n\n // ============================================================\n // JSON Path Operations\n // ============================================================\n\n compilePath(pointer) {\n return toPostgresPath(pointer);\n },\n\n jsonExtract(column, pointer) {\n // #> returns JSONB value at path\n const path = toPostgresPath(pointer);\n return sql`${column} #> ${path}`;\n },\n\n jsonExtractText(column, pointer) {\n // #>> returns text value at path\n const path = toPostgresPath(pointer);\n return sql`${column} #>> ${path}`;\n },\n\n jsonExtractNumber(column, pointer) {\n // Extract as text then cast to numeric\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::numeric`;\n },\n\n jsonExtractBoolean(column, pointer) {\n // Extract as text then cast to boolean\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::boolean`;\n },\n\n jsonExtractDate(column, pointer) {\n // Extract as text then cast to timestamptz\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::timestamptz`;\n },\n\n // ============================================================\n // JSON Array Operations\n // ============================================================\n\n jsonArrayLength(column) {\n return sql`jsonb_array_length(${column})`;\n },\n\n jsonArrayContains(column, value) {\n // @> checks if left contains right\n const jsonValue = JSON.stringify([value]);\n return sql`${column} @> ${jsonValue}::jsonb`;\n },\n\n jsonArrayContainsAll(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=1\");\n }\n\n // @> with full array checks all values\n const jsonValue = JSON.stringify(values);\n return sql`${column} @> ${jsonValue}::jsonb`;\n },\n\n jsonArrayContainsAny(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=0\");\n }\n\n // Check each value with @> and OR them together\n // PostgreSQL doesn't have a native \"overlaps\" for jsonb arrays\n const conditions = values.map((value) => {\n const jsonValue = JSON.stringify([value]);\n return sql`${column} @> ${jsonValue}::jsonb`;\n });\n return sql`(${sql.join(conditions, sql` OR `)})`;\n },\n\n // ============================================================\n // JSON Object Operations\n // ============================================================\n\n jsonHasPath(column, pointer) {\n const path = toPostgresPath(pointer);\n return sql`${column} #> ${path} IS NOT NULL`;\n },\n\n jsonPathIsNull(column, pointer) {\n const path = toPostgresPath(pointer);\n // Check both SQL NULL and JSON null literal\n return sql`(${column} #> ${path} IS NULL OR ${column} #>> ${path} = 'null')`;\n },\n\n jsonPathIsNotNull(column, pointer) {\n const path = toPostgresPath(pointer);\n return sql`(${column} #> ${path} IS NOT NULL AND ${column} #>> ${path} != 'null')`;\n },\n\n // ============================================================\n // String Operations\n // ============================================================\n\n ilike(column, pattern) {\n // PostgreSQL has native ILIKE operator\n return sql`${column} ILIKE ${pattern}`;\n },\n\n // ============================================================\n // Recursive CTE Path Operations\n // ============================================================\n\n initializePath(nodeId) {\n // PostgreSQL uses text arrays: ARRAY[id]\n return sql`ARRAY[${nodeId}]`;\n },\n\n extendPath(currentPath, nodeId) {\n // Array concatenation: path || id\n return sql`${currentPath} || ${nodeId}`;\n },\n\n cycleCheck(nodeId, path) {\n // Check that id is NOT in array path\n // Returns TRUE if no cycle (id not in array)\n return sql`${nodeId} != ALL(${path})`;\n },\n\n // ============================================================\n // Type Utilities\n // ============================================================\n\n currentTimestamp() {\n return sql`NOW()`;\n },\n\n // ============================================================\n // Value Binding & Literals\n // ============================================================\n\n bindValue(value) {\n // PostgreSQL supports native booleans, no conversion needed\n return value;\n },\n\n booleanLiteral(value) {\n return sql.raw(this.booleanLiteralString(value));\n },\n\n booleanLiteralString(value) {\n return value ? \"TRUE\" : \"FALSE\";\n },\n\n quoteIdentifier(name) {\n // PostgreSQL uses double quotes, escape embedded quotes by doubling\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n },\n\n // ============================================================\n // Vector Operations\n // ============================================================\n\n supportsVectors: true,\n\n vectorDistance(column, embedding, metric) {\n const formatted = this.formatEmbedding(embedding);\n // Column is native VECTOR type, no cast needed\n switch (metric) {\n case \"cosine\": {\n // Cosine distance: 1 - cosine_similarity\n // Lower is more similar (0 = identical)\n return sql`(${column} <=> ${formatted})`;\n }\n case \"l2\": {\n // Euclidean (L2) distance\n // Lower is more similar (0 = identical)\n return sql`(${column} <-> ${formatted})`;\n }\n case \"inner_product\": {\n // Inner product distance (negative inner product)\n // Note: pgvector uses <#> which returns NEGATIVE inner product\n // More negative = more similar for normalized vectors\n return sql`(${column} <#> ${formatted})`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(\"Unsupported vector metric: \" + String(_exhaustive));\n }\n }\n },\n\n formatEmbedding(embedding) {\n // Validate all values are finite numbers to prevent injection\n for (const [index, value] of embedding.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `embedding[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n // Format as PostgreSQL vector literal: '[1.0,2.0,3.0]'::vector\n // Query embedding still needs cast since it's a literal string\n const asString = `[${embedding.join(\",\")}]`;\n return sql`${asString}::vector`;\n },\n\n // ============================================================\n // Fulltext Operations\n // ============================================================\n\n fulltext: tsvectorStrategy,\n};\n","/**\n * SQLite Dialect Adapter\n *\n * Implements dialect-specific SQL generation for SQLite databases.\n * Uses SQLite's JSON1 extension for JSON operations.\n */\nimport { sql } from \"drizzle-orm\";\n\nimport { type JsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { fts5Strategy } from \"./fulltext-strategy\";\nimport { type DialectAdapter } from \"./types\";\n\n/**\n * Escapes a string for use in a SQLite string literal.\n * SQLite uses single quotes and escapes embedded single quotes by doubling them.\n */\nfunction escapeSqliteLiteral(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\n/**\n * Converts a JSON pointer to SQLite's JSON path syntax.\n *\n * @example\n * \"/name\" → \"$.\\\"name\\\"\"\n * \"/items/0\" → \"$.\\\"items\\\"[0]\"\n * \"/a/b/c\" → \"$.\\\"a\\\".\\\"b\\\".\\\"c\\\"\"\n */\nfunction toSqlitePath(pointer: JsonPointer): string {\n if (!pointer || pointer === \"\" || pointer === \"/\") {\n return \"$\";\n }\n\n const segments = parseJsonPointer(pointer);\n const parts: string[] = [\"$\"];\n\n for (const segment of segments) {\n if (isArrayIndex(segment)) {\n parts.push(`[${segment}]`);\n } else {\n // Quote the key to handle special characters\n parts.push(`.${JSON.stringify(segment)}`);\n }\n }\n\n return parts.join(\"\");\n}\n\n/**\n * Checks if a JSON pointer segment is an array index.\n */\nfunction isArrayIndex(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\n/**\n * SQLite dialect adapter implementation.\n */\nexport const sqliteDialect: DialectAdapter = {\n name: \"sqlite\",\n capabilities: {\n standardQueryStrategy: \"cte_project\",\n recursiveQueryStrategy: \"recursive_cte\",\n setOperationStrategy: \"sqlite_compound\",\n materializeIntermediateTraversalCtes: true,\n emitNotMaterializedHint: false,\n forceRecursiveWorktableOuterJoinOrder: true,\n vectorPredicateStrategy: \"native\",\n vectorMetrics: [\"cosine\", \"l2\"] as const,\n supportsFulltext: true,\n },\n\n // ============================================================\n // JSON Path Operations\n // ============================================================\n\n compilePath(pointer) {\n // Use raw SQL to ensure the path is a literal, which allows expression\n // indexes on json_extract(...) to be used by the query planner.\n return sql.raw(escapeSqliteLiteral(toSqlitePath(pointer)));\n },\n\n jsonExtract(column, pointer) {\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractText(column, pointer) {\n // SQLite's json_extract returns the native JSON type, which works\n // for text comparisons. For explicit text, we use the same function.\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractNumber(column, pointer) {\n // SQLite json_extract returns numbers natively when the value is numeric\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractBoolean(column, pointer) {\n // SQLite json_extract returns 0/1 for boolean values\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractDate(column, pointer) {\n // SQLite stores dates as ISO strings, json_extract returns them as text\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n // ============================================================\n // JSON Array Operations\n // ============================================================\n\n jsonArrayLength(column) {\n return sql`json_array_length(${column})`;\n },\n\n jsonArrayContains(column, value) {\n return sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`;\n },\n\n jsonArrayContainsAll(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=1\");\n }\n\n const conditions = values.map(\n (value) =>\n sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`,\n );\n return sql`(${sql.join(conditions, sql` AND `)})`;\n },\n\n jsonArrayContainsAny(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=0\");\n }\n\n const conditions = values.map(\n (value) =>\n sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`,\n );\n return sql`(${sql.join(conditions, sql` OR `)})`;\n },\n\n // ============================================================\n // JSON Object Operations\n // ============================================================\n\n jsonHasPath(column, pointer) {\n const path = toSqlitePath(pointer);\n return sql`json_type(${column}, ${sql.raw(escapeSqliteLiteral(path))}) IS NOT NULL`;\n },\n\n jsonPathIsNull(column, pointer) {\n const path = toSqlitePath(pointer);\n const pathSql = sql.raw(escapeSqliteLiteral(path));\n return sql`(json_extract(${column}, ${pathSql}) IS NULL OR json_type(${column}, ${pathSql}) = 'null')`;\n },\n\n jsonPathIsNotNull(column, pointer) {\n const path = toSqlitePath(pointer);\n const pathSql = sql.raw(escapeSqliteLiteral(path));\n return sql`(json_extract(${column}, ${pathSql}) IS NOT NULL AND json_type(${column}, ${pathSql}) != 'null')`;\n },\n\n // ============================================================\n // String Operations\n // ============================================================\n\n ilike(column, pattern) {\n // SQLite LIKE is case-insensitive for ASCII by default, but we use\n // LOWER() for consistency with non-ASCII characters\n return sql`LOWER(${column}) LIKE LOWER(${pattern})`;\n },\n\n // ============================================================\n // Recursive CTE Path Operations\n // ============================================================\n\n initializePath(nodeId) {\n // SQLite uses string-based paths with delimiters: '|id|'\n return sql`'|' || ${nodeId} || '|'`;\n },\n\n extendPath(currentPath, nodeId) {\n // Append: path || id || '|'\n return sql`${currentPath} || ${nodeId} || '|'`;\n },\n\n cycleCheck(nodeId, path) {\n // Check that id is NOT in path using INSTR\n // Returns TRUE if no cycle (id not found in path)\n return sql`INSTR(${path}, '|' || ${nodeId} || '|') = 0`;\n },\n\n // ============================================================\n // Type Utilities\n // ============================================================\n\n currentTimestamp() {\n // Keep ISO-8601 format aligned with stored timestamps from Date.toISOString()\n // so string-based temporal comparisons remain correct in SQLite TEXT columns.\n return sql`strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n },\n\n // ============================================================\n // Value Binding & Literals\n // ============================================================\n\n bindValue(value) {\n // SQLite doesn't support native booleans, convert to 0/1\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n return value;\n },\n\n booleanLiteral(value) {\n return sql.raw(this.booleanLiteralString(value));\n },\n\n booleanLiteralString(value) {\n return value ? \"1\" : \"0\";\n },\n\n quoteIdentifier(name) {\n // SQLite uses double quotes (or backticks), escape embedded quotes by doubling\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n },\n\n // ============================================================\n // Vector Operations\n // ============================================================\n\n supportsVectors: true,\n\n vectorDistance(column, embedding, metric) {\n // sqlite-vec functions expect vec_f32 format for the query embedding\n const formatted = this.formatEmbedding(embedding);\n switch (metric) {\n case \"cosine\": {\n // Cosine distance: 1 - cosine_similarity\n // Lower is more similar (0 = identical)\n return sql`vec_distance_cosine(${column}, ${formatted})`;\n }\n case \"l2\": {\n // Euclidean (L2) distance\n // Lower is more similar (0 = identical)\n return sql`vec_distance_l2(${column}, ${formatted})`;\n }\n case \"inner_product\": {\n // sqlite-vec does not support inner product distance\n // See: https://alexgarcia.xyz/sqlite-vec/api-reference.html\n throw new Error(\n \"Inner product distance is not supported by sqlite-vec. Use 'cosine' or 'l2' metrics instead.\",\n );\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(\"Unsupported vector metric: \" + String(_exhaustive));\n }\n }\n },\n\n formatEmbedding(embedding) {\n // Validate all values are finite numbers\n for (const [index, value] of embedding.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `embedding[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n // sqlite-vec uses vec_f32() to convert JSON array to binary format\n const asJson = JSON.stringify(embedding);\n return sql`vec_f32(${asJson})`;\n },\n\n // ============================================================\n // Fulltext Operations\n // ============================================================\n\n fulltext: fts5Strategy,\n};\n","/**\n * SQL Dialect Module\n *\n * Provides dialect adapters for different SQL databases.\n * Use `getDialect()` to get the appropriate adapter for a dialect name.\n */\n\nexport type { FulltextStrategy } from \"./fulltext-strategy\";\nexport {\n ALL_FULLTEXT_MODES,\n buildFulltextCapabilities,\n fts5Strategy,\n tsvectorStrategy,\n} from \"./fulltext-strategy\";\nexport { postgresDialect } from \"./postgres\";\nexport { sqliteDialect } from \"./sqlite\";\nexport type {\n DialectAdapter,\n DialectCapabilities,\n DialectRecursiveQueryStrategy,\n DialectSetOperationStrategy,\n DialectStandardQueryStrategy,\n DialectVectorPredicateStrategy,\n SqlDialect,\n} from \"./types\";\n\nimport { postgresDialect } from \"./postgres\";\nimport { sqliteDialect } from \"./sqlite\";\nimport { type DialectAdapter, type SqlDialect } from \"./types\";\n\n/**\n * Map of dialect names to their adapters.\n */\nconst DIALECT_ADAPTERS: Record<SqlDialect, DialectAdapter> = {\n sqlite: sqliteDialect,\n postgres: postgresDialect,\n};\n\n/**\n * Gets the dialect adapter for a given dialect name.\n *\n * @param dialect - The dialect name (\"sqlite\" or \"postgres\")\n * @returns The dialect adapter\n *\n * @example\n * ```typescript\n * const adapter = getDialect(\"postgres\");\n * const sql = adapter.jsonExtract(column, \"/name\");\n * ```\n */\nexport function getDialect(dialect: SqlDialect): DialectAdapter {\n return DIALECT_ADAPTERS[dialect];\n}\n\n/**\n * Default dialect used when none is specified.\n */\nexport const DEFAULT_DIALECT: SqlDialect = \"sqlite\";\n","/**\n * FNV-1a hash utilities.\n *\n * FNV-1a is a fast, non-cryptographic hash function used for generating\n * short, deterministic, collision-resistant identifiers (column aliases,\n * index name suffixes, etc.).\n */\nimport { FNV1A_OFFSET_BASIS, FNV1A_PRIME } from \"../constants\";\n\n/**\n * FNV-1a hash of `input`, returned as a base-36 encoded string.\n */\nexport function fnv1aBase36(input: string): string {\n let hash = FNV1A_OFFSET_BASIS;\n for (const character of input) {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) continue;\n hash ^= codePoint;\n hash = Math.imul(hash, FNV1A_PRIME);\n }\n return (hash >>> 0).toString(36);\n}\n","export const NODE_META_KEYS = [\n \"version\",\n \"validFrom\",\n \"validTo\",\n \"createdAt\",\n \"updatedAt\",\n \"deletedAt\",\n] as const;\n\nexport const EDGE_META_KEYS = [\n \"validFrom\",\n \"validTo\",\n \"createdAt\",\n \"updatedAt\",\n \"deletedAt\",\n] as const;\n"]}
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkQ73OWTJY_cjs = require('./chunk-Q73OWTJY.cjs');
3
+ var chunkSCXOGKLD_cjs = require('./chunk-SCXOGKLD.cjs');
4
4
  var chunkO5PST6TB_cjs = require('./chunk-O5PST6TB.cjs');
5
- var chunkFQCQM3KG_cjs = require('./chunk-FQCQM3KG.cjs');
5
+ var chunk3JK66E3I_cjs = require('./chunk-3JK66E3I.cjs');
6
6
  var drizzleOrm = require('drizzle-orm');
7
7
 
8
8
  var DEFAULT_PREPARED_STATEMENT_CACHE_MAX = 256;
@@ -107,7 +107,7 @@ function createSqliteExecutionAdapter(db, statementCacheMaxOrOptions = {}) {
107
107
  supportsCompiledExecution: sqliteClient !== void 0,
108
108
  transactionMode
109
109
  };
110
- const compile = (query) => chunkQ73OWTJY_cjs.compileQueryWithDialect(db, query, "SQLite");
110
+ const compile = (query) => chunkSCXOGKLD_cjs.compileQueryWithDialect(db, query, "SQLite");
111
111
  if (sqliteClient !== void 0) {
112
112
  let executeCompiled2 = function(compiledQuery) {
113
113
  const preparedStatement = getOrCreatePreparedStatement(
@@ -178,10 +178,10 @@ var SQLITE_CHECK_UNIQUE_BATCH_CHUNK_SIZE = Math.max(
178
178
  1,
179
179
  SQLITE_MAX_BIND_PARAMETERS - CHECK_UNIQUE_BATCH_FIXED_PARAM_COUNT
180
180
  );
181
- var toNodeRow = chunkQ73OWTJY_cjs.createNodeRowMapper(chunkQ73OWTJY_cjs.SQLITE_ROW_MAPPER_CONFIG);
182
- var toEdgeRow = chunkQ73OWTJY_cjs.createEdgeRowMapper(chunkQ73OWTJY_cjs.SQLITE_ROW_MAPPER_CONFIG);
183
- var toUniqueRow = chunkQ73OWTJY_cjs.createUniqueRowMapper(chunkQ73OWTJY_cjs.SQLITE_ROW_MAPPER_CONFIG);
184
- var toSchemaVersionRow = chunkQ73OWTJY_cjs.createSchemaVersionRowMapper(chunkQ73OWTJY_cjs.SQLITE_ROW_MAPPER_CONFIG);
181
+ var toNodeRow = chunkSCXOGKLD_cjs.createNodeRowMapper(chunkSCXOGKLD_cjs.SQLITE_ROW_MAPPER_CONFIG);
182
+ var toEdgeRow = chunkSCXOGKLD_cjs.createEdgeRowMapper(chunkSCXOGKLD_cjs.SQLITE_ROW_MAPPER_CONFIG);
183
+ var toUniqueRow = chunkSCXOGKLD_cjs.createUniqueRowMapper(chunkSCXOGKLD_cjs.SQLITE_ROW_MAPPER_CONFIG);
184
+ var toSchemaVersionRow = chunkSCXOGKLD_cjs.createSchemaVersionRowMapper(chunkSCXOGKLD_cjs.SQLITE_ROW_MAPPER_CONFIG);
185
185
  var PENDING_FOREVER = new Promise(noop);
186
186
  function pendingForever() {
187
187
  return PENDING_FOREVER;
@@ -248,7 +248,7 @@ function createSqliteOperationBackend(options) {
248
248
  await db.run(query);
249
249
  });
250
250
  }
251
- const commonBackend = chunkQ73OWTJY_cjs.createCommonOperationBackend({
251
+ const commonBackend = chunkSCXOGKLD_cjs.createCommonOperationBackend({
252
252
  batchConfig: {
253
253
  checkUniqueBatchChunkSize: SQLITE_CHECK_UNIQUE_BATCH_CHUNK_SIZE,
254
254
  edgeInsertBatchSize: SQLITE_EDGE_INSERT_BATCH_SIZE,
@@ -261,7 +261,7 @@ function createSqliteOperationBackend(options) {
261
261
  execGet,
262
262
  execRun
263
263
  },
264
- nowIso: chunkQ73OWTJY_cjs.nowIso,
264
+ nowIso: chunkSCXOGKLD_cjs.nowIso,
265
265
  operationStrategy,
266
266
  rowMappers: {
267
267
  toEdgeRow,
@@ -279,9 +279,23 @@ function createSqliteOperationBackend(options) {
279
279
  );
280
280
  }
281
281
  };
282
+ const vectorEmbeddingMethods = options.hasVectorEmbeddings ? {
283
+ async upsertEmbedding(params) {
284
+ const query = operationStrategy.buildUpsertEmbedding(
285
+ params,
286
+ chunkSCXOGKLD_cjs.nowIso()
287
+ );
288
+ await execRun(query);
289
+ },
290
+ async deleteEmbedding(params) {
291
+ const query = operationStrategy.buildDeleteEmbedding(params);
292
+ await execRun(query);
293
+ }
294
+ } : {};
282
295
  const operationBackend = {
283
296
  ...commonBackend,
284
297
  ...executeRawMethod,
298
+ ...vectorEmbeddingMethods,
285
299
  capabilities,
286
300
  dialect: "sqlite",
287
301
  tableNames,
@@ -298,14 +312,14 @@ function createSqliteOperationBackend(options) {
298
312
  ...params.indexParams?.efConstruction === void 0 ? {} : { hnswEfConstruction: params.indexParams.efConstruction },
299
313
  ...params.indexParams?.lists === void 0 ? {} : { ivfflatLists: params.indexParams.lists }
300
314
  };
301
- const result = chunkQ73OWTJY_cjs.createSqliteVectorIndex(indexOptions);
315
+ const result = chunkSCXOGKLD_cjs.createSqliteVectorIndex(indexOptions);
302
316
  if (!result.success) {
303
317
  throw new Error(result.message ?? "Failed to create SQLite vector index");
304
318
  }
305
319
  return Promise.resolve();
306
320
  },
307
321
  dropVectorIndex(params) {
308
- const result = chunkQ73OWTJY_cjs.dropSqliteVectorIndex(
322
+ const result = chunkSCXOGKLD_cjs.dropSqliteVectorIndex(
309
323
  params.graphId,
310
324
  params.nodeKind,
311
325
  params.fieldPath
@@ -317,7 +331,7 @@ function createSqliteOperationBackend(options) {
317
331
  },
318
332
  // === Fulltext Operations ===
319
333
  async upsertFulltext(params) {
320
- const timestamp = chunkQ73OWTJY_cjs.nowIso();
334
+ const timestamp = chunkSCXOGKLD_cjs.nowIso();
321
335
  const statements = operationStrategy.buildUpsertFulltext(
322
336
  params,
323
337
  timestamp
@@ -334,7 +348,7 @@ function createSqliteOperationBackend(options) {
334
348
  },
335
349
  async upsertFulltextBatch(params) {
336
350
  if (params.rows.length === 0) return;
337
- const timestamp = chunkQ73OWTJY_cjs.nowIso();
351
+ const timestamp = chunkSCXOGKLD_cjs.nowIso();
338
352
  const statements = operationStrategy.buildUpsertFulltextBatch(
339
353
  params,
340
354
  timestamp
@@ -374,15 +388,15 @@ function createSqliteOperationBackend(options) {
374
388
  return operationBackend;
375
389
  }
376
390
  function createSqliteBackend(db, options = {}) {
377
- const tables2 = options.tables ?? chunkQ73OWTJY_cjs.tables2;
378
- const fulltextStrategy = options.fulltext ?? chunkFQCQM3KG_cjs.fts5Strategy;
391
+ const tables2 = options.tables ?? chunkSCXOGKLD_cjs.tables2;
392
+ const fulltextStrategy = options.fulltext ?? chunk3JK66E3I_cjs.fts5Strategy;
379
393
  const profileHints = options.executionProfile ?? {};
380
394
  const executionAdapter = createSqliteExecutionAdapter(db, { profileHints });
381
395
  const { isSync, transactionMode } = executionAdapter.profile;
382
- const baseCapabilities = transactionMode === "none" ? { ...chunkQ73OWTJY_cjs.SQLITE_CAPABILITIES, transactions: false } : chunkQ73OWTJY_cjs.SQLITE_CAPABILITIES;
396
+ const baseCapabilities = transactionMode === "none" ? { ...chunkSCXOGKLD_cjs.SQLITE_CAPABILITIES, transactions: false } : chunkSCXOGKLD_cjs.SQLITE_CAPABILITIES;
383
397
  const capabilities = {
384
398
  ...baseCapabilities,
385
- fulltext: chunkFQCQM3KG_cjs.buildFulltextCapabilities(fulltextStrategy)
399
+ fulltext: chunk3JK66E3I_cjs.buildFulltextCapabilities(fulltextStrategy)
386
400
  };
387
401
  const tableNames = {
388
402
  nodes: drizzleOrm.getTableName(tables2.nodes),
@@ -390,11 +404,12 @@ function createSqliteBackend(db, options = {}) {
390
404
  embeddings: drizzleOrm.getTableName(tables2.embeddings),
391
405
  fulltext: tables2.fulltextTableName
392
406
  };
393
- const operationStrategy = chunkQ73OWTJY_cjs.createSqliteOperationStrategy(
407
+ const operationStrategy = chunkSCXOGKLD_cjs.createSqliteOperationStrategy(
394
408
  tables2,
395
409
  fulltextStrategy
396
410
  );
397
411
  const serializedQueue = isSync ? createSerializedExecutionQueue() : void 0;
412
+ const hasVectorEmbeddings = options.hasVectorEmbeddings === true;
398
413
  const operations = createSqliteOperationBackend({
399
414
  capabilities,
400
415
  db,
@@ -402,12 +417,13 @@ function createSqliteBackend(db, options = {}) {
402
417
  operationStrategy,
403
418
  tableNames,
404
419
  fulltextStrategy,
420
+ hasVectorEmbeddings,
405
421
  ...serializedQueue === void 0 ? {} : { serializedQueue }
406
422
  });
407
423
  const backend = {
408
424
  ...operations,
409
425
  async bootstrapTables() {
410
- const statements = chunkQ73OWTJY_cjs.generateSqliteDDL(tables2, fulltextStrategy);
426
+ const statements = chunkSCXOGKLD_cjs.generateSqliteDDL(tables2, fulltextStrategy);
411
427
  for (const statement of statements) {
412
428
  await db.run(drizzleOrm.sql.raw(statement));
413
429
  }
@@ -437,7 +453,8 @@ function createSqliteBackend(db, options = {}) {
437
453
  operationStrategy,
438
454
  profileHints: { isSync: true },
439
455
  tableNames,
440
- fulltextStrategy
456
+ fulltextStrategy,
457
+ hasVectorEmbeddings
441
458
  });
442
459
  db.run(drizzleOrm.sql`BEGIN`);
443
460
  try {
@@ -459,7 +476,8 @@ function createSqliteBackend(db, options = {}) {
459
476
  operationStrategy,
460
477
  profileHints: { isSync },
461
478
  tableNames,
462
- fulltextStrategy
479
+ fulltextStrategy,
480
+ hasVectorEmbeddings
463
481
  });
464
482
  return fn(txBackend);
465
483
  })
@@ -482,10 +500,11 @@ function createTransactionBackend(options) {
482
500
  executionAdapter: txExecutionAdapter,
483
501
  operationStrategy: options.operationStrategy,
484
502
  tableNames: options.tableNames,
485
- fulltextStrategy: options.fulltextStrategy
503
+ fulltextStrategy: options.fulltextStrategy,
504
+ ...options.hasVectorEmbeddings === void 0 ? {} : { hasVectorEmbeddings: options.hasVectorEmbeddings }
486
505
  });
487
506
  }
488
507
 
489
508
  exports.createSqliteBackend = createSqliteBackend;
490
- //# sourceMappingURL=chunk-CQL6FOTT.cjs.map
491
- //# sourceMappingURL=chunk-CQL6FOTT.cjs.map
509
+ //# sourceMappingURL=chunk-GUYI6VAS.cjs.map
510
+ //# sourceMappingURL=chunk-GUYI6VAS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/backend/drizzle/execution/sqlite-execution.ts","../src/backend/drizzle/sqlite.ts"],"names":["sql","compileQueryWithDialect","executeCompiled","createNodeRowMapper","SQLITE_ROW_MAPPER_CONFIG","createEdgeRowMapper","createUniqueRowMapper","createSchemaVersionRowMapper","BackendDisposedError","createCommonOperationBackend","nowIso","createSqliteVectorIndex","dropSqliteVectorIndex","tables","fts5Strategy","SQLITE_CAPABILITIES","buildFulltextCapabilities","getTableName","createSqliteOperationStrategy","generateSqliteDDL","ConfigurationError"],"mappings":"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","file":"chunk-GUYI6VAS.cjs","sourcesContent":["import { type SQL, sql } from \"drizzle-orm\";\nimport { type BaseSQLiteDatabase } from \"drizzle-orm/sqlite-core\";\n\nimport {\n type CompiledSqlQuery,\n compileQueryWithDialect,\n type PreparedSqlStatement,\n type SqlExecutionAdapter,\n} from \"./types\";\n\nconst DEFAULT_PREPARED_STATEMENT_CACHE_MAX = 256;\n\ntype PreparedAllStatement = Readonly<{\n all: (...params: readonly unknown[]) => readonly unknown[];\n}>;\n\ntype SqliteClientWithPrepare = Readonly<{\n prepare: (sqlText: string) => PreparedAllStatement;\n}>;\n\ntype SqliteClientCarrier = Readonly<{\n $client?: SqliteClientWithPrepare;\n}>;\n\ntype SessionLike = Readonly<{\n constructor?: Readonly<{\n name?: string;\n }>;\n}>;\n\ntype DatabaseWithSession = Readonly<{\n _?: Readonly<{\n session?: SessionLike;\n }>;\n session?: SessionLike;\n}>;\n\n/**\n * Controls how the backend manages SQLite transactions.\n *\n * - `\"sql\"`: TypeGraph issues BEGIN / COMMIT / ROLLBACK SQL directly.\n * Default for sync drivers (better-sqlite3, bun:sqlite).\n * - `\"drizzle\"`: Delegates to Drizzle's `db.transaction()` method.\n * Default for async drivers (libsql, sql.js).\n * - `\"none\"`: Transactions disabled.\n * Default for Cloudflare D1 and Durable Objects.\n */\nexport type SqliteTransactionMode = \"sql\" | \"drizzle\" | \"none\";\n\nexport type SqliteExecutionProfileHints = Readonly<{\n isSync?: boolean;\n transactionMode?: SqliteTransactionMode;\n}>;\n\ntype SqliteExecutionAdapterOptions = Readonly<{\n profileHints?: SqliteExecutionProfileHints;\n statementCacheMax?: number;\n}>;\n\nexport type AnySqliteDatabase = BaseSQLiteDatabase<\"sync\" | \"async\", unknown>;\n\nexport type SqliteExecutionProfile = Readonly<{\n isSync: boolean;\n supportsCompiledExecution: boolean;\n transactionMode: SqliteTransactionMode;\n}>;\n\nexport type SqliteExecutionAdapter = Readonly<\n SqlExecutionAdapter & {\n clearStatementCache: () => void;\n profile: SqliteExecutionProfile;\n }\n>;\n\nfunction getSessionName(db: AnySqliteDatabase): string | undefined {\n const databaseWithSession = db as DatabaseWithSession;\n const primarySessionName = databaseWithSession.session?.constructor?.name;\n if (primarySessionName !== undefined) {\n return primarySessionName;\n }\n\n return databaseWithSession._?.session?.constructor?.name;\n}\n\nfunction isD1DatabaseBySessionName(db: AnySqliteDatabase): boolean {\n return getSessionName(db) === \"SQLiteD1Session\";\n}\n\nfunction isDurableObjectBySessionName(db: AnySqliteDatabase): boolean {\n const sessionName = getSessionName(db);\n return sessionName === \"SQLiteDurableObjectSession\";\n}\n\nfunction isSyncDatabaseBySessionName(db: AnySqliteDatabase): boolean {\n const sessionName = getSessionName(db);\n return (\n sessionName === \"BetterSQLiteSession\" || sessionName === \"BunSQLiteSession\"\n );\n}\n\nfunction detectSyncProfile(\n db: AnySqliteDatabase,\n profileHints: SqliteExecutionProfileHints,\n): boolean {\n if (profileHints.isSync !== undefined) {\n return profileHints.isSync;\n }\n\n const sessionName = getSessionName(db);\n if (sessionName === \"BetterSQLiteSession\" || sessionName === \"BunSQLiteSession\") {\n return true;\n }\n if (sessionName === \"SQLiteD1Session\") {\n return false;\n }\n\n try {\n const probeResult = db.get(sql`SELECT 1 AS __typegraph_sync_probe__`);\n return !(probeResult instanceof Promise);\n } catch {\n return isSyncDatabaseBySessionName(db);\n }\n}\n\nfunction detectTransactionMode(\n db: AnySqliteDatabase,\n profileHints: SqliteExecutionProfileHints,\n isSync: boolean,\n): SqliteTransactionMode {\n if (profileHints.transactionMode !== undefined) {\n return profileHints.transactionMode;\n }\n // D1 and Durable Object SQLite do not support raw BEGIN/COMMIT SQL\n // through Drizzle's db.run(). Default to \"none\" because async\n // transaction callbacks are not reliably supported across sync\n // Drizzle drivers. Users can opt in to \"drizzle\" mode explicitly if\n // their runtime's db.transaction() handles async callbacks.\n if (isD1DatabaseBySessionName(db) || isDurableObjectBySessionName(db)) {\n return \"none\";\n }\n if (isSync) return \"sql\";\n return \"drizzle\";\n}\n\nfunction resolveSqliteClient(\n db: AnySqliteDatabase,\n): SqliteClientWithPrepare | undefined {\n const databaseWithClient = db as SqliteClientCarrier;\n const sqliteClient = databaseWithClient.$client;\n if (sqliteClient?.prepare === undefined) {\n return undefined;\n }\n return sqliteClient;\n}\n\nfunction getOrCreatePreparedStatement(\n cache: Map<string, PreparedAllStatement>,\n sqliteClient: SqliteClientWithPrepare,\n sqlText: string,\n cacheMax: number,\n): PreparedAllStatement {\n const cachedStatement = cache.get(sqlText);\n if (cachedStatement !== undefined) {\n // Promote to most-recently-used position for LRU eviction\n cache.delete(sqlText);\n cache.set(sqlText, cachedStatement);\n return cachedStatement;\n }\n\n const preparedStatement = sqliteClient.prepare(sqlText);\n cache.set(sqlText, preparedStatement);\n\n if (cache.size > cacheMax) {\n const oldestSqlText = cache.keys().next().value;\n if (typeof oldestSqlText === \"string\") {\n cache.delete(oldestSqlText);\n }\n }\n\n return preparedStatement;\n}\n\n// Uses unconditional `await` because Drizzle returns SQLiteRaw thenables\n// that fail `instanceof Promise` checks (drizzle-team/drizzle-orm#2275).\nasync function executeDrizzleQuery<TRow>(\n db: AnySqliteDatabase,\n query: SQL,\n): Promise<readonly TRow[]> {\n return (await db.all(query));\n}\n\nfunction createPreparedStatementExecutor(\n sqliteClient: SqliteClientWithPrepare,\n cache: Map<string, PreparedAllStatement>,\n sqlText: string,\n cacheMax: number,\n): PreparedSqlStatement {\n return {\n execute<TRow>(params: readonly unknown[]): Promise<readonly TRow[]> {\n const preparedStatement = getOrCreatePreparedStatement(\n cache,\n sqliteClient,\n sqlText,\n cacheMax,\n );\n const rows = preparedStatement.all(...params);\n return Promise.resolve(rows as readonly TRow[]);\n },\n };\n}\n\nexport function createSqliteExecutionAdapter(\n db: AnySqliteDatabase,\n statementCacheMaxOrOptions: number | SqliteExecutionAdapterOptions = {},\n): SqliteExecutionAdapter {\n const options: SqliteExecutionAdapterOptions =\n typeof statementCacheMaxOrOptions === \"number\"\n ? { statementCacheMax: statementCacheMaxOrOptions }\n : statementCacheMaxOrOptions;\n const statementCacheMax =\n options.statementCacheMax ?? DEFAULT_PREPARED_STATEMENT_CACHE_MAX;\n const profileHints = options.profileHints ?? {};\n\n const isSync = detectSyncProfile(db, profileHints);\n const sqliteClient = isSync ? resolveSqliteClient(db) : undefined;\n const transactionMode = detectTransactionMode(db, profileHints, isSync);\n\n const profile: SqliteExecutionProfile = {\n isSync,\n supportsCompiledExecution: sqliteClient !== undefined,\n transactionMode,\n };\n\n const compile = (query: SQL): CompiledSqlQuery =>\n compileQueryWithDialect(db, query, \"SQLite\");\n\n if (sqliteClient !== undefined) {\n const client = sqliteClient;\n const statementCache = new Map<string, PreparedAllStatement>();\n\n function executeCompiled<TRow>(\n compiledQuery: CompiledSqlQuery,\n ): Promise<readonly TRow[]> {\n const preparedStatement = getOrCreatePreparedStatement(\n statementCache,\n client,\n compiledQuery.sql,\n statementCacheMax,\n );\n const rows = preparedStatement.all(...compiledQuery.params);\n return Promise.resolve(rows as readonly TRow[]);\n }\n\n return {\n clearStatementCache() {\n statementCache.clear();\n },\n compile,\n execute<TRow>(query: SQL): Promise<readonly TRow[]> {\n const compiledQuery = compile(query);\n return executeCompiled<TRow>(compiledQuery);\n },\n executeCompiled,\n prepare(sqlText: string): PreparedSqlStatement {\n return createPreparedStatementExecutor(\n client,\n statementCache,\n sqlText,\n statementCacheMax,\n );\n },\n profile,\n };\n }\n\n return {\n clearStatementCache() {\n // No-op: no statement cache in async/D1 mode\n },\n compile,\n execute<TRow>(query: SQL): Promise<readonly TRow[]> {\n return executeDrizzleQuery<TRow>(db, query);\n },\n profile,\n };\n}\n","/**\n * SQLite backend adapter for TypeGraph.\n *\n * Works with any Drizzle SQLite database instance:\n * - better-sqlite3\n * - libsql / Turso\n * - Cloudflare D1\n * - bun:sqlite\n * - sql.js\n *\n * @example\n * ```typescript\n * import { drizzle } from \"drizzle-orm/better-sqlite3\";\n * import Database from \"better-sqlite3\";\n * import { createSqliteBackend, tables } from \"@nicia-ai/typegraph/sqlite\";\n *\n * const sqlite = new Database(\"app.db\");\n * const db = drizzle(sqlite);\n * const backend = createSqliteBackend(db, { tables });\n * ```\n */\nimport { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport { BackendDisposedError, ConfigurationError } from \"../../errors\";\nimport type { SqlTableNames } from \"../../query/compiler/schema\";\nimport {\n buildFulltextCapabilities,\n fts5Strategy,\n type FulltextStrategy,\n} from \"../../query/dialect/fulltext-strategy\";\nimport {\n type BackendCapabilities,\n type CreateVectorIndexParams,\n type DeleteEmbeddingParams,\n type DeleteFulltextBatchParams,\n type DeleteFulltextParams,\n type DropVectorIndexParams,\n type FulltextSearchParams,\n type FulltextSearchResult,\n type GraphBackend,\n SQLITE_CAPABILITIES,\n type TransactionBackend,\n type TransactionOptions,\n type UpsertEmbeddingParams,\n type UpsertFulltextBatchParams,\n type UpsertFulltextParams,\n} from \"../types\";\nimport {\n type AnySqliteDatabase,\n createSqliteExecutionAdapter,\n type SqliteExecutionAdapter,\n type SqliteExecutionProfileHints,\n} from \"./execution/sqlite-execution\";\nexport type { SqliteTransactionMode } from \"./execution/sqlite-execution\";\nimport { generateSqliteDDL } from \"./ddl\";\nimport { createCommonOperationBackend } from \"./operation-backend-core\";\nimport { createSqliteOperationStrategy } from \"./operations/strategy\";\nimport {\n createEdgeRowMapper,\n createNodeRowMapper,\n createSchemaVersionRowMapper,\n createUniqueRowMapper,\n nowIso,\n SQLITE_ROW_MAPPER_CONFIG,\n} from \"./row-mappers\";\nimport { type SqliteTables, tables as defaultTables } from \"./schema/sqlite\";\nimport {\n createSqliteVectorIndex,\n dropSqliteVectorIndex,\n type VectorIndexOptions,\n} from \"./vector-index\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Options for creating a SQLite backend.\n */\nexport type SqliteBackendOptions = Readonly<{\n /**\n * Custom table definitions. Use createSqliteTables() to customize table names.\n * Defaults to standard TypeGraph table names.\n */\n tables?: SqliteTables;\n /**\n * Optional execution profile hints used to avoid runtime driver reflection.\n * Set `transactionMode: \"none\"` for drivers that do not support transactions\n * (e.g. Cloudflare D1, Durable Objects).\n */\n executionProfile?: SqliteExecutionProfileHints;\n /**\n * Fulltext strategy override. Defaults to `fts5Strategy` (SQLite's\n * built-in FTS5 virtual table). Most users should leave this alone.\n */\n fulltext?: FulltextStrategy;\n /**\n * Set to `true` when sqlite-vec has been loaded on the connection.\n * Enables vector embedding persistence via `upsertEmbedding` /\n * `deleteEmbedding`, which the store's embedding-sync path relies on\n * whenever node schemas declare `embedding()` fields. When omitted the\n * backend does not expose those methods and embedding values pass\n * through writes without being indexed — matching existing behavior\n * for backends without sqlite-vec. `createLocalSqliteBackend` sets\n * this automatically when it loads the extension.\n */\n hasVectorEmbeddings?: boolean;\n}>;\n\nconst SQLITE_MAX_BIND_PARAMETERS = 999;\nconst NODE_INSERT_PARAM_COUNT = 9;\nconst EDGE_INSERT_PARAM_COUNT = 12;\nconst SQLITE_NODE_INSERT_BATCH_SIZE = Math.max(\n 1,\n Math.floor(SQLITE_MAX_BIND_PARAMETERS / NODE_INSERT_PARAM_COUNT),\n);\nconst SQLITE_EDGE_INSERT_BATCH_SIZE = Math.max(\n 1,\n Math.floor(SQLITE_MAX_BIND_PARAMETERS / EDGE_INSERT_PARAM_COUNT),\n);\nconst SQLITE_GET_NODES_ID_CHUNK_SIZE = Math.max(\n 1,\n SQLITE_MAX_BIND_PARAMETERS - 2,\n);\nconst SQLITE_GET_EDGES_ID_CHUNK_SIZE = Math.max(\n 1,\n SQLITE_MAX_BIND_PARAMETERS - 1,\n);\nconst CHECK_UNIQUE_BATCH_FIXED_PARAM_COUNT = 3;\nconst SQLITE_CHECK_UNIQUE_BATCH_CHUNK_SIZE = Math.max(\n 1,\n SQLITE_MAX_BIND_PARAMETERS - CHECK_UNIQUE_BATCH_FIXED_PARAM_COUNT,\n);\n\ntype SerializedExecutionQueue = Readonly<{\n dispose: () => void;\n runExclusive: <T>(task: () => Promise<T>) => Promise<T>;\n}>;\n\n// ============================================================\n// Utilities\n// ============================================================\n\nconst toNodeRow = createNodeRowMapper(SQLITE_ROW_MAPPER_CONFIG);\nconst toEdgeRow = createEdgeRowMapper(SQLITE_ROW_MAPPER_CONFIG);\nconst toUniqueRow = createUniqueRowMapper(SQLITE_ROW_MAPPER_CONFIG);\nconst toSchemaVersionRow = createSchemaVersionRowMapper(SQLITE_ROW_MAPPER_CONFIG);\n\n/** A shared promise that never settles — used to absorb post-dispose work. */\nconst PENDING_FOREVER: Promise<never> = new Promise<never>(noop);\n\nfunction pendingForever<T>(): Promise<T> {\n return PENDING_FOREVER;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop(): void {}\n\nfunction createSerializedExecutionQueue(): SerializedExecutionQueue {\n let tail: Promise<unknown> = Promise.resolve();\n let disposed = false;\n\n function isDisposed(): boolean {\n return disposed;\n }\n\n return {\n dispose() {\n disposed = true;\n },\n\n runExclusive<T>(task: () => Promise<T>): Promise<T> {\n if (isDisposed()) return Promise.reject(new BackendDisposedError());\n\n // When disposed, runTask returns a never-settling promise so that no\n // rejection propagates through the 7+ async wrappers between this\n // queue and the store-level caller. A rejection here would become an\n // unhandled rejection if the caller abandoned the promise during\n // teardown — and JavaScript offers no way to `.catch()` a rejection\n // at the bottom of a chain without every async wrapper above it also\n // creating an independently-unhandled rejected promise.\n //\n // The tradeoff: an active caller whose operation was queued before\n // dispose() will see a permanently-pending promise rather than a\n // BackendDisposedError. Post-dispose submissions (the check above)\n // still reject immediately since the caller actively holds that\n // promise.\n const runTask = async (): Promise<T> => {\n if (isDisposed()) return pendingForever<T>();\n try {\n return await task();\n } catch (error) {\n if (isDisposed()) return pendingForever<T>();\n throw error;\n }\n };\n const result = tail.then(runTask, runTask);\n tail = result.then(\n () => 0,\n () => 0,\n );\n return result;\n },\n };\n}\n\nfunction runWithSerializedQueue<T>(\n queue: SerializedExecutionQueue | undefined,\n task: () => Promise<T>,\n): Promise<T> {\n if (queue === undefined) return task();\n return queue.runExclusive(task);\n}\n\n// ============================================================\n// Backend Factory\n// ============================================================\n\n/**\n * Creates a TypeGraph backend for SQLite databases.\n *\n * Works with any Drizzle SQLite instance regardless of the underlying driver.\n *\n * @param db - A Drizzle SQLite database instance\n * @param options - Backend configuration\n * @returns A GraphBackend implementation\n */\ntype CreateSqliteOperationBackendOptions = Readonly<{\n capabilities: GraphBackend[\"capabilities\"];\n db: AnySqliteDatabase;\n executionAdapter: SqliteExecutionAdapter;\n operationStrategy: ReturnType<typeof createSqliteOperationStrategy>;\n serializedQueue?: SerializedExecutionQueue;\n tableNames: SqlTableNames;\n fulltextStrategy: FulltextStrategy;\n /** Wire up upsertEmbedding / deleteEmbedding. See transaction options for details. */\n hasVectorEmbeddings?: boolean;\n}>;\n\ntype CreateSqliteTransactionBackendOptions = Readonly<{\n capabilities: GraphBackend[\"capabilities\"];\n db: AnySqliteDatabase;\n executionAdapter?: SqliteExecutionAdapter;\n operationStrategy: ReturnType<typeof createSqliteOperationStrategy>;\n profileHints: SqliteExecutionProfileHints;\n tableNames: SqlTableNames;\n fulltextStrategy: FulltextStrategy;\n /**\n * When true, the backend exposes upsertEmbedding / deleteEmbedding —\n * detected by probing `vec_f32(...)` on the connection at boot so the\n * store's embedding-sync path persists vectors to the embeddings table.\n */\n hasVectorEmbeddings?: boolean;\n}>;\n\nfunction createSqliteOperationBackend(\n options: CreateSqliteOperationBackendOptions,\n): TransactionBackend {\n const {\n capabilities,\n db,\n executionAdapter,\n operationStrategy,\n serializedQueue,\n tableNames,\n fulltextStrategy,\n } = options;\n\n function execGet<T>(query: SQL): Promise<T | undefined> {\n // Workaround: drizzle-team/drizzle-orm#1049 — db.get() crashes with\n // the libsql driver when no rows match (normalizeRow receives undefined).\n // Using db.all()[0] avoids the crash for all drivers.\n //\n // All three exec helpers use `await` unconditionally rather than\n // `instanceof Promise` because Drizzle returns SQLiteRaw thenables\n // that are NOT Promise instances (drizzle-team/drizzle-orm#2275).\n return runWithSerializedQueue(serializedQueue, async () => {\n const rows = await db.all(query);\n return (rows as T[])[0];\n });\n }\n\n function execAll<T>(query: SQL): Promise<T[]> {\n return runWithSerializedQueue(serializedQueue, async () => {\n return await db.all(query);\n });\n }\n\n function execRun(query: SQL): Promise<void> {\n return runWithSerializedQueue(serializedQueue, async () => {\n await db.run(query);\n });\n }\n\n const commonBackend = createCommonOperationBackend({\n batchConfig: {\n checkUniqueBatchChunkSize: SQLITE_CHECK_UNIQUE_BATCH_CHUNK_SIZE,\n edgeInsertBatchSize: SQLITE_EDGE_INSERT_BATCH_SIZE,\n getEdgesChunkSize: SQLITE_GET_EDGES_ID_CHUNK_SIZE,\n getNodesChunkSize: SQLITE_GET_NODES_ID_CHUNK_SIZE,\n nodeInsertBatchSize: SQLITE_NODE_INSERT_BATCH_SIZE,\n },\n execution: {\n execAll,\n execGet,\n execRun,\n },\n nowIso,\n operationStrategy,\n rowMappers: {\n toEdgeRow,\n toNodeRow,\n toSchemaVersionRow,\n toUniqueRow,\n },\n });\n\n const executeCompiled = executionAdapter.executeCompiled;\n const executeRawMethod: Pick<TransactionBackend, \"executeRaw\"> =\n executeCompiled === undefined ?\n {}\n : {\n executeRaw<T>(\n sqlText: string,\n params: readonly unknown[],\n ): Promise<readonly T[]> {\n return runWithSerializedQueue(serializedQueue, async () =>\n executeCompiled<T>({ params, sql: sqlText }),\n );\n },\n };\n\n const vectorEmbeddingMethods =\n options.hasVectorEmbeddings\n ? {\n async upsertEmbedding(params: UpsertEmbeddingParams): Promise<void> {\n const query = operationStrategy.buildUpsertEmbedding(\n params,\n nowIso(),\n );\n await execRun(query);\n },\n async deleteEmbedding(params: DeleteEmbeddingParams): Promise<void> {\n const query = operationStrategy.buildDeleteEmbedding(params);\n await execRun(query);\n },\n }\n : {};\n\n const operationBackend: TransactionBackend = {\n ...commonBackend,\n ...executeRawMethod,\n ...vectorEmbeddingMethods,\n capabilities,\n dialect: \"sqlite\",\n tableNames,\n fulltextStrategy,\n\n createVectorIndex(params: CreateVectorIndexParams): Promise<void> {\n const indexOptions: VectorIndexOptions = {\n graphId: params.graphId,\n nodeKind: params.nodeKind,\n fieldPath: params.fieldPath,\n dimensions: params.dimensions,\n indexType: params.indexType,\n metric: params.metric,\n ...(params.indexParams?.m === undefined\n ? {}\n : { hnswM: params.indexParams.m }),\n ...(params.indexParams?.efConstruction === undefined\n ? {}\n : { hnswEfConstruction: params.indexParams.efConstruction }),\n ...(params.indexParams?.lists === undefined\n ? {}\n : { ivfflatLists: params.indexParams.lists }),\n };\n\n const result = createSqliteVectorIndex(indexOptions);\n\n if (!result.success) {\n throw new Error(result.message ?? \"Failed to create SQLite vector index\");\n }\n return Promise.resolve();\n },\n\n dropVectorIndex(params: DropVectorIndexParams): Promise<void> {\n const result = dropSqliteVectorIndex(\n params.graphId,\n params.nodeKind,\n params.fieldPath,\n );\n if (!result.success) {\n throw new Error(result.message ?? \"Failed to drop SQLite vector index\");\n }\n return Promise.resolve();\n },\n\n // === Fulltext Operations ===\n\n async upsertFulltext(params: UpsertFulltextParams): Promise<void> {\n const timestamp = nowIso();\n const statements = operationStrategy.buildUpsertFulltext(\n params,\n timestamp,\n );\n for (const stmt of statements) {\n await execRun(stmt);\n }\n },\n\n async deleteFulltext(params: DeleteFulltextParams): Promise<void> {\n const statements = operationStrategy.buildDeleteFulltext(params);\n for (const stmt of statements) {\n await execRun(stmt);\n }\n },\n\n async upsertFulltextBatch(\n params: UpsertFulltextBatchParams,\n ): Promise<void> {\n if (params.rows.length === 0) return;\n const timestamp = nowIso();\n const statements = operationStrategy.buildUpsertFulltextBatch(\n params,\n timestamp,\n );\n for (const stmt of statements) {\n await execRun(stmt);\n }\n },\n\n async deleteFulltextBatch(\n params: DeleteFulltextBatchParams,\n ): Promise<void> {\n if (params.nodeIds.length === 0) return;\n const statements = operationStrategy.buildDeleteFulltextBatch(params);\n for (const stmt of statements) {\n await execRun(stmt);\n }\n },\n\n async fulltextSearch(\n params: FulltextSearchParams,\n ): Promise<readonly FulltextSearchResult[]> {\n const query = operationStrategy.buildFulltextSearch(params);\n const rows = await execAll<{\n node_id: string;\n score: number;\n snippet: string | null;\n }>(query);\n return rows.map((row, index) => ({\n nodeId: row.node_id,\n score: row.score,\n rank: index + 1,\n ...(row.snippet === null ? {} : { snippet: row.snippet }),\n }));\n },\n\n // === Query Execution ===\n\n async execute<T>(query: SQL): Promise<readonly T[]> {\n return runWithSerializedQueue(serializedQueue, async () =>\n executionAdapter.execute<T>(query),\n );\n },\n\n compileSql(query: SQL): Readonly<{ sql: string; params: readonly unknown[] }> {\n return executionAdapter.compile(query);\n },\n };\n\n return operationBackend;\n}\n\nexport function createSqliteBackend(\n db: AnySqliteDatabase,\n options: SqliteBackendOptions = {},\n): GraphBackend {\n const tables = options.tables ?? defaultTables;\n const fulltextStrategy = options.fulltext ?? fts5Strategy;\n const profileHints = options.executionProfile ?? {};\n const executionAdapter = createSqliteExecutionAdapter(db, { profileHints });\n const { isSync, transactionMode } = executionAdapter.profile;\n const baseCapabilities: BackendCapabilities =\n transactionMode === \"none\"\n ? { ...SQLITE_CAPABILITIES, transactions: false }\n : SQLITE_CAPABILITIES;\n const capabilities: BackendCapabilities = {\n ...baseCapabilities,\n fulltext: buildFulltextCapabilities(fulltextStrategy),\n };\n\n const tableNames: SqlTableNames = {\n nodes: getTableName(tables.nodes),\n edges: getTableName(tables.edges),\n embeddings: getTableName(tables.embeddings),\n fulltext: tables.fulltextTableName,\n };\n const operationStrategy = createSqliteOperationStrategy(\n tables,\n fulltextStrategy,\n );\n const serializedQueue = isSync ? createSerializedExecutionQueue() : undefined;\n // Explicit opt-in: wire upsertEmbedding / deleteEmbedding only when\n // the caller confirms sqlite-vec is loaded. Probing synchronously\n // isn't portable across drizzle SQLite drivers (sync vs async), so\n // the gate lives with the caller that loaded the extension.\n const hasVectorEmbeddings = options.hasVectorEmbeddings === true;\n const operations = createSqliteOperationBackend({\n capabilities,\n db,\n executionAdapter,\n operationStrategy,\n tableNames,\n fulltextStrategy,\n hasVectorEmbeddings,\n ...(serializedQueue === undefined ? {} : { serializedQueue }),\n });\n\n const backend: GraphBackend = {\n ...operations,\n\n async bootstrapTables(): Promise<void> {\n const statements = generateSqliteDDL(tables, fulltextStrategy);\n for (const statement of statements) {\n await db.run(sql.raw(statement));\n }\n },\n\n async setActiveSchema(graphId: string, version: number): Promise<void> {\n await backend.transaction(async (txBackend) => {\n await txBackend.setActiveSchema(graphId, version);\n });\n },\n\n async transaction<T>(\n fn: (tx: TransactionBackend) => Promise<T>,\n _options?: TransactionOptions,\n ): Promise<T> {\n if (transactionMode === \"none\") {\n throw new ConfigurationError(\n \"This SQLite backend does not support atomic transactions. \" +\n \"Operations within a transaction are not rolled back on failure. \" +\n \"Use backend.capabilities.transactions to check for transaction support, \" +\n \"or use individual operations with manual error handling.\",\n {\n backend: \"sqlite\",\n capability: \"transactions\",\n supportsTransactions: false,\n },\n );\n }\n\n if (transactionMode === \"sql\") {\n return runWithSerializedQueue(serializedQueue, async () => {\n const txBackend = createTransactionBackend({\n capabilities,\n db,\n executionAdapter,\n operationStrategy,\n profileHints: { isSync: true },\n tableNames,\n fulltextStrategy,\n hasVectorEmbeddings,\n });\n db.run(sql`BEGIN`);\n\n try {\n const result = await fn(txBackend);\n db.run(sql`COMMIT`);\n return result;\n } catch (error) {\n db.run(sql`ROLLBACK`);\n throw error;\n }\n });\n }\n\n // transactionMode === \"drizzle\"\n return runWithSerializedQueue(serializedQueue, async () =>\n db.transaction(async (tx) => {\n const txBackend = createTransactionBackend({\n capabilities,\n db: tx,\n operationStrategy,\n profileHints: { isSync },\n tableNames,\n fulltextStrategy,\n hasVectorEmbeddings,\n });\n return fn(txBackend);\n }) as Promise<T>,\n );\n },\n\n close(): Promise<void> {\n serializedQueue?.dispose();\n return Promise.resolve();\n },\n };\n\n return backend;\n}\n\nfunction createTransactionBackend(\n options: CreateSqliteTransactionBackendOptions,\n): TransactionBackend {\n const txExecutionAdapter =\n options.executionAdapter ??\n createSqliteExecutionAdapter(options.db, {\n profileHints: options.profileHints,\n });\n\n return createSqliteOperationBackend({\n capabilities: options.capabilities,\n db: options.db,\n executionAdapter: txExecutionAdapter,\n operationStrategy: options.operationStrategy,\n tableNames: options.tableNames,\n fulltextStrategy: options.fulltextStrategy,\n ...(options.hasVectorEmbeddings === undefined\n ? {}\n : { hasVectorEmbeddings: options.hasVectorEmbeddings }),\n });\n}\n\n// Re-export schema utilities\nexport type { SqliteTableNames,SqliteTables } from \"./schema/sqlite\";\nexport { createSqliteTables, tables } from \"./schema/sqlite\";\n"]}
@@ -1,6 +1,6 @@
1
- import { createNodeRowMapper, SQLITE_ROW_MAPPER_CONFIG, createEdgeRowMapper, createUniqueRowMapper, createSchemaVersionRowMapper, tables2, SQLITE_CAPABILITIES, createSqliteOperationStrategy, generateSqliteDDL, createCommonOperationBackend, nowIso, compileQueryWithDialect, dropSqliteVectorIndex, createSqliteVectorIndex } from './chunk-UQVBVBVG.js';
1
+ import { createNodeRowMapper, SQLITE_ROW_MAPPER_CONFIG, createEdgeRowMapper, createUniqueRowMapper, createSchemaVersionRowMapper, tables2, SQLITE_CAPABILITIES, createSqliteOperationStrategy, generateSqliteDDL, createCommonOperationBackend, nowIso, compileQueryWithDialect, dropSqliteVectorIndex, createSqliteVectorIndex } from './chunk-5ZMMHUWR.js';
2
2
  import { ConfigurationError, BackendDisposedError } from './chunk-WFMTAEEN.js';
3
- import { fts5Strategy, buildFulltextCapabilities } from './chunk-4XNE2JG3.js';
3
+ import { fts5Strategy, buildFulltextCapabilities } from './chunk-753F33CV.js';
4
4
  import { getTableName, sql } from 'drizzle-orm';
5
5
 
6
6
  var DEFAULT_PREPARED_STATEMENT_CACHE_MAX = 256;
@@ -277,9 +277,23 @@ function createSqliteOperationBackend(options) {
277
277
  );
278
278
  }
279
279
  };
280
+ const vectorEmbeddingMethods = options.hasVectorEmbeddings ? {
281
+ async upsertEmbedding(params) {
282
+ const query = operationStrategy.buildUpsertEmbedding(
283
+ params,
284
+ nowIso()
285
+ );
286
+ await execRun(query);
287
+ },
288
+ async deleteEmbedding(params) {
289
+ const query = operationStrategy.buildDeleteEmbedding(params);
290
+ await execRun(query);
291
+ }
292
+ } : {};
280
293
  const operationBackend = {
281
294
  ...commonBackend,
282
295
  ...executeRawMethod,
296
+ ...vectorEmbeddingMethods,
283
297
  capabilities,
284
298
  dialect: "sqlite",
285
299
  tableNames,
@@ -393,6 +407,7 @@ function createSqliteBackend(db, options = {}) {
393
407
  fulltextStrategy
394
408
  );
395
409
  const serializedQueue = isSync ? createSerializedExecutionQueue() : void 0;
410
+ const hasVectorEmbeddings = options.hasVectorEmbeddings === true;
396
411
  const operations = createSqliteOperationBackend({
397
412
  capabilities,
398
413
  db,
@@ -400,6 +415,7 @@ function createSqliteBackend(db, options = {}) {
400
415
  operationStrategy,
401
416
  tableNames,
402
417
  fulltextStrategy,
418
+ hasVectorEmbeddings,
403
419
  ...serializedQueue === void 0 ? {} : { serializedQueue }
404
420
  });
405
421
  const backend = {
@@ -435,7 +451,8 @@ function createSqliteBackend(db, options = {}) {
435
451
  operationStrategy,
436
452
  profileHints: { isSync: true },
437
453
  tableNames,
438
- fulltextStrategy
454
+ fulltextStrategy,
455
+ hasVectorEmbeddings
439
456
  });
440
457
  db.run(sql`BEGIN`);
441
458
  try {
@@ -457,7 +474,8 @@ function createSqliteBackend(db, options = {}) {
457
474
  operationStrategy,
458
475
  profileHints: { isSync },
459
476
  tableNames,
460
- fulltextStrategy
477
+ fulltextStrategy,
478
+ hasVectorEmbeddings
461
479
  });
462
480
  return fn(txBackend);
463
481
  })
@@ -480,10 +498,11 @@ function createTransactionBackend(options) {
480
498
  executionAdapter: txExecutionAdapter,
481
499
  operationStrategy: options.operationStrategy,
482
500
  tableNames: options.tableNames,
483
- fulltextStrategy: options.fulltextStrategy
501
+ fulltextStrategy: options.fulltextStrategy,
502
+ ...options.hasVectorEmbeddings === void 0 ? {} : { hasVectorEmbeddings: options.hasVectorEmbeddings }
484
503
  });
485
504
  }
486
505
 
487
506
  export { createSqliteBackend };
488
- //# sourceMappingURL=chunk-NRNJ52AA.js.map
489
- //# sourceMappingURL=chunk-NRNJ52AA.js.map
507
+ //# sourceMappingURL=chunk-NSLTDXVH.js.map
508
+ //# sourceMappingURL=chunk-NSLTDXVH.js.map