@nicia-ai/typegraph 0.58.0 → 0.60.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 (179) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +15 -0
  3. package/dist/{atomic-mutation-program-CPcn0ZPu.d.ts → atomic-mutation-program-BNvJ13bq.d.ts} +1 -1
  4. package/dist/{atomic-mutation-program-AqOe51XD.d.cts → atomic-mutation-program-DOVE147J.d.cts} +1 -1
  5. package/dist/backend/drizzle/engine/index.cjs +8 -8
  6. package/dist/backend/drizzle/engine/index.d.cts +9 -9
  7. package/dist/backend/drizzle/engine/index.d.ts +9 -9
  8. package/dist/backend/drizzle/engine/index.js +3 -3
  9. package/dist/backend/drizzle/indexes.cjs +6 -6
  10. package/dist/backend/drizzle/indexes.d.cts +1 -1
  11. package/dist/backend/drizzle/indexes.d.ts +1 -1
  12. package/dist/backend/drizzle/indexes.js +2 -2
  13. package/dist/backend/index.d.cts +7 -7
  14. package/dist/backend/index.d.ts +7 -7
  15. package/dist/backend/postgres/index.cjs +17 -17
  16. package/dist/backend/postgres/index.d.cts +8 -8
  17. package/dist/backend/postgres/index.d.ts +8 -8
  18. package/dist/backend/postgres/index.js +3 -3
  19. package/dist/backend/postgres/pglite-store.cjs +1 -1
  20. package/dist/backend/postgres/pglite-store.d.cts +6 -6
  21. package/dist/backend/postgres/pglite-store.d.ts +6 -6
  22. package/dist/backend/postgres/pglite-store.js +1 -1
  23. package/dist/backend/postgres/pglite.cjs +5 -5
  24. package/dist/backend/postgres/pglite.d.cts +3 -3
  25. package/dist/backend/postgres/pglite.d.ts +3 -3
  26. package/dist/backend/postgres/pglite.js +4 -4
  27. package/dist/backend/sqlite/index.cjs +16 -16
  28. package/dist/backend/sqlite/index.d.cts +7 -7
  29. package/dist/backend/sqlite/index.d.ts +7 -7
  30. package/dist/backend/sqlite/index.js +3 -3
  31. package/dist/backend/sqlite/libsql.cjs +7 -7
  32. package/dist/backend/sqlite/libsql.d.cts +3 -3
  33. package/dist/backend/sqlite/libsql.d.ts +3 -3
  34. package/dist/backend/sqlite/libsql.js +3 -3
  35. package/dist/backend/sqlite/local-store.cjs +1 -1
  36. package/dist/backend/sqlite/local-store.d.cts +6 -6
  37. package/dist/backend/sqlite/local-store.d.ts +6 -6
  38. package/dist/backend/sqlite/local-store.js +1 -1
  39. package/dist/backend/sqlite/local.cjs +5 -5
  40. package/dist/backend/sqlite/local.d.cts +3 -3
  41. package/dist/backend/sqlite/local.d.ts +3 -3
  42. package/dist/backend/sqlite/local.js +4 -4
  43. package/dist/{chunk-7JUD57B4.js → chunk-2DKIJP2R.js} +1044 -84
  44. package/dist/chunk-2DKIJP2R.js.map +1 -0
  45. package/dist/{chunk-QIKO6DL5.js → chunk-2QNFFAMF.js} +3 -3
  46. package/dist/{chunk-QIKO6DL5.js.map → chunk-2QNFFAMF.js.map} +1 -1
  47. package/dist/{chunk-6BVZHDAZ.js → chunk-43DOTETB.js} +3 -3
  48. package/dist/{chunk-6BVZHDAZ.js.map → chunk-43DOTETB.js.map} +1 -1
  49. package/dist/{chunk-US3BLFWM.js → chunk-7GNPCBS2.js} +3 -3
  50. package/dist/{chunk-US3BLFWM.js.map → chunk-7GNPCBS2.js.map} +1 -1
  51. package/dist/{chunk-IV5W7LKW.cjs → chunk-A22XPVBQ.cjs} +2 -2
  52. package/dist/chunk-A22XPVBQ.cjs.map +1 -0
  53. package/dist/{chunk-CVO2ZPW5.js → chunk-B4P4DAW3.js} +4 -4
  54. package/dist/{chunk-CVO2ZPW5.js.map → chunk-B4P4DAW3.js.map} +1 -1
  55. package/dist/{chunk-FHFPUORN.cjs → chunk-CNFKFE5L.cjs} +1375 -415
  56. package/dist/chunk-CNFKFE5L.cjs.map +1 -0
  57. package/dist/{chunk-4MZQVVPX.cjs → chunk-D5CHUSW7.cjs} +33 -2
  58. package/dist/chunk-D5CHUSW7.cjs.map +1 -0
  59. package/dist/{chunk-TKEJR2UL.cjs → chunk-DWO6WZP5.cjs} +6 -6
  60. package/dist/{chunk-TKEJR2UL.cjs.map → chunk-DWO6WZP5.cjs.map} +1 -1
  61. package/dist/{chunk-GUMNJJFP.cjs → chunk-EHDLHPMK.cjs} +9 -9
  62. package/dist/{chunk-GUMNJJFP.cjs.map → chunk-EHDLHPMK.cjs.map} +1 -1
  63. package/dist/{chunk-DV24YZHG.js → chunk-FTDRMXIJ.js} +6 -6
  64. package/dist/{chunk-DV24YZHG.js.map → chunk-FTDRMXIJ.js.map} +1 -1
  65. package/dist/{chunk-BYBMDK6X.js → chunk-GYOQAV6R.js} +3 -3
  66. package/dist/{chunk-BYBMDK6X.js.map → chunk-GYOQAV6R.js.map} +1 -1
  67. package/dist/{chunk-GTW5YKFV.js → chunk-HCNC53MU.js} +3 -3
  68. package/dist/{chunk-GTW5YKFV.js.map → chunk-HCNC53MU.js.map} +1 -1
  69. package/dist/{chunk-M7TRJXFE.js → chunk-ILVXUOQY.js} +3 -3
  70. package/dist/{chunk-M7TRJXFE.js.map → chunk-ILVXUOQY.js.map} +1 -1
  71. package/dist/{chunk-FGKWXSHF.cjs → chunk-KGQVK2II.cjs} +40 -40
  72. package/dist/{chunk-FGKWXSHF.cjs.map → chunk-KGQVK2II.cjs.map} +1 -1
  73. package/dist/{chunk-BMATB57B.cjs → chunk-KW3ON5IU.cjs} +11 -11
  74. package/dist/{chunk-BMATB57B.cjs.map → chunk-KW3ON5IU.cjs.map} +1 -1
  75. package/dist/{chunk-GK62U3S5.js → chunk-LOFUF6L7.js} +3 -3
  76. package/dist/{chunk-GK62U3S5.js.map → chunk-LOFUF6L7.js.map} +1 -1
  77. package/dist/{chunk-BPYZUJX5.cjs → chunk-MTJAT6UO.cjs} +5 -5
  78. package/dist/{chunk-BPYZUJX5.cjs.map → chunk-MTJAT6UO.cjs.map} +1 -1
  79. package/dist/{chunk-YTYB5KCQ.js → chunk-OH7QRGPQ.js} +33 -2
  80. package/dist/chunk-OH7QRGPQ.js.map +1 -0
  81. package/dist/{chunk-U53HFE4L.cjs → chunk-OKA6H3B3.cjs} +22 -22
  82. package/dist/{chunk-U53HFE4L.cjs.map → chunk-OKA6H3B3.cjs.map} +1 -1
  83. package/dist/{chunk-QR6V2BXA.cjs → chunk-PTFO3JI5.cjs} +114 -114
  84. package/dist/{chunk-QR6V2BXA.cjs.map → chunk-PTFO3JI5.cjs.map} +1 -1
  85. package/dist/{chunk-C3CN2C2T.cjs → chunk-Q6ZVQWH7.cjs} +38 -38
  86. package/dist/{chunk-C3CN2C2T.cjs.map → chunk-Q6ZVQWH7.cjs.map} +1 -1
  87. package/dist/{chunk-WAG3NVD7.cjs → chunk-QBQ465OX.cjs} +12 -12
  88. package/dist/{chunk-WAG3NVD7.cjs.map → chunk-QBQ465OX.cjs.map} +1 -1
  89. package/dist/{chunk-CRROO6PK.cjs → chunk-QHP2BCBJ.cjs} +4 -4
  90. package/dist/{chunk-CRROO6PK.cjs.map → chunk-QHP2BCBJ.cjs.map} +1 -1
  91. package/dist/{chunk-HWWPL2YL.js → chunk-QWIR5533.js} +2 -2
  92. package/dist/chunk-QWIR5533.js.map +1 -0
  93. package/dist/{chunk-ZHLWPHNT.cjs → chunk-RJ3GVX73.cjs} +6 -6
  94. package/dist/{chunk-ZHLWPHNT.cjs.map → chunk-RJ3GVX73.cjs.map} +1 -1
  95. package/dist/{chunk-SYKR6MVR.cjs → chunk-T2M2S5YZ.cjs} +59 -59
  96. package/dist/{chunk-SYKR6MVR.cjs.map → chunk-T2M2S5YZ.cjs.map} +1 -1
  97. package/dist/{chunk-OESX3T5K.js → chunk-TNNDNSNH.js} +4 -4
  98. package/dist/{chunk-OESX3T5K.js.map → chunk-TNNDNSNH.js.map} +1 -1
  99. package/dist/{chunk-5C4OYYDD.js → chunk-UVQMUBZ6.js} +6 -6
  100. package/dist/{chunk-5C4OYYDD.js.map → chunk-UVQMUBZ6.js.map} +1 -1
  101. package/dist/{chunk-IV3FENV2.js → chunk-W6K6NSRT.js} +5 -5
  102. package/dist/{chunk-IV3FENV2.js.map → chunk-W6K6NSRT.js.map} +1 -1
  103. package/dist/core/index.d.cts +3 -3
  104. package/dist/core/index.d.ts +3 -3
  105. package/dist/{ddl-wlEdaCQK.d.cts → ddl-B9lzB8Zi.d.cts} +3 -3
  106. package/dist/{ddl-DkFrUTn_.d.ts → ddl-DuZWvxBb.d.ts} +3 -3
  107. package/dist/graph-extension/index.d.cts +2 -2
  108. package/dist/graph-extension/index.d.ts +2 -2
  109. package/dist/graph-merge/index.cjs +122 -122
  110. package/dist/graph-merge/index.d.cts +7 -6
  111. package/dist/graph-merge/index.d.ts +7 -6
  112. package/dist/graph-merge/index.js +10 -10
  113. package/dist/{graph-templates-B4gkXVqg.d.ts → graph-templates-ClBhrXiA.d.ts} +2 -2
  114. package/dist/{graph-templates-6zTU7bNe.d.cts → graph-templates-DfmKDARd.d.cts} +2 -2
  115. package/dist/index.cjs +73 -73
  116. package/dist/index.d.cts +10 -10
  117. package/dist/index.d.ts +10 -10
  118. package/dist/index.js +11 -11
  119. package/dist/indexes/index.cjs +8 -8
  120. package/dist/indexes/index.d.cts +4 -4
  121. package/dist/indexes/index.d.ts +4 -4
  122. package/dist/indexes/index.js +3 -3
  123. package/dist/{ingestion-import-target-im9wEB00.d.cts → ingestion-import-target-BSgJagqI.d.cts} +1 -1
  124. package/dist/{ingestion-import-target-SopMSm-T.d.ts → ingestion-import-target-PNw10V4T.d.ts} +1 -1
  125. package/dist/interchange/index.cjs +29 -29
  126. package/dist/interchange/index.d.cts +7 -6
  127. package/dist/interchange/index.d.ts +7 -6
  128. package/dist/interchange/index.js +6 -6
  129. package/dist/{local-store-impl-ARNXBBSF.cjs → local-store-impl-QGSRYFZF.cjs} +17 -17
  130. package/dist/{local-store-impl-ARNXBBSF.cjs.map → local-store-impl-QGSRYFZF.cjs.map} +1 -1
  131. package/dist/{local-store-impl-FTGRP2V7.js → local-store-impl-VEVK2VGA.js} +14 -14
  132. package/dist/{local-store-impl-FTGRP2V7.js.map → local-store-impl-VEVK2VGA.js.map} +1 -1
  133. package/dist/{pglite-store-impl-CNQZYRBC.cjs → pglite-store-impl-33CI3P3M.cjs} +17 -17
  134. package/dist/{pglite-store-impl-CNQZYRBC.cjs.map → pglite-store-impl-33CI3P3M.cjs.map} +1 -1
  135. package/dist/{pglite-store-impl-NULC2IHH.js → pglite-store-impl-RDPTOOP3.js} +14 -14
  136. package/dist/{pglite-store-impl-NULC2IHH.js.map → pglite-store-impl-RDPTOOP3.js.map} +1 -1
  137. package/dist/{postgres-Dd3TrFku.d.ts → postgres-2FBMdOE_.d.ts} +3 -3
  138. package/dist/{postgres-cLQPlKtp.d.cts → postgres-BR3AeXm9.d.ts} +1 -1
  139. package/dist/{postgres-CLPfTNYN.d.ts → postgres-CRatyTVL.d.cts} +1 -1
  140. package/dist/{postgres-B4VD_rVy.d.cts → postgres-lbZf0zyg.d.cts} +3 -3
  141. package/dist/{profile-Co154QBx.d.ts → profile-BipG05-8.d.ts} +2 -2
  142. package/dist/{profile-BqThShR_.d.cts → profile-DKtvxVyA.d.cts} +2 -2
  143. package/dist/profiler/index.d.cts +8 -7
  144. package/dist/profiler/index.d.ts +8 -7
  145. package/dist/provenance/index.cjs +15 -15
  146. package/dist/provenance/index.cjs.map +1 -1
  147. package/dist/provenance/index.d.cts +6 -5
  148. package/dist/provenance/index.d.ts +6 -5
  149. package/dist/provenance/index.js +2 -2
  150. package/dist/provenance/index.js.map +1 -1
  151. package/dist/{repair-validity-windows-BLoClfCq.d.cts → repair-validity-windows-BnSHFIsR.d.cts} +1 -1
  152. package/dist/{repair-validity-windows-C__28ckL.d.ts → repair-validity-windows-DfRb4gZm.d.ts} +1 -1
  153. package/dist/{resolve-DgFSIK99.d.ts → resolve-BbjZDYTw.d.ts} +1 -1
  154. package/dist/{resolve-DSUxNIqw.d.cts → resolve-mLksuBg2.d.cts} +1 -1
  155. package/dist/schema/index.cjs +36 -36
  156. package/dist/schema/index.d.cts +7 -7
  157. package/dist/schema/index.d.ts +7 -7
  158. package/dist/schema/index.js +6 -6
  159. package/dist/{searchable-CZKn12eY.d.cts → searchable-BEAN91Ce.d.cts} +1 -1
  160. package/dist/{searchable-CUWWphQI.d.ts → searchable-Bg2lMPRm.d.ts} +1 -1
  161. package/dist/{sqlite-mSd_eVk4.d.ts → sqlite-Cal3rHgZ.d.ts} +3 -3
  162. package/dist/{sqlite-RdH7w-ix.d.cts → sqlite-CvajLABd.d.cts} +1 -1
  163. package/dist/{sqlite-qXLIybR2.d.cts → sqlite-DQxKoWAH.d.cts} +3 -3
  164. package/dist/{sqlite-CoBmhiFd.d.ts → sqlite-jH5J-Jb8.d.ts} +1 -1
  165. package/dist/{store-BzmMsCcw.d.ts → store-B5WZ8E5m.d.ts} +313 -177
  166. package/dist/{store-CL6uTm_W.d.cts → store-DdhFpX53.d.cts} +313 -177
  167. package/dist/{types-BUoh7cc3.d.cts → types-BUA3dZ99.d.cts} +1 -1
  168. package/dist/{types-ClC0IFIS.d.ts → types-CPtb7KNf.d.ts} +1 -1
  169. package/dist/{types-Blq8PG_N.d.cts → types-Dky3sCFz.d.cts} +9 -0
  170. package/dist/{types-Blq8PG_N.d.ts → types-Dky3sCFz.d.ts} +9 -0
  171. package/dist/{where-61C-QoM8.d.ts → where-BReEkAiy.d.ts} +1 -1
  172. package/dist/{where-o3Me5iJx.d.cts → where-Cz11nPRu.d.cts} +1 -1
  173. package/package.json +2 -2
  174. package/dist/chunk-4MZQVVPX.cjs.map +0 -1
  175. package/dist/chunk-7JUD57B4.js.map +0 -1
  176. package/dist/chunk-FHFPUORN.cjs.map +0 -1
  177. package/dist/chunk-HWWPL2YL.js.map +0 -1
  178. package/dist/chunk-IV5W7LKW.cjs.map +0 -1
  179. package/dist/chunk-YTYB5KCQ.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkQCD5JKU4_cjs = require('./chunk-QCD5JKU4.cjs');
