@nicia-ai/typegraph 0.1.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.
- package/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/ast-BVyihVbP.d.cts +564 -0
- package/dist/ast-BVyihVbP.d.ts +564 -0
- package/dist/backend/drizzle/index.cjs +41 -0
- package/dist/backend/drizzle/index.cjs.map +1 -0
- package/dist/backend/drizzle/index.d.cts +12 -0
- package/dist/backend/drizzle/index.d.ts +12 -0
- package/dist/backend/drizzle/index.js +12 -0
- package/dist/backend/drizzle/index.js.map +1 -0
- package/dist/backend/drizzle/postgres.cjs +27 -0
- package/dist/backend/drizzle/postgres.cjs.map +1 -0
- package/dist/backend/drizzle/postgres.d.cts +37 -0
- package/dist/backend/drizzle/postgres.d.ts +37 -0
- package/dist/backend/drizzle/postgres.js +10 -0
- package/dist/backend/drizzle/postgres.js.map +1 -0
- package/dist/backend/drizzle/schema/postgres.cjs +40 -0
- package/dist/backend/drizzle/schema/postgres.cjs.map +1 -0
- package/dist/backend/drizzle/schema/postgres.d.cts +2419 -0
- package/dist/backend/drizzle/schema/postgres.d.ts +2419 -0
- package/dist/backend/drizzle/schema/postgres.js +7 -0
- package/dist/backend/drizzle/schema/postgres.js.map +1 -0
- package/dist/backend/drizzle/schema/sqlite.cjs +40 -0
- package/dist/backend/drizzle/schema/sqlite.cjs.map +1 -0
- package/dist/backend/drizzle/schema/sqlite.d.cts +2647 -0
- package/dist/backend/drizzle/schema/sqlite.d.ts +2647 -0
- package/dist/backend/drizzle/schema/sqlite.js +7 -0
- package/dist/backend/drizzle/schema/sqlite.js.map +1 -0
- package/dist/backend/drizzle/sqlite.cjs +27 -0
- package/dist/backend/drizzle/sqlite.cjs.map +1 -0
- package/dist/backend/drizzle/sqlite.d.cts +36 -0
- package/dist/backend/drizzle/sqlite.d.ts +36 -0
- package/dist/backend/drizzle/sqlite.js +10 -0
- package/dist/backend/drizzle/sqlite.js.map +1 -0
- package/dist/backend/postgres/index.cjs +53 -0
- package/dist/backend/postgres/index.cjs.map +1 -0
- package/dist/backend/postgres/index.d.cts +12 -0
- package/dist/backend/postgres/index.d.ts +12 -0
- package/dist/backend/postgres/index.js +12 -0
- package/dist/backend/postgres/index.js.map +1 -0
- package/dist/backend/sqlite/index.cjs +117 -0
- package/dist/backend/sqlite/index.cjs.map +1 -0
- package/dist/backend/sqlite/index.d.cts +71 -0
- package/dist/backend/sqlite/index.d.ts +71 -0
- package/dist/backend/sqlite/index.js +78 -0
- package/dist/backend/sqlite/index.js.map +1 -0
- package/dist/chunk-2QHQ2C4P.js +146 -0
- package/dist/chunk-2QHQ2C4P.js.map +1 -0
- package/dist/chunk-3A5TKOEJ.js +306 -0
- package/dist/chunk-3A5TKOEJ.js.map +1 -0
- package/dist/chunk-4PIEL2VO.js +162 -0
- package/dist/chunk-4PIEL2VO.js.map +1 -0
- package/dist/chunk-536PH5FT.js +342 -0
- package/dist/chunk-536PH5FT.js.map +1 -0
- package/dist/chunk-DBFCKELK.cjs +156 -0
- package/dist/chunk-DBFCKELK.cjs.map +1 -0
- package/dist/chunk-DDM2FZRJ.cjs +1143 -0
- package/dist/chunk-DDM2FZRJ.cjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-F32HCHYA.cjs +680 -0
- package/dist/chunk-F32HCHYA.cjs.map +1 -0
- package/dist/chunk-IIAT36MI.js +353 -0
- package/dist/chunk-IIAT36MI.js.map +1 -0
- package/dist/chunk-JDAET5LO.js +236 -0
- package/dist/chunk-JDAET5LO.js.map +1 -0
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
- package/dist/chunk-JKTO7TW3.js +299 -0
- package/dist/chunk-JKTO7TW3.js.map +1 -0
- package/dist/chunk-K7SQ3SWP.js +497 -0
- package/dist/chunk-K7SQ3SWP.js.map +1 -0
- package/dist/chunk-L642L24T.js +142 -0
- package/dist/chunk-L642L24T.js.map +1 -0
- package/dist/chunk-MFVCSNIY.cjs +308 -0
- package/dist/chunk-MFVCSNIY.cjs.map +1 -0
- package/dist/chunk-MNO33ASC.cjs +240 -0
- package/dist/chunk-MNO33ASC.cjs.map +1 -0
- package/dist/chunk-N4AOJ3VF.cjs +154 -0
- package/dist/chunk-N4AOJ3VF.cjs.map +1 -0
- package/dist/chunk-P5CNM325.cjs +508 -0
- package/dist/chunk-P5CNM325.cjs.map +1 -0
- package/dist/chunk-RYT4H46I.js +646 -0
- package/dist/chunk-RYT4H46I.js.map +1 -0
- package/dist/chunk-SV5H3XM5.cjs +321 -0
- package/dist/chunk-SV5H3XM5.cjs.map +1 -0
- package/dist/chunk-TXHKFLWX.cjs +344 -0
- package/dist/chunk-TXHKFLWX.cjs.map +1 -0
- package/dist/chunk-UJAGXJDG.cjs +170 -0
- package/dist/chunk-UJAGXJDG.cjs.map +1 -0
- package/dist/chunk-VXRVGFCI.js +1128 -0
- package/dist/chunk-VXRVGFCI.js.map +1 -0
- package/dist/chunk-YM5AL65Y.cjs +357 -0
- package/dist/chunk-YM5AL65Y.cjs.map +1 -0
- package/dist/index.cjs +8334 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1365 -0
- package/dist/index.d.ts +1365 -0
- package/dist/index.js +8105 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes/index.cjs +67 -0
- package/dist/indexes/index.cjs.map +1 -0
- package/dist/indexes/index.d.cts +62 -0
- package/dist/indexes/index.d.ts +62 -0
- package/dist/indexes/index.js +6 -0
- package/dist/indexes/index.js.map +1 -0
- package/dist/interchange/index.cjs +612 -0
- package/dist/interchange/index.cjs.map +1 -0
- package/dist/interchange/index.d.cts +288 -0
- package/dist/interchange/index.d.ts +288 -0
- package/dist/interchange/index.js +598 -0
- package/dist/interchange/index.js.map +1 -0
- package/dist/profiler/index.cjs +793 -0
- package/dist/profiler/index.cjs.map +1 -0
- package/dist/profiler/index.d.cts +283 -0
- package/dist/profiler/index.d.ts +283 -0
- package/dist/profiler/index.js +785 -0
- package/dist/profiler/index.js.map +1 -0
- package/dist/store-60Lcfi0w.d.ts +2263 -0
- package/dist/store-Bifii8MZ.d.cts +2263 -0
- package/dist/test-helpers-BjyRYJZX.d.ts +22 -0
- package/dist/test-helpers-NoQXhleQ.d.cts +22 -0
- package/dist/types-BRzHlhKC.d.cts +14 -0
- package/dist/types-BRzHlhKC.d.ts +14 -0
- package/dist/types-BrSfFSpW.d.cts +158 -0
- package/dist/types-CX4cLd7M.d.ts +152 -0
- package/dist/types-CjZ7g_7v.d.ts +442 -0
- package/dist/types-DDOSfrih.d.cts +442 -0
- package/dist/types-D_3mEv2y.d.ts +158 -0
- package/dist/types-a5rAxC92.d.cts +152 -0
- package/package.json +201 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { buildSqliteNodeIndexBuilders, buildSqliteEdgeIndexBuilders } from './chunk-VXRVGFCI.js';
|
|
2
|
+
import { sqliteTable, text, integer, primaryKey, index, blob } from 'drizzle-orm/sqlite-core';
|
|
3
|
+
|
|
4
|
+
var DEFAULT_TABLE_NAMES = {
|
|
5
|
+
nodes: "typegraph_nodes",
|
|
6
|
+
edges: "typegraph_edges",
|
|
7
|
+
uniques: "typegraph_node_uniques",
|
|
8
|
+
schemaVersions: "typegraph_schema_versions",
|
|
9
|
+
embeddings: "typegraph_node_embeddings"
|
|
10
|
+
};
|
|
11
|
+
function createSqliteTables(names = {}, options = {}) {
|
|
12
|
+
const n = { ...DEFAULT_TABLE_NAMES, ...names };
|
|
13
|
+
const indexes = options.indexes ?? [];
|
|
14
|
+
const nodes2 = sqliteTable(
|
|
15
|
+
n.nodes,
|
|
16
|
+
{
|
|
17
|
+
graphId: text("graph_id").notNull(),
|
|
18
|
+
kind: text("kind").notNull(),
|
|
19
|
+
id: text("id").notNull(),
|
|
20
|
+
props: text("props").notNull(),
|
|
21
|
+
version: integer("version").notNull().default(1),
|
|
22
|
+
validFrom: text("valid_from"),
|
|
23
|
+
validTo: text("valid_to"),
|
|
24
|
+
createdAt: text("created_at").notNull(),
|
|
25
|
+
updatedAt: text("updated_at").notNull(),
|
|
26
|
+
deletedAt: text("deleted_at")
|
|
27
|
+
},
|
|
28
|
+
(t) => [
|
|
29
|
+
primaryKey({ columns: [t.graphId, t.kind, t.id] }),
|
|
30
|
+
index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),
|
|
31
|
+
index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),
|
|
32
|
+
index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),
|
|
33
|
+
...buildSqliteNodeIndexBuilders(t, indexes)
|
|
34
|
+
]
|
|
35
|
+
);
|
|
36
|
+
const edges2 = sqliteTable(
|
|
37
|
+
n.edges,
|
|
38
|
+
{
|
|
39
|
+
graphId: text("graph_id").notNull(),
|
|
40
|
+
id: text("id").notNull(),
|
|
41
|
+
kind: text("kind").notNull(),
|
|
42
|
+
fromKind: text("from_kind").notNull(),
|
|
43
|
+
fromId: text("from_id").notNull(),
|
|
44
|
+
toKind: text("to_kind").notNull(),
|
|
45
|
+
toId: text("to_id").notNull(),
|
|
46
|
+
props: text("props").notNull(),
|
|
47
|
+
validFrom: text("valid_from"),
|
|
48
|
+
validTo: text("valid_to"),
|
|
49
|
+
createdAt: text("created_at").notNull(),
|
|
50
|
+
updatedAt: text("updated_at").notNull(),
|
|
51
|
+
deletedAt: text("deleted_at")
|
|
52
|
+
},
|
|
53
|
+
(t) => [
|
|
54
|
+
primaryKey({ columns: [t.graphId, t.id] }),
|
|
55
|
+
index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),
|
|
56
|
+
index(`${n.edges}_from_idx`).on(t.graphId, t.fromKind, t.fromId),
|
|
57
|
+
index(`${n.edges}_to_idx`).on(t.graphId, t.toKind, t.toId),
|
|
58
|
+
index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),
|
|
59
|
+
index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),
|
|
60
|
+
index(`${n.edges}_cardinality_idx`).on(
|
|
61
|
+
t.graphId,
|
|
62
|
+
t.kind,
|
|
63
|
+
t.fromKind,
|
|
64
|
+
t.fromId,
|
|
65
|
+
t.validTo
|
|
66
|
+
),
|
|
67
|
+
...buildSqliteEdgeIndexBuilders(t, indexes)
|
|
68
|
+
]
|
|
69
|
+
);
|
|
70
|
+
const uniques2 = sqliteTable(
|
|
71
|
+
n.uniques,
|
|
72
|
+
{
|
|
73
|
+
graphId: text("graph_id").notNull(),
|
|
74
|
+
nodeKind: text("node_kind").notNull(),
|
|
75
|
+
constraintName: text("constraint_name").notNull(),
|
|
76
|
+
key: text("key").notNull(),
|
|
77
|
+
nodeId: text("node_id").notNull(),
|
|
78
|
+
concreteKind: text("concrete_kind").notNull(),
|
|
79
|
+
deletedAt: text("deleted_at")
|
|
80
|
+
},
|
|
81
|
+
(t) => [
|
|
82
|
+
primaryKey({
|
|
83
|
+
columns: [t.graphId, t.nodeKind, t.constraintName, t.key]
|
|
84
|
+
}),
|
|
85
|
+
index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId)
|
|
86
|
+
]
|
|
87
|
+
);
|
|
88
|
+
const schemaVersions2 = sqliteTable(
|
|
89
|
+
n.schemaVersions,
|
|
90
|
+
{
|
|
91
|
+
graphId: text("graph_id").notNull(),
|
|
92
|
+
version: integer("version").notNull(),
|
|
93
|
+
schemaHash: text("schema_hash").notNull(),
|
|
94
|
+
schemaDoc: text("schema_doc").notNull(),
|
|
95
|
+
createdAt: text("created_at").notNull(),
|
|
96
|
+
isActive: integer("is_active", { mode: "boolean" }).notNull().default(false)
|
|
97
|
+
},
|
|
98
|
+
(t) => [
|
|
99
|
+
primaryKey({ columns: [t.graphId, t.version] }),
|
|
100
|
+
index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive)
|
|
101
|
+
]
|
|
102
|
+
);
|
|
103
|
+
const embeddings2 = sqliteTable(
|
|
104
|
+
n.embeddings,
|
|
105
|
+
{
|
|
106
|
+
graphId: text("graph_id").notNull(),
|
|
107
|
+
nodeKind: text("node_kind").notNull(),
|
|
108
|
+
nodeId: text("node_id").notNull(),
|
|
109
|
+
fieldPath: text("field_path").notNull(),
|
|
110
|
+
/**
|
|
111
|
+
* Embedding vector.
|
|
112
|
+
* Stored as BLOB for sqlite-vec binary format, or JSON text for fallback.
|
|
113
|
+
* For sqlite-vec: use vec_f32() to convert JSON array to binary.
|
|
114
|
+
*/
|
|
115
|
+
embedding: blob("embedding", { mode: "buffer" }).notNull(),
|
|
116
|
+
/** Number of dimensions (for validation) */
|
|
117
|
+
dimensions: integer("dimensions").notNull(),
|
|
118
|
+
createdAt: text("created_at").notNull(),
|
|
119
|
+
updatedAt: text("updated_at").notNull()
|
|
120
|
+
},
|
|
121
|
+
(t) => [
|
|
122
|
+
primaryKey({
|
|
123
|
+
columns: [t.graphId, t.nodeKind, t.nodeId, t.fieldPath]
|
|
124
|
+
}),
|
|
125
|
+
// Index for looking up embeddings by node
|
|
126
|
+
index(`${n.embeddings}_node_idx`).on(
|
|
127
|
+
t.graphId,
|
|
128
|
+
t.nodeKind,
|
|
129
|
+
t.nodeId
|
|
130
|
+
),
|
|
131
|
+
// Index for filtering by kind and field (used in vector search)
|
|
132
|
+
index(`${n.embeddings}_kind_field_idx`).on(
|
|
133
|
+
t.graphId,
|
|
134
|
+
t.nodeKind,
|
|
135
|
+
t.fieldPath
|
|
136
|
+
)
|
|
137
|
+
]
|
|
138
|
+
);
|
|
139
|
+
return { nodes: nodes2, edges: edges2, uniques: uniques2, schemaVersions: schemaVersions2, embeddings: embeddings2 };
|
|
140
|
+
}
|
|
141
|
+
var tables = createSqliteTables();
|
|
142
|
+
var { nodes, edges, uniques, schemaVersions, embeddings } = tables;
|
|
143
|
+
|
|
144
|
+
export { createSqliteTables, edges, embeddings, nodes, schemaVersions, tables, uniques };
|
|
145
|
+
//# sourceMappingURL=chunk-2QHQ2C4P.js.map
|
|
146
|
+
//# sourceMappingURL=chunk-2QHQ2C4P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/backend/drizzle/schema/sqlite.ts"],"names":["nodes","edges","uniques","schemaVersions","embeddings"],"mappings":"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","file":"chunk-2QHQ2C4P.js","sourcesContent":["/**\n * Drizzle SQLite schema for TypeGraph.\n *\n * Provides table definitions that can be customized via the factory function.\n * Users import these tables into their Drizzle schema and use drizzle-kit\n * for migrations.\n *\n * @example\n * ```typescript\n * // Default table names\n * import { tables } from \"@nicia-ai/typegraph/drizzle/schema/sqlite\";\n *\n * // Custom table names\n * import { createSqliteTables } from \"@nicia-ai/typegraph/drizzle/schema/sqlite\";\n * const tables = createSqliteTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport {\n blob,\n index,\n integer,\n primaryKey,\n sqliteTable,\n text,\n} from \"drizzle-orm/sqlite-core\";\n\nimport {\n buildSqliteEdgeIndexBuilders,\n buildSqliteNodeIndexBuilders,\n type TypeGraphIndex,\n} from \"../../../indexes\";\n\n/**\n * Table name configuration.\n */\nexport type TableNames = Readonly<{\n nodes: string;\n edges: string;\n uniques: string;\n schemaVersions: string;\n embeddings: string;\n}>;\n\nexport type CreateSqliteTablesOptions = Readonly<{\n /**\n * Additional TypeGraph indexes to include in the Drizzle schema.\n *\n * These become first-class Drizzle indexes, so drizzle-kit migrations will\n * pick them up automatically.\n */\n indexes?: readonly TypeGraphIndex[] | undefined;\n}>;\n\nconst DEFAULT_TABLE_NAMES: TableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n uniques: \"typegraph_node_uniques\",\n schemaVersions: \"typegraph_schema_versions\",\n embeddings: \"typegraph_node_embeddings\",\n};\n\n/**\n * Creates SQLite table definitions with customizable table names.\n * Index names are derived from table names.\n */\nexport function createSqliteTables(\n names: Partial<TableNames> = {},\n options: CreateSqliteTablesOptions = {},\n) {\n const n: TableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n const indexes = options.indexes ?? [];\n\n const nodes = sqliteTable(\n n.nodes,\n {\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: text(\"props\").notNull(),\n version: integer(\"version\").notNull().default(1),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.kind, t.id] }),\n index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n ...buildSqliteNodeIndexBuilders(t, indexes),\n ],\n );\n\n const edges = sqliteTable(\n n.edges,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n kind: text(\"kind\").notNull(),\n fromKind: text(\"from_kind\").notNull(),\n fromId: text(\"from_id\").notNull(),\n toKind: text(\"to_kind\").notNull(),\n toId: text(\"to_id\").notNull(),\n props: text(\"props\").notNull(),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.edges}_from_idx`).on(t.graphId, t.fromKind, t.fromId),\n index(`${n.edges}_to_idx`).on(t.graphId, t.toKind, t.toId),\n index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n index(`${n.edges}_cardinality_idx`).on(\n t.graphId,\n t.kind,\n t.fromKind,\n t.fromId,\n t.validTo,\n ),\n ...buildSqliteEdgeIndexBuilders(t, indexes),\n ],\n );\n\n const uniques = sqliteTable(\n n.uniques,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n constraintName: text(\"constraint_name\").notNull(),\n key: text(\"key\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n concreteKind: text(\"concrete_kind\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.constraintName, t.key],\n }),\n index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId),\n ],\n );\n\n const schemaVersions = sqliteTable(\n n.schemaVersions,\n {\n graphId: text(\"graph_id\").notNull(),\n version: integer(\"version\").notNull(),\n schemaHash: text(\"schema_hash\").notNull(),\n schemaDoc: text(\"schema_doc\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n isActive: integer(\"is_active\", { mode: \"boolean\" })\n .notNull()\n .default(false),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.version] }),\n index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive),\n ],\n );\n\n /**\n * Embeddings table for vector search.\n *\n * Stores embeddings as BLOB (for sqlite-vec binary format) or as JSON text.\n * When sqlite-vec extension is loaded, the BLOB column can be used with\n * vec_f32() for similarity operations.\n */\n const embeddings = sqliteTable(\n n.embeddings,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n fieldPath: text(\"field_path\").notNull(),\n /**\n * Embedding vector.\n * Stored as BLOB for sqlite-vec binary format, or JSON text for fallback.\n * For sqlite-vec: use vec_f32() to convert JSON array to binary.\n */\n embedding: blob(\"embedding\", { mode: \"buffer\" }).notNull(),\n /** Number of dimensions (for validation) */\n dimensions: integer(\"dimensions\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.nodeId, t.fieldPath],\n }),\n // Index for looking up embeddings by node\n index(`${n.embeddings}_node_idx`).on(\n t.graphId,\n t.nodeKind,\n t.nodeId,\n ),\n // Index for filtering by kind and field (used in vector search)\n index(`${n.embeddings}_kind_field_idx`).on(\n t.graphId,\n t.nodeKind,\n t.fieldPath,\n ),\n ],\n );\n\n return { nodes, edges, uniques, schemaVersions, embeddings } as const;\n}\n\n/**\n * Default tables with standard TypeGraph table names.\n */\nexport const tables = createSqliteTables();\n\n/**\n * Convenience exports for default tables.\n */\nexport const { nodes, edges, uniques, schemaVersions, embeddings } = tables;\n\n/**\n * Type representing the tables object returned by createSqliteTables.\n */\nexport type SqliteTables = ReturnType<typeof createSqliteTables>;\n\n/**\n * Type for nodes table.\n */\nexport type NodesTable = SqliteTables[\"nodes\"];\n\n/**\n * Type for edges table.\n */\nexport type EdgesTable = SqliteTables[\"edges\"];\n\n/**\n * Type for uniques table.\n */\nexport type UniquesTable = SqliteTables[\"uniques\"];\n\n/**\n * Type for schema versions table.\n */\nexport type SchemaVersionsTable = SqliteTables[\"schemaVersions\"];\n\n/**\n * Type for embeddings table.\n */\nexport type EmbeddingsTable = SqliteTables[\"embeddings\"];\n"]}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { D1_CAPABILITIES, SQLITE_CAPABILITIES, buildSetActiveSchema, buildGetSchemaVersion, buildInsertSchema, buildGetActiveSchema, buildCheckUnique, buildDeleteUnique, buildInsertUnique, buildCountEdgesByKind, buildFindEdgesByKind, buildCountNodesByKind, buildFindNodesByKind, buildFindEdgesConnectedTo, buildEdgeExistsBetween, buildCountEdgesFrom, buildHardDeleteEdge, buildDeleteEdge, buildUpdateEdge, buildGetEdge, buildInsertEdge, buildHardDeleteUniquesByNode, buildHardDeleteEmbeddingsByNode, buildHardDeleteNode, buildDeleteNode, buildUpdateNode, buildGetNode, buildInsertNode } from './chunk-RYT4H46I.js';
|
|
2
|
+
import { tables } from './chunk-2QHQ2C4P.js';
|
|
3
|
+
import { ConfigurationError, UniquenessError } from './chunk-JKTO7TW3.js';
|
|
4
|
+
import { sql } from 'drizzle-orm';
|
|
5
|
+
|
|
6
|
+
function nowIso() {
|
|
7
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
8
|
+
}
|
|
9
|
+
function nullToUndefined(value) {
|
|
10
|
+
return value ?? void 0;
|
|
11
|
+
}
|
|
12
|
+
function toNodeRow(row) {
|
|
13
|
+
return {
|
|
14
|
+
graph_id: row.graph_id,
|
|
15
|
+
kind: row.kind,
|
|
16
|
+
id: row.id,
|
|
17
|
+
props: row.props,
|
|
18
|
+
version: row.version,
|
|
19
|
+
valid_from: nullToUndefined(row.valid_from),
|
|
20
|
+
valid_to: nullToUndefined(row.valid_to),
|
|
21
|
+
created_at: row.created_at,
|
|
22
|
+
updated_at: row.updated_at,
|
|
23
|
+
deleted_at: nullToUndefined(row.deleted_at)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function toEdgeRow(row) {
|
|
27
|
+
return {
|
|
28
|
+
graph_id: row.graph_id,
|
|
29
|
+
id: row.id,
|
|
30
|
+
kind: row.kind,
|
|
31
|
+
from_kind: row.from_kind,
|
|
32
|
+
from_id: row.from_id,
|
|
33
|
+
to_kind: row.to_kind,
|
|
34
|
+
to_id: row.to_id,
|
|
35
|
+
props: row.props,
|
|
36
|
+
valid_from: nullToUndefined(row.valid_from),
|
|
37
|
+
valid_to: nullToUndefined(row.valid_to),
|
|
38
|
+
created_at: row.created_at,
|
|
39
|
+
updated_at: row.updated_at,
|
|
40
|
+
deleted_at: nullToUndefined(row.deleted_at)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function toUniqueRow(row) {
|
|
44
|
+
return {
|
|
45
|
+
graph_id: row.graph_id,
|
|
46
|
+
node_kind: row.node_kind,
|
|
47
|
+
constraint_name: row.constraint_name,
|
|
48
|
+
key: row.key,
|
|
49
|
+
node_id: row.node_id,
|
|
50
|
+
concrete_kind: row.concrete_kind,
|
|
51
|
+
deleted_at: nullToUndefined(row.deleted_at)
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function toSchemaVersionRow(row) {
|
|
55
|
+
const isActiveValue = row.is_active;
|
|
56
|
+
const isActive = isActiveValue === 1 || isActiveValue === "1" || isActiveValue === true;
|
|
57
|
+
return {
|
|
58
|
+
graph_id: row.graph_id,
|
|
59
|
+
version: row.version,
|
|
60
|
+
schema_hash: row.schema_hash,
|
|
61
|
+
schema_doc: row.schema_doc,
|
|
62
|
+
created_at: row.created_at,
|
|
63
|
+
is_active: isActive
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function getSessionName(db) {
|
|
67
|
+
const dbAny = db;
|
|
68
|
+
if (dbAny.session?.constructor?.name) {
|
|
69
|
+
return dbAny.session.constructor.name;
|
|
70
|
+
}
|
|
71
|
+
if (dbAny._?.session?.constructor?.name) {
|
|
72
|
+
return dbAny._.session.constructor.name;
|
|
73
|
+
}
|
|
74
|
+
return void 0;
|
|
75
|
+
}
|
|
76
|
+
function isD1Database(db) {
|
|
77
|
+
return getSessionName(db) === "SQLiteD1Session";
|
|
78
|
+
}
|
|
79
|
+
function isSyncDatabase(db) {
|
|
80
|
+
const sessionName = getSessionName(db);
|
|
81
|
+
return sessionName === "BetterSQLiteSession" || sessionName === "BunSQLiteSession";
|
|
82
|
+
}
|
|
83
|
+
function createSqliteBackend(db, options = {}) {
|
|
84
|
+
const tables2 = options.tables ?? tables;
|
|
85
|
+
const isD1 = isD1Database(db);
|
|
86
|
+
const isSync = isSyncDatabase(db);
|
|
87
|
+
async function execGet(query) {
|
|
88
|
+
const result = db.get(query);
|
|
89
|
+
return result instanceof Promise ? await result : result;
|
|
90
|
+
}
|
|
91
|
+
async function execAll(query) {
|
|
92
|
+
const result = db.all(query);
|
|
93
|
+
return result instanceof Promise ? await result : result;
|
|
94
|
+
}
|
|
95
|
+
async function execRun(query) {
|
|
96
|
+
const result = db.run(query);
|
|
97
|
+
if (result instanceof Promise) await result;
|
|
98
|
+
}
|
|
99
|
+
const backend = {
|
|
100
|
+
dialect: "sqlite",
|
|
101
|
+
capabilities: isD1 ? D1_CAPABILITIES : SQLITE_CAPABILITIES,
|
|
102
|
+
// === Node Operations ===
|
|
103
|
+
async insertNode(params) {
|
|
104
|
+
const timestamp = nowIso();
|
|
105
|
+
const query = buildInsertNode(tables2, params, timestamp);
|
|
106
|
+
const row = await execGet(query);
|
|
107
|
+
if (!row) throw new Error("Insert node failed: no row returned");
|
|
108
|
+
return toNodeRow(row);
|
|
109
|
+
},
|
|
110
|
+
async getNode(graphId, kind, id) {
|
|
111
|
+
const query = buildGetNode(tables2, graphId, kind, id);
|
|
112
|
+
const row = await execGet(query);
|
|
113
|
+
return row ? toNodeRow(row) : void 0;
|
|
114
|
+
},
|
|
115
|
+
async updateNode(params) {
|
|
116
|
+
const timestamp = nowIso();
|
|
117
|
+
const query = buildUpdateNode(tables2, params, timestamp);
|
|
118
|
+
const row = await execGet(query);
|
|
119
|
+
if (!row) throw new Error("Update node failed: no row returned");
|
|
120
|
+
return toNodeRow(row);
|
|
121
|
+
},
|
|
122
|
+
async deleteNode(params) {
|
|
123
|
+
const timestamp = nowIso();
|
|
124
|
+
const query = buildDeleteNode(tables2, params, timestamp);
|
|
125
|
+
await execRun(query);
|
|
126
|
+
},
|
|
127
|
+
async hardDeleteNode(params) {
|
|
128
|
+
const deleteUniquesQuery = buildHardDeleteUniquesByNode(
|
|
129
|
+
tables2,
|
|
130
|
+
params.graphId,
|
|
131
|
+
params.id
|
|
132
|
+
);
|
|
133
|
+
await execRun(deleteUniquesQuery);
|
|
134
|
+
const deleteEmbeddingsQuery = buildHardDeleteEmbeddingsByNode(
|
|
135
|
+
tables2,
|
|
136
|
+
params.graphId,
|
|
137
|
+
params.kind,
|
|
138
|
+
params.id
|
|
139
|
+
);
|
|
140
|
+
await execRun(deleteEmbeddingsQuery);
|
|
141
|
+
const query = buildHardDeleteNode(tables2, params);
|
|
142
|
+
await execRun(query);
|
|
143
|
+
},
|
|
144
|
+
// === Edge Operations ===
|
|
145
|
+
async insertEdge(params) {
|
|
146
|
+
const timestamp = nowIso();
|
|
147
|
+
const query = buildInsertEdge(tables2, params, timestamp);
|
|
148
|
+
const row = await execGet(query);
|
|
149
|
+
if (!row) throw new Error("Insert edge failed: no row returned");
|
|
150
|
+
return toEdgeRow(row);
|
|
151
|
+
},
|
|
152
|
+
async getEdge(graphId, id) {
|
|
153
|
+
const query = buildGetEdge(tables2, graphId, id);
|
|
154
|
+
const row = await execGet(query);
|
|
155
|
+
return row ? toEdgeRow(row) : void 0;
|
|
156
|
+
},
|
|
157
|
+
async updateEdge(params) {
|
|
158
|
+
const timestamp = nowIso();
|
|
159
|
+
const query = buildUpdateEdge(tables2, params, timestamp);
|
|
160
|
+
const row = await execGet(query);
|
|
161
|
+
if (!row) throw new Error("Update edge failed: no row returned");
|
|
162
|
+
return toEdgeRow(row);
|
|
163
|
+
},
|
|
164
|
+
async deleteEdge(params) {
|
|
165
|
+
const timestamp = nowIso();
|
|
166
|
+
const query = buildDeleteEdge(tables2, params, timestamp);
|
|
167
|
+
await execRun(query);
|
|
168
|
+
},
|
|
169
|
+
async hardDeleteEdge(params) {
|
|
170
|
+
const query = buildHardDeleteEdge(tables2, params);
|
|
171
|
+
await execRun(query);
|
|
172
|
+
},
|
|
173
|
+
// === Edge Cardinality Operations ===
|
|
174
|
+
async countEdgesFrom(params) {
|
|
175
|
+
const query = buildCountEdgesFrom(tables2, params);
|
|
176
|
+
const row = await execGet(query);
|
|
177
|
+
return row?.count ?? 0;
|
|
178
|
+
},
|
|
179
|
+
async edgeExistsBetween(params) {
|
|
180
|
+
const query = buildEdgeExistsBetween(tables2, params);
|
|
181
|
+
const row = await execGet(query);
|
|
182
|
+
return row !== void 0;
|
|
183
|
+
},
|
|
184
|
+
// === Edge Query Operations ===
|
|
185
|
+
async findEdgesConnectedTo(params) {
|
|
186
|
+
const query = buildFindEdgesConnectedTo(tables2, params);
|
|
187
|
+
const rows = await execAll(query);
|
|
188
|
+
return rows.map((row) => toEdgeRow(row));
|
|
189
|
+
},
|
|
190
|
+
// === Collection Query Operations ===
|
|
191
|
+
async findNodesByKind(params) {
|
|
192
|
+
const query = buildFindNodesByKind(tables2, params);
|
|
193
|
+
const rows = await execAll(query);
|
|
194
|
+
return rows.map((row) => toNodeRow(row));
|
|
195
|
+
},
|
|
196
|
+
async countNodesByKind(params) {
|
|
197
|
+
const query = buildCountNodesByKind(tables2, params);
|
|
198
|
+
const row = await execGet(query);
|
|
199
|
+
return row?.count ?? 0;
|
|
200
|
+
},
|
|
201
|
+
async findEdgesByKind(params) {
|
|
202
|
+
const query = buildFindEdgesByKind(tables2, params);
|
|
203
|
+
const rows = await execAll(query);
|
|
204
|
+
return rows.map((row) => toEdgeRow(row));
|
|
205
|
+
},
|
|
206
|
+
async countEdgesByKind(params) {
|
|
207
|
+
const query = buildCountEdgesByKind(tables2, params);
|
|
208
|
+
const row = await execGet(query);
|
|
209
|
+
return row?.count ?? 0;
|
|
210
|
+
},
|
|
211
|
+
// === Unique Constraint Operations ===
|
|
212
|
+
async insertUnique(params) {
|
|
213
|
+
const query = buildInsertUnique(tables2, "sqlite", params);
|
|
214
|
+
const result = await execGet(query);
|
|
215
|
+
if (result && result.node_id !== params.nodeId) {
|
|
216
|
+
throw new UniquenessError({
|
|
217
|
+
constraintName: params.constraintName,
|
|
218
|
+
kind: params.nodeKind,
|
|
219
|
+
existingId: result.node_id,
|
|
220
|
+
newId: params.nodeId,
|
|
221
|
+
fields: []
|
|
222
|
+
// Fields not available at this level
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
async deleteUnique(params) {
|
|
227
|
+
const timestamp = nowIso();
|
|
228
|
+
const query = buildDeleteUnique(tables2, params, timestamp);
|
|
229
|
+
await execRun(query);
|
|
230
|
+
},
|
|
231
|
+
async checkUnique(params) {
|
|
232
|
+
const query = buildCheckUnique(tables2, params);
|
|
233
|
+
const row = await execGet(query);
|
|
234
|
+
return row ? toUniqueRow(row) : void 0;
|
|
235
|
+
},
|
|
236
|
+
// === Schema Operations ===
|
|
237
|
+
async getActiveSchema(graphId) {
|
|
238
|
+
const query = buildGetActiveSchema(tables2, graphId);
|
|
239
|
+
const row = await execGet(query);
|
|
240
|
+
return row ? toSchemaVersionRow(row) : void 0;
|
|
241
|
+
},
|
|
242
|
+
async insertSchema(params) {
|
|
243
|
+
const timestamp = nowIso();
|
|
244
|
+
const query = buildInsertSchema(tables2, params, timestamp);
|
|
245
|
+
const row = await execGet(query);
|
|
246
|
+
if (!row) throw new Error("Insert schema failed: no row returned");
|
|
247
|
+
return toSchemaVersionRow(row);
|
|
248
|
+
},
|
|
249
|
+
async getSchemaVersion(graphId, version) {
|
|
250
|
+
const query = buildGetSchemaVersion(tables2, graphId, version);
|
|
251
|
+
const row = await execGet(query);
|
|
252
|
+
return row ? toSchemaVersionRow(row) : void 0;
|
|
253
|
+
},
|
|
254
|
+
async setActiveSchema(graphId, version) {
|
|
255
|
+
const queries = buildSetActiveSchema(tables2, graphId, version);
|
|
256
|
+
await execRun(queries.deactivateAll);
|
|
257
|
+
await execRun(queries.activateVersion);
|
|
258
|
+
},
|
|
259
|
+
// === Query Execution ===
|
|
260
|
+
async execute(query) {
|
|
261
|
+
return execAll(query);
|
|
262
|
+
},
|
|
263
|
+
// === Transaction ===
|
|
264
|
+
async transaction(fn, _options) {
|
|
265
|
+
if (isD1) {
|
|
266
|
+
throw new ConfigurationError(
|
|
267
|
+
"Cloudflare D1 does not support atomic transactions. Operations within a transaction are not rolled back on failure. Use backend.capabilities.transactions to check for transaction support, or use individual operations with manual error handling.",
|
|
268
|
+
{
|
|
269
|
+
backend: "D1",
|
|
270
|
+
capability: "transactions",
|
|
271
|
+
supportsTransactions: false
|
|
272
|
+
}
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
if (isSync) {
|
|
276
|
+
const txBackend = createTransactionBackend(db, tables2);
|
|
277
|
+
db.run(sql`BEGIN`);
|
|
278
|
+
try {
|
|
279
|
+
const result = await fn(txBackend);
|
|
280
|
+
db.run(sql`COMMIT`);
|
|
281
|
+
return result;
|
|
282
|
+
} catch (error) {
|
|
283
|
+
db.run(sql`ROLLBACK`);
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return db.transaction(async (tx) => {
|
|
288
|
+
const txBackend = createTransactionBackend(tx, tables2);
|
|
289
|
+
return fn(txBackend);
|
|
290
|
+
});
|
|
291
|
+
},
|
|
292
|
+
// === Lifecycle ===
|
|
293
|
+
async close() {
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
return backend;
|
|
297
|
+
}
|
|
298
|
+
function createTransactionBackend(tx, tables2) {
|
|
299
|
+
const txBackend = createSqliteBackend(tx, { tables: tables2 });
|
|
300
|
+
const { transaction: _tx, close: _close, ...ops } = txBackend;
|
|
301
|
+
return ops;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export { createSqliteBackend };
|
|
305
|
+
//# sourceMappingURL=chunk-3A5TKOEJ.js.map
|
|
306
|
+
//# sourceMappingURL=chunk-3A5TKOEJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/backend/drizzle/sqlite.ts"],"names":["tables"],"mappings":"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","file":"chunk-3A5TKOEJ.js","sourcesContent":["/**\n * SQLite backend adapter for TypeGraph.\n *\n * Works with any Drizzle SQLite database instance:\n * - better-sqlite3\n * - libsql / Turso\n * - Cloudflare D1\n * - bun:sqlite\n * - sql.js\n *\n * @example\n * ```typescript\n * import { drizzle } from \"drizzle-orm/better-sqlite3\";\n * import Database from \"better-sqlite3\";\n * import { createSqliteBackend } from \"@nicia-ai/typegraph/drizzle/sqlite\";\n * import { tables } from \"@nicia-ai/typegraph/drizzle/schema/sqlite\";\n *\n * const sqlite = new Database(\"app.db\");\n * const db = drizzle(sqlite);\n * const backend = createSqliteBackend(db, { tables });\n * ```\n */\nimport { type SQL,sql } from \"drizzle-orm\";\nimport { type BaseSQLiteDatabase } from \"drizzle-orm/sqlite-core\";\n\nimport { ConfigurationError, UniquenessError } from \"../../errors\";\nimport {\n type CheckUniqueParams,\n type CountEdgesByKindParams,\n type CountEdgesFromParams,\n type CountNodesByKindParams,\n D1_CAPABILITIES,\n type DeleteEdgeParams,\n type DeleteNodeParams,\n type DeleteUniqueParams,\n type EdgeExistsBetweenParams,\n type EdgeRow,\n type FindEdgesByKindParams,\n type FindEdgesConnectedToParams,\n type FindNodesByKindParams,\n type GraphBackend,\n type HardDeleteEdgeParams,\n type HardDeleteNodeParams,\n type InsertEdgeParams,\n type InsertNodeParams,\n type InsertSchemaParams,\n type InsertUniqueParams,\n type NodeRow,\n type SchemaVersionRow,\n SQLITE_CAPABILITIES,\n type TransactionBackend,\n type TransactionOptions,\n type UniqueRow,\n type UpdateEdgeParams,\n type UpdateNodeParams,\n} from \"../types\";\nimport * as ops from \"./operations\";\nimport { type SqliteTables,tables as defaultTables } from \"./schema/sqlite\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Options for creating a SQLite backend.\n */\nexport type SqliteBackendOptions = Readonly<{\n /**\n * Custom table definitions. Use createSqliteTables() to customize table names.\n * Defaults to standard TypeGraph table names.\n */\n tables?: SqliteTables;\n}>;\n\n/**\n * Any Drizzle SQLite database instance.\n */\ntype AnySqliteDatabase = BaseSQLiteDatabase<\"sync\" | \"async\", unknown>;\n\n// ============================================================\n// Utilities\n// ============================================================\n\n/**\n * Gets the current timestamp in ISO format.\n */\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\n/**\n * Converts null to undefined.\n */\nfunction nullToUndefined<T>(value: T | null): T | undefined {\n return value ?? undefined;\n}\n\n/**\n * Converts a database row to NodeRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toNodeRow(row: Record<string, unknown>): NodeRow {\n return {\n graph_id: row.graph_id as string,\n kind: row.kind as string,\n id: row.id as string,\n props: row.props as string,\n version: row.version as number,\n valid_from: nullToUndefined(row.valid_from as string | null),\n valid_to: nullToUndefined(row.valid_to as string | null),\n created_at: row.created_at as string,\n updated_at: row.updated_at as string,\n deleted_at: nullToUndefined(row.deleted_at as string | null),\n };\n}\n\n/**\n * Converts a database row to EdgeRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toEdgeRow(row: Record<string, unknown>): EdgeRow {\n return {\n graph_id: row.graph_id as string,\n id: row.id as string,\n kind: row.kind as string,\n from_kind: row.from_kind as string,\n from_id: row.from_id as string,\n to_kind: row.to_kind as string,\n to_id: row.to_id as string,\n props: row.props as string,\n valid_from: nullToUndefined(row.valid_from as string | null),\n valid_to: nullToUndefined(row.valid_to as string | null),\n created_at: row.created_at as string,\n updated_at: row.updated_at as string,\n deleted_at: nullToUndefined(row.deleted_at as string | null),\n };\n}\n\n/**\n * Converts a database row to UniqueRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toUniqueRow(row: Record<string, unknown>): UniqueRow {\n return {\n graph_id: row.graph_id as string,\n node_kind: row.node_kind as string,\n constraint_name: row.constraint_name as string,\n key: row.key as string,\n node_id: row.node_id as string,\n concrete_kind: row.concrete_kind as string,\n deleted_at: nullToUndefined(row.deleted_at as string | null),\n };\n}\n\n/**\n * Converts a database row to SchemaVersionRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toSchemaVersionRow(row: Record<string, unknown>): SchemaVersionRow {\n // SQLite returns is_active as number (0 or 1) or string ('0' or '1')\n // Boolean('0') is true in JavaScript, so we need explicit conversion\n const isActiveValue = row.is_active;\n const isActive = isActiveValue === 1 || isActiveValue === \"1\" || isActiveValue === true;\n\n return {\n graph_id: row.graph_id as string,\n version: row.version as number,\n schema_hash: row.schema_hash as string,\n schema_doc: row.schema_doc as string,\n created_at: row.created_at as string,\n is_active: isActive,\n };\n}\n\n/**\n * Gets the session class name from a Drizzle database instance.\n */\nfunction getSessionName(db: AnySqliteDatabase): string | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dbAny: any = db;\n\n // Try db.session first (current Drizzle structure)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (dbAny.session?.constructor?.name) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return dbAny.session.constructor.name as string;\n }\n\n // Fallback to db._.session (older Drizzle structure)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (dbAny._?.session?.constructor?.name) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return dbAny._.session.constructor.name as string;\n }\n\n return undefined;\n}\n\n/**\n * Detects if the database is a D1 database (no transaction support).\n */\nfunction isD1Database(db: AnySqliteDatabase): boolean {\n return getSessionName(db) === \"SQLiteD1Session\";\n}\n\n/**\n * Detects if the database is a synchronous SQLite database (better-sqlite3, bun:sqlite).\n * These drivers don't support async transaction callbacks.\n */\nfunction isSyncDatabase(db: AnySqliteDatabase): boolean {\n const sessionName = getSessionName(db);\n // BetterSQLiteSession is better-sqlite3\n // BunSQLiteSession is bun:sqlite\n return sessionName === \"BetterSQLiteSession\" || sessionName === \"BunSQLiteSession\";\n}\n\n// ============================================================\n// Backend Factory\n// ============================================================\n\n/**\n * Creates a TypeGraph backend for SQLite databases.\n *\n * Works with any Drizzle SQLite instance regardless of the underlying driver.\n *\n * @param db - A Drizzle SQLite database instance\n * @param options - Backend configuration\n * @returns A GraphBackend implementation\n */\nexport function createSqliteBackend(\n db: AnySqliteDatabase,\n options: SqliteBackendOptions = {},\n): GraphBackend {\n const tables = options.tables ?? defaultTables;\n const isD1 = isD1Database(db);\n const isSync = isSyncDatabase(db);\n\n /**\n * Helper to execute a query and handle sync/async uniformly.\n */\n async function execGet<T>(query: SQL): Promise<T | undefined> {\n const result = db.get(query);\n return (result instanceof Promise ? await result : result) as T | undefined;\n }\n\n async function execAll<T>(query: SQL): Promise<T[]> {\n const result = db.all(query);\n return (result instanceof Promise ? await result : result) as T[];\n }\n\n async function execRun(query: SQL): Promise<void> {\n const result = db.run(query);\n if (result instanceof Promise) await result;\n }\n\n // Create the backend operations\n const backend: GraphBackend = {\n dialect: \"sqlite\",\n capabilities: isD1 ? D1_CAPABILITIES : SQLITE_CAPABILITIES,\n\n // === Node Operations ===\n\n async insertNode(params: InsertNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = ops.buildInsertNode(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Insert node failed: no row returned\");\n return toNodeRow(row);\n },\n\n async getNode(\n graphId: string,\n kind: string,\n id: string,\n ): Promise<NodeRow | undefined> {\n const query = ops.buildGetNode(tables, graphId, kind, id);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toNodeRow(row) : undefined;\n },\n\n async updateNode(params: UpdateNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = ops.buildUpdateNode(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Update node failed: no row returned\");\n return toNodeRow(row);\n },\n\n async deleteNode(params: DeleteNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = ops.buildDeleteNode(tables, params, timestamp);\n await execRun(query);\n },\n\n async hardDeleteNode(params: HardDeleteNodeParams): Promise<void> {\n // Delete associated uniqueness entries\n const deleteUniquesQuery = ops.buildHardDeleteUniquesByNode(\n tables,\n params.graphId,\n params.id,\n );\n await execRun(deleteUniquesQuery);\n\n // Delete associated embeddings (if embeddings table exists)\n const deleteEmbeddingsQuery = ops.buildHardDeleteEmbeddingsByNode(\n tables,\n params.graphId,\n params.kind,\n params.id,\n );\n await execRun(deleteEmbeddingsQuery);\n\n // Delete the node itself\n const query = ops.buildHardDeleteNode(tables, params);\n await execRun(query);\n },\n\n // === Edge Operations ===\n\n async insertEdge(params: InsertEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = ops.buildInsertEdge(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Insert edge failed: no row returned\");\n return toEdgeRow(row);\n },\n\n async getEdge(graphId: string, id: string): Promise<EdgeRow | undefined> {\n const query = ops.buildGetEdge(tables, graphId, id);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toEdgeRow(row) : undefined;\n },\n\n async updateEdge(params: UpdateEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = ops.buildUpdateEdge(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Update edge failed: no row returned\");\n return toEdgeRow(row);\n },\n\n async deleteEdge(params: DeleteEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = ops.buildDeleteEdge(tables, params, timestamp);\n await execRun(query);\n },\n\n async hardDeleteEdge(params: HardDeleteEdgeParams): Promise<void> {\n const query = ops.buildHardDeleteEdge(tables, params);\n await execRun(query);\n },\n\n // === Edge Cardinality Operations ===\n\n async countEdgesFrom(params: CountEdgesFromParams): Promise<number> {\n const query = ops.buildCountEdgesFrom(tables, params);\n const row = await execGet<{ count: number }>(query);\n return row?.count ?? 0;\n },\n\n async edgeExistsBetween(params: EdgeExistsBetweenParams): Promise<boolean> {\n const query = ops.buildEdgeExistsBetween(tables, params);\n const row = await execGet<Record<string, unknown>>(query);\n return row !== undefined;\n },\n\n // === Edge Query Operations ===\n\n async findEdgesConnectedTo(\n params: FindEdgesConnectedToParams,\n ): Promise<readonly EdgeRow[]> {\n const query = ops.buildFindEdgesConnectedTo(tables, params);\n const rows = await execAll<Record<string, unknown>>(query);\n return rows.map((row) => toEdgeRow(row));\n },\n\n // === Collection Query Operations ===\n\n async findNodesByKind(\n params: FindNodesByKindParams,\n ): Promise<readonly NodeRow[]> {\n const query = ops.buildFindNodesByKind(tables, params);\n const rows = await execAll<Record<string, unknown>>(query);\n return rows.map((row) => toNodeRow(row));\n },\n\n async countNodesByKind(params: CountNodesByKindParams): Promise<number> {\n const query = ops.buildCountNodesByKind(tables, params);\n const row = await execGet<{ count: number }>(query);\n return row?.count ?? 0;\n },\n\n async findEdgesByKind(\n params: FindEdgesByKindParams,\n ): Promise<readonly EdgeRow[]> {\n const query = ops.buildFindEdgesByKind(tables, params);\n const rows = await execAll<Record<string, unknown>>(query);\n return rows.map((row) => toEdgeRow(row));\n },\n\n async countEdgesByKind(params: CountEdgesByKindParams): Promise<number> {\n const query = ops.buildCountEdgesByKind(tables, params);\n const row = await execGet<{ count: number }>(query);\n return row?.count ?? 0;\n },\n\n // === Unique Constraint Operations ===\n\n async insertUnique(params: InsertUniqueParams): Promise<void> {\n const query = ops.buildInsertUnique(tables, \"sqlite\", params);\n const result = await execGet<{ node_id: string }>(query);\n\n // Check if the returned node_id matches our input\n // If different, another node holds this key (race condition or conflict)\n if (result && result.node_id !== params.nodeId) {\n throw new UniquenessError({\n constraintName: params.constraintName,\n kind: params.nodeKind,\n existingId: result.node_id,\n newId: params.nodeId,\n fields: [], // Fields not available at this level\n });\n }\n },\n\n async deleteUnique(params: DeleteUniqueParams): Promise<void> {\n const timestamp = nowIso();\n const query = ops.buildDeleteUnique(tables, params, timestamp);\n await execRun(query);\n },\n\n async checkUnique(\n params: CheckUniqueParams,\n ): Promise<UniqueRow | undefined> {\n const query = ops.buildCheckUnique(tables, params);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toUniqueRow(row) : undefined;\n },\n\n // === Schema Operations ===\n\n async getActiveSchema(\n graphId: string,\n ): Promise<SchemaVersionRow | undefined> {\n const query = ops.buildGetActiveSchema(tables, graphId);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toSchemaVersionRow(row) : undefined;\n },\n\n async insertSchema(params: InsertSchemaParams): Promise<SchemaVersionRow> {\n const timestamp = nowIso();\n const query = ops.buildInsertSchema(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Insert schema failed: no row returned\");\n return toSchemaVersionRow(row);\n },\n\n async getSchemaVersion(\n graphId: string,\n version: number,\n ): Promise<SchemaVersionRow | undefined> {\n const query = ops.buildGetSchemaVersion(tables, graphId, version);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toSchemaVersionRow(row) : undefined;\n },\n\n async setActiveSchema(graphId: string, version: number): Promise<void> {\n const queries = ops.buildSetActiveSchema(tables, graphId, version);\n await execRun(queries.deactivateAll);\n await execRun(queries.activateVersion);\n },\n\n // === Query Execution ===\n\n async execute<T>(query: SQL): Promise<readonly T[]> {\n return execAll<T>(query);\n },\n\n // === Transaction ===\n\n async transaction<T>(\n fn: (tx: TransactionBackend) => Promise<T>,\n _options?: TransactionOptions,\n ): Promise<T> {\n if (isD1) {\n // D1 doesn't support atomic transactions - operations are auto-committed.\n // This is a critical limitation that could cause data corruption if\n // a multi-step operation fails partway through.\n throw new ConfigurationError(\n \"Cloudflare D1 does not support atomic transactions. \" +\n \"Operations within a transaction are not rolled back on failure. \" +\n \"Use backend.capabilities.transactions to check for transaction support, \" +\n \"or use individual operations with manual error handling.\",\n {\n backend: \"D1\",\n capability: \"transactions\",\n supportsTransactions: false,\n },\n );\n }\n\n if (isSync) {\n // Synchronous drivers (better-sqlite3, bun:sqlite) don't support\n // async transaction callbacks. Use raw SQL BEGIN/COMMIT/ROLLBACK.\n const txBackend = createTransactionBackend(db, tables);\n\n // Begin transaction synchronously\n db.run(sql`BEGIN`);\n\n try {\n const result = await fn(txBackend);\n db.run(sql`COMMIT`);\n return result;\n } catch (error) {\n db.run(sql`ROLLBACK`);\n throw error;\n }\n }\n\n // Use Drizzle's transaction API for async drivers (libsql, etc.)\n return db.transaction(async (tx) => {\n const txBackend = createTransactionBackend(tx as AnySqliteDatabase, tables);\n return fn(txBackend);\n }) as Promise<T>;\n },\n\n // === Lifecycle ===\n\n async close(): Promise<void> {\n // Drizzle doesn't expose a close method\n // Users manage connection lifecycle themselves\n },\n };\n\n return backend;\n}\n\n/**\n * Creates a transaction backend from a Drizzle transaction.\n */\nfunction createTransactionBackend(\n tx: AnySqliteDatabase,\n tables: SqliteTables,\n): TransactionBackend {\n // Create a new backend using the transaction\n const txBackend = createSqliteBackend(tx, { tables });\n\n // Return without transaction and close methods\n const { transaction: _tx, close: _close, ...ops } = txBackend;\n void _tx;\n void _close;\n return ops;\n}\n\n// Re-export schema utilities\nexport type { SqliteTables, TableNames } from \"./schema/sqlite\";\nexport { createSqliteTables, tables } from \"./schema/sqlite\";\n"]}
|