4
- var chunkSYKR6MVR_cjs = require('./chunk-SYKR6MVR.cjs');
4
+ var chunkT2M2S5YZ_cjs = require('./chunk-T2M2S5YZ.cjs');
5
5
  var chunkPKWAO4NC_cjs = require('./chunk-PKWAO4NC.cjs');
6
6
  var chunkY6M5BFRJ_cjs = require('./chunk-Y6M5BFRJ.cjs');
7
7
  var chunkEOLNL35G_cjs = require('./chunk-EOLNL35G.cjs');
@@ -16,26 +16,26 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
17
17
  var Database__default = /*#__PURE__*/_interopDefault(Database);
18
18
 
19
- var nodeRequire = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-WAG3NVD7.cjs', document.baseURI).href)));
19
+ var nodeRequire = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-QBQ465OX.cjs', document.baseURI).href)));
20
20
  function installLocalSqliteBaseSchema(sqlite, tables2, fulltextStrategy) {
21
- if (chunkSYKR6MVR_cjs.CURRENT_BASE_SCHEMA_VERSION !== 3) {
21
+ if (chunkT2M2S5YZ_cjs.CURRENT_BASE_SCHEMA_VERSION !== 3) {
22
22
  throw new chunkG7W67PZO_cjs.CompilerInvariantError(
23
23
  "The synchronous managed SQLite installation path only implements base-schema v1 through v3 adoption.",
24
- { currentVersion: chunkSYKR6MVR_cjs.CURRENT_BASE_SCHEMA_VERSION }
24
+ { currentVersion: chunkT2M2S5YZ_cjs.CURRENT_BASE_SCHEMA_VERSION }
25
25
  );
26
26
  }
27
- const installationSql = chunkSYKR6MVR_cjs.generateSqliteMigrationSQL(tables2, fulltextStrategy);
27
+ const installationSql = chunkT2M2S5YZ_cjs.generateSqliteMigrationSQL(tables2, fulltextStrategy);
28
28
  try {
29
29
  sqlite.exec(installationSql);
30
30
  } catch (error) {
31
31
  if (!chunkEOLNL35G_cjs.isSqliteMissingEdgeMatchIdentityColumnError(error)) throw error;
32
32
  const edgeTableName = drizzleOrm.getTableName(tables2.edges);
33
33
  for (let attempt = 0; attempt < 3; attempt += 1) {
34
- const rows = sqlite.prepare(`PRAGMA table_info(${chunkSYKR6MVR_cjs.quoteDdlIdentifier(edgeTableName)})`).all();
34
+ const rows = sqlite.prepare(`PRAGMA table_info(${chunkT2M2S5YZ_cjs.quoteDdlIdentifier(edgeTableName)})`).all();
35
35
  const columns = new Set(
36
36
  rows.flatMap((row) => typeof row.name === "string" ? [row.name] : [])
37
37
  );
38
- const adoptionSql = chunkSYKR6MVR_cjs.planSqliteEdgeMatchIdentityAdoption(
38
+ const adoptionSql = chunkT2M2S5YZ_cjs.planSqliteEdgeMatchIdentityAdoption(
39
39
  edgeTableName,
40
40
  columns
41
41
  );
@@ -162,16 +162,16 @@ function applyConnectionPragmas(sqlite, pragmas) {
162
162
  }
163
163
  }
164
164
  function createLocalSqliteBackend(options = {}) {
165
- chunkSYKR6MVR_cjs.assertNoLegacyTransactionCapability(options.capabilities);
165
+ chunkT2M2S5YZ_cjs.assertNoLegacyTransactionCapability(options.capabilities);
166
166
  const path = options.path ?? ":memory:";
167
- const tables2 = options.tables ?? chunkSYKR6MVR_cjs.tables2;
167
+ const tables2 = options.tables ?? chunkT2M2S5YZ_cjs.tables2;
168
168
  const sqlite = createDatabase(path);
169
169
  try {
170
170
  applyConnectionPragmas(sqlite, options.pragmas);
171
171
  const hasSqliteVec = tryLoadSqliteVec(sqlite);
172
172
  const db = betterSqlite3.drizzle(sqlite);
173
173
  installLocalSqliteBaseSchema(sqlite, tables2, options.fulltext);
174
- const backend = chunkSYKR6MVR_cjs.createSqliteBackend(db, {
174
+ const backend = chunkT2M2S5YZ_cjs.createSqliteBackend(db, {
175
175
  executionProfile: {
176
176
  isSync: true
177
177
  },
@@ -212,5 +212,5 @@ function tryLoadSqliteVec(sqlite) {
212
212
  }
213
213
 
214
214
  exports.createLocalSqliteBackend = createLocalSqliteBackend;
215
- //# sourceMappingURL=chunk-WAG3NVD7.cjs.map
216
- //# sourceMappingURL=chunk-WAG3NVD7.cjs.map
215
+ //# sourceMappingURL=chunk-QBQ465OX.cjs.map
216
+ //# sourceMappingURL=chunk-QBQ465OX.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/backend/sqlite/local.ts"],"names":["createRequire","tables","CURRENT_BASE_SCHEMA_VERSION","CompilerInvariantError","generateSqliteMigrationSQL","isSqliteMissingEdgeMatchIdentityColumnError","getTableName","quoteDdlIdentifier","planSqliteEdgeMatchIdentityAdoption","isSqliteDuplicateEdgeMatchIdentityColumnError","Database","ConfigurationError","DEFAULT_LOCAL_SQLITE_PRAGMAS","assertNoLegacyTransactionCapability","drizzle","createSqliteBackend","sqliteVecStrategy","wrapWithManagedClose","markBundledRootAutocommitEligible"],"mappings":"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","file":"chunk-WAG3NVD7.cjs","sourcesContent":["/**\n * Local SQLite backend using better-sqlite3.\n *\n * This module depends on the `better-sqlite3` native addon and should only\n * be imported in Node.js environments. For bundler-friendly SQLite DDL\n * generation and Drizzle backend creation, import from `@nicia-ai/typegraph/adapters/drizzle/sqlite`.\n *\n * @example In-memory database (default)\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database for persistent local development\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend({ path: \"./dev.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nimport { createRequire } from \"node:module\";\n\nimport Database from \"better-sqlite3\";\nimport { getTableName } from \"drizzle-orm\";\nimport {\n type BetterSQLite3Database,\n drizzle,\n} from \"drizzle-orm/better-sqlite3\";\n\nimport { CompilerInvariantError, ConfigurationError } from \"../../errors\";\nimport { type FulltextStrategy } from \"../../query/dialect/fulltext-strategy\";\nimport { sqliteVecStrategy } from \"../../query/dialect/vector/sqlite-vec-strategy\";\nimport {\n isSqliteDuplicateEdgeMatchIdentityColumnError,\n isSqliteMissingEdgeMatchIdentityColumnError,\n} from \"../../utils/sql-errors\";\nimport { markBundledRootAutocommitEligible } from \"../capabilities/autocommit-single-statement\";\nimport { wrapWithManagedClose } from \"../derive-backend\";\nimport { CURRENT_BASE_SCHEMA_VERSION } from \"../drizzle/base-schema\";\nimport {\n generateSqliteMigrationSQL,\n planSqliteEdgeMatchIdentityAdoption,\n quoteDdlIdentifier,\n} from \"../drizzle/ddl\";\nimport { type AnySqliteDatabase } from \"../drizzle/execution\";\nexport type { AnySqliteDatabase } from \"../drizzle/execution\";\nimport { assertNoLegacyTransactionCapability } from \"../capabilities/declarations\";\nimport {\n createSqliteBackend,\n type SqliteTables,\n tables as defaultTables,\n} from \"../drizzle/sqlite\";\nimport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\n\nexport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\nimport {\n type AdapterBackend,\n type BundledBackendCapabilityOverrides,\n} from \"../types\";\nexport type { BundledBackendCapabilityOverrides } from \"../types\";\nexport type {\n ContributionDiagnostic,\n ContributionDiagnosticState,\n ContributionRepairEntry,\n ContributionRepairResult,\n} from \"../types\";\n\nconst nodeRequire = createRequire(import.meta.url);\n\nfunction installLocalSqliteBaseSchema(\n sqlite: Database.Database,\n tables: SqliteTables,\n fulltextStrategy: FulltextStrategy | false | undefined,\n): void {\n // v2 (the fences relation) and v3 (the recorded-relations' and recorded\n // identity-assertions relation's `since_idx` indexes) need no adoption\n // logic beyond what `generateSqliteMigrationSQL` already emits: a\n // brand-new relation or index is fully covered by its own `CREATE TABLE\n // IF NOT EXISTS` / `CREATE INDEX IF NOT EXISTS`, on both a fresh database\n // and one that already has every OTHER base table or index. Only v1's\n // edge-match-identity `ADD COLUMN` migration — handled by the catch block\n // below — needed runtime introspection this synchronous path writes by\n // hand instead of running `BaseSchemaLifecycle`'s async state machine.\n if (CURRENT_BASE_SCHEMA_VERSION !== 3) {\n throw new CompilerInvariantError(\n \"The synchronous managed SQLite installation path only implements base-schema v1 through v3 adoption.\",\n { currentVersion: CURRENT_BASE_SCHEMA_VERSION },\n );\n }\n const installationSql = generateSqliteMigrationSQL(tables, fulltextStrategy);\n try {\n sqlite.exec(installationSql);\n } catch (error) {\n if (!isSqliteMissingEdgeMatchIdentityColumnError(error)) throw error;\n const edgeTableName = getTableName(tables.edges);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const rows = sqlite\n .prepare(`PRAGMA table_info(${quoteDdlIdentifier(edgeTableName)})`)\n .all() as readonly Readonly<{ name?: unknown }>[];\n const columns = new Set(\n rows.flatMap((row) => (typeof row.name === \"string\" ? [row.name] : [])),\n );\n const adoptionSql = planSqliteEdgeMatchIdentityAdoption(\n edgeTableName,\n columns,\n );\n try {\n sqlite.exec([...adoptionSql, installationSql].join(\"\\n\"));\n return;\n } catch (repairError) {\n if (\n attempt === 2 ||\n !isSqliteDuplicateEdgeMatchIdentityColumnError(repairError)\n ) {\n throw repairError;\n }\n }\n }\n throw new CompilerInvariantError(\n \"Local SQLite match-identity adoption exhausted its retry loop without returning or throwing.\",\n );\n }\n}\n\n// ============================================================\n// Native Addon Helpers\n// ============================================================\n\ntype NodeModuleVersionMismatch = Readonly<{\n compiled: number;\n required: number;\n}>;\n\nfunction getUnknownErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction parseNodeModuleVersionMismatchMessage(\n message: string,\n): NodeModuleVersionMismatch | undefined {\n const regexp =\n /NODE_MODULE_VERSION (?<compiled>\\d+)[\\s\\S]*?NODE_MODULE_VERSION (?<required>\\d+)/;\n const match = regexp.exec(message);\n if (!match?.groups) return undefined;\n\n const compiled = Number(match.groups[\"compiled\"]);\n const required = Number(match.groups[\"required\"]);\n\n if (!Number.isFinite(compiled) || !Number.isFinite(required))\n return undefined;\n\n return { compiled, required };\n}\n\nfunction createDatabase(path: string): Database.Database {\n try {\n return new Database(path);\n } catch (error) {\n const message = getUnknownErrorMessage(error);\n const mismatch = parseNodeModuleVersionMismatchMessage(message);\n if (!mismatch) throw error;\n\n throw new ConfigurationError(\n [\n \"Failed to load better-sqlite3 native addon.\",\n `It was compiled for NODE_MODULE_VERSION ${mismatch.compiled}, but this Node.js runtime requires ${mismatch.required}.`,\n \"This usually happens after switching Node versions without rebuilding native dependencies.\",\n \"Rebuild with: pnpm rebuild better-sqlite3 (or npm rebuild better-sqlite3).\",\n ].join(\" \"),\n {\n nodeVersion: process.version,\n nodeModuleVersion: process.versions.modules,\n compiledNodeModuleVersion: mismatch.compiled,\n requiredNodeModuleVersion: mismatch.required,\n },\n { cause: error },\n );\n }\n}\n\n// ============================================================\n// Types\n// ============================================================\n\nconst LOCAL_SQLITE_JOURNAL_MODES: readonly LocalSqliteJournalMode[] = [\n \"wal\",\n \"delete\",\n \"truncate\",\n \"persist\",\n \"memory\",\n \"off\",\n];\n\nconst LOCAL_SQLITE_SYNCHRONOUS_MODES: readonly LocalSqliteSynchronousMode[] = [\n \"off\",\n \"normal\",\n \"full\",\n \"extra\",\n];\n\nconst SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES = 2_147_483_647;\n\nfunction applyConnectionPragmas(\n sqlite: Database.Database,\n pragmas: LocalSqlitePragmaOptions | false | undefined,\n): void {\n if (pragmas === false) return;\n const resolved: Required<LocalSqlitePragmaOptions> = {\n ...DEFAULT_LOCAL_SQLITE_PRAGMAS,\n ...pragmas,\n };\n\n // Runtime guards mirror the compile-time unions: pragma values are spliced\n // into pragma statements, so reject anything outside the allowlists rather\n // than forwarding it to SQLite.\n if (!LOCAL_SQLITE_JOURNAL_MODES.includes(resolved.journalMode)) {\n throw new ConfigurationError(\n `Invalid journalMode pragma: ${resolved.journalMode}. ` +\n `Expected one of: ${LOCAL_SQLITE_JOURNAL_MODES.join(\", \")}.`,\n { journalMode: resolved.journalMode },\n );\n }\n if (!LOCAL_SQLITE_SYNCHRONOUS_MODES.includes(resolved.synchronous)) {\n throw new ConfigurationError(\n `Invalid synchronous pragma: ${resolved.synchronous}. ` +\n `Expected one of: ${LOCAL_SQLITE_SYNCHRONOUS_MODES.join(\", \")}.`,\n { synchronous: resolved.synchronous },\n );\n }\n if (\n !Number.isSafeInteger(resolved.busyTimeoutMs) ||\n resolved.busyTimeoutMs < 0\n ) {\n throw new ConfigurationError(\n `Invalid busyTimeoutMs pragma: ${String(resolved.busyTimeoutMs)}. ` +\n \"Expected a non-negative integer number of milliseconds.\",\n { busyTimeoutMs: resolved.busyTimeoutMs },\n );\n }\n if (\n resolved.cacheSizeKib !== undefined &&\n (!Number.isSafeInteger(resolved.cacheSizeKib) || resolved.cacheSizeKib >= 0)\n ) {\n throw new ConfigurationError(\n `Invalid cacheSizeKib pragma: ${String(resolved.cacheSizeKib)}. ` +\n \"Expected a negative safe integer — SQLite's own cache_size pragma \" +\n \"interprets a positive value as a page count, not KiB, so a caller \" +\n 'who passes e.g. 131072 meaning \"131072 KiB\" silently gets ' +\n \"131072 pages (~512MiB at the default 4KiB page size) instead.\",\n { cacheSizeKib: resolved.cacheSizeKib },\n );\n }\n if (\n resolved.mmapSizeBytes !== undefined &&\n (!Number.isSafeInteger(resolved.mmapSizeBytes) ||\n resolved.mmapSizeBytes < 0)\n ) {\n throw new ConfigurationError(\n `Invalid mmapSizeBytes pragma: ${String(resolved.mmapSizeBytes)}. ` +\n \"Expected a non-negative safe integer number of bytes.\",\n { mmapSizeBytes: resolved.mmapSizeBytes },\n );\n }\n if (\n resolved.walAutocheckpointPages !== undefined &&\n (!Number.isSafeInteger(resolved.walAutocheckpointPages) ||\n resolved.walAutocheckpointPages < 0 ||\n resolved.walAutocheckpointPages > SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES)\n ) {\n throw new ConfigurationError(\n `Invalid walAutocheckpointPages pragma: ${String(resolved.walAutocheckpointPages)}. ` +\n `Expected an integer between 0 and ${SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES} ` +\n \"WAL pages (0 disables automatic checkpointing entirely).\",\n { walAutocheckpointPages: resolved.walAutocheckpointPages },\n );\n }\n\n // \":memory:\" databases always journal in memory; SQLite answers the WAL\n // request with \"memory\" instead of erroring, so no special-casing needed.\n sqlite.pragma(`journal_mode = ${resolved.journalMode}`);\n sqlite.pragma(`synchronous = ${resolved.synchronous}`);\n sqlite.pragma(`busy_timeout = ${resolved.busyTimeoutMs}`);\n if (resolved.cacheSizeKib !== undefined) {\n sqlite.pragma(`cache_size = ${resolved.cacheSizeKib}`);\n }\n if (resolved.mmapSizeBytes !== undefined) {\n sqlite.pragma(`mmap_size = ${resolved.mmapSizeBytes}`);\n }\n if (resolved.walAutocheckpointPages !== undefined) {\n sqlite.pragma(`wal_autocheckpoint = ${resolved.walAutocheckpointPages}`);\n }\n}\n\n/**\n * Options for creating a local SQLite backend.\n */\nexport type LocalSqliteBackendOptions = Readonly<{\n /**\n * Path to the SQLite database file.\n * Defaults to \":memory:\" for an in-memory database.\n */\n path?: string;\n\n /**\n * Connection pragmas applied at open. Defaults to\n * {@link DEFAULT_LOCAL_SQLITE_PRAGMAS} (WAL, `synchronous=NORMAL`, 5s busy\n * timeout, and SQLite's own tiny built-in page cache / disabled mmap\n * left untouched). Individual values merge over the defaults; pass\n * `false` to skip pragma configuration entirely and keep the driver\n * defaults (rollback journal, `synchronous=FULL`, and better-sqlite3's\n * own 5s busy timeout from its `timeout` constructor option). Set\n * `cacheSizeKib`/`mmapSizeBytes` explicitly once a database's working\n * set is known to exceed SQLite's 2MiB default cache — otherwise every\n * query pays a fresh disk read per page past that tiny working set. Set\n * `walAutocheckpointPages` explicitly for a bulk-insert-heavy workload —\n * SQLite's own default checkpoints every ~4MiB of WAL growth, which gets\n * more expensive as the database file grows over a large load.\n */\n pragmas?: LocalSqlitePragmaOptions | false;\n\n /**\n * Custom table definitions.\n * Defaults to standard TypeGraph table names.\n */\n tables?: SqliteTables;\n\n /**\n * Override the fulltext strategy. Defaults to `fts5Strategy` (SQLite's\n * built-in FTS5 virtual table). Pass `false` to disable fulltext support\n * entirely — the backend then advertises no `capabilities.fulltext` and\n * omits the fulltext CRUD/search methods, and the managed installation\n * never creates the fulltext table. Forwarded to both the installation\n * DDL and `createSqliteBackend`.\n */\n fulltext?: FulltextStrategy | false;\n\n /**\n * Override specific backend capabilities — e.g. to simulate an engine-level\n * gap like missing SQL window functions in tests. Forwarded to\n * createSqliteBackend.\n */\n capabilities?: BundledBackendCapabilityOverrides;\n}>;\n\n/**\n * Result of creating a local SQLite backend.\n */\nexport type LocalSqliteBackendResult = Readonly<{\n /**\n * The GraphBackend instance for use with createStore.\n */\n backend: AdapterBackend<AnySqliteDatabase>;\n\n /**\n * The underlying Drizzle database instance.\n * Useful for direct SQL access or cleanup.\n */\n db: BetterSQLite3Database;\n}>;\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a SQLite backend with minimal configuration.\n *\n * This is a convenience function for local development and testing.\n * It handles database creation, schema migration, and backend setup.\n *\n * For production deployments or custom configurations, use createSqliteBackend\n * directly with your own Drizzle database instance.\n *\n * @param options - Configuration options\n * @returns Backend and database instances\n *\n * @example In-memory database (default)\n * ```typescript\n * const { backend } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database\n * ```typescript\n * const { backend, db } = createLocalSqliteBackend({ path: \"./data.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nexport function createLocalSqliteBackend(\n options: LocalSqliteBackendOptions = {},\n): LocalSqliteBackendResult {\n assertNoLegacyTransactionCapability(options.capabilities);\n const path = options.path ?? \":memory:\";\n const tables = options.tables ?? defaultTables;\n\n const sqlite = createDatabase(path);\n try {\n applyConnectionPragmas(sqlite, options.pragmas);\n\n // Best-effort: load sqlite-vec so embedding fields are persisted to\n // per-`(kind, field)` `vec0` storage. Without it, nodes with\n // `embedding()` fields validate and insert but their vectors are silently\n // dropped. When the user has installed sqlite-vec as a peer dep we load\n // it and wire the strategy; otherwise we proceed without vector support.\n const hasSqliteVec = tryLoadSqliteVec(sqlite);\n\n const db = drizzle(sqlite);\n\n // The managed factory owns a complete fresh installation, including the\n // deployment-wide base-schema marker consumed by verified/runtime-only\n // entrypoints. Raw generateSqliteDDL intentionally omits that marker.\n installLocalSqliteBaseSchema(sqlite, tables, options.fulltext);\n\n const backend = createSqliteBackend(db, {\n executionProfile: {\n isSync: true,\n },\n tables,\n ...(hasSqliteVec ? { vector: sqliteVecStrategy } : {}),\n ...(options.fulltext === undefined ? {} : { fulltext: options.fulltext }),\n capabilities: {\n ...options.capabilities,\n graphAnalytics: {\n supported:\n options.capabilities?.graphAnalytics?.supported ??\n options.capabilities?.execution?.interactiveTransactions !== false,\n mathFunctions:\n options.capabilities?.graphAnalytics?.mathFunctions ?? true,\n },\n },\n });\n const managedBackend = wrapWithManagedClose(backend, () => {\n sqlite.close();\n });\n\n return { backend: markBundledRootAutocommitEligible(managedBackend), db };\n } catch (error) {\n try {\n sqlite.close();\n } catch {\n // Preserve the provisioning error; a cleanup failure is secondary.\n }\n throw error;\n }\n}\n\nfunction tryLoadSqliteVec(sqlite: Database.Database): boolean {\n try {\n // `sqlite-vec` is an optional peer dep; resolved via createRequire so\n // bundlers don't mark it as a hard import. Node resolves the package\n // only when it's actually installed.\n const module_: unknown = nodeRequire(\"sqlite-vec\");\n if (\n typeof module_ === \"object\" &&\n module_ !== null &&\n \"load\" in module_ &&\n typeof module_.load === \"function\"\n ) {\n (module_ as { load: (db: Database.Database) => void }).load(sqlite);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\nexport type { GraphIdentityConfig } from \"../../core/define-graph\";\n"]}
1
+ {"version":3,"sources":["../src/backend/sqlite/local.ts"],"names":["createRequire","tables","CURRENT_BASE_SCHEMA_VERSION","CompilerInvariantError","generateSqliteMigrationSQL","isSqliteMissingEdgeMatchIdentityColumnError","getTableName","quoteDdlIdentifier","planSqliteEdgeMatchIdentityAdoption","isSqliteDuplicateEdgeMatchIdentityColumnError","Database","ConfigurationError","DEFAULT_LOCAL_SQLITE_PRAGMAS","assertNoLegacyTransactionCapability","drizzle","createSqliteBackend","sqliteVecStrategy","wrapWithManagedClose","markBundledRootAutocommitEligible"],"mappings":"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","file":"chunk-QBQ465OX.cjs","sourcesContent":["/**\n * Local SQLite backend using better-sqlite3.\n *\n * This module depends on the `better-sqlite3` native addon and should only\n * be imported in Node.js environments. For bundler-friendly SQLite DDL\n * generation and Drizzle backend creation, import from `@nicia-ai/typegraph/adapters/drizzle/sqlite`.\n *\n * @example In-memory database (default)\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database for persistent local development\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend({ path: \"./dev.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nimport { createRequire } from \"node:module\";\n\nimport Database from \"better-sqlite3\";\nimport { getTableName } from \"drizzle-orm\";\nimport {\n type BetterSQLite3Database,\n drizzle,\n} from \"drizzle-orm/better-sqlite3\";\n\nimport { CompilerInvariantError, ConfigurationError } from \"../../errors\";\nimport { type FulltextStrategy } from \"../../query/dialect/fulltext-strategy\";\nimport { sqliteVecStrategy } from \"../../query/dialect/vector/sqlite-vec-strategy\";\nimport {\n isSqliteDuplicateEdgeMatchIdentityColumnError,\n isSqliteMissingEdgeMatchIdentityColumnError,\n} from \"../../utils/sql-errors\";\nimport { markBundledRootAutocommitEligible } from \"../capabilities/autocommit-single-statement\";\nimport { wrapWithManagedClose } from \"../derive-backend\";\nimport { CURRENT_BASE_SCHEMA_VERSION } from \"../drizzle/base-schema\";\nimport {\n generateSqliteMigrationSQL,\n planSqliteEdgeMatchIdentityAdoption,\n quoteDdlIdentifier,\n} from \"../drizzle/ddl\";\nimport { type AnySqliteDatabase } from \"../drizzle/execution\";\nexport type { AnySqliteDatabase } from \"../drizzle/execution\";\nimport { assertNoLegacyTransactionCapability } from \"../capabilities/declarations\";\nimport {\n createSqliteBackend,\n type SqliteTables,\n tables as defaultTables,\n} from \"../drizzle/sqlite\";\nimport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\n\nexport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\nimport {\n type AdapterBackend,\n type BundledBackendCapabilityOverrides,\n} from \"../types\";\nexport type { BundledBackendCapabilityOverrides } from \"../types\";\nexport type {\n ContributionDiagnostic,\n ContributionDiagnosticState,\n ContributionRepairEntry,\n ContributionRepairResult,\n} from \"../types\";\n\nconst nodeRequire = createRequire(import.meta.url);\n\nfunction installLocalSqliteBaseSchema(\n sqlite: Database.Database,\n tables: SqliteTables,\n fulltextStrategy: FulltextStrategy | false | undefined,\n): void {\n // v2 (the fences relation) and v3 (the recorded-relations' and recorded\n // identity-assertions relation's `since_idx` indexes) need no adoption\n // logic beyond what `generateSqliteMigrationSQL` already emits: a\n // brand-new relation or index is fully covered by its own `CREATE TABLE\n // IF NOT EXISTS` / `CREATE INDEX IF NOT EXISTS`, on both a fresh database\n // and one that already has every OTHER base table or index. Only v1's\n // edge-match-identity `ADD COLUMN` migration — handled by the catch block\n // below — needed runtime introspection this synchronous path writes by\n // hand instead of running `BaseSchemaLifecycle`'s async state machine.\n if (CURRENT_BASE_SCHEMA_VERSION !== 3) {\n throw new CompilerInvariantError(\n \"The synchronous managed SQLite installation path only implements base-schema v1 through v3 adoption.\",\n { currentVersion: CURRENT_BASE_SCHEMA_VERSION },\n );\n }\n const installationSql = generateSqliteMigrationSQL(tables, fulltextStrategy);\n try {\n sqlite.exec(installationSql);\n } catch (error) {\n if (!isSqliteMissingEdgeMatchIdentityColumnError(error)) throw error;\n const edgeTableName = getTableName(tables.edges);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const rows = sqlite\n .prepare(`PRAGMA table_info(${quoteDdlIdentifier(edgeTableName)})`)\n .all() as readonly Readonly<{ name?: unknown }>[];\n const columns = new Set(\n rows.flatMap((row) => (typeof row.name === \"string\" ? [row.name] : [])),\n );\n const adoptionSql = planSqliteEdgeMatchIdentityAdoption(\n edgeTableName,\n columns,\n );\n try {\n sqlite.exec([...adoptionSql, installationSql].join(\"\\n\"));\n return;\n } catch (repairError) {\n if (\n attempt === 2 ||\n !isSqliteDuplicateEdgeMatchIdentityColumnError(repairError)\n ) {\n throw repairError;\n }\n }\n }\n throw new CompilerInvariantError(\n \"Local SQLite match-identity adoption exhausted its retry loop without returning or throwing.\",\n );\n }\n}\n\n// ============================================================\n// Native Addon Helpers\n// ============================================================\n\ntype NodeModuleVersionMismatch = Readonly<{\n compiled: number;\n required: number;\n}>;\n\nfunction getUnknownErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction parseNodeModuleVersionMismatchMessage(\n message: string,\n): NodeModuleVersionMismatch | undefined {\n const regexp =\n /NODE_MODULE_VERSION (?<compiled>\\d+)[\\s\\S]*?NODE_MODULE_VERSION (?<required>\\d+)/;\n const match = regexp.exec(message);\n if (!match?.groups) return undefined;\n\n const compiled = Number(match.groups[\"compiled\"]);\n const required = Number(match.groups[\"required\"]);\n\n if (!Number.isFinite(compiled) || !Number.isFinite(required))\n return undefined;\n\n return { compiled, required };\n}\n\nfunction createDatabase(path: string): Database.Database {\n try {\n return new Database(path);\n } catch (error) {\n const message = getUnknownErrorMessage(error);\n const mismatch = parseNodeModuleVersionMismatchMessage(message);\n if (!mismatch) throw error;\n\n throw new ConfigurationError(\n [\n \"Failed to load better-sqlite3 native addon.\",\n `It was compiled for NODE_MODULE_VERSION ${mismatch.compiled}, but this Node.js runtime requires ${mismatch.required}.`,\n \"This usually happens after switching Node versions without rebuilding native dependencies.\",\n \"Rebuild with: pnpm rebuild better-sqlite3 (or npm rebuild better-sqlite3).\",\n ].join(\" \"),\n {\n nodeVersion: process.version,\n nodeModuleVersion: process.versions.modules,\n compiledNodeModuleVersion: mismatch.compiled,\n requiredNodeModuleVersion: mismatch.required,\n },\n { cause: error },\n );\n }\n}\n\n// ============================================================\n// Types\n// ============================================================\n\nconst LOCAL_SQLITE_JOURNAL_MODES: readonly LocalSqliteJournalMode[] = [\n \"wal\",\n \"delete\",\n \"truncate\",\n \"persist\",\n \"memory\",\n \"off\",\n];\n\nconst LOCAL_SQLITE_SYNCHRONOUS_MODES: readonly LocalSqliteSynchronousMode[] = [\n \"off\",\n \"normal\",\n \"full\",\n \"extra\",\n];\n\nconst SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES = 2_147_483_647;\n\nfunction applyConnectionPragmas(\n sqlite: Database.Database,\n pragmas: LocalSqlitePragmaOptions | false | undefined,\n): void {\n if (pragmas === false) return;\n const resolved: Required<LocalSqlitePragmaOptions> = {\n ...DEFAULT_LOCAL_SQLITE_PRAGMAS,\n ...pragmas,\n };\n\n // Runtime guards mirror the compile-time unions: pragma values are spliced\n // into pragma statements, so reject anything outside the allowlists rather\n // than forwarding it to SQLite.\n if (!LOCAL_SQLITE_JOURNAL_MODES.includes(resolved.journalMode)) {\n throw new ConfigurationError(\n `Invalid journalMode pragma: ${resolved.journalMode}. ` +\n `Expected one of: ${LOCAL_SQLITE_JOURNAL_MODES.join(\", \")}.`,\n { journalMode: resolved.journalMode },\n );\n }\n if (!LOCAL_SQLITE_SYNCHRONOUS_MODES.includes(resolved.synchronous)) {\n throw new ConfigurationError(\n `Invalid synchronous pragma: ${resolved.synchronous}. ` +\n `Expected one of: ${LOCAL_SQLITE_SYNCHRONOUS_MODES.join(\", \")}.`,\n { synchronous: resolved.synchronous },\n );\n }\n if (\n !Number.isSafeInteger(resolved.busyTimeoutMs) ||\n resolved.busyTimeoutMs < 0\n ) {\n throw new ConfigurationError(\n `Invalid busyTimeoutMs pragma: ${String(resolved.busyTimeoutMs)}. ` +\n \"Expected a non-negative integer number of milliseconds.\",\n { busyTimeoutMs: resolved.busyTimeoutMs },\n );\n }\n if (\n resolved.cacheSizeKib !== undefined &&\n (!Number.isSafeInteger(resolved.cacheSizeKib) || resolved.cacheSizeKib >= 0)\n ) {\n throw new ConfigurationError(\n `Invalid cacheSizeKib pragma: ${String(resolved.cacheSizeKib)}. ` +\n \"Expected a negative safe integer — SQLite's own cache_size pragma \" +\n \"interprets a positive value as a page count, not KiB, so a caller \" +\n 'who passes e.g. 131072 meaning \"131072 KiB\" silently gets ' +\n \"131072 pages (~512MiB at the default 4KiB page size) instead.\",\n { cacheSizeKib: resolved.cacheSizeKib },\n );\n }\n if (\n resolved.mmapSizeBytes !== undefined &&\n (!Number.isSafeInteger(resolved.mmapSizeBytes) ||\n resolved.mmapSizeBytes < 0)\n ) {\n throw new ConfigurationError(\n `Invalid mmapSizeBytes pragma: ${String(resolved.mmapSizeBytes)}. ` +\n \"Expected a non-negative safe integer number of bytes.\",\n { mmapSizeBytes: resolved.mmapSizeBytes },\n );\n }\n if (\n resolved.walAutocheckpointPages !== undefined &&\n (!Number.isSafeInteger(resolved.walAutocheckpointPages) ||\n resolved.walAutocheckpointPages < 0 ||\n resolved.walAutocheckpointPages > SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES)\n ) {\n throw new ConfigurationError(\n `Invalid walAutocheckpointPages pragma: ${String(resolved.walAutocheckpointPages)}. ` +\n `Expected an integer between 0 and ${SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES} ` +\n \"WAL pages (0 disables automatic checkpointing entirely).\",\n { walAutocheckpointPages: resolved.walAutocheckpointPages },\n );\n }\n\n // \":memory:\" databases always journal in memory; SQLite answers the WAL\n // request with \"memory\" instead of erroring, so no special-casing needed.\n sqlite.pragma(`journal_mode = ${resolved.journalMode}`);\n sqlite.pragma(`synchronous = ${resolved.synchronous}`);\n sqlite.pragma(`busy_timeout = ${resolved.busyTimeoutMs}`);\n if (resolved.cacheSizeKib !== undefined) {\n sqlite.pragma(`cache_size = ${resolved.cacheSizeKib}`);\n }\n if (resolved.mmapSizeBytes !== undefined) {\n sqlite.pragma(`mmap_size = ${resolved.mmapSizeBytes}`);\n }\n if (resolved.walAutocheckpointPages !== undefined) {\n sqlite.pragma(`wal_autocheckpoint = ${resolved.walAutocheckpointPages}`);\n }\n}\n\n/**\n * Options for creating a local SQLite backend.\n */\nexport type LocalSqliteBackendOptions = Readonly<{\n /**\n * Path to the SQLite database file.\n * Defaults to \":memory:\" for an in-memory database.\n */\n path?: string;\n\n /**\n * Connection pragmas applied at open. Defaults to\n * {@link DEFAULT_LOCAL_SQLITE_PRAGMAS} (WAL, `synchronous=NORMAL`, 5s busy\n * timeout, and SQLite's own tiny built-in page cache / disabled mmap\n * left untouched). Individual values merge over the defaults; pass\n * `false` to skip pragma configuration entirely and keep the driver\n * defaults (rollback journal, `synchronous=FULL`, and better-sqlite3's\n * own 5s busy timeout from its `timeout` constructor option). Set\n * `cacheSizeKib`/`mmapSizeBytes` explicitly once a database's working\n * set is known to exceed SQLite's 2MiB default cache — otherwise every\n * query pays a fresh disk read per page past that tiny working set. Set\n * `walAutocheckpointPages` explicitly for a bulk-insert-heavy workload —\n * SQLite's own default checkpoints every ~4MiB of WAL growth, which gets\n * more expensive as the database file grows over a large load.\n */\n pragmas?: LocalSqlitePragmaOptions | false;\n\n /**\n * Custom table definitions.\n * Defaults to standard TypeGraph table names.\n */\n tables?: SqliteTables;\n\n /**\n * Override the fulltext strategy. Defaults to `fts5Strategy` (SQLite's\n * built-in FTS5 virtual table). Pass `false` to disable fulltext support\n * entirely — the backend then advertises no `capabilities.fulltext` and\n * omits the fulltext CRUD/search methods, and the managed installation\n * never creates the fulltext table. Forwarded to both the installation\n * DDL and `createSqliteBackend`.\n */\n fulltext?: FulltextStrategy | false;\n\n /**\n * Override specific backend capabilities — e.g. to simulate an engine-level\n * gap like missing SQL window functions in tests. Forwarded to\n * createSqliteBackend.\n */\n capabilities?: BundledBackendCapabilityOverrides;\n}>;\n\n/**\n * Result of creating a local SQLite backend.\n */\nexport type LocalSqliteBackendResult = Readonly<{\n /**\n * The GraphBackend instance for use with createStore.\n */\n backend: AdapterBackend<AnySqliteDatabase>;\n\n /**\n * The underlying Drizzle database instance.\n * Useful for direct SQL access or cleanup.\n */\n db: BetterSQLite3Database;\n}>;\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a SQLite backend with minimal configuration.\n *\n * This is a convenience function for local development and testing.\n * It handles database creation, schema migration, and backend setup.\n *\n * For production deployments or custom configurations, use createSqliteBackend\n * directly with your own Drizzle database instance.\n *\n * @param options - Configuration options\n * @returns Backend and database instances\n *\n * @example In-memory database (default)\n * ```typescript\n * const { backend } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database\n * ```typescript\n * const { backend, db } = createLocalSqliteBackend({ path: \"./data.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nexport function createLocalSqliteBackend(\n options: LocalSqliteBackendOptions = {},\n): LocalSqliteBackendResult {\n assertNoLegacyTransactionCapability(options.capabilities);\n const path = options.path ?? \":memory:\";\n const tables = options.tables ?? defaultTables;\n\n const sqlite = createDatabase(path);\n try {\n applyConnectionPragmas(sqlite, options.pragmas);\n\n // Best-effort: load sqlite-vec so embedding fields are persisted to\n // per-`(kind, field)` `vec0` storage. Without it, nodes with\n // `embedding()` fields validate and insert but their vectors are silently\n // dropped. When the user has installed sqlite-vec as a peer dep we load\n // it and wire the strategy; otherwise we proceed without vector support.\n const hasSqliteVec = tryLoadSqliteVec(sqlite);\n\n const db = drizzle(sqlite);\n\n // The managed factory owns a complete fresh installation, including the\n // deployment-wide base-schema marker consumed by verified/runtime-only\n // entrypoints. Raw generateSqliteDDL intentionally omits that marker.\n installLocalSqliteBaseSchema(sqlite, tables, options.fulltext);\n\n const backend = createSqliteBackend(db, {\n executionProfile: {\n isSync: true,\n },\n tables,\n ...(hasSqliteVec ? { vector: sqliteVecStrategy } : {}),\n ...(options.fulltext === undefined ? {} : { fulltext: options.fulltext }),\n capabilities: {\n ...options.capabilities,\n graphAnalytics: {\n supported:\n options.capabilities?.graphAnalytics?.supported ??\n options.capabilities?.execution?.interactiveTransactions !== false,\n mathFunctions:\n options.capabilities?.graphAnalytics?.mathFunctions ?? true,\n },\n },\n });\n const managedBackend = wrapWithManagedClose(backend, () => {\n sqlite.close();\n });\n\n return { backend: markBundledRootAutocommitEligible(managedBackend), db };\n } catch (error) {\n try {\n sqlite.close();\n } catch {\n // Preserve the provisioning error; a cleanup failure is secondary.\n }\n throw error;\n }\n}\n\nfunction tryLoadSqliteVec(sqlite: Database.Database): boolean {\n try {\n // `sqlite-vec` is an optional peer dep; resolved via createRequire so\n // bundlers don't mark it as a hard import. Node resolves the package\n // only when it's actually installed.\n const module_: unknown = nodeRequire(\"sqlite-vec\");\n if (\n typeof module_ === \"object\" &&\n module_ !== null &&\n \"load\" in module_ &&\n typeof module_.load === \"function\"\n ) {\n (module_ as { load: (db: Database.Database) => void }).load(sqlite);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\nexport type { GraphIdentityConfig } from \"../../core/define-graph\";\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkZY4GXIVN_cjs = require('./chunk-ZY4GXIVN.cjs');
4
- var chunk4MZQVVPX_cjs = require('./chunk-4MZQVVPX.cjs');
4
+ var chunkD5CHUSW7_cjs = require('./chunk-D5CHUSW7.cjs');
5
5
  var chunkNAUA4PW5_cjs = require('./chunk-NAUA4PW5.cjs');
6
6
  var chunkUSBHGGZV_cjs = require('./chunk-USBHGGZV.cjs');
7
7
  var chunkOJCSA7LX_cjs = require('./chunk-OJCSA7LX.cjs');
@@ -110,7 +110,7 @@ function normalizeKeySystemColumnsOrThrow(columns, scope, unique) {
110
110
  }
111
111
  }
112
112
  assertUnique(columns, "keySystemColumns");
113
- const scopeColumns = new Set(chunk4MZQVVPX_cjs.getNodeScopeColumns(scope));
113
+ const scopeColumns = new Set(chunkD5CHUSW7_cjs.getNodeScopeColumns(scope));
114
114
  for (const column of columns) {
115
115
  if (scopeColumns.has(column)) {
116
116
  throw new Error(
@@ -620,5 +620,5 @@ exports.EDGE_META_KEYS = EDGE_META_KEYS;
620
620
  exports.NODE_META_KEYS = NODE_META_KEYS;
621
621
  exports.defineEdgeIndex = defineEdgeIndex;
622
622
  exports.defineNodeIndex = defineNodeIndex;
623
- //# sourceMappingURL=chunk-CRROO6PK.cjs.map
624
- //# sourceMappingURL=chunk-CRROO6PK.cjs.map
623
+ //# sourceMappingURL=chunk-QHP2BCBJ.cjs.map
624
+ //# sourceMappingURL=chunk-QHP2BCBJ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/system-fields.ts","../src/indexes/define-index.ts"],"names":["createSchemaIntrospector","getNodeScopeColumns","hasOwnKey","isInteropProbeKey","jsonPointer","normalizeJsonPointer","parseJsonPointer","resolveFieldTypeInfoAtJsonPointer","fnv1aBase36","MAX_PG_IDENTIFIER_LENGTH","TRUNCATED_IDENTIFIER_MAX_LENGTH","IDENTIFIER_COMPONENT_MAX_LENGTH"],"mappings":"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","file":"chunk-CRROO6PK.cjs","sourcesContent":["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","import { type z } from \"zod\";\n\nimport {\n IDENTIFIER_COMPONENT_MAX_LENGTH,\n MAX_PG_IDENTIFIER_LENGTH,\n TRUNCATED_IDENTIFIER_MAX_LENGTH,\n} from \"../constants\";\nimport {\n type AnyEdgeType,\n type KindEntity,\n type NodeType,\n} from \"../core/types\";\nimport { type ValueType } from \"../query/ast\";\nimport { resolveFieldTypeInfoAtJsonPointer } from \"../query/field-type-info\";\nimport {\n type JsonPointer,\n jsonPointer,\n type JsonPointerInput,\n type JsonPointerSegment,\n normalizeJsonPointer,\n parseJsonPointer,\n} from \"../query/json-pointer\";\nimport {\n createSchemaIntrospector,\n type FieldTypeInfo,\n} from \"../query/schema-introspector\";\nimport { EDGE_META_KEYS, NODE_META_KEYS } from \"../system-fields\";\nimport { fnv1aBase36 } from \"../utils/hash\";\nimport { hasOwnKey, isInteropProbeKey } from \"../utils/object\";\nimport { getNodeScopeColumns } from \"./compiler\";\nimport {\n type EdgeIndexConfig,\n type EdgeIndexDeclaration,\n type EdgeIndexDirection,\n type EdgeIndexWhereBuilder,\n type IndexFieldInput,\n type IndexScope,\n type IndexWhereExpression,\n type IndexWhereFieldBuilder,\n type IndexWhereLiteral,\n type IndexWhereOp,\n type IndexWhereOperand,\n type NodeIndexConfig,\n type NodeIndexDeclaration,\n type NodeIndexWhereBuilder,\n type RelationalIndexMethod,\n type SystemColumnName,\n} from \"./types\";\n\n// `keySystemColumns` on a node index must fail closed: reject anything that\n// isn't a known node-valid column, not just the known edge-only ones. A\n// caller whose array escapes TypeScript's literal-union checking (`any`-typed\n// data, a value round-tripped through JSON) could otherwise pass a typo'd or\n// otherwise-invalid column that silently reaches SQL DDL generation instead\n// of failing here with a clear error. Derived from the single source of\n// truth (`createSystemColumnMapForNode`, hoisted — see below) rather than a\n// second hand-maintained list, so it can't drift from it.\nconst NODE_KEY_SYSTEM_COLUMNS: ReadonlySet<SystemColumnName> = new Set(\n [...createSystemColumnMapForNode().values()].map((entry) => entry.column),\n);\n\n// ============================================================\n// Public API\n// ============================================================\n\nexport function defineNodeIndex<N extends NodeType>(\n node: N,\n config: NodeIndexConfig<N>,\n): NodeIndexDeclaration {\n const scope = config.scope ?? \"graphAndKind\";\n const unique = config.unique ?? false;\n const keySystemColumns = normalizeKeySystemColumnsOrThrow(\n config.keySystemColumns ?? [],\n scope,\n unique,\n );\n\n const schemaIntrospector = createSchemaIntrospector(\n new Map([[node.kind, { schema: node.schema }]]),\n );\n\n const { pointers: fields, valueTypes: fieldValueTypes } =\n normalizeNodeIndexFieldsOrThrow(\n node,\n config.fields ?? [],\n schemaIntrospector,\n \"fields\",\n // GIN containment indexes exist precisely for array/object fields,\n // which the btree guard otherwise rejects.\n { allowJsonFields: config.method === \"gin\" },\n );\n\n const { pointers: coveringFields, valueTypes: coveringFieldValueTypes } =\n normalizeNodeIndexFieldsOrThrow(\n node,\n config.coveringFields ?? [],\n schemaIntrospector,\n \"coveringFields\",\n {},\n );\n assertNoOverlap(fields, coveringFields, \"fields\", \"coveringFields\");\n\n if (\n fields.length === 0 &&\n coveringFields.length === 0 &&\n keySystemColumns.length === 0\n ) {\n throw new Error(\n \"Index must declare at least one of fields, coveringFields, or keySystemColumns\",\n );\n }\n\n const where = normalizeWhereInput(config.where, () =>\n createNodeWhereBuilder(node, schemaIntrospector),\n );\n\n const method = resolveAdvancedIndexMethod(config.method, {\n fieldCount: fields.length,\n fieldValueType: fieldValueTypes[0],\n coveringFieldCount: coveringFields.length,\n keySystemColumnCount: keySystemColumns.length,\n unique,\n hasWhere: where !== undefined,\n });\n\n const defaultName = generateDefaultIndexName({\n kind: \"node\",\n kindName: node.kind,\n unique,\n scope,\n direction: \"none\",\n fields,\n coveringFields,\n keySystemColumns,\n });\n const name =\n config.name ??\n (method === undefined ? defaultName : `${defaultName}_${method}`);\n\n // `origin` is intentionally omitted: `\"compile-time\"` is the default\n // and is canonicalized by absence so the serialized form stays\n // byte-identical for legacy graphs. `method` and `keySystemColumns`\n // follow the same rule (absence == \"btree\" / no system key columns).\n return {\n entity: \"node\",\n kind: node.kind,\n name,\n fields,\n fieldValueTypes,\n coveringFields,\n coveringFieldValueTypes,\n unique,\n scope,\n where,\n ...(method === undefined ? {} : { method }),\n ...(keySystemColumns.length === 0 ? {} : { keySystemColumns }),\n };\n}\n\n/**\n * Validates `keySystemColumns`: must be node system columns (not\n * edge-only `from_kind`/`from_id`/`to_kind`/`to_id`), must not repeat\n * each other, must not repeat a column `scope` already prefixes the key\n * with, and must not combine `\"id\"` with `unique` (every node's `id` is\n * already unique per row, so that combination can never enforce a\n * meaningful constraint across the index's other key columns).\n */\nfunction normalizeKeySystemColumnsOrThrow(\n columns: readonly SystemColumnName[],\n scope: IndexScope,\n unique: boolean,\n): readonly SystemColumnName[] {\n if (columns.length === 0) return [];\n\n for (const column of columns) {\n if (!NODE_KEY_SYSTEM_COLUMNS.has(column)) {\n throw new Error(\n `Node index keySystemColumns does not support \"${column}\" (edge-only system column)`,\n );\n }\n }\n assertUnique(columns, \"keySystemColumns\");\n\n const scopeColumns = new Set(getNodeScopeColumns(scope));\n for (const column of columns) {\n if (scopeColumns.has(column)) {\n throw new Error(\n `Node index keySystemColumns must not repeat a column already implied by scope \"${scope}\": \"${column}\"`,\n );\n }\n }\n\n if (unique && columns.includes(\"id\")) {\n throw new Error(\n `unique node indexes cannot include keySystemColumns: [\"id\"]; id is already unique per node, so including it defeats uniqueness across the prop fields`,\n );\n }\n\n // Return a fresh array: the declaration must own an immutable snapshot, not\n // a reference to the caller's array. Otherwise a post-call mutation of the\n // original `config.keySystemColumns` bypasses these checks and desyncs the\n // already-computed name/hash from the compiled index keys.\n return [...columns];\n}\n\nexport function defineEdgeIndex<E extends AnyEdgeType>(\n edge: E,\n config: EdgeIndexConfig<E>,\n): EdgeIndexDeclaration {\n const scope = config.scope ?? \"graphAndKind\";\n const unique = config.unique ?? false;\n const direction = config.direction ?? \"none\";\n\n const schemaIntrospector = createSchemaIntrospector(\n new Map(),\n new Map([[edge.kind, { schema: edge.schema }]]),\n );\n\n const { pointers: fields, valueTypes: fieldValueTypes } =\n normalizeEdgeIndexFieldsOrThrow(\n edge,\n config.fields,\n schemaIntrospector,\n \"fields\",\n { allowEmpty: false, allowJsonFields: config.method === \"gin\" },\n );\n\n const { pointers: coveringFields, valueTypes: coveringFieldValueTypes } =\n normalizeEdgeIndexFieldsOrThrow(\n edge,\n config.coveringFields ?? [],\n schemaIntrospector,\n \"coveringFields\",\n { allowEmpty: true },\n );\n assertNoOverlap(fields, coveringFields, \"fields\", \"coveringFields\");\n\n const where = normalizeWhereInput(config.where, () =>\n createEdgeWhereBuilder(edge, schemaIntrospector),\n );\n\n const method = resolveAdvancedIndexMethod(config.method, {\n fieldCount: fields.length,\n fieldValueType: fieldValueTypes[0],\n coveringFieldCount: coveringFields.length,\n keySystemColumnCount: 0,\n unique,\n hasWhere: where !== undefined,\n });\n\n const defaultName = generateDefaultIndexName({\n kind: \"edge\",\n kindName: edge.kind,\n unique,\n scope,\n direction,\n fields,\n coveringFields,\n });\n const name =\n config.name ??\n (method === undefined ? defaultName : `${defaultName}_${method}`);\n\n return {\n entity: \"edge\",\n kind: edge.kind,\n name,\n fields,\n fieldValueTypes,\n coveringFields,\n coveringFieldValueTypes,\n unique,\n scope,\n direction,\n where,\n ...(method === undefined ? {} : { method }),\n };\n}\n\n/**\n * Validates and canonicalizes a declaration's index method. `\"btree\"` (or\n * absent) canonicalizes to `undefined` so serialized declarations and\n * materialization signatures from before `method` existed stay\n * byte-identical. GIN-family methods index one expression and have no\n * ordered key columns, so multi-field, covering, unique, and partial\n * variants are rejected at declaration time rather than failing as\n * confusing DDL errors at materialization time.\n */\nfunction resolveAdvancedIndexMethod(\n method: RelationalIndexMethod | undefined,\n details: Readonly<{\n fieldCount: number;\n fieldValueType: ValueType | undefined;\n coveringFieldCount: number;\n keySystemColumnCount: number;\n unique: boolean;\n hasWhere: boolean;\n }>,\n): Exclude<RelationalIndexMethod, \"btree\"> | undefined {\n const resolved = method ?? \"btree\";\n if (resolved === \"btree\") return undefined;\n if (details.fieldCount !== 1) {\n throw new Error(\n `Index method \"${resolved}\" requires exactly one field (a GIN indexes one expression), got ${details.fieldCount}`,\n );\n }\n // Enforce the field-type contract the methods advertise: gin serves the\n // array containment predicates, trigram serves the string substring /\n // case-insensitive predicates. Anything else (including unresolvable\n // field types) would materialize an index no documented predicate can\n // ever use, so it is rejected here rather than silently costing write\n // amplification for nothing.\n if (resolved === \"gin\" && details.fieldValueType !== \"array\") {\n throw new Error(\n details.fieldValueType === \"string\" ?\n 'Index method \"gin\" serves array containment; for substring or case-insensitive matching on a string field use method: \"trigram\"'\n : `Index method \"gin\" requires an array field (it serves the array containment predicates), got field type \"${details.fieldValueType ?? \"unresolved\"}\"`,\n );\n }\n if (resolved === \"trigram\" && details.fieldValueType !== \"string\") {\n throw new Error(\n details.fieldValueType === \"array\" ?\n 'Index method \"trigram\" serves substring matching on string fields; for array containment use method: \"gin\"'\n : `Index method \"trigram\" requires a string field (it serves substring and case-insensitive matches), got field type \"${details.fieldValueType ?? \"unresolved\"}\"`,\n );\n }\n const extraKeyColumns: readonly [string, number][] = [\n [\"coveringFields\", details.coveringFieldCount],\n [\"keySystemColumns\", details.keySystemColumnCount],\n ];\n for (const [label, count] of extraKeyColumns) {\n if (count > 0) {\n throw new Error(\n `Index method \"${resolved}\" does not support ${label} (GIN indexes cannot serve index-only scans over extra columns)`,\n );\n }\n }\n if (details.unique) {\n throw new Error(\n `Index method \"${resolved}\" does not support unique (GIN indexes cannot enforce uniqueness)`,\n );\n }\n if (details.hasWhere) {\n throw new Error(\n `Index method \"${resolved}\" does not support a partial where clause`,\n );\n }\n return resolved;\n}\n\n// ============================================================\n// WHERE Builder\n// ============================================================\n\n/**\n * The WHERE builder currently only supports top-level fields.\n * Nested field access (e.g., `where.metadata.priority.gt(5)`) is not supported.\n * Use top-level field predicates like `where.status.eq(\"active\")`.\n *\n * For complex nested predicates, use `andWhere()`, `orWhere()`, and `notWhere()`\n * to compose multiple top-level conditions.\n */\n\nfunction normalizeWhereInput<Builder>(\n input:\n | ((where: Builder) => IndexWhereExpression)\n | IndexWhereExpression\n | undefined,\n createBuilder: () => Builder,\n): IndexWhereExpression | undefined {\n if (input === undefined) {\n return undefined;\n }\n\n if (typeof input === \"function\") {\n return input(createBuilder());\n }\n\n return input;\n}\n\ntype NodeShape = Readonly<Record<string, z.ZodType>>;\ntype EdgeShape = Readonly<Record<string, z.ZodType>>;\n\nfunction createNodeWhereBuilder<N extends NodeType>(\n node: N,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): NodeIndexWhereBuilder<N> {\n const shape = getSchemaShape(node.schema);\n const system = createSystemColumnMapForNode();\n\n function getOperand(key: string): IndexWhereOperand {\n const systemColumn = system.get(key);\n if (systemColumn) {\n return {\n __type: \"index_operand_system\",\n column: systemColumn.column,\n valueType: systemColumn.valueType,\n };\n }\n\n if (!hasOwnKey(shape, key)) {\n throw new Error(\n `Unknown field \"${key}\" in node index WHERE clause for \"${node.kind}\"`,\n );\n }\n\n const info = schemaIntrospector.getFieldTypeInfo(node.kind, key);\n const valueType = info?.valueType;\n\n return {\n __type: \"index_operand_prop\",\n field: key,\n valueType,\n };\n }\n\n return createWhereProxy<NodeIndexWhereBuilder<N>>(\n (key) => getOperand(key),\n (key) => system.has(key) || hasOwnKey(shape, key),\n );\n}\n\nfunction createEdgeWhereBuilder<E extends AnyEdgeType>(\n edge: E,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): EdgeIndexWhereBuilder<E> {\n const shape = getSchemaShape(edge.schema);\n const system = createSystemColumnMapForEdge();\n\n function getOperand(key: string): IndexWhereOperand {\n const systemColumn = system.get(key);\n if (systemColumn) {\n return {\n __type: \"index_operand_system\",\n column: systemColumn.column,\n valueType: systemColumn.valueType,\n };\n }\n\n if (!hasOwnKey(shape, key)) {\n throw new Error(\n `Unknown field \"${key}\" in edge index WHERE clause for \"${edge.kind}\"`,\n );\n }\n\n const info = schemaIntrospector.getEdgeFieldTypeInfo(edge.kind, key);\n const valueType = info?.valueType;\n\n return {\n __type: \"index_operand_prop\",\n field: key,\n valueType,\n };\n }\n\n return createWhereProxy<EdgeIndexWhereBuilder<E>>(\n (key) => getOperand(key),\n (key) => system.has(key) || hasOwnKey(shape, key),\n );\n}\n\nfunction createWhereProxy<TBuilder extends object>(\n getOperand: (key: string) => IndexWhereOperand,\n declaresField: (key: string) => boolean,\n): TBuilder {\n // An ORDINARY object target, even though the target is never read: a proxy's\n // target is what `instanceof`, `Object.getPrototypeOf` and every other\n // internal method resolve against, and this proxy is handed to the CALLER's\n // `where:` callback. A null-prototype target made `builder instanceof Object`\n // answer `false` for no benefit — nothing is ever written to it, so it was\n // not even the `__proto__`-write protection a data-keyed bag exists for.\n return new Proxy({} as TBuilder, {\n get: (_target, property: string | symbol) => {\n if (typeof property !== \"string\") return;\n\n // A DECLARED field wins over the interop exemption, for the reason\n // `isInteropProbeKey` documents: `then` and `toJSON` are legal schema\n // field names, and refusing them here left a partial index unable to\n // reference a field the schema declares. Only an UNDECLARED probe\n // resolves to `undefined`, keeping the builder safe to await or\n // stringify.\n if (isInteropProbeKey(property) && !declaresField(property)) return;\n\n const operand = getOperand(property);\n return createIndexWhereFieldBuilder(operand);\n },\n });\n}\n\nfunction createIndexWhereFieldBuilder<T>(\n operand: IndexWhereOperand,\n): IndexWhereFieldBuilder<T> {\n function isNull(): IndexWhereExpression {\n return { __type: \"index_where_null_check\", operand, op: \"isNull\" };\n }\n\n function isNotNull(): IndexWhereExpression {\n return { __type: \"index_where_null_check\", operand, op: \"isNotNull\" };\n }\n\n function comparison(op: IndexWhereOp, value: unknown): IndexWhereExpression {\n return {\n __type: \"index_where_comparison\",\n left: operand,\n op,\n right: toLiteralOrThrow(value, operand.valueType),\n };\n }\n\n function listComparison(\n op: IndexWhereOp,\n values: readonly unknown[],\n ): IndexWhereExpression {\n const literals = values.map((value) =>\n toLiteralOrThrow(value, operand.valueType),\n );\n return {\n __type: \"index_where_comparison\",\n left: operand,\n op,\n right: literals,\n };\n }\n\n return {\n eq: (value) => comparison(\"eq\", value),\n neq: (value) => comparison(\"neq\", value),\n gt: (value) => comparison(\"gt\", value),\n gte: (value) => comparison(\"gte\", value),\n lt: (value) => comparison(\"lt\", value),\n lte: (value) => comparison(\"lte\", value),\n in: (values) => listComparison(\"in\", values),\n notIn: (values) => listComparison(\"notIn\", values),\n isNull,\n isNotNull,\n };\n}\n\nfunction toLiteralOrThrow(\n value: unknown,\n preferredType: ValueType | undefined,\n): IndexWhereLiteral {\n if (value instanceof Date) {\n return {\n __type: \"index_where_literal\",\n value: value.toISOString(),\n valueType: \"date\",\n };\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n const valueType = inferValueType(value, preferredType);\n return { __type: \"index_where_literal\", value, valueType };\n }\n\n throw new Error(\n `Unsupported literal value type in index WHERE clause: ${String(value)}`,\n );\n}\n\nfunction inferValueType(\n value: string | number | boolean,\n preferredType: ValueType | undefined,\n): ValueType {\n if (preferredType === \"date\" && typeof value === \"string\") {\n return \"date\";\n }\n if (preferredType === \"number\" && typeof value === \"string\") {\n return \"number\";\n }\n if (preferredType === \"boolean\" && typeof value === \"string\") {\n return \"boolean\";\n }\n\n if (typeof value === \"string\") return \"string\";\n if (typeof value === \"number\") return \"number\";\n return \"boolean\";\n}\n\nfunction toSystemColumnName(metaKey: string): SystemColumnName {\n const snake = metaKey.replaceAll(/([A-Z])/g, \"_$1\").toLowerCase();\n\n switch (snake) {\n case \"deleted_at\":\n case \"valid_from\":\n case \"valid_to\":\n case \"created_at\":\n case \"updated_at\": {\n return snake;\n }\n default: {\n throw new Error(`Unsupported system meta key: ${metaKey}`);\n }\n }\n}\n\nfunction createSystemColumnMapForNode(): Map<\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>\n> {\n const entries: (readonly [\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>,\n ])[] = [\n [\"graphId\", { column: \"graph_id\", valueType: \"string\" }],\n [\"kind\", { column: \"kind\", valueType: \"string\" }],\n [\"id\", { column: \"id\", valueType: \"string\" }],\n ];\n\n for (const key of NODE_META_KEYS) {\n if (key === \"version\") {\n entries.push([key, { column: \"version\", valueType: \"number\" }]);\n continue;\n }\n entries.push([key, { column: toSystemColumnName(key), valueType: \"date\" }]);\n }\n\n return new Map(entries);\n}\n\nfunction createSystemColumnMapForEdge(): Map<\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>\n> {\n const entries: (readonly [\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>,\n ])[] = [\n [\"graphId\", { column: \"graph_id\", valueType: \"string\" }],\n [\"kind\", { column: \"kind\", valueType: \"string\" }],\n [\"id\", { column: \"id\", valueType: \"string\" }],\n [\"fromKind\", { column: \"from_kind\", valueType: \"string\" }],\n [\"fromId\", { column: \"from_id\", valueType: \"string\" }],\n [\"toKind\", { column: \"to_kind\", valueType: \"string\" }],\n [\"toId\", { column: \"to_id\", valueType: \"string\" }],\n ];\n\n for (const key of EDGE_META_KEYS) {\n entries.push([key, { column: toSystemColumnName(key), valueType: \"date\" }]);\n }\n\n return new Map(entries);\n}\n\nfunction getSchemaShape(schema: z.ZodType): NodeShape | EdgeShape {\n if (schema.type !== \"object\") {\n throw new Error(\"Index definitions require an object schema\");\n }\n\n const def = schema.def as { shape?: Record<string, z.ZodType> };\n const shape = def.shape;\n if (!shape) {\n throw new Error(\"Index definitions require a resolvable object shape\");\n }\n\n return shape;\n}\n\n// ============================================================\n// Validation\n// ============================================================\n\nfunction assertNonEmpty(values: readonly unknown[], label: string): void {\n if (values.length === 0) {\n throw new Error(`Index ${label} must not be empty`);\n }\n}\n\nfunction assertUnique(values: readonly string[], label: string): void {\n const set = new Set<string>();\n for (const value of values) {\n if (set.has(value)) {\n throw new Error(`Index ${label} contains duplicate value: ${value}`);\n }\n set.add(value);\n }\n}\n\nfunction assertNoOverlap(\n a: readonly string[],\n b: readonly string[],\n aLabel: string,\n bLabel: string,\n): void {\n const set = new Set(a);\n for (const value of b) {\n if (set.has(value)) {\n throw new Error(`Index ${bLabel} must not overlap ${aLabel}: ${value}`);\n }\n }\n}\n\nfunction assertIndexableValueType(\n valueType: ValueType,\n context: string,\n options: Readonly<{ allowJsonFields: boolean }>,\n): void {\n if (valueType === \"embedding\") {\n throw new Error(\n `Cannot create props index for embedding field (${context}); embedding() fields are indexed automatically in the vector strategy's per-(kind, field) storage`,\n );\n }\n\n if (\n (valueType === \"array\" || valueType === \"object\") &&\n !options.allowJsonFields\n ) {\n throw new Error(\n `Cannot create btree props index for ${valueType} field (${context}); use method: \"gin\" instead`,\n );\n }\n}\n\ntype NormalizedIndexFields = Readonly<{\n pointers: readonly JsonPointer[];\n valueTypes: readonly (ValueType | undefined)[];\n}>;\n\nfunction normalizeNodeIndexFieldsOrThrow<N extends NodeType>(\n node: N,\n inputs: readonly IndexFieldInput<z.infer<N[\"schema\"]>>[],\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n label: string,\n options: Readonly<{ allowJsonFields?: boolean }>,\n): NormalizedIndexFields {\n // Node `fields`/`coveringFields` are both optional (an index can be keyed\n // by `keySystemColumns` alone), so unlike the edge equivalent below, an\n // empty input is always valid here — `defineNodeIndex` enforces that at\n // least one of `fields`/`coveringFields`/`keySystemColumns` is non-empty.\n if (inputs.length === 0) {\n return { pointers: [], valueTypes: [] };\n }\n\n const pointers: JsonPointer[] = [];\n const valueTypes: (ValueType | undefined)[] = [];\n\n for (const input of inputs) {\n const pointer = normalizeIndexFieldPointer(input);\n const info = resolveNodeFieldTypeInfoOrThrow(\n node.kind,\n pointer,\n schemaIntrospector,\n );\n assertIndexableValueType(info.valueType, `node \"${node.kind}\" ${pointer}`, {\n allowJsonFields: options.allowJsonFields ?? false,\n });\n pointers.push(pointer);\n valueTypes.push(info.valueType);\n }\n\n assertUnique(pointers, label);\n\n return { pointers, valueTypes };\n}\n\nfunction normalizeEdgeIndexFieldsOrThrow<E extends AnyEdgeType>(\n edge: E,\n inputs: readonly IndexFieldInput<z.infer<E[\"schema\"]>>[],\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n label: string,\n options: Readonly<{ allowEmpty: boolean; allowJsonFields?: boolean }>,\n): NormalizedIndexFields {\n if (inputs.length === 0 && options.allowEmpty) {\n return { pointers: [], valueTypes: [] };\n }\n assertNonEmpty(inputs, label);\n\n const pointers: JsonPointer[] = [];\n const valueTypes: (ValueType | undefined)[] = [];\n\n for (const input of inputs) {\n const pointer = normalizeIndexFieldPointer(input);\n const info = resolveEdgeFieldTypeInfoOrThrow(\n edge.kind,\n pointer,\n schemaIntrospector,\n );\n assertIndexableValueType(info.valueType, `edge \"${edge.kind}\" ${pointer}`, {\n allowJsonFields: options.allowJsonFields ?? false,\n });\n pointers.push(pointer);\n valueTypes.push(info.valueType);\n }\n\n assertUnique(pointers, label);\n\n return { pointers, valueTypes };\n}\n\nfunction normalizeIndexFieldPointer<T>(input: IndexFieldInput<T>): JsonPointer {\n if (Array.isArray(input)) {\n if (input.length === 0) {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n return jsonPointer(input as readonly JsonPointerSegment[]);\n }\n\n if (typeof input === \"string\") {\n if (input.startsWith(\"/\")) {\n const pointer = normalizeJsonPointer(\n input as JsonPointerInput<Record<string, unknown>>,\n );\n if (pointer === \"\") {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n return pointer;\n }\n return jsonPointer([input]);\n }\n\n throw new Error(`Unsupported index field input: ${String(input)}`);\n}\n\nfunction resolveNodeFieldTypeInfoOrThrow(\n nodeKind: string,\n pointer: JsonPointer,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): FieldTypeInfo {\n const segments = parseJsonPointer(pointer);\n const [first, ...rest] = segments;\n if (!first) {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n\n const rootInfo = schemaIntrospector.getFieldTypeInfo(nodeKind, first);\n if (!rootInfo) {\n throw new Error(\n `Unknown field \"${first}\" for node \"${nodeKind}\" in index definition`,\n );\n }\n\n if (rest.length === 0) {\n return rootInfo;\n }\n\n const resolved = resolveFieldTypeInfoAtJsonPointer(\n rootInfo,\n jsonPointer(rest),\n );\n if (!resolved) {\n throw new Error(\n `Unknown JSON pointer \"${pointer}\" for node \"${nodeKind}\" in index definition`,\n );\n }\n\n return resolved;\n}\n\nfunction resolveEdgeFieldTypeInfoOrThrow(\n edgeKind: string,\n pointer: JsonPointer,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): FieldTypeInfo {\n const segments = parseJsonPointer(pointer);\n const [first, ...rest] = segments;\n if (!first) {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n\n const rootInfo = schemaIntrospector.getEdgeFieldTypeInfo(edgeKind, first);\n if (!rootInfo) {\n throw new Error(\n `Unknown field \"${first}\" for edge \"${edgeKind}\" in index definition`,\n );\n }\n\n if (rest.length === 0) {\n return rootInfo;\n }\n\n const resolved = resolveFieldTypeInfoAtJsonPointer(\n rootInfo,\n jsonPointer(rest),\n );\n if (!resolved) {\n throw new Error(\n `Unknown JSON pointer \"${pointer}\" for edge \"${edgeKind}\" in index definition`,\n );\n }\n\n return resolved;\n}\n\n// ============================================================\n// Default Name Generation\n// ============================================================\n\ntype DefaultNameParts = Readonly<{\n kind: KindEntity;\n kindName: string;\n unique: boolean;\n scope: IndexScope;\n direction: EdgeIndexDirection;\n fields: readonly string[];\n coveringFields: readonly string[];\n /**\n * Node-only, defaults to `[]` for edges. Folded into the hash/name only\n * when non-empty so indexes that don't use it keep byte-identical\n * default names to before this field existed.\n */\n keySystemColumns?: readonly string[];\n}>;\n\nfunction generateDefaultIndexName(parts: DefaultNameParts): string {\n const keySystemColumns = parts.keySystemColumns ?? [];\n const hash = fnv1aBase36(\n JSON.stringify({\n kind: parts.kind,\n kindName: parts.kindName,\n unique: parts.unique,\n scope: parts.scope,\n direction: parts.direction,\n fields: parts.fields,\n covering: parts.coveringFields,\n ...(keySystemColumns.length > 0 ? { keySystemColumns } : {}),\n }),\n );\n\n const nameParts = [\n \"idx\",\n \"tg\",\n parts.kind,\n sanitizeIdentifierComponent(parts.kindName),\n parts.fields.length > 0 ?\n sanitizeIdentifierComponent(parts.fields.join(\"_\"))\n : undefined,\n parts.coveringFields.length > 0 ?\n `cov_${sanitizeIdentifierComponent(parts.coveringFields.join(\"_\"))}`\n : undefined,\n keySystemColumns.length > 0 ?\n `sys_${sanitizeIdentifierComponent(keySystemColumns.join(\"_\"))}`\n : undefined,\n parts.direction === \"none\" ? undefined : parts.direction,\n parts.unique ? \"uniq\" : undefined,\n parts.scope === \"graphAndKind\" ?\n undefined\n : sanitizeIdentifierComponent(parts.scope),\n hash,\n ].filter((part) => part !== undefined);\n\n const joined = nameParts.join(\"_\");\n return joined.length <= MAX_PG_IDENTIFIER_LENGTH ?\n joined\n : `${joined.slice(0, TRUNCATED_IDENTIFIER_MAX_LENGTH)}_${hash}`;\n}\n\nfunction sanitizeIdentifierComponent(value: string): string {\n return value\n .toLowerCase()\n .replaceAll(/[^a-z0-9_]+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\")\n .slice(0, IDENTIFIER_COMPONENT_MAX_LENGTH);\n}\n"]}
1
+ {"version":3,"sources":["../src/system-fields.ts","../src/indexes/define-index.ts"],"names":["createSchemaIntrospector","getNodeScopeColumns","hasOwnKey","isInteropProbeKey","jsonPointer","normalizeJsonPointer","parseJsonPointer","resolveFieldTypeInfoAtJsonPointer","fnv1aBase36","MAX_PG_IDENTIFIER_LENGTH","TRUNCATED_IDENTIFIER_MAX_LENGTH","IDENTIFIER_COMPONENT_MAX_LENGTH"],"mappings":"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","file":"chunk-QHP2BCBJ.cjs","sourcesContent":["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","import { type z } from \"zod\";\n\nimport {\n IDENTIFIER_COMPONENT_MAX_LENGTH,\n MAX_PG_IDENTIFIER_LENGTH,\n TRUNCATED_IDENTIFIER_MAX_LENGTH,\n} from \"../constants\";\nimport {\n type AnyEdgeType,\n type KindEntity,\n type NodeType,\n} from \"../core/types\";\nimport { type ValueType } from \"../query/ast\";\nimport { resolveFieldTypeInfoAtJsonPointer } from \"../query/field-type-info\";\nimport {\n type JsonPointer,\n jsonPointer,\n type JsonPointerInput,\n type JsonPointerSegment,\n normalizeJsonPointer,\n parseJsonPointer,\n} from \"../query/json-pointer\";\nimport {\n createSchemaIntrospector,\n type FieldTypeInfo,\n} from \"../query/schema-introspector\";\nimport { EDGE_META_KEYS, NODE_META_KEYS } from \"../system-fields\";\nimport { fnv1aBase36 } from \"../utils/hash\";\nimport { hasOwnKey, isInteropProbeKey } from \"../utils/object\";\nimport { getNodeScopeColumns } from \"./compiler\";\nimport {\n type EdgeIndexConfig,\n type EdgeIndexDeclaration,\n type EdgeIndexDirection,\n type EdgeIndexWhereBuilder,\n type IndexFieldInput,\n type IndexScope,\n type IndexWhereExpression,\n type IndexWhereFieldBuilder,\n type IndexWhereLiteral,\n type IndexWhereOp,\n type IndexWhereOperand,\n type NodeIndexConfig,\n type NodeIndexDeclaration,\n type NodeIndexWhereBuilder,\n type RelationalIndexMethod,\n type SystemColumnName,\n} from \"./types\";\n\n// `keySystemColumns` on a node index must fail closed: reject anything that\n// isn't a known node-valid column, not just the known edge-only ones. A\n// caller whose array escapes TypeScript's literal-union checking (`any`-typed\n// data, a value round-tripped through JSON) could otherwise pass a typo'd or\n// otherwise-invalid column that silently reaches SQL DDL generation instead\n// of failing here with a clear error. Derived from the single source of\n// truth (`createSystemColumnMapForNode`, hoisted — see below) rather than a\n// second hand-maintained list, so it can't drift from it.\nconst NODE_KEY_SYSTEM_COLUMNS: ReadonlySet<SystemColumnName> = new Set(\n [...createSystemColumnMapForNode().values()].map((entry) => entry.column),\n);\n\n// ============================================================\n// Public API\n// ============================================================\n\nexport function defineNodeIndex<N extends NodeType>(\n node: N,\n config: NodeIndexConfig<N>,\n): NodeIndexDeclaration {\n const scope = config.scope ?? \"graphAndKind\";\n const unique = config.unique ?? false;\n const keySystemColumns = normalizeKeySystemColumnsOrThrow(\n config.keySystemColumns ?? [],\n scope,\n unique,\n );\n\n const schemaIntrospector = createSchemaIntrospector(\n new Map([[node.kind, { schema: node.schema }]]),\n );\n\n const { pointers: fields, valueTypes: fieldValueTypes } =\n normalizeNodeIndexFieldsOrThrow(\n node,\n config.fields ?? [],\n schemaIntrospector,\n \"fields\",\n // GIN containment indexes exist precisely for array/object fields,\n // which the btree guard otherwise rejects.\n { allowJsonFields: config.method === \"gin\" },\n );\n\n const { pointers: coveringFields, valueTypes: coveringFieldValueTypes } =\n normalizeNodeIndexFieldsOrThrow(\n node,\n config.coveringFields ?? [],\n schemaIntrospector,\n \"coveringFields\",\n {},\n );\n assertNoOverlap(fields, coveringFields, \"fields\", \"coveringFields\");\n\n if (\n fields.length === 0 &&\n coveringFields.length === 0 &&\n keySystemColumns.length === 0\n ) {\n throw new Error(\n \"Index must declare at least one of fields, coveringFields, or keySystemColumns\",\n );\n }\n\n const where = normalizeWhereInput(config.where, () =>\n createNodeWhereBuilder(node, schemaIntrospector),\n );\n\n const method = resolveAdvancedIndexMethod(config.method, {\n fieldCount: fields.length,\n fieldValueType: fieldValueTypes[0],\n coveringFieldCount: coveringFields.length,\n keySystemColumnCount: keySystemColumns.length,\n unique,\n hasWhere: where !== undefined,\n });\n\n const defaultName = generateDefaultIndexName({\n kind: \"node\",\n kindName: node.kind,\n unique,\n scope,\n direction: \"none\",\n fields,\n coveringFields,\n keySystemColumns,\n });\n const name =\n config.name ??\n (method === undefined ? defaultName : `${defaultName}_${method}`);\n\n // `origin` is intentionally omitted: `\"compile-time\"` is the default\n // and is canonicalized by absence so the serialized form stays\n // byte-identical for legacy graphs. `method` and `keySystemColumns`\n // follow the same rule (absence == \"btree\" / no system key columns).\n return {\n entity: \"node\",\n kind: node.kind,\n name,\n fields,\n fieldValueTypes,\n coveringFields,\n coveringFieldValueTypes,\n unique,\n scope,\n where,\n ...(method === undefined ? {} : { method }),\n ...(keySystemColumns.length === 0 ? {} : { keySystemColumns }),\n };\n}\n\n/**\n * Validates `keySystemColumns`: must be node system columns (not\n * edge-only `from_kind`/`from_id`/`to_kind`/`to_id`), must not repeat\n * each other, must not repeat a column `scope` already prefixes the key\n * with, and must not combine `\"id\"` with `unique` (every node's `id` is\n * already unique per row, so that combination can never enforce a\n * meaningful constraint across the index's other key columns).\n */\nfunction normalizeKeySystemColumnsOrThrow(\n columns: readonly SystemColumnName[],\n scope: IndexScope,\n unique: boolean,\n): readonly SystemColumnName[] {\n if (columns.length === 0) return [];\n\n for (const column of columns) {\n if (!NODE_KEY_SYSTEM_COLUMNS.has(column)) {\n throw new Error(\n `Node index keySystemColumns does not support \"${column}\" (edge-only system column)`,\n );\n }\n }\n assertUnique(columns, \"keySystemColumns\");\n\n const scopeColumns = new Set(getNodeScopeColumns(scope));\n for (const column of columns) {\n if (scopeColumns.has(column)) {\n throw new Error(\n `Node index keySystemColumns must not repeat a column already implied by scope \"${scope}\": \"${column}\"`,\n );\n }\n }\n\n if (unique && columns.includes(\"id\")) {\n throw new Error(\n `unique node indexes cannot include keySystemColumns: [\"id\"]; id is already unique per node, so including it defeats uniqueness across the prop fields`,\n );\n }\n\n // Return a fresh array: the declaration must own an immutable snapshot, not\n // a reference to the caller's array. Otherwise a post-call mutation of the\n // original `config.keySystemColumns` bypasses these checks and desyncs the\n // already-computed name/hash from the compiled index keys.\n return [...columns];\n}\n\nexport function defineEdgeIndex<E extends AnyEdgeType>(\n edge: E,\n config: EdgeIndexConfig<E>,\n): EdgeIndexDeclaration {\n const scope = config.scope ?? \"graphAndKind\";\n const unique = config.unique ?? false;\n const direction = config.direction ?? \"none\";\n\n const schemaIntrospector = createSchemaIntrospector(\n new Map(),\n new Map([[edge.kind, { schema: edge.schema }]]),\n );\n\n const { pointers: fields, valueTypes: fieldValueTypes } =\n normalizeEdgeIndexFieldsOrThrow(\n edge,\n config.fields,\n schemaIntrospector,\n \"fields\",\n { allowEmpty: false, allowJsonFields: config.method === \"gin\" },\n );\n\n const { pointers: coveringFields, valueTypes: coveringFieldValueTypes } =\n normalizeEdgeIndexFieldsOrThrow(\n edge,\n config.coveringFields ?? [],\n schemaIntrospector,\n \"coveringFields\",\n { allowEmpty: true },\n );\n assertNoOverlap(fields, coveringFields, \"fields\", \"coveringFields\");\n\n const where = normalizeWhereInput(config.where, () =>\n createEdgeWhereBuilder(edge, schemaIntrospector),\n );\n\n const method = resolveAdvancedIndexMethod(config.method, {\n fieldCount: fields.length,\n fieldValueType: fieldValueTypes[0],\n coveringFieldCount: coveringFields.length,\n keySystemColumnCount: 0,\n unique,\n hasWhere: where !== undefined,\n });\n\n const defaultName = generateDefaultIndexName({\n kind: \"edge\",\n kindName: edge.kind,\n unique,\n scope,\n direction,\n fields,\n coveringFields,\n });\n const name =\n config.name ??\n (method === undefined ? defaultName : `${defaultName}_${method}`);\n\n return {\n entity: \"edge\",\n kind: edge.kind,\n name,\n fields,\n fieldValueTypes,\n coveringFields,\n coveringFieldValueTypes,\n unique,\n scope,\n direction,\n where,\n ...(method === undefined ? {} : { method }),\n };\n}\n\n/**\n * Validates and canonicalizes a declaration's index method. `\"btree\"` (or\n * absent) canonicalizes to `undefined` so serialized declarations and\n * materialization signatures from before `method` existed stay\n * byte-identical. GIN-family methods index one expression and have no\n * ordered key columns, so multi-field, covering, unique, and partial\n * variants are rejected at declaration time rather than failing as\n * confusing DDL errors at materialization time.\n */\nfunction resolveAdvancedIndexMethod(\n method: RelationalIndexMethod | undefined,\n details: Readonly<{\n fieldCount: number;\n fieldValueType: ValueType | undefined;\n coveringFieldCount: number;\n keySystemColumnCount: number;\n unique: boolean;\n hasWhere: boolean;\n }>,\n): Exclude<RelationalIndexMethod, \"btree\"> | undefined {\n const resolved = method ?? \"btree\";\n if (resolved === \"btree\") return undefined;\n if (details.fieldCount !== 1) {\n throw new Error(\n `Index method \"${resolved}\" requires exactly one field (a GIN indexes one expression), got ${details.fieldCount}`,\n );\n }\n // Enforce the field-type contract the methods advertise: gin serves the\n // array containment predicates, trigram serves the string substring /\n // case-insensitive predicates. Anything else (including unresolvable\n // field types) would materialize an index no documented predicate can\n // ever use, so it is rejected here rather than silently costing write\n // amplification for nothing.\n if (resolved === \"gin\" && details.fieldValueType !== \"array\") {\n throw new Error(\n details.fieldValueType === \"string\" ?\n 'Index method \"gin\" serves array containment; for substring or case-insensitive matching on a string field use method: \"trigram\"'\n : `Index method \"gin\" requires an array field (it serves the array containment predicates), got field type \"${details.fieldValueType ?? \"unresolved\"}\"`,\n );\n }\n if (resolved === \"trigram\" && details.fieldValueType !== \"string\") {\n throw new Error(\n details.fieldValueType === \"array\" ?\n 'Index method \"trigram\" serves substring matching on string fields; for array containment use method: \"gin\"'\n : `Index method \"trigram\" requires a string field (it serves substring and case-insensitive matches), got field type \"${details.fieldValueType ?? \"unresolved\"}\"`,\n );\n }\n const extraKeyColumns: readonly [string, number][] = [\n [\"coveringFields\", details.coveringFieldCount],\n [\"keySystemColumns\", details.keySystemColumnCount],\n ];\n for (const [label, count] of extraKeyColumns) {\n if (count > 0) {\n throw new Error(\n `Index method \"${resolved}\" does not support ${label} (GIN indexes cannot serve index-only scans over extra columns)`,\n );\n }\n }\n if (details.unique) {\n throw new Error(\n `Index method \"${resolved}\" does not support unique (GIN indexes cannot enforce uniqueness)`,\n );\n }\n if (details.hasWhere) {\n throw new Error(\n `Index method \"${resolved}\" does not support a partial where clause`,\n );\n }\n return resolved;\n}\n\n// ============================================================\n// WHERE Builder\n// ============================================================\n\n/**\n * The WHERE builder currently only supports top-level fields.\n * Nested field access (e.g., `where.metadata.priority.gt(5)`) is not supported.\n * Use top-level field predicates like `where.status.eq(\"active\")`.\n *\n * For complex nested predicates, use `andWhere()`, `orWhere()`, and `notWhere()`\n * to compose multiple top-level conditions.\n */\n\nfunction normalizeWhereInput<Builder>(\n input:\n | ((where: Builder) => IndexWhereExpression)\n | IndexWhereExpression\n | undefined,\n createBuilder: () => Builder,\n): IndexWhereExpression | undefined {\n if (input === undefined) {\n return undefined;\n }\n\n if (typeof input === \"function\") {\n return input(createBuilder());\n }\n\n return input;\n}\n\ntype NodeShape = Readonly<Record<string, z.ZodType>>;\ntype EdgeShape = Readonly<Record<string, z.ZodType>>;\n\nfunction createNodeWhereBuilder<N extends NodeType>(\n node: N,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): NodeIndexWhereBuilder<N> {\n const shape = getSchemaShape(node.schema);\n const system = createSystemColumnMapForNode();\n\n function getOperand(key: string): IndexWhereOperand {\n const systemColumn = system.get(key);\n if (systemColumn) {\n return {\n __type: \"index_operand_system\",\n column: systemColumn.column,\n valueType: systemColumn.valueType,\n };\n }\n\n if (!hasOwnKey(shape, key)) {\n throw new Error(\n `Unknown field \"${key}\" in node index WHERE clause for \"${node.kind}\"`,\n );\n }\n\n const info = schemaIntrospector.getFieldTypeInfo(node.kind, key);\n const valueType = info?.valueType;\n\n return {\n __type: \"index_operand_prop\",\n field: key,\n valueType,\n };\n }\n\n return createWhereProxy<NodeIndexWhereBuilder<N>>(\n (key) => getOperand(key),\n (key) => system.has(key) || hasOwnKey(shape, key),\n );\n}\n\nfunction createEdgeWhereBuilder<E extends AnyEdgeType>(\n edge: E,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): EdgeIndexWhereBuilder<E> {\n const shape = getSchemaShape(edge.schema);\n const system = createSystemColumnMapForEdge();\n\n function getOperand(key: string): IndexWhereOperand {\n const systemColumn = system.get(key);\n if (systemColumn) {\n return {\n __type: \"index_operand_system\",\n column: systemColumn.column,\n valueType: systemColumn.valueType,\n };\n }\n\n if (!hasOwnKey(shape, key)) {\n throw new Error(\n `Unknown field \"${key}\" in edge index WHERE clause for \"${edge.kind}\"`,\n );\n }\n\n const info = schemaIntrospector.getEdgeFieldTypeInfo(edge.kind, key);\n const valueType = info?.valueType;\n\n return {\n __type: \"index_operand_prop\",\n field: key,\n valueType,\n };\n }\n\n return createWhereProxy<EdgeIndexWhereBuilder<E>>(\n (key) => getOperand(key),\n (key) => system.has(key) || hasOwnKey(shape, key),\n );\n}\n\nfunction createWhereProxy<TBuilder extends object>(\n getOperand: (key: string) => IndexWhereOperand,\n declaresField: (key: string) => boolean,\n): TBuilder {\n // An ORDINARY object target, even though the target is never read: a proxy's\n // target is what `instanceof`, `Object.getPrototypeOf` and every other\n // internal method resolve against, and this proxy is handed to the CALLER's\n // `where:` callback. A null-prototype target made `builder instanceof Object`\n // answer `false` for no benefit — nothing is ever written to it, so it was\n // not even the `__proto__`-write protection a data-keyed bag exists for.\n return new Proxy({} as TBuilder, {\n get: (_target, property: string | symbol) => {\n if (typeof property !== \"string\") return;\n\n // A DECLARED field wins over the interop exemption, for the reason\n // `isInteropProbeKey` documents: `then` and `toJSON` are legal schema\n // field names, and refusing them here left a partial index unable to\n // reference a field the schema declares. Only an UNDECLARED probe\n // resolves to `undefined`, keeping the builder safe to await or\n // stringify.\n if (isInteropProbeKey(property) && !declaresField(property)) return;\n\n const operand = getOperand(property);\n return createIndexWhereFieldBuilder(operand);\n },\n });\n}\n\nfunction createIndexWhereFieldBuilder<T>(\n operand: IndexWhereOperand,\n): IndexWhereFieldBuilder<T> {\n function isNull(): IndexWhereExpression {\n return { __type: \"index_where_null_check\", operand, op: \"isNull\" };\n }\n\n function isNotNull(): IndexWhereExpression {\n return { __type: \"index_where_null_check\", operand, op: \"isNotNull\" };\n }\n\n function comparison(op: IndexWhereOp, value: unknown): IndexWhereExpression {\n return {\n __type: \"index_where_comparison\",\n left: operand,\n op,\n right: toLiteralOrThrow(value, operand.valueType),\n };\n }\n\n function listComparison(\n op: IndexWhereOp,\n values: readonly unknown[],\n ): IndexWhereExpression {\n const literals = values.map((value) =>\n toLiteralOrThrow(value, operand.valueType),\n );\n return {\n __type: \"index_where_comparison\",\n left: operand,\n op,\n right: literals,\n };\n }\n\n return {\n eq: (value) => comparison(\"eq\", value),\n neq: (value) => comparison(\"neq\", value),\n gt: (value) => comparison(\"gt\", value),\n gte: (value) => comparison(\"gte\", value),\n lt: (value) => comparison(\"lt\", value),\n lte: (value) => comparison(\"lte\", value),\n in: (values) => listComparison(\"in\", values),\n notIn: (values) => listComparison(\"notIn\", values),\n isNull,\n isNotNull,\n };\n}\n\nfunction toLiteralOrThrow(\n value: unknown,\n preferredType: ValueType | undefined,\n): IndexWhereLiteral {\n if (value instanceof Date) {\n return {\n __type: \"index_where_literal\",\n value: value.toISOString(),\n valueType: \"date\",\n };\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n const valueType = inferValueType(value, preferredType);\n return { __type: \"index_where_literal\", value, valueType };\n }\n\n throw new Error(\n `Unsupported literal value type in index WHERE clause: ${String(value)}`,\n );\n}\n\nfunction inferValueType(\n value: string | number | boolean,\n preferredType: ValueType | undefined,\n): ValueType {\n if (preferredType === \"date\" && typeof value === \"string\") {\n return \"date\";\n }\n if (preferredType === \"number\" && typeof value === \"string\") {\n return \"number\";\n }\n if (preferredType === \"boolean\" && typeof value === \"string\") {\n return \"boolean\";\n }\n\n if (typeof value === \"string\") return \"string\";\n if (typeof value === \"number\") return \"number\";\n return \"boolean\";\n}\n\nfunction toSystemColumnName(metaKey: string): SystemColumnName {\n const snake = metaKey.replaceAll(/([A-Z])/g, \"_$1\").toLowerCase();\n\n switch (snake) {\n case \"deleted_at\":\n case \"valid_from\":\n case \"valid_to\":\n case \"created_at\":\n case \"updated_at\": {\n return snake;\n }\n default: {\n throw new Error(`Unsupported system meta key: ${metaKey}`);\n }\n }\n}\n\nfunction createSystemColumnMapForNode(): Map<\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>\n> {\n const entries: (readonly [\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>,\n ])[] = [\n [\"graphId\", { column: \"graph_id\", valueType: \"string\" }],\n [\"kind\", { column: \"kind\", valueType: \"string\" }],\n [\"id\", { column: \"id\", valueType: \"string\" }],\n ];\n\n for (const key of NODE_META_KEYS) {\n if (key === \"version\") {\n entries.push([key, { column: \"version\", valueType: \"number\" }]);\n continue;\n }\n entries.push([key, { column: toSystemColumnName(key), valueType: \"date\" }]);\n }\n\n return new Map(entries);\n}\n\nfunction createSystemColumnMapForEdge(): Map<\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>\n> {\n const entries: (readonly [\n string,\n Readonly<{ column: SystemColumnName; valueType: ValueType | undefined }>,\n ])[] = [\n [\"graphId\", { column: \"graph_id\", valueType: \"string\" }],\n [\"kind\", { column: \"kind\", valueType: \"string\" }],\n [\"id\", { column: \"id\", valueType: \"string\" }],\n [\"fromKind\", { column: \"from_kind\", valueType: \"string\" }],\n [\"fromId\", { column: \"from_id\", valueType: \"string\" }],\n [\"toKind\", { column: \"to_kind\", valueType: \"string\" }],\n [\"toId\", { column: \"to_id\", valueType: \"string\" }],\n ];\n\n for (const key of EDGE_META_KEYS) {\n entries.push([key, { column: toSystemColumnName(key), valueType: \"date\" }]);\n }\n\n return new Map(entries);\n}\n\nfunction getSchemaShape(schema: z.ZodType): NodeShape | EdgeShape {\n if (schema.type !== \"object\") {\n throw new Error(\"Index definitions require an object schema\");\n }\n\n const def = schema.def as { shape?: Record<string, z.ZodType> };\n const shape = def.shape;\n if (!shape) {\n throw new Error(\"Index definitions require a resolvable object shape\");\n }\n\n return shape;\n}\n\n// ============================================================\n// Validation\n// ============================================================\n\nfunction assertNonEmpty(values: readonly unknown[], label: string): void {\n if (values.length === 0) {\n throw new Error(`Index ${label} must not be empty`);\n }\n}\n\nfunction assertUnique(values: readonly string[], label: string): void {\n const set = new Set<string>();\n for (const value of values) {\n if (set.has(value)) {\n throw new Error(`Index ${label} contains duplicate value: ${value}`);\n }\n set.add(value);\n }\n}\n\nfunction assertNoOverlap(\n a: readonly string[],\n b: readonly string[],\n aLabel: string,\n bLabel: string,\n): void {\n const set = new Set(a);\n for (const value of b) {\n if (set.has(value)) {\n throw new Error(`Index ${bLabel} must not overlap ${aLabel}: ${value}`);\n }\n }\n}\n\nfunction assertIndexableValueType(\n valueType: ValueType,\n context: string,\n options: Readonly<{ allowJsonFields: boolean }>,\n): void {\n if (valueType === \"embedding\") {\n throw new Error(\n `Cannot create props index for embedding field (${context}); embedding() fields are indexed automatically in the vector strategy's per-(kind, field) storage`,\n );\n }\n\n if (\n (valueType === \"array\" || valueType === \"object\") &&\n !options.allowJsonFields\n ) {\n throw new Error(\n `Cannot create btree props index for ${valueType} field (${context}); use method: \"gin\" instead`,\n );\n }\n}\n\ntype NormalizedIndexFields = Readonly<{\n pointers: readonly JsonPointer[];\n valueTypes: readonly (ValueType | undefined)[];\n}>;\n\nfunction normalizeNodeIndexFieldsOrThrow<N extends NodeType>(\n node: N,\n inputs: readonly IndexFieldInput<z.infer<N[\"schema\"]>>[],\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n label: string,\n options: Readonly<{ allowJsonFields?: boolean }>,\n): NormalizedIndexFields {\n // Node `fields`/`coveringFields` are both optional (an index can be keyed\n // by `keySystemColumns` alone), so unlike the edge equivalent below, an\n // empty input is always valid here — `defineNodeIndex` enforces that at\n // least one of `fields`/`coveringFields`/`keySystemColumns` is non-empty.\n if (inputs.length === 0) {\n return { pointers: [], valueTypes: [] };\n }\n\n const pointers: JsonPointer[] = [];\n const valueTypes: (ValueType | undefined)[] = [];\n\n for (const input of inputs) {\n const pointer = normalizeIndexFieldPointer(input);\n const info = resolveNodeFieldTypeInfoOrThrow(\n node.kind,\n pointer,\n schemaIntrospector,\n );\n assertIndexableValueType(info.valueType, `node \"${node.kind}\" ${pointer}`, {\n allowJsonFields: options.allowJsonFields ?? false,\n });\n pointers.push(pointer);\n valueTypes.push(info.valueType);\n }\n\n assertUnique(pointers, label);\n\n return { pointers, valueTypes };\n}\n\nfunction normalizeEdgeIndexFieldsOrThrow<E extends AnyEdgeType>(\n edge: E,\n inputs: readonly IndexFieldInput<z.infer<E[\"schema\"]>>[],\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n label: string,\n options: Readonly<{ allowEmpty: boolean; allowJsonFields?: boolean }>,\n): NormalizedIndexFields {\n if (inputs.length === 0 && options.allowEmpty) {\n return { pointers: [], valueTypes: [] };\n }\n assertNonEmpty(inputs, label);\n\n const pointers: JsonPointer[] = [];\n const valueTypes: (ValueType | undefined)[] = [];\n\n for (const input of inputs) {\n const pointer = normalizeIndexFieldPointer(input);\n const info = resolveEdgeFieldTypeInfoOrThrow(\n edge.kind,\n pointer,\n schemaIntrospector,\n );\n assertIndexableValueType(info.valueType, `edge \"${edge.kind}\" ${pointer}`, {\n allowJsonFields: options.allowJsonFields ?? false,\n });\n pointers.push(pointer);\n valueTypes.push(info.valueType);\n }\n\n assertUnique(pointers, label);\n\n return { pointers, valueTypes };\n}\n\nfunction normalizeIndexFieldPointer<T>(input: IndexFieldInput<T>): JsonPointer {\n if (Array.isArray(input)) {\n if (input.length === 0) {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n return jsonPointer(input as readonly JsonPointerSegment[]);\n }\n\n if (typeof input === \"string\") {\n if (input.startsWith(\"/\")) {\n const pointer = normalizeJsonPointer(\n input as JsonPointerInput<Record<string, unknown>>,\n );\n if (pointer === \"\") {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n return pointer;\n }\n return jsonPointer([input]);\n }\n\n throw new Error(`Unsupported index field input: ${String(input)}`);\n}\n\nfunction resolveNodeFieldTypeInfoOrThrow(\n nodeKind: string,\n pointer: JsonPointer,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): FieldTypeInfo {\n const segments = parseJsonPointer(pointer);\n const [first, ...rest] = segments;\n if (!first) {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n\n const rootInfo = schemaIntrospector.getFieldTypeInfo(nodeKind, first);\n if (!rootInfo) {\n throw new Error(\n `Unknown field \"${first}\" for node \"${nodeKind}\" in index definition`,\n );\n }\n\n if (rest.length === 0) {\n return rootInfo;\n }\n\n const resolved = resolveFieldTypeInfoAtJsonPointer(\n rootInfo,\n jsonPointer(rest),\n );\n if (!resolved) {\n throw new Error(\n `Unknown JSON pointer \"${pointer}\" for node \"${nodeKind}\" in index definition`,\n );\n }\n\n return resolved;\n}\n\nfunction resolveEdgeFieldTypeInfoOrThrow(\n edgeKind: string,\n pointer: JsonPointer,\n schemaIntrospector: ReturnType<typeof createSchemaIntrospector>,\n): FieldTypeInfo {\n const segments = parseJsonPointer(pointer);\n const [first, ...rest] = segments;\n if (!first) {\n throw new Error(\"Index field JSON pointer must not be empty\");\n }\n\n const rootInfo = schemaIntrospector.getEdgeFieldTypeInfo(edgeKind, first);\n if (!rootInfo) {\n throw new Error(\n `Unknown field \"${first}\" for edge \"${edgeKind}\" in index definition`,\n );\n }\n\n if (rest.length === 0) {\n return rootInfo;\n }\n\n const resolved = resolveFieldTypeInfoAtJsonPointer(\n rootInfo,\n jsonPointer(rest),\n );\n if (!resolved) {\n throw new Error(\n `Unknown JSON pointer \"${pointer}\" for edge \"${edgeKind}\" in index definition`,\n );\n }\n\n return resolved;\n}\n\n// ============================================================\n// Default Name Generation\n// ============================================================\n\ntype DefaultNameParts = Readonly<{\n kind: KindEntity;\n kindName: string;\n unique: boolean;\n scope: IndexScope;\n direction: EdgeIndexDirection;\n fields: readonly string[];\n coveringFields: readonly string[];\n /**\n * Node-only, defaults to `[]` for edges. Folded into the hash/name only\n * when non-empty so indexes that don't use it keep byte-identical\n * default names to before this field existed.\n */\n keySystemColumns?: readonly string[];\n}>;\n\nfunction generateDefaultIndexName(parts: DefaultNameParts): string {\n const keySystemColumns = parts.keySystemColumns ?? [];\n const hash = fnv1aBase36(\n JSON.stringify({\n kind: parts.kind,\n kindName: parts.kindName,\n unique: parts.unique,\n scope: parts.scope,\n direction: parts.direction,\n fields: parts.fields,\n covering: parts.coveringFields,\n ...(keySystemColumns.length > 0 ? { keySystemColumns } : {}),\n }),\n );\n\n const nameParts = [\n \"idx\",\n \"tg\",\n parts.kind,\n sanitizeIdentifierComponent(parts.kindName),\n parts.fields.length > 0 ?\n sanitizeIdentifierComponent(parts.fields.join(\"_\"))\n : undefined,\n parts.coveringFields.length > 0 ?\n `cov_${sanitizeIdentifierComponent(parts.coveringFields.join(\"_\"))}`\n : undefined,\n keySystemColumns.length > 0 ?\n `sys_${sanitizeIdentifierComponent(keySystemColumns.join(\"_\"))}`\n : undefined,\n parts.direction === \"none\" ? undefined : parts.direction,\n parts.unique ? \"uniq\" : undefined,\n parts.scope === \"graphAndKind\" ?\n undefined\n : sanitizeIdentifierComponent(parts.scope),\n hash,\n ].filter((part) => part !== undefined);\n\n const joined = nameParts.join(\"_\");\n return joined.length <= MAX_PG_IDENTIFIER_LENGTH ?\n joined\n : `${joined.slice(0, TRUNCATED_IDENTIFIER_MAX_LENGTH)}_${hash}`;\n}\n\nfunction sanitizeIdentifierComponent(value: string): string {\n return value\n .toLowerCase()\n .replaceAll(/[^a-z0-9_]+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\")\n .slice(0, IDENTIFIER_COMPONENT_MAX_LENGTH);\n}\n"]}
@@ -2633,5 +2633,5 @@ function runHookedWriteOperation(ctx, opContext, backend, body, options) {
2633
2633
  }
2634
2634
 
2635
2635
  export { AUTO_REFRESH_STATISTICS_ROW_THRESHOLD, IDENTITY_ASSERTION_COLUMNS, IDENTITY_PEER_CLASS_COLUMNS, STORE_RUNTIME, TRANSACTION_RUNTIME, advanceRevisionClock, assertCurrentRecordedSchema, assertRecordedCaptureTransactionIsolation, assertRevisionTrackableBackend, closeRecordedHardDeletedKind, compareAndSetAbsent, constraintFenceRefusal, createMutationWitness, createRecordedBackend, createRecordedTransactionScope, createValidationError, diagnoseFusedSchemaFenceNoRow, edgeInsertDispatch, encodeRecordedLineageRevision, ensureRevisionOrigin, ensureRevisionOriginsRelation, forceRecordedGraphRevision, forceWriteTransactionRevision, generateId, getEdgeRowsByIds, getNodeRowsByIds, hasLeasedSchemaFence, historicalIdentityPeerClassQuery, historicalIdentityReconstructionCtes, identityAssertionSnapshotSource, identityNodeSnapshotSource, identityNodeVisibilitySql, identitySqlCoordinate, lockRecordedGraphWrite, lockSchemaVersionForStoreWrite, memoizeLeasedSchemaFence, mintsOriginNamespacedAnchor, nodeInsertDispatch, readRecordedClock, readRevisionOrigin, recordedBindParamBudget, recordedCaptureRequiresCallbackTransactionError, recordedRelationsLineage, refuseEngineNativeRecordedIdentityRead, registerRecordedIdentityMutationWitness, resetRevisionOrigin, resolveLineage, runHookedWriteOperation, runInWriteTransaction, runInsertBatch, runInsertBatchReturning, runInsertIfAbsent, runInsertNoReturn, runRecordedTransactionSavepoint, storeBackend, storeCaptureEnabled, storeRuntime, throwHistoryUnsafeSqlAccess, throwRevisionTrackingUnsafeSqlAccess, transactionBackend, transactionNodeOperationHookRunner, uncapturedGraphWriteLock, validateEdgeProps, validateNodeProps, validateProps, withRecordedFlushObserver, withRecordedIdentityMutationTarget, withTransactionSchemaFenceLease, withWriteTransactionSession, wrapZodError };
2636
- //# sourceMappingURL=chunk-HWWPL2YL.js.map
2637
- //# sourceMappingURL=chunk-HWWPL2YL.js.map
2636
+ //# sourceMappingURL=chunk-QWIR5533.js.map
2637
+ //# sourceMappingURL=chunk-QWIR5533.js.map