@nicia-ai/typegraph 0.3.0 → 0.4.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/dist/backend/drizzle/index.cjs +6 -6
- package/dist/backend/drizzle/index.d.cts +1 -1
- package/dist/backend/drizzle/index.d.ts +1 -1
- package/dist/backend/drizzle/index.js +4 -4
- package/dist/backend/drizzle/postgres.cjs +4 -4
- package/dist/backend/drizzle/postgres.d.cts +2 -2
- package/dist/backend/drizzle/postgres.d.ts +2 -2
- package/dist/backend/drizzle/postgres.js +3 -3
- package/dist/backend/drizzle/sqlite.cjs +4 -4
- package/dist/backend/drizzle/sqlite.d.cts +1 -1
- package/dist/backend/drizzle/sqlite.d.ts +1 -1
- package/dist/backend/drizzle/sqlite.js +3 -3
- package/dist/backend/postgres/index.cjs +4 -4
- package/dist/backend/postgres/index.d.cts +1 -1
- package/dist/backend/postgres/index.d.ts +1 -1
- package/dist/backend/postgres/index.js +3 -3
- package/dist/backend/sqlite/index.cjs +6 -6
- package/dist/backend/sqlite/index.d.cts +1 -1
- package/dist/backend/sqlite/index.d.ts +1 -1
- package/dist/backend/sqlite/index.js +4 -4
- package/dist/{chunk-OYL2SGBD.cjs → chunk-44SXEVF4.cjs} +18 -2
- package/dist/chunk-44SXEVF4.cjs.map +1 -0
- package/dist/{chunk-SFY2PPOY.cjs → chunk-7RVSDXT3.cjs} +50 -10
- package/dist/chunk-7RVSDXT3.cjs.map +1 -0
- package/dist/{chunk-ZJHQZZT2.cjs → chunk-K2ROKOK3.cjs} +6 -6
- package/dist/{chunk-ZJHQZZT2.cjs.map → chunk-K2ROKOK3.cjs.map} +1 -1
- package/dist/{chunk-DD6ONEBN.cjs → chunk-LDM2AFKZ.cjs} +12 -12
- package/dist/{chunk-DD6ONEBN.cjs.map → chunk-LDM2AFKZ.cjs.map} +1 -1
- package/dist/{chunk-V7CS2MDB.cjs → chunk-LUARLSYT.cjs} +18 -18
- package/dist/chunk-LUARLSYT.cjs.map +1 -0
- package/dist/{chunk-NP4G4ZKM.js → chunk-M5SOQ7UV.js} +4 -4
- package/dist/{chunk-NP4G4ZKM.js.map → chunk-M5SOQ7UV.js.map} +1 -1
- package/dist/{chunk-CMHFS34N.cjs → chunk-NYDXJGA3.cjs} +16 -16
- package/dist/{chunk-CMHFS34N.cjs.map → chunk-NYDXJGA3.cjs.map} +1 -1
- package/dist/{chunk-WE5BKYNB.js → chunk-Q6PXIKRQ.js} +3 -3
- package/dist/chunk-Q6PXIKRQ.js.map +1 -0
- package/dist/{chunk-O5XPCJLF.js → chunk-SJ2QMDXY.js} +18 -3
- package/dist/chunk-SJ2QMDXY.js.map +1 -0
- package/dist/{chunk-XDTYTNYL.js → chunk-TGDFBLGS.js} +3 -3
- package/dist/{chunk-XDTYTNYL.js.map → chunk-TGDFBLGS.js.map} +1 -1
- package/dist/{chunk-F2BZSEFE.js → chunk-ZO2FRJ2U.js} +4 -4
- package/dist/{chunk-F2BZSEFE.js.map → chunk-ZO2FRJ2U.js.map} +1 -1
- package/dist/{chunk-4HARSV2G.js → chunk-ZQGOBVXZ.js} +43 -3
- package/dist/chunk-ZQGOBVXZ.js.map +1 -0
- package/dist/{index-Dkicw49A.d.ts → index-DyrR_d-H.d.cts} +9 -1
- package/dist/{index-Dkicw49A.d.cts → index-DyrR_d-H.d.ts} +9 -1
- package/dist/index.cjs +893 -218
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +687 -16
- package/dist/index.js.map +1 -1
- package/dist/interchange/index.cjs +7 -7
- package/dist/interchange/index.d.cts +3 -3
- package/dist/interchange/index.d.ts +3 -3
- package/dist/interchange/index.js +2 -2
- package/dist/{manager-Jc5Btay9.d.cts → manager-0NysX4s6.d.cts} +1 -1
- package/dist/{manager-e9LXthrx.d.ts → manager-DFKe7ql3.d.ts} +1 -1
- package/dist/profiler/index.d.cts +3 -3
- package/dist/profiler/index.d.ts +3 -3
- package/dist/schema/index.cjs +22 -22
- package/dist/schema/index.d.cts +5 -5
- package/dist/schema/index.d.ts +5 -5
- package/dist/schema/index.js +4 -4
- package/dist/{store-nbBybLWP.d.cts → store-DhoA5uRc.d.cts} +93 -7
- package/dist/{store-DM3Tk3Pw.d.ts → store-SiovWEYA.d.ts} +93 -7
- package/dist/{types-Cdbi4hcx.d.ts → types-6EKrWTs9.d.ts} +14 -0
- package/dist/{types-DDP0MGBF.d.cts → types-BUy-pHKH.d.cts} +14 -0
- package/package.json +2 -2
- package/dist/chunk-4HARSV2G.js.map +0 -1
- package/dist/chunk-O5XPCJLF.js.map +0 -1
- package/dist/chunk-OYL2SGBD.cjs.map +0 -1
- package/dist/chunk-SFY2PPOY.cjs.map +0 -1
- package/dist/chunk-V7CS2MDB.cjs.map +0 -1
- package/dist/chunk-WE5BKYNB.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/backend/types.ts","../src/backend/drizzle/row-mappers.ts","../src/backend/drizzle/operation-backend-core.ts","../src/backend/drizzle/operations/collections.ts","../src/backend/drizzle/operations/shared.ts","../src/backend/drizzle/operations/edges.ts","../src/backend/drizzle/operations/nodes.ts","../src/backend/drizzle/operations/schema.ts","../src/backend/drizzle/operations/uniques.ts","../src/backend/drizzle/operations/vectors.ts","../src/backend/drizzle/operations/strategy.ts","../src/backend/drizzle/vector-index.ts","../src/backend/drizzle/execution/types.ts"],"names":["DatabaseOperationError","nowIso","UniquenessError","sql","getTableName"],"mappings":"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","file":"chunk-7RVSDXT3.cjs","sourcesContent":["/**\n * Backend interface types for TypeGraph storage.\n *\n * The backend abstracts database operations, allowing different\n * SQL implementations (SQLite, PostgreSQL) behind a common interface.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../core/types\";\nimport { type SqlTableNames } from \"../query/compiler/schema\";\nimport { type SerializedSchema } from \"../schema/types\";\n\n// ============================================================\n// Vector Search Types\n// ============================================================\n\n/**\n * Supported vector similarity metrics.\n */\nexport type VectorMetric = \"cosine\" | \"l2\" | \"inner_product\";\n\n/**\n * Supported vector index types.\n */\nexport type VectorIndexType = \"hnsw\" | \"ivfflat\" | \"none\";\n\n/**\n * Vector search capabilities.\n */\nexport type VectorCapabilities = Readonly<{\n /** Whether the backend supports vector operations */\n supported: boolean;\n /** Supported similarity metrics */\n metrics: readonly VectorMetric[];\n /** Supported index types */\n indexTypes: readonly VectorIndexType[];\n /** Maximum dimensions supported */\n maxDimensions: number;\n}>;\n\n// ============================================================\n// SQL Dialect & Capabilities\n// ============================================================\n\nimport { type SqlDialect } from \"../query/dialect/types\";\n\nexport type { SqlDialect } from \"../query/dialect/types\";\n\n/**\n * Backend capabilities that vary by dialect.\n */\nexport type BackendCapabilities = Readonly<{\n /** Whether the backend supports JSONB type (vs TEXT for JSON) */\n jsonb: boolean;\n /** Whether the backend supports partial indexes */\n partialIndexes: boolean;\n /** Whether the backend supports GIN indexes for JSON */\n ginIndexes: boolean;\n /** Whether the backend supports CTE (WITH) queries */\n cte: boolean;\n /** Whether the backend supports RETURNING clause */\n returning: boolean;\n /** Whether the backend supports atomic transactions (D1 does not) */\n transactions: boolean;\n /** Vector search capabilities (undefined if not configured) */\n vector?: VectorCapabilities | undefined;\n}>;\n\n// ============================================================\n// Row Types (Database Records)\n// ============================================================\n\n/**\n * A row from the typegraph_nodes table.\n */\nexport type NodeRow = Readonly<{\n graph_id: string;\n kind: string;\n id: string;\n props: string; // JSON string\n version: number;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * A row from the typegraph_edges table.\n */\nexport type EdgeRow = Readonly<{\n graph_id: string;\n id: string;\n kind: string;\n from_kind: string;\n from_id: string;\n to_kind: string;\n to_id: string;\n props: string; // JSON string\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * A row from the typegraph_node_uniques table.\n */\nexport type UniqueRow = Readonly<{\n graph_id: string;\n node_kind: string;\n constraint_name: string;\n key: string;\n node_id: string;\n concrete_kind: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * A row from the typegraph_schema_versions table.\n */\nexport type SchemaVersionRow = Readonly<{\n graph_id: string;\n version: number;\n schema_hash: string;\n schema_doc: string; // JSON string\n created_at: string;\n is_active: boolean;\n}>;\n\n/**\n * A row from the typegraph_node_embeddings table.\n */\nexport type EmbeddingRow = Readonly<{\n graph_id: string;\n node_kind: string;\n node_id: string;\n field_path: string;\n embedding: readonly number[];\n dimensions: number;\n created_at: string;\n updated_at: string;\n}>;\n\n// ============================================================\n// Insert Parameters\n// ============================================================\n\n/**\n * Parameters for inserting a node.\n */\nexport type InsertNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n}>;\n\n/**\n * Parameters for updating a node.\n */\nexport type UpdateNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n /** If true, clears deleted_at (un-deletes the node). Used by upsert. */\n clearDeleted?: boolean;\n}>;\n\n/**\n * Parameters for deleting a node (soft delete).\n */\nexport type DeleteNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n}>;\n\n/**\n * Parameters for inserting an edge.\n */\nexport type InsertEdgeParams = Readonly<{\n graphId: string;\n id: string;\n kind: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n}>;\n\n/**\n * Parameters for updating an edge.\n */\nexport type UpdateEdgeParams = Readonly<{\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n clearDeleted?: boolean;\n}>;\n\n/**\n * Parameters for deleting an edge (soft delete).\n */\nexport type DeleteEdgeParams = Readonly<{\n graphId: string;\n id: string;\n}>;\n\n/**\n * Parameters for hard deleting a node (permanent removal).\n */\nexport type HardDeleteNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n}>;\n\n/**\n * Parameters for hard deleting an edge (permanent removal).\n */\nexport type HardDeleteEdgeParams = Readonly<{\n graphId: string;\n id: string;\n}>;\n\n// ============================================================\n// Embedding Parameters\n// ============================================================\n\n/**\n * Parameters for inserting or updating an embedding.\n */\nexport type UpsertEmbeddingParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n fieldPath: string;\n embedding: readonly number[];\n dimensions: number;\n}>;\n\n/**\n * Parameters for deleting an embedding.\n */\nexport type DeleteEmbeddingParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n fieldPath: string;\n}>;\n\n/**\n * Parameters for vector similarity search.\n */\nexport type VectorSearchParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n queryEmbedding: readonly number[];\n metric: VectorMetric;\n limit: number;\n minScore?: number;\n}>;\n\n/**\n * Result from a vector similarity search.\n */\nexport type VectorSearchResult = Readonly<{\n nodeId: string;\n /**\n * Cosine metric returns similarity score (higher is better).\n * L2 and inner_product return raw distance (lower is better).\n */\n score: number;\n}>;\n\n/**\n * Parameters for creating a vector index.\n */\nexport type CreateVectorIndexParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n dimensions: number;\n metric: VectorMetric;\n indexType: VectorIndexType;\n /** Index-specific parameters */\n indexParams?: Readonly<{\n /** HNSW: max connections per layer */\n m?: number;\n /** HNSW: construction search depth */\n efConstruction?: number;\n /** IVFFlat: number of lists */\n lists?: number;\n }>;\n}>;\n\n/**\n * Parameters for dropping a vector index.\n */\nexport type DropVectorIndexParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n}>;\n\n// ============================================================\n// Query Types\n// ============================================================\n\n/**\n * Transaction options.\n */\nexport type TransactionOptions = Readonly<{\n /** Transaction isolation level (if supported) */\n isolationLevel?:\n | \"read_uncommitted\"\n | \"read_committed\"\n | \"repeatable_read\"\n | \"serializable\";\n}>;\n\n// ============================================================\n// Backend Interface\n// ============================================================\n\n/**\n * Transaction backend - a backend scoped to a transaction.\n */\nexport type TransactionBackend = Omit<GraphBackend, \"transaction\" | \"close\">;\n\n/**\n * The GraphBackend interface abstracts database operations.\n *\n * Implementations should provide:\n * - SQLite backend via better-sqlite3 or libsql\n * - PostgreSQL backend via pg or postgres\n */\nexport type GraphBackend = Readonly<{\n /** The SQL dialect */\n dialect: SqlDialect;\n /** Backend capabilities */\n capabilities: BackendCapabilities;\n /** Table names used by this backend (for query schema auto-derivation) */\n tableNames?: SqlTableNames | undefined;\n\n // === Node Operations ===\n insertNode: (params: InsertNodeParams) => Promise<NodeRow>;\n insertNodeNoReturn?: (params: InsertNodeParams) => Promise<void>;\n insertNodesBatch?: (params: readonly InsertNodeParams[]) => Promise<void>;\n insertNodesBatchReturning?: (\n params: readonly InsertNodeParams[],\n ) => Promise<readonly NodeRow[]>;\n updateNode: (params: UpdateNodeParams) => Promise<NodeRow>;\n deleteNode: (params: DeleteNodeParams) => Promise<void>;\n hardDeleteNode: (params: HardDeleteNodeParams) => Promise<void>;\n getNode: (\n graphId: string,\n kind: string,\n id: string,\n ) => Promise<NodeRow | undefined>;\n getNodes?: (\n graphId: string,\n kind: string,\n ids: readonly string[],\n ) => Promise<readonly NodeRow[]>;\n\n // === Edge Operations ===\n insertEdge: (params: InsertEdgeParams) => Promise<EdgeRow>;\n insertEdgeNoReturn?: (params: InsertEdgeParams) => Promise<void>;\n insertEdgesBatch?: (params: readonly InsertEdgeParams[]) => Promise<void>;\n insertEdgesBatchReturning?: (\n params: readonly InsertEdgeParams[],\n ) => Promise<readonly EdgeRow[]>;\n updateEdge: (params: UpdateEdgeParams) => Promise<EdgeRow>;\n deleteEdge: (params: DeleteEdgeParams) => Promise<void>;\n hardDeleteEdge: (params: HardDeleteEdgeParams) => Promise<void>;\n getEdge: (graphId: string, id: string) => Promise<EdgeRow | undefined>;\n getEdges?: (\n graphId: string,\n ids: readonly string[],\n ) => Promise<readonly EdgeRow[]>;\n\n // === Edge Cardinality Operations ===\n countEdgesFrom: (params: CountEdgesFromParams) => Promise<number>;\n edgeExistsBetween: (params: EdgeExistsBetweenParams) => Promise<boolean>;\n\n // === Edge Query Operations ===\n findEdgesConnectedTo: (\n params: FindEdgesConnectedToParams,\n ) => Promise<readonly EdgeRow[]>;\n\n // === Collection Query Operations ===\n findNodesByKind: (\n params: FindNodesByKindParams,\n ) => Promise<readonly NodeRow[]>;\n countNodesByKind: (params: CountNodesByKindParams) => Promise<number>;\n findEdgesByKind: (\n params: FindEdgesByKindParams,\n ) => Promise<readonly EdgeRow[]>;\n countEdgesByKind: (params: CountEdgesByKindParams) => Promise<number>;\n\n // === Unique Constraint Operations ===\n insertUnique: (params: InsertUniqueParams) => Promise<void>;\n deleteUnique: (params: DeleteUniqueParams) => Promise<void>;\n checkUnique: (params: CheckUniqueParams) => Promise<UniqueRow | undefined>;\n checkUniqueBatch?: (\n params: CheckUniqueBatchParams,\n ) => Promise<readonly UniqueRow[]>;\n\n // === Schema Operations ===\n getActiveSchema: (graphId: string) => Promise<SchemaVersionRow | undefined>;\n getSchemaVersion: (\n graphId: string,\n version: number,\n ) => Promise<SchemaVersionRow | undefined>;\n insertSchema: (params: InsertSchemaParams) => Promise<SchemaVersionRow>;\n setActiveSchema: (graphId: string, version: number) => Promise<void>;\n\n // === Embedding Operations (optional - depends on vector capabilities) ===\n upsertEmbedding?: (params: UpsertEmbeddingParams) => Promise<void>;\n deleteEmbedding?: (params: DeleteEmbeddingParams) => Promise<void>;\n getEmbedding?: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ) => Promise<EmbeddingRow | undefined>;\n vectorSearch?: (\n params: VectorSearchParams,\n ) => Promise<readonly VectorSearchResult[]>;\n createVectorIndex?: (params: CreateVectorIndexParams) => Promise<void>;\n dropVectorIndex?: (params: DropVectorIndexParams) => Promise<void>;\n\n // === Query Execution ===\n execute: <T>(query: SQL) => Promise<readonly T[]>;\n\n /** Execute pre-compiled SQL text with bound parameters. Available on sync SQLite and pg backends. */\n executeRaw?: <T>(\n sqlText: string,\n params: readonly unknown[],\n ) => Promise<readonly T[]>;\n\n /** Compile a Drizzle SQL object to { sql, params } without executing. */\n compileSql?: (\n query: SQL,\n ) => Readonly<{ sql: string; params: readonly unknown[] }>;\n\n // === Transaction ===\n transaction: <T>(\n fn: (tx: TransactionBackend) => Promise<T>,\n options?: TransactionOptions,\n ) => Promise<T>;\n\n // === Lifecycle ===\n close: () => Promise<void>;\n}>;\n\n// ============================================================\n// Additional Parameter Types\n// ============================================================\n\n/**\n * Parameters for inserting a unique constraint entry.\n */\nexport type InsertUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n nodeId: string;\n concreteKind: string;\n}>;\n\n/**\n * Parameters for deleting a unique constraint entry.\n */\nexport type DeleteUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n}>;\n\n/**\n * Parameters for checking a unique constraint.\n */\nexport type CheckUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n /** If true, also returns soft-deleted entries. Used by get-or-create operations. */\n includeDeleted?: boolean;\n}>;\n\n/**\n * Parameters for batch-checking unique constraints.\n */\nexport type CheckUniqueBatchParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n keys: readonly string[];\n /** If true, also returns soft-deleted entries. Used by get-or-create operations. */\n includeDeleted?: boolean;\n}>;\n\n/**\n * Parameters for inserting a schema version.\n */\nexport type InsertSchemaParams = Readonly<{\n graphId: string;\n version: number;\n schemaHash: string;\n schemaDoc: SerializedSchema;\n isActive: boolean;\n}>;\n\n/**\n * Parameters for counting edges from a source node.\n */\nexport type CountEdgesFromParams = Readonly<{\n graphId: string;\n edgeKind: string;\n fromKind: string;\n fromId: string;\n /** If true, only count edges where valid_to IS NULL */\n activeOnly?: boolean;\n}>;\n\n/**\n * Parameters for checking if an edge exists between two nodes.\n */\nexport type EdgeExistsBetweenParams = Readonly<{\n graphId: string;\n edgeKind: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n}>;\n\n/**\n * Parameters for finding edges connected to a node.\n */\nexport type FindEdgesConnectedToParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n}>;\n\n/**\n * Parameters for finding nodes by kind.\n */\nexport type FindNodesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n limit?: number;\n offset?: number;\n /** If true, exclude deleted nodes. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n/**\n * Parameters for counting nodes by kind.\n */\nexport type CountNodesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n /** If true, exclude deleted nodes. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n/**\n * Parameters for finding edges by kind.\n */\nexport type FindEdgesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n limit?: number;\n offset?: number;\n /** If true, exclude deleted edges. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n/**\n * Parameters for counting edges by kind.\n */\nexport type CountEdgesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n /** If true, exclude deleted edges. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n// ============================================================\n// Default Capabilities\n// ============================================================\n\n/**\n * Default capabilities for SQLite.\n */\nexport const SQLITE_CAPABILITIES: BackendCapabilities = {\n jsonb: false, // SQLite uses TEXT with json functions\n partialIndexes: true, // SQLite supports WHERE in CREATE INDEX\n ginIndexes: false, // SQLite doesn't have GIN\n cte: true, // SQLite supports WITH\n returning: true, // SQLite 3.35+ supports RETURNING\n transactions: true, // SQLite supports transactions\n};\n\n/**\n * Default capabilities for PostgreSQL.\n */\nexport const POSTGRES_CAPABILITIES: BackendCapabilities = {\n jsonb: true, // PostgreSQL has native JSONB\n partialIndexes: true,\n ginIndexes: true,\n cte: true,\n returning: true,\n transactions: true, // PostgreSQL supports transactions\n};\n\n/**\n * Capabilities for Cloudflare D1.\n * D1 does NOT support atomic transactions - operations are auto-committed.\n */\nexport const D1_CAPABILITIES: BackendCapabilities = {\n jsonb: false, // D1 uses TEXT with json functions\n partialIndexes: true,\n ginIndexes: false,\n cte: true,\n returning: true,\n transactions: false, // D1 does NOT support atomic transactions\n};\n","/**\n * Shared row-mapping utilities for Drizzle backend adapters.\n */\n\nimport { DatabaseOperationError } from \"../../errors\";\nimport type { EdgeRow, NodeRow, SchemaVersionRow, UniqueRow } from \"../types\";\n\nfunction requireTimestamp(value: string | undefined, field: string): string {\n if (value === undefined) {\n throw new DatabaseOperationError(\n `Expected non-null ${field} timestamp`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction nullToUndefined<T>(value: T | null): T | undefined {\n return value ?? undefined;\n}\n\n/**\n * Formats a PostgreSQL timestamp value to ISO string.\n * PostgreSQL returns Date objects or timestamp strings that need normalization.\n */\nexport function formatPostgresTimestamp(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"string\") {\n if (value.includes(\"T\")) return value;\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) return date.toISOString();\n return value;\n }\n return undefined;\n}\n\n/**\n * Normalizes a JSON column that may be returned as a parsed object (JSONB) or string.\n */\nfunction normalizeJsonColumn(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value ?? {});\n}\n\n/**\n * Dialect-specific configuration for row mappers.\n *\n * Row mapper factories accept this config to produce dialect-appropriate\n * mappers. The `formatTimestamp` and `normalizeJson` functions handle\n * the differences between how SQLite and PostgreSQL return timestamps\n * and JSON columns.\n */\ntype DialectRowMapperConfig = Readonly<{\n formatTimestamp: (value: unknown) => string | undefined;\n normalizeJson: (value: unknown) => string;\n}>;\n\n/**\n * SQLite row mapper config.\n * Timestamps are stored as ISO strings; JSON is stored as TEXT.\n */\nexport const SQLITE_ROW_MAPPER_CONFIG: DialectRowMapperConfig = {\n formatTimestamp: (value) => nullToUndefined(value as string | null),\n normalizeJson: (value) => value as string,\n};\n\n/**\n * PostgreSQL row mapper config.\n * Timestamps may be Date objects or PG-format strings; JSONB is parsed objects.\n */\nexport const POSTGRES_ROW_MAPPER_CONFIG: DialectRowMapperConfig = {\n formatTimestamp: formatPostgresTimestamp,\n normalizeJson: normalizeJsonColumn,\n};\n\n// Trust boundary: Drizzle raw SQL returns Record<string, unknown> rows.\n// The field access patterns below are intentional unsafe casts at the\n// database driver boundary where we know the column shapes.\n\nexport function createNodeRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => NodeRow {\n return (row) => ({\n graph_id: row.graph_id as string,\n kind: row.kind as string,\n id: row.id as string,\n props: config.normalizeJson(row.props),\n version: row.version as number,\n valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),\n valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),\n created_at: requireTimestamp(config.formatTimestamp(row.created_at), \"created_at\"),\n updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), \"updated_at\"),\n deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at)),\n });\n}\n\nexport function createEdgeRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => EdgeRow {\n return (row) => ({\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: config.normalizeJson(row.props),\n valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),\n valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),\n created_at: requireTimestamp(config.formatTimestamp(row.created_at), \"created_at\"),\n updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), \"updated_at\"),\n deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at)),\n });\n}\n\nexport function createUniqueRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => UniqueRow {\n return (row) => ({\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(config.formatTimestamp(row.deleted_at)),\n });\n}\n\nexport function createSchemaVersionRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => SchemaVersionRow {\n return (row) => {\n const isActiveValue = row.is_active;\n const isActive =\n isActiveValue === true || isActiveValue === 1 || isActiveValue === \"1\";\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: config.normalizeJson(row.schema_doc),\n created_at: requireTimestamp(config.formatTimestamp(row.created_at), \"created_at\"),\n is_active: isActive,\n };\n };\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport { DatabaseOperationError, UniquenessError } from \"../../errors\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n EdgeRow,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n NodeRow,\n SchemaVersionRow,\n TransactionBackend,\n UniqueRow,\n UpdateEdgeParams,\n UpdateNodeParams,\n} from \"../types\";\nimport { type CommonOperationStrategy } from \"./operations/strategy\";\nimport { nowIso as defaultNowIso } from \"./row-mappers\";\n\ntype CommonOperationBackend = Pick<\n TransactionBackend,\n | \"checkUnique\"\n | \"checkUniqueBatch\"\n | \"countEdgesByKind\"\n | \"countEdgesFrom\"\n | \"countNodesByKind\"\n | \"deleteEdge\"\n | \"deleteNode\"\n | \"deleteUnique\"\n | \"edgeExistsBetween\"\n | \"findEdgesByKind\"\n | \"findEdgesConnectedTo\"\n | \"findNodesByKind\"\n | \"getActiveSchema\"\n | \"getEdge\"\n | \"getEdges\"\n | \"getNode\"\n | \"getNodes\"\n | \"getSchemaVersion\"\n | \"hardDeleteEdge\"\n | \"hardDeleteNode\"\n | \"insertEdge\"\n | \"insertEdgeNoReturn\"\n | \"insertEdgesBatch\"\n | \"insertEdgesBatchReturning\"\n | \"insertNode\"\n | \"insertNodeNoReturn\"\n | \"insertNodesBatch\"\n | \"insertNodesBatchReturning\"\n | \"insertSchema\"\n | \"insertUnique\"\n | \"setActiveSchema\"\n | \"updateEdge\"\n | \"updateNode\"\n>;\n\ntype OperationBackendExecution = Readonly<{\n execAll: <TRow>(query: SQL) => Promise<readonly TRow[]>;\n execGet: <TRow>(query: SQL) => Promise<TRow | undefined>;\n execRun: (query: SQL) => Promise<void>;\n}>;\n\ntype OperationBackendBatchConfig = Readonly<{\n edgeInsertBatchSize: number;\n getEdgesChunkSize: number;\n getNodesChunkSize: number;\n nodeInsertBatchSize: number;\n}>;\n\ntype OperationBackendRowMappers = Readonly<{\n toEdgeRow: (row: Record<string, unknown>) => EdgeRow;\n toNodeRow: (row: Record<string, unknown>) => NodeRow;\n toSchemaVersionRow: (row: Record<string, unknown>) => SchemaVersionRow;\n toUniqueRow: (row: Record<string, unknown>) => UniqueRow;\n}>;\n\ntype CreateCommonOperationBackendOptions = Readonly<{\n batchConfig: OperationBackendBatchConfig;\n execution: OperationBackendExecution;\n nowIso?: (() => string) | undefined;\n operationStrategy: CommonOperationStrategy;\n rowMappers: OperationBackendRowMappers;\n}>;\n\nfunction chunkArray<T>(\n values: readonly T[],\n size: number,\n): readonly (readonly T[])[] {\n if (values.length <= size) {\n return [values];\n }\n\n const chunks: T[][] = [];\n for (let index = 0; index < values.length; index += size) {\n chunks.push(values.slice(index, index + size));\n }\n return chunks;\n}\n\nexport function createCommonOperationBackend(\n options: CreateCommonOperationBackendOptions,\n): CommonOperationBackend {\n const { batchConfig, execution, operationStrategy, rowMappers } = options;\n const nowIso = options.nowIso ?? defaultNowIso;\n\n return {\n async insertNode(params: InsertNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertNode(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert node failed: no row returned\", { operation: \"insert\", entity: \"node\" });\n return rowMappers.toNodeRow(row);\n },\n\n async insertNodeNoReturn(params: InsertNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertNodeNoReturn(params, timestamp);\n await execution.execRun(query);\n },\n\n async insertNodesBatch(params: readonly InsertNodeParams[]): Promise<void> {\n if (params.length === 0) {\n return;\n }\n const timestamp = nowIso();\n for (const chunk of chunkArray(params, batchConfig.nodeInsertBatchSize)) {\n const query = operationStrategy.buildInsertNodesBatch(chunk, timestamp);\n await execution.execRun(query);\n }\n },\n\n async insertNodesBatchReturning(\n params: readonly InsertNodeParams[],\n ): Promise<readonly NodeRow[]> {\n if (params.length === 0) {\n return [];\n }\n const timestamp = nowIso();\n const allRows: NodeRow[] = [];\n for (const chunk of chunkArray(params, batchConfig.nodeInsertBatchSize)) {\n const query =\n operationStrategy.buildInsertNodesBatchReturning(chunk, timestamp);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toNodeRow(row)));\n }\n return allRows;\n },\n\n async getNode(\n graphId: string,\n kind: string,\n id: string,\n ): Promise<NodeRow | undefined> {\n const query = operationStrategy.buildGetNode(graphId, kind, id);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toNodeRow(row) : undefined;\n },\n\n async getNodes(\n graphId: string,\n kind: string,\n ids: readonly string[],\n ): Promise<readonly NodeRow[]> {\n if (ids.length === 0) return [];\n const allRows: NodeRow[] = [];\n for (const chunk of chunkArray(ids, batchConfig.getNodesChunkSize)) {\n const query = operationStrategy.buildGetNodes(graphId, kind, chunk);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toNodeRow(row)));\n }\n return allRows;\n },\n\n async updateNode(params: UpdateNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildUpdateNode(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Update node failed: no row returned\", { operation: \"update\", entity: \"node\" });\n return rowMappers.toNodeRow(row);\n },\n\n async deleteNode(params: DeleteNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteNode(params, timestamp);\n await execution.execRun(query);\n },\n\n // IMPORTANT: This cascade is not atomic. Callers must ensure this runs\n // within a transaction to prevent partial deletion on intermediate failure.\n async hardDeleteNode(params: HardDeleteNodeParams): Promise<void> {\n const deleteUniquesQuery = operationStrategy.buildHardDeleteUniquesByNode(\n params.graphId,\n params.id,\n );\n await execution.execRun(deleteUniquesQuery);\n\n const deleteEmbeddingsQuery =\n operationStrategy.buildHardDeleteEmbeddingsByNode(\n params.graphId,\n params.kind,\n params.id,\n );\n await execution.execRun(deleteEmbeddingsQuery);\n\n const deleteEdgesQuery = operationStrategy.buildHardDeleteEdgesByNode(\n params.graphId,\n params.kind,\n params.id,\n );\n await execution.execRun(deleteEdgesQuery);\n\n const query = operationStrategy.buildHardDeleteNode(params);\n await execution.execRun(query);\n },\n\n async insertEdge(params: InsertEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertEdge(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert edge failed: no row returned\", { operation: \"insert\", entity: \"edge\" });\n return rowMappers.toEdgeRow(row);\n },\n\n async insertEdgeNoReturn(params: InsertEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertEdgeNoReturn(params, timestamp);\n await execution.execRun(query);\n },\n\n async insertEdgesBatch(params: readonly InsertEdgeParams[]): Promise<void> {\n if (params.length === 0) {\n return;\n }\n const timestamp = nowIso();\n for (const chunk of chunkArray(params, batchConfig.edgeInsertBatchSize)) {\n const query = operationStrategy.buildInsertEdgesBatch(chunk, timestamp);\n await execution.execRun(query);\n }\n },\n\n async insertEdgesBatchReturning(\n params: readonly InsertEdgeParams[],\n ): Promise<readonly EdgeRow[]> {\n if (params.length === 0) {\n return [];\n }\n const timestamp = nowIso();\n const allRows: EdgeRow[] = [];\n for (const chunk of chunkArray(params, batchConfig.edgeInsertBatchSize)) {\n const query =\n operationStrategy.buildInsertEdgesBatchReturning(chunk, timestamp);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toEdgeRow(row)));\n }\n return allRows;\n },\n\n async getEdge(graphId: string, id: string): Promise<EdgeRow | undefined> {\n const query = operationStrategy.buildGetEdge(graphId, id);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toEdgeRow(row) : undefined;\n },\n\n async getEdges(\n graphId: string,\n ids: readonly string[],\n ): Promise<readonly EdgeRow[]> {\n if (ids.length === 0) return [];\n const allRows: EdgeRow[] = [];\n for (const chunk of chunkArray(ids, batchConfig.getEdgesChunkSize)) {\n const query = operationStrategy.buildGetEdges(graphId, chunk);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toEdgeRow(row)));\n }\n return allRows;\n },\n\n async updateEdge(params: UpdateEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildUpdateEdge(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Update edge failed: no row returned\", { operation: \"update\", entity: \"edge\" });\n return rowMappers.toEdgeRow(row);\n },\n\n async deleteEdge(params: DeleteEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteEdge(params, timestamp);\n await execution.execRun(query);\n },\n\n async hardDeleteEdge(params: HardDeleteEdgeParams): Promise<void> {\n const query = operationStrategy.buildHardDeleteEdge(params);\n await execution.execRun(query);\n },\n\n async countEdgesFrom(params: CountEdgesFromParams): Promise<number> {\n const query = operationStrategy.buildCountEdgesFrom(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async edgeExistsBetween(params: EdgeExistsBetweenParams): Promise<boolean> {\n const query = operationStrategy.buildEdgeExistsBetween(params);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row !== undefined;\n },\n\n async findEdgesConnectedTo(\n params: FindEdgesConnectedToParams,\n ): Promise<readonly EdgeRow[]> {\n const query = operationStrategy.buildFindEdgesConnectedTo(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toEdgeRow(row));\n },\n\n async findNodesByKind(\n params: FindNodesByKindParams,\n ): Promise<readonly NodeRow[]> {\n const query = operationStrategy.buildFindNodesByKind(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toNodeRow(row));\n },\n\n async countNodesByKind(params: CountNodesByKindParams): Promise<number> {\n const query = operationStrategy.buildCountNodesByKind(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async findEdgesByKind(\n params: FindEdgesByKindParams,\n ): Promise<readonly EdgeRow[]> {\n const query = operationStrategy.buildFindEdgesByKind(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toEdgeRow(row));\n },\n\n async countEdgesByKind(params: CountEdgesByKindParams): Promise<number> {\n const query = operationStrategy.buildCountEdgesByKind(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async insertUnique(params: InsertUniqueParams): Promise<void> {\n const query = operationStrategy.buildInsertUnique(params);\n const result = await execution.execGet<{ node_id: string }>(query);\n\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: [],\n });\n }\n },\n\n async deleteUnique(params: DeleteUniqueParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteUnique(params, timestamp);\n await execution.execRun(query);\n },\n\n async checkUnique(\n params: CheckUniqueParams,\n ): Promise<UniqueRow | undefined> {\n const query = operationStrategy.buildCheckUnique(params);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toUniqueRow(row) : undefined;\n },\n\n async checkUniqueBatch(\n params: CheckUniqueBatchParams,\n ): Promise<readonly UniqueRow[]> {\n if (params.keys.length === 0) return [];\n const query = operationStrategy.buildCheckUniqueBatch(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toUniqueRow(row));\n },\n\n async getActiveSchema(\n graphId: string,\n ): Promise<SchemaVersionRow | undefined> {\n const query = operationStrategy.buildGetActiveSchema(graphId);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toSchemaVersionRow(row) : undefined;\n },\n\n async insertSchema(params: InsertSchemaParams): Promise<SchemaVersionRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertSchema(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert schema failed: no row returned\", { operation: \"insert\", entity: \"schema\" });\n return rowMappers.toSchemaVersionRow(row);\n },\n\n async getSchemaVersion(\n graphId: string,\n version: number,\n ): Promise<SchemaVersionRow | undefined> {\n const query = operationStrategy.buildGetSchemaVersion(graphId, version);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toSchemaVersionRow(row) : undefined;\n },\n\n async setActiveSchema(graphId: string, version: number): Promise<void> {\n const queries = operationStrategy.buildSetActiveSchema(graphId, version);\n await execution.execRun(queries.deactivateAll);\n await execution.execRun(queries.activateVersion);\n },\n };\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n CountEdgesByKindParams,\n CountNodesByKindParams,\n FindEdgesByKindParams,\n FindNodesByKindParams,\n} from \"../../types\";\nimport type { Tables } from \"./shared\";\n\n/**\n * Builds temporal and soft-delete SQL conditions.\n *\n * - `includeTombstones`: no filtering at all (overrides excludeDeleted)\n * - `current` / `asOf`: exclude deleted + filter by validity range\n * - `includeEnded`: exclude deleted only\n * - no temporalMode: just apply excludeDeleted (backward-compatible)\n */\nfunction buildTemporalConditions(\n table: Pick<Tables[\"nodes\"], \"deletedAt\" | \"validFrom\" | \"validTo\">,\n params: Readonly<{\n temporalMode?: string;\n asOf?: string;\n excludeDeleted?: boolean;\n }>,\n): SQL[] {\n const conditions: SQL[] = [];\n const mode = params.temporalMode;\n\n if (mode === \"includeTombstones\") return conditions;\n\n if (params.excludeDeleted !== false) {\n conditions.push(sql`${table.deletedAt} IS NULL`);\n }\n\n if (mode === \"current\" || mode === \"asOf\") {\n const asOf = params.asOf!;\n conditions.push(\n sql`(${table.validFrom} IS NULL OR ${table.validFrom} <= ${asOf})`,\n sql`(${table.validTo} IS NULL OR ${table.validTo} > ${asOf})`,\n );\n }\n\n return conditions;\n}\n\n/**\n * Builds a query to find nodes by kind.\n */\nexport function buildFindNodesByKind(\n tables: Tables,\n params: FindNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n\n const conditions: SQL[] = [\n sql`${nodes.graphId} = ${params.graphId}`,\n sql`${nodes.kind} = ${params.kind}`,\n ...buildTemporalConditions(nodes, params),\n ];\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${nodes.createdAt} DESC\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${nodes.createdAt} DESC\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${nodes.createdAt} DESC\n `;\n}\n\n/**\n * Builds a query to count nodes by kind.\n */\nexport function buildCountNodesByKind(\n tables: Tables,\n params: CountNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n\n const conditions: SQL[] = [\n sql`${nodes.graphId} = ${params.graphId}`,\n sql`${nodes.kind} = ${params.kind}`,\n ...buildTemporalConditions(nodes, params),\n ];\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT COUNT(*) as count FROM ${nodes}\n WHERE ${whereClause}\n `;\n}\n\n/**\n * Builds a query to find edges by kind with optional endpoint filters.\n */\nexport function buildFindEdgesByKind(\n tables: Tables,\n params: FindEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ...buildTemporalConditions(edges, params),\n ];\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n `;\n}\n\n/**\n * Builds a query to count edges by kind with optional endpoint filters.\n */\nexport function buildCountEdgesByKind(\n tables: Tables,\n params: CountEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ...buildTemporalConditions(edges, params),\n ];\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${whereClause}\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\n\nexport type Tables = SqliteTables | PostgresTables;\n\n/**\n * Converts undefined to SQL NULL for use in template literals.\n * Drizzle doesn't handle undefined in sql`` templates correctly.\n */\nexport function sqlNull(value: string | undefined): SQL | string {\n return value ?? sql.raw(\"NULL\");\n}\n\nexport function quotedColumn(column: { name: string }): SQL {\n return sql.raw(`\"${column.name.replaceAll('\"', '\"\"')}\"`);\n}\n\nexport function nodeColumnList(nodes: Tables[\"nodes\"]): SQL {\n return sql.raw(`\"${nodes.graphId.name}\", \"${nodes.kind.name}\", \"${nodes.id.name}\", \"${nodes.props.name}\", \"${nodes.version.name}\", \"${nodes.validFrom.name}\", \"${nodes.validTo.name}\", \"${nodes.createdAt.name}\", \"${nodes.updatedAt.name}\"`);\n}\n\nexport function edgeColumnList(edges: Tables[\"edges\"]): SQL {\n return sql.raw(`\"${edges.graphId.name}\", \"${edges.id.name}\", \"${edges.kind.name}\", \"${edges.fromKind.name}\", \"${edges.fromId.name}\", \"${edges.toKind.name}\", \"${edges.toId.name}\", \"${edges.props.name}\", \"${edges.validFrom.name}\", \"${edges.validTo.name}\", \"${edges.createdAt.name}\", \"${edges.updatedAt.name}\"`);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n CountEdgesFromParams,\n DeleteEdgeParams,\n EdgeExistsBetweenParams,\n FindEdgesConnectedToParams,\n HardDeleteEdgeParams,\n InsertEdgeParams,\n UpdateEdgeParams,\n} from \"../../types\";\nimport {\n edgeColumnList,\n quotedColumn,\n sqlNull,\n type Tables,\n} from \"./shared\";\n\n/**\n * Builds an INSERT query for an edge.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertEdge(\n tables: Tables,\n params: InsertEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = edgeColumnList(edges);\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES (\n ${params.graphId}, ${params.id}, ${params.kind},\n ${params.fromKind}, ${params.fromId}, ${params.toKind}, ${params.toId},\n ${propsJson}, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for an edge without RETURNING payload.\n */\nexport function buildInsertEdgeNoReturn(\n tables: Tables,\n params: InsertEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = edgeColumnList(edges);\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES (\n ${params.graphId}, ${params.id}, ${params.kind},\n ${params.fromKind}, ${params.fromId}, ${params.toKind}, ${params.toId},\n ${propsJson}, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n `;\n}\n\n/**\n * Builds a batched INSERT query for edges without RETURNING payload.\n */\nexport function buildInsertEdgesBatch(\n tables: Tables,\n params: readonly InsertEdgeParams[],\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const columns = edgeColumnList(edges);\n const values = params.map((edgeParams) => {\n const propsJson = JSON.stringify(edgeParams.props);\n return sql`(${edgeParams.graphId}, ${edgeParams.id}, ${edgeParams.kind}, ${edgeParams.fromKind}, ${edgeParams.fromId}, ${edgeParams.toKind}, ${edgeParams.toId}, ${propsJson}, ${sqlNull(edgeParams.validFrom)}, ${sqlNull(edgeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n `;\n}\n\n/**\n * Builds a batched INSERT query for edges with RETURNING *.\n */\nexport function buildInsertEdgesBatchReturning(\n tables: Tables,\n params: readonly InsertEdgeParams[],\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const columns = edgeColumnList(edges);\n const values = params.map((edgeParams) => {\n const propsJson = JSON.stringify(edgeParams.props);\n return sql`(${edgeParams.graphId}, ${edgeParams.id}, ${edgeParams.kind}, ${edgeParams.fromKind}, ${edgeParams.fromId}, ${edgeParams.toKind}, ${edgeParams.toId}, ${propsJson}, ${sqlNull(edgeParams.validFrom)}, ${sqlNull(edgeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get an edge by id.\n * Returns the edge regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetEdge(\n tables: Tables,\n graphId: string,\n id: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND ${edges.id} = ${id}\n `;\n}\n\n/**\n * Builds a SELECT query to get multiple edges by ids.\n * Returns edges regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetEdges(\n tables: Tables,\n graphId: string,\n ids: readonly string[],\n): SQL {\n const { edges } = tables;\n const idPlaceholders = sql.join(\n ids.map((edgeId) => sql`${edgeId}`),\n sql`, `,\n );\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND ${edges.id} IN (${idPlaceholders})\n `;\n}\n\n/**\n * Builds an UPDATE query for an edge.\n * Uses raw column names in SET clause.\n */\nexport function buildUpdateEdge(\n tables: Tables,\n params: UpdateEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n\n const setParts: SQL[] = [\n sql`${quotedColumn(edges.props)} = ${propsJson}`,\n sql`${quotedColumn(edges.updatedAt)} = ${timestamp}`,\n ];\n\n if (params.validTo !== undefined) {\n setParts.push(sql`${quotedColumn(edges.validTo)} = ${params.validTo}`);\n }\n\n if (params.clearDeleted) {\n setParts.push(sql`${quotedColumn(edges.deletedAt)} = NULL`);\n }\n\n const setClause = sql.join(setParts, sql`, `);\n\n if (params.clearDeleted) {\n return sql`\n UPDATE ${edges}\n SET ${setClause}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${edges}\n SET ${setClause}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for an edge (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteEdge(\n tables: Tables,\n params: DeleteEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n UPDATE ${edges}\n SET ${quotedColumn(edges.deletedAt)} = ${timestamp}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for an edge (permanent removal).\n */\nexport function buildHardDeleteEdge(\n tables: Tables,\n params: HardDeleteEdgeParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n `;\n}\n\n/**\n * Builds a hard DELETE query for all edges connected to a node (permanent removal).\n * Deletes edges where the node appears as either source or target.\n */\nexport function buildHardDeleteEdgesByNode(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND (\n (${edges.fromKind} = ${nodeKind} AND ${edges.fromId} = ${nodeId})\n OR (${edges.toKind} = ${nodeKind} AND ${edges.toId} = ${nodeId})\n )\n `;\n}\n\n/**\n * Builds a query to count edges from a source node.\n */\nexport function buildCountEdgesFrom(\n tables: Tables,\n params: CountEdgesFromParams,\n): SQL {\n const { edges } = tables;\n\n if (params.activeOnly) {\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.validTo} IS NULL\n `;\n }\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a query to check if an edge exists between two nodes.\n */\nexport function buildEdgeExistsBetween(\n tables: Tables,\n params: EdgeExistsBetweenParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT 1 FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.toKind} = ${params.toKind}\n AND ${edges.toId} = ${params.toId}\n AND ${edges.deletedAt} IS NULL\n LIMIT 1\n `;\n}\n\n/**\n * Builds a query to find all edges connected to a node.\n */\nexport function buildFindEdgesConnectedTo(\n tables: Tables,\n params: FindEdgesConnectedToParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.fromKind} = ${params.nodeKind}\n AND ${edges.fromId} = ${params.nodeId}\n UNION ALL\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.toKind} = ${params.nodeKind}\n AND ${edges.toId} = ${params.nodeId}\n AND NOT (\n ${edges.fromKind} = ${params.nodeKind}\n AND ${edges.fromId} = ${params.nodeId}\n )\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n DeleteNodeParams,\n HardDeleteNodeParams,\n InsertNodeParams,\n UpdateNodeParams,\n} from \"../../types\";\nimport {\n nodeColumnList,\n quotedColumn,\n sqlNull,\n type Tables,\n} from \"./shared\";\n\n/**\n * Builds an INSERT query for a node.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertNode(\n tables: Tables,\n params: InsertNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = nodeColumnList(nodes);\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES (\n ${params.graphId}, ${params.kind}, ${params.id}, ${propsJson},\n 1, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for a node without RETURNING payload.\n */\nexport function buildInsertNodeNoReturn(\n tables: Tables,\n params: InsertNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = nodeColumnList(nodes);\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES (\n ${params.graphId}, ${params.kind}, ${params.id}, ${propsJson},\n 1, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n `;\n}\n\n/**\n * Builds a batched INSERT query for nodes without RETURNING payload.\n */\nexport function buildInsertNodesBatch(\n tables: Tables,\n params: readonly InsertNodeParams[],\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const columns = nodeColumnList(nodes);\n const values = params.map((nodeParams) => {\n const propsJson = JSON.stringify(nodeParams.props);\n return sql`(${nodeParams.graphId}, ${nodeParams.kind}, ${nodeParams.id}, ${propsJson}, 1, ${sqlNull(nodeParams.validFrom)}, ${sqlNull(nodeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n `;\n}\n\n/**\n * Builds a batched INSERT query for nodes with RETURNING *.\n */\nexport function buildInsertNodesBatchReturning(\n tables: Tables,\n params: readonly InsertNodeParams[],\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const columns = nodeColumnList(nodes);\n const values = params.map((nodeParams) => {\n const propsJson = JSON.stringify(nodeParams.props);\n return sql`(${nodeParams.graphId}, ${nodeParams.kind}, ${nodeParams.id}, ${propsJson}, 1, ${sqlNull(nodeParams.validFrom)}, ${sqlNull(nodeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get a node by kind and id.\n * Returns the node regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetNode(\n tables: Tables,\n graphId: string,\n kind: string,\n id: string,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${nodes.graphId} = ${graphId}\n AND ${nodes.kind} = ${kind}\n AND ${nodes.id} = ${id}\n `;\n}\n\n/**\n * Builds a SELECT query to get multiple nodes by kind and ids.\n * Returns nodes regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetNodes(\n tables: Tables,\n graphId: string,\n kind: string,\n ids: readonly string[],\n): SQL {\n const { nodes } = tables;\n const idPlaceholders = sql.join(\n ids.map((nodeId) => sql`${nodeId}`),\n sql`, `,\n );\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${nodes.graphId} = ${graphId}\n AND ${nodes.kind} = ${kind}\n AND ${nodes.id} IN (${idPlaceholders})\n `;\n}\n\n/**\n * Builds an UPDATE query for a node.\n * Uses raw column names in SET clause (required by SQL syntax).\n */\nexport function buildUpdateNode(\n tables: Tables,\n params: UpdateNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n\n const setParts: SQL[] = [\n sql`${quotedColumn(nodes.props)} = ${propsJson}`,\n sql`${quotedColumn(nodes.updatedAt)} = ${timestamp}`,\n ];\n\n if (params.incrementVersion) {\n setParts.push(\n sql`${quotedColumn(nodes.version)} = ${quotedColumn(nodes.version)} + 1`,\n );\n }\n\n if (params.validTo !== undefined) {\n setParts.push(sql`${quotedColumn(nodes.validTo)} = ${params.validTo}`);\n }\n\n if (params.clearDeleted) {\n setParts.push(sql`${quotedColumn(nodes.deletedAt)} = NULL`);\n }\n\n const setClause = sql.join(setParts, sql`, `);\n\n if (params.clearDeleted) {\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for a node (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteNode(\n tables: Tables,\n params: DeleteNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n UPDATE ${nodes}\n SET ${quotedColumn(nodes.deletedAt)} = ${timestamp}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for a node (permanent removal).\n */\nexport function buildHardDeleteNode(\n tables: Tables,\n params: HardDeleteNodeParams,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n DELETE FROM ${nodes}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type { InsertSchemaParams,SqlDialect } from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\ntype SchemaDialectStrategy = Readonly<{\n booleanLiteral: (value: boolean) => SQL;\n}>;\n\nfunction createSchemaDialectStrategy(dialect: SqlDialect): SchemaDialectStrategy {\n const trueLiteral = dialect === \"sqlite\" ? sql.raw(\"1\") : sql.raw(\"TRUE\");\n const falseLiteral = dialect === \"sqlite\" ? sql.raw(\"0\") : sql.raw(\"FALSE\");\n\n return {\n booleanLiteral(value: boolean): SQL {\n return value ? trueLiteral : falseLiteral;\n },\n };\n}\n\nconst SCHEMA_DIALECT_STRATEGIES: Record<SqlDialect, SchemaDialectStrategy> = {\n postgres: createSchemaDialectStrategy(\"postgres\"),\n sqlite: createSchemaDialectStrategy(\"sqlite\"),\n};\n\n/**\n * Builds an INSERT query for a schema version.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertSchema(\n tables: Tables,\n params: InsertSchemaParams,\n timestamp: string,\n dialect: SqlDialect = \"sqlite\",\n): SQL {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n const schemaDocumentJson = JSON.stringify(params.schemaDoc);\n const isActiveValue = strategy.booleanLiteral(params.isActive);\n\n const columns = sql.raw(`\"${schemaVersions.graphId.name}\", \"${schemaVersions.version.name}\", \"${schemaVersions.schemaHash.name}\", \"${schemaVersions.schemaDoc.name}\", \"${schemaVersions.createdAt.name}\", \"${schemaVersions.isActive.name}\"`);\n\n return sql`\n INSERT INTO ${schemaVersions} (${columns})\n VALUES (\n ${params.graphId}, ${params.version},\n ${params.schemaHash}, ${schemaDocumentJson},\n ${timestamp}, ${isActiveValue}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get the active schema for a graph.\n */\nexport function buildGetActiveSchema(\n tables: Tables,\n graphId: string,\n dialect: SqlDialect = \"sqlite\",\n): SQL {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.isActive} = ${strategy.booleanLiteral(true)}\n `;\n}\n\n/**\n * Builds a SELECT query to get a specific schema version.\n */\nexport function buildGetSchemaVersion(\n tables: Tables,\n graphId: string,\n version: number,\n): SQL {\n const { schemaVersions } = tables;\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n}\n\n/**\n * Builds UPDATE queries to set the active schema version.\n * Returns two queries: first deactivates all, second activates the specified version.\n * Uses raw column names in SET clause (SQLite doesn't allow table prefix there).\n */\nexport function buildSetActiveSchema(\n tables: Tables,\n graphId: string,\n version: number,\n dialect: SqlDialect = \"sqlite\",\n): { deactivateAll: SQL; activateVersion: SQL } {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n\n const deactivateAll = sql`\n UPDATE ${schemaVersions}\n SET ${quotedColumn(schemaVersions.isActive)} = ${strategy.booleanLiteral(false)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n `;\n\n const activateVersion = sql`\n UPDATE ${schemaVersions}\n SET ${quotedColumn(schemaVersions.isActive)} = ${strategy.booleanLiteral(true)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n\n return { deactivateAll, activateVersion };\n}\n","import { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n DeleteUniqueParams,\n InsertUniqueParams,\n SqlDialect,\n} from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\ntype InsertUniqueDialectBuilder = (\n tables: Tables,\n params: InsertUniqueParams,\n) => SQL;\n\n/**\n * Builds an INSERT query for a uniqueness entry (SQLite).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING will show the conflicting node_id.\n */\nfunction buildInsertUniqueSqlite(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n const conflictColumns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${quotedColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.nodeId}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${quotedColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${quotedColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.concreteKind}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${quotedColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${quotedColumn(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${quotedColumn(uniques.deletedAt)}\n END\n RETURNING ${quotedColumn(uniques.nodeId)} as node_id\n `;\n}\n\n/**\n * Builds an INSERT query for a uniqueness entry (PostgreSQL).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING will show the conflicting node_id.\n */\nfunction buildInsertUniquePostgres(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n const conflictColumns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\n\n const tableName = getTableName(uniques);\n const existingColumn = (column: { name: string }) =>\n sql.raw(`\"${tableName}\".\"${column.name}\"`);\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${existingColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.nodeId}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${existingColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${existingColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.concreteKind}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${existingColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${existingColumn(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingColumn(uniques.deletedAt)}\n END\n RETURNING ${quotedColumn(uniques.nodeId)} as node_id\n `;\n}\n\nconst UNIQUE_INSERT_BUILDERS: Record<SqlDialect, InsertUniqueDialectBuilder> = {\n postgres: buildInsertUniquePostgres,\n sqlite: buildInsertUniqueSqlite,\n};\n\n/**\n * Builds an INSERT query for a uniqueness entry.\n * Returns the node_id that now holds the key (may differ from input if conflict).\n */\nexport function buildInsertUnique(\n tables: Tables,\n dialect: SqlDialect,\n params: InsertUniqueParams,\n): SQL {\n const builder = UNIQUE_INSERT_BUILDERS[dialect];\n return builder(tables, params);\n}\n\n/**\n * Builds a soft DELETE query for a uniqueness entry.\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteUnique(\n tables: Tables,\n params: DeleteUniqueParams,\n timestamp: string,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n UPDATE ${uniques}\n SET ${quotedColumn(uniques.deletedAt)} = ${timestamp}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for all uniqueness entries for a node.\n */\nexport function buildHardDeleteUniquesByNode(\n tables: Tables,\n graphId: string,\n nodeId: string,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n DELETE FROM ${uniques}\n WHERE ${uniques.graphId} = ${graphId}\n AND ${uniques.nodeId} = ${nodeId}\n `;\n}\n\n/**\n * Builds a hard DELETE query for all embeddings for a node.\n */\nexport function buildHardDeleteEmbeddingsByNode(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n DELETE FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${graphId}\n AND ${embeddings.nodeKind} = ${nodeKind}\n AND ${embeddings.nodeId} = ${nodeId}\n `;\n}\n\n/**\n * Builds a SELECT query to check for uniqueness violations.\n */\nexport function buildCheckUnique(\n tables: Tables,\n params: CheckUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n if (params.includeDeleted) {\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n `;\n }\n\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a SELECT query to batch-check uniqueness entries by multiple keys.\n */\nexport function buildCheckUniqueBatch(\n tables: Tables,\n params: CheckUniqueBatchParams,\n): SQL {\n const { uniques } = tables;\n\n const keyPlaceholders = sql.join(\n params.keys.map((key) => sql`${key}`),\n sql`, `,\n );\n\n if (params.includeDeleted) {\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} IN (${keyPlaceholders})\n `;\n }\n\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} IN (${keyPlaceholders})\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n DeleteEmbeddingParams,\n UpsertEmbeddingParams,\n VectorMetric,\n VectorSearchParams,\n} from \"../../types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { Tables } from \"./shared\";\n\n/**\n * Validates that all values in an array are finite numbers.\n * Throws if any value is NaN, Infinity, or not a number.\n */\nfunction assertFiniteNumberArray(array: readonly number[], name: string): void {\n for (const [index, value] of array.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `${name}[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n}\n\n/**\n * Formats an embedding array as a pgvector literal string.\n * Validates all values are finite numbers first.\n */\nfunction formatEmbeddingLiteral(embedding: readonly number[]): string {\n assertFiniteNumberArray(embedding, \"embedding\");\n return `[${embedding.join(\",\")}]`;\n}\n\n/**\n * Builds an UPSERT query for an embedding (PostgreSQL).\n * Uses ON CONFLICT to update existing embeddings.\n */\nexport function buildUpsertEmbeddingPostgres(\n tables: PostgresTables,\n params: UpsertEmbeddingParams,\n timestamp: string,\n): SQL {\n const { embeddings } = tables;\n const embeddingLiteral = formatEmbeddingLiteral(params.embedding);\n\n const columns = sql.raw(\n `\"${embeddings.graphId.name}\", \"${embeddings.nodeKind.name}\", \"${embeddings.nodeId.name}\", \"${embeddings.fieldPath.name}\", \"${embeddings.embedding.name}\", \"${embeddings.dimensions.name}\", \"${embeddings.createdAt.name}\", \"${embeddings.updatedAt.name}\"`,\n );\n\n const conflictColumns = sql.raw(\n `\"${embeddings.graphId.name}\", \"${embeddings.nodeKind.name}\", \"${embeddings.nodeId.name}\", \"${embeddings.fieldPath.name}\"`,\n );\n\n const column = (target: { name: string }) => sql.raw(`\"${target.name}\"`);\n\n return sql`\n INSERT INTO ${embeddings} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.nodeId}, ${params.fieldPath},\n ${embeddingLiteral}::vector, ${params.dimensions}, ${timestamp}, ${timestamp}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${column(embeddings.embedding)} = ${embeddingLiteral}::vector,\n ${column(embeddings.dimensions)} = ${params.dimensions},\n ${column(embeddings.updatedAt)} = ${timestamp}\n `;\n}\n\n/**\n * Builds a DELETE query for an embedding.\n */\nexport function buildDeleteEmbedding(\n tables: Tables,\n params: DeleteEmbeddingParams,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n DELETE FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${params.graphId}\n AND ${embeddings.nodeKind} = ${params.nodeKind}\n AND ${embeddings.nodeId} = ${params.nodeId}\n AND ${embeddings.fieldPath} = ${params.fieldPath}\n `;\n}\n\n/**\n * Builds a SELECT query to get an embedding.\n */\nexport function buildGetEmbedding(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n SELECT * FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${graphId}\n AND ${embeddings.nodeKind} = ${nodeKind}\n AND ${embeddings.nodeId} = ${nodeId}\n AND ${embeddings.fieldPath} = ${fieldPath}\n `;\n}\n\n/**\n * Builds the distance expression for a given metric.\n * Uses parameterized embedding literal to prevent SQL injection.\n */\nfunction buildDistanceExpression(\n embeddingColumn: SQL,\n queryLiteral: string,\n metric: VectorMetric,\n): SQL {\n const vectorParameter = sql`${queryLiteral}::vector`;\n\n switch (metric) {\n case \"cosine\": {\n return sql`(${embeddingColumn} <=> ${vectorParameter})`;\n }\n case \"l2\": {\n return sql`(${embeddingColumn} <-> ${vectorParameter})`;\n }\n case \"inner_product\": {\n return sql`(${embeddingColumn} <#> ${vectorParameter})`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\nfunction buildVectorSearchScoreExpression(\n distanceExpression: SQL,\n metric: VectorMetric,\n): SQL {\n switch (metric) {\n case \"cosine\": {\n return sql`(1 - (${distanceExpression}))`;\n }\n case \"l2\":\n case \"inner_product\": {\n return distanceExpression;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\nfunction buildVectorSearchMinScoreCondition(\n distanceExpression: SQL,\n metric: VectorMetric,\n minScore: number,\n): SQL {\n switch (metric) {\n case \"cosine\": {\n const threshold = 1 - minScore;\n return sql`${distanceExpression} <= ${threshold}`;\n }\n case \"l2\": {\n return sql`${distanceExpression} <= ${minScore}`;\n }\n case \"inner_product\": {\n const negativeThreshold = -minScore;\n return sql`${distanceExpression} <= ${negativeThreshold}`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\n/**\n * Builds a vector similarity search query (PostgreSQL).\n * Returns node IDs ordered by similarity (closest first).\n */\nexport function buildVectorSearchPostgres(\n tables: PostgresTables,\n params: VectorSearchParams,\n): SQL {\n const { embeddings } = tables;\n const queryLiteral = formatEmbeddingLiteral(params.queryEmbedding);\n\n if (params.minScore !== undefined && !Number.isFinite(params.minScore)) {\n throw new TypeError(\n `minScore must be a finite number, got: ${params.minScore}`,\n );\n }\n\n if (!Number.isInteger(params.limit) || params.limit <= 0) {\n throw new Error(`limit must be a positive integer, got: ${params.limit}`);\n }\n\n const embeddingColumn = sql`${embeddings.embedding}`;\n const distanceExpression = buildDistanceExpression(\n embeddingColumn,\n queryLiteral,\n params.metric,\n );\n\n const conditions = [\n sql`${embeddings.graphId} = ${params.graphId}`,\n sql`${embeddings.nodeKind} = ${params.nodeKind}`,\n sql`${embeddings.fieldPath} = ${params.fieldPath}`,\n ];\n\n if (params.minScore !== undefined) {\n conditions.push(\n buildVectorSearchMinScoreCondition(\n distanceExpression,\n params.metric,\n params.minScore,\n ),\n );\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n const scoreExpression = buildVectorSearchScoreExpression(\n distanceExpression,\n params.metric,\n );\n\n return sql`\n SELECT\n ${embeddings.nodeId} as node_id,\n ${scoreExpression} as score\n FROM ${embeddings}\n WHERE ${whereClause}\n ORDER BY ${distanceExpression} ASC\n LIMIT ${params.limit}\n `;\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEmbeddingParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n SqlDialect,\n UpdateEdgeParams,\n UpdateNodeParams,\n UpsertEmbeddingParams,\n VectorSearchParams,\n} from \"../../types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\nimport {\n buildCountEdgesByKind,\n buildCountNodesByKind,\n buildFindEdgesByKind,\n buildFindNodesByKind,\n} from \"./collections\";\nimport {\n buildCountEdgesFrom,\n buildDeleteEdge,\n buildEdgeExistsBetween,\n buildFindEdgesConnectedTo,\n buildGetEdge,\n buildGetEdges,\n buildHardDeleteEdge,\n buildHardDeleteEdgesByNode,\n buildInsertEdge,\n buildInsertEdgeNoReturn,\n buildInsertEdgesBatch,\n buildInsertEdgesBatchReturning,\n buildUpdateEdge,\n} from \"./edges\";\nimport {\n buildDeleteNode,\n buildGetNode,\n buildGetNodes,\n buildHardDeleteNode,\n buildInsertNode,\n buildInsertNodeNoReturn,\n buildInsertNodesBatch,\n buildInsertNodesBatchReturning,\n buildUpdateNode,\n} from \"./nodes\";\nimport {\n buildGetActiveSchema,\n buildGetSchemaVersion,\n buildInsertSchema,\n buildSetActiveSchema,\n} from \"./schema\";\nimport type { Tables } from \"./shared\";\nimport {\n buildCheckUnique,\n buildCheckUniqueBatch,\n buildDeleteUnique,\n buildHardDeleteEmbeddingsByNode,\n buildHardDeleteUniquesByNode,\n buildInsertUnique,\n} from \"./uniques\";\nimport {\n buildDeleteEmbedding,\n buildGetEmbedding,\n buildUpsertEmbeddingPostgres,\n buildVectorSearchPostgres,\n} from \"./vectors\";\n\nexport type CommonOperationStrategy = Readonly<{\n buildInsertNode: (params: InsertNodeParams, timestamp: string) => SQL;\n buildInsertNodeNoReturn: (\n params: InsertNodeParams,\n timestamp: string,\n ) => SQL;\n buildInsertNodesBatch: (\n params: readonly InsertNodeParams[],\n timestamp: string,\n ) => SQL;\n buildInsertNodesBatchReturning: (\n params: readonly InsertNodeParams[],\n timestamp: string,\n ) => SQL;\n buildGetNode: (graphId: string, kind: string, id: string) => SQL;\n buildGetNodes: (graphId: string, kind: string, ids: readonly string[]) => SQL;\n buildUpdateNode: (params: UpdateNodeParams, timestamp: string) => SQL;\n buildDeleteNode: (params: DeleteNodeParams, timestamp: string) => SQL;\n buildHardDeleteNode: (params: HardDeleteNodeParams) => SQL;\n buildInsertEdge: (params: InsertEdgeParams, timestamp: string) => SQL;\n buildInsertEdgeNoReturn: (\n params: InsertEdgeParams,\n timestamp: string,\n ) => SQL;\n buildInsertEdgesBatch: (\n params: readonly InsertEdgeParams[],\n timestamp: string,\n ) => SQL;\n buildInsertEdgesBatchReturning: (\n params: readonly InsertEdgeParams[],\n timestamp: string,\n ) => SQL;\n buildGetEdge: (graphId: string, id: string) => SQL;\n buildGetEdges: (graphId: string, ids: readonly string[]) => SQL;\n buildUpdateEdge: (params: UpdateEdgeParams, timestamp: string) => SQL;\n buildDeleteEdge: (params: DeleteEdgeParams, timestamp: string) => SQL;\n buildHardDeleteEdge: (params: HardDeleteEdgeParams) => SQL;\n buildHardDeleteEdgesByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ) => SQL;\n buildCountEdgesFrom: (params: CountEdgesFromParams) => SQL;\n buildEdgeExistsBetween: (params: EdgeExistsBetweenParams) => SQL;\n buildFindEdgesConnectedTo: (params: FindEdgesConnectedToParams) => SQL;\n buildFindNodesByKind: (params: FindNodesByKindParams) => SQL;\n buildCountNodesByKind: (params: CountNodesByKindParams) => SQL;\n buildFindEdgesByKind: (params: FindEdgesByKindParams) => SQL;\n buildCountEdgesByKind: (params: CountEdgesByKindParams) => SQL;\n buildInsertUnique: (params: InsertUniqueParams) => SQL;\n buildDeleteUnique: (params: DeleteUniqueParams, timestamp: string) => SQL;\n buildHardDeleteUniquesByNode: (graphId: string, nodeId: string) => SQL;\n buildHardDeleteEmbeddingsByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ) => SQL;\n buildCheckUnique: (params: CheckUniqueParams) => SQL;\n buildCheckUniqueBatch: (params: CheckUniqueBatchParams) => SQL;\n buildGetActiveSchema: (graphId: string) => SQL;\n buildInsertSchema: (params: InsertSchemaParams, timestamp: string) => SQL;\n buildGetSchemaVersion: (graphId: string, version: number) => SQL;\n buildSetActiveSchema: (\n graphId: string,\n version: number,\n ) => Readonly<{ activateVersion: SQL; deactivateAll: SQL }>;\n}>;\n\nexport type PostgresVectorOperationStrategy = Readonly<{\n buildUpsertEmbedding: (\n params: UpsertEmbeddingParams,\n timestamp: string,\n ) => SQL;\n buildDeleteEmbedding: (params: DeleteEmbeddingParams) => SQL;\n buildGetEmbedding: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ) => SQL;\n buildVectorSearch: (params: VectorSearchParams) => SQL;\n}>;\n\nexport type SqliteOperationStrategy = CommonOperationStrategy;\n\nexport type PostgresOperationStrategy = Readonly<\n CommonOperationStrategy & PostgresVectorOperationStrategy\n>;\n\ntype TableOperationBuilder = (\n tables: Tables,\n ...args: never[]\n) => SQL;\n\ntype TableOperationBuilderMap = Readonly<Record<string, TableOperationBuilder>>;\n\ntype BoundTableOperationBuilderMap<TBuilders extends TableOperationBuilderMap> = Readonly<{\n [K in keyof TBuilders]: TBuilders[K] extends (\n tables: Tables,\n ...args: infer TArguments\n ) => SQL\n ? (...args: TArguments) => SQL\n : never;\n}>;\n\nfunction bindTableOperationBuilders<TBuilders extends TableOperationBuilderMap>(\n tables: Tables,\n builders: TBuilders,\n): BoundTableOperationBuilderMap<TBuilders> {\n const boundEntries = Object.entries(builders).map(([name, builder]) => {\n function boundBuilder(...args: never[]): SQL {\n return builder(tables, ...args);\n }\n\n return [name, boundBuilder] as const;\n });\n\n return Object.fromEntries(boundEntries) as BoundTableOperationBuilderMap<TBuilders>;\n}\n\nconst COMMON_TABLE_OPERATION_BUILDERS = {\n buildInsertNode,\n buildInsertNodeNoReturn,\n buildInsertNodesBatch,\n buildInsertNodesBatchReturning,\n buildGetNode,\n buildGetNodes,\n buildUpdateNode,\n buildDeleteNode,\n buildHardDeleteNode,\n buildInsertEdge,\n buildInsertEdgeNoReturn,\n buildInsertEdgesBatch,\n buildInsertEdgesBatchReturning,\n buildGetEdge,\n buildGetEdges,\n buildUpdateEdge,\n buildDeleteEdge,\n buildHardDeleteEdge,\n buildHardDeleteEdgesByNode,\n buildCountEdgesFrom,\n buildEdgeExistsBetween,\n buildFindEdgesConnectedTo,\n buildFindNodesByKind,\n buildCountNodesByKind,\n buildFindEdgesByKind,\n buildCountEdgesByKind,\n buildDeleteUnique,\n buildHardDeleteUniquesByNode,\n buildHardDeleteEmbeddingsByNode,\n buildCheckUnique,\n buildCheckUniqueBatch,\n buildGetSchemaVersion,\n} as const satisfies TableOperationBuilderMap;\n\nfunction createCommonOperationStrategy(\n tables: Tables,\n dialect: SqlDialect,\n): CommonOperationStrategy {\n const tableOperations = bindTableOperationBuilders(\n tables,\n COMMON_TABLE_OPERATION_BUILDERS,\n );\n\n return {\n ...tableOperations,\n buildInsertUnique(params: InsertUniqueParams): SQL {\n return buildInsertUnique(tables, dialect, params);\n },\n buildGetActiveSchema(graphId: string): SQL {\n return buildGetActiveSchema(tables, graphId, dialect);\n },\n buildInsertSchema(params: InsertSchemaParams, timestamp: string): SQL {\n return buildInsertSchema(tables, params, timestamp, dialect);\n },\n buildSetActiveSchema(\n graphId: string,\n version: number,\n ): Readonly<{ activateVersion: SQL; deactivateAll: SQL }> {\n return buildSetActiveSchema(tables, graphId, version, dialect);\n },\n };\n}\n\nexport function createSqliteOperationStrategy(\n tables: SqliteTables,\n): SqliteOperationStrategy {\n return createCommonOperationStrategy(tables, \"sqlite\");\n}\n\nexport function createPostgresOperationStrategy(\n tables: PostgresTables,\n): PostgresOperationStrategy {\n const common = createCommonOperationStrategy(tables, \"postgres\");\n\n return {\n ...common,\n buildUpsertEmbedding(params: UpsertEmbeddingParams, timestamp: string): SQL {\n return buildUpsertEmbeddingPostgres(tables, params, timestamp);\n },\n buildDeleteEmbedding(params: DeleteEmbeddingParams): SQL {\n return buildDeleteEmbedding(tables, params);\n },\n buildGetEmbedding(\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ): SQL {\n return buildGetEmbedding(tables, graphId, nodeKind, nodeId, fieldPath);\n },\n buildVectorSearch(params: VectorSearchParams): SQL {\n return buildVectorSearchPostgres(tables, params);\n },\n };\n}\n","/**\n * Vector Index Management\n *\n * Provides utilities for creating and managing vector indexes\n * on the embeddings table for efficient similarity search.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type VectorIndexType, type VectorMetric } from \"../types\";\nimport { type AnyPgDatabase } from \"./execution/postgres-execution\";\n\n// ============================================================\n// Validation\n// ============================================================\n\n/**\n * Validates that a value is a positive integer.\n */\nfunction assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer, got: ${value}`);\n }\n}\n\n/**\n * Validates that a string is a safe SQL identifier (alphanumeric + underscore only).\n */\nfunction assertSafeIdentifier(value: string, name: string): void {\n if (!/^[a-z0-9_]+$/i.test(value)) {\n throw new Error(\n `${name} must contain only alphanumeric characters and underscores, got: ${value}`,\n );\n }\n}\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Options for creating a vector index.\n */\nexport type VectorIndexOptions = Readonly<{\n /** The graph ID */\n graphId: string;\n /** The node kind to index */\n nodeKind: string;\n /** The field path (embedding property name) */\n fieldPath: string;\n /** The number of dimensions (required for pgvector) */\n dimensions: number;\n /** The index type: \"hnsw\" (default) or \"ivfflat\" */\n indexType?: VectorIndexType;\n /** The similarity metric for the index */\n metric?: VectorMetric;\n /** HNSW-specific: maximum number of connections per layer (default: 16) */\n hnswM?: number;\n /** HNSW-specific: size of dynamic candidate list during construction (default: 64) */\n hnswEfConstruction?: number;\n /** IVFFlat-specific: number of inverted lists (default: 100) */\n ivfflatLists?: number;\n /** Embeddings table name. Defaults to typegraph_node_embeddings. */\n embeddingsTableName?: string;\n}>;\n\n/**\n * Result of a vector index operation.\n */\nexport type VectorIndexResult = Readonly<{\n /** The generated index name */\n indexName: string;\n /** Whether the operation succeeded */\n success: boolean;\n /** Optional message */\n message?: string;\n}>;\n\n// ============================================================\n// Index Name Generation\n// ============================================================\n\nconst MAX_IDENTIFIER_LENGTH = 63;\n\n/**\n * Sanitizes a string to be a valid SQL identifier component.\n */\nfunction sanitizeIdentifier(s: string): string {\n return s.toLowerCase().replaceAll(/[^a-z0-9_]/g, \"_\");\n}\n\nfunction quoteIdentifier(value: string): string {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\n/**\n * Simple deterministic hash for identifier deduplication.\n * Returns an 8-char hex string.\n */\nfunction shortHash(input: string): string {\n let h1 = 0xde_ad_be_ef;\n let h2 = 0x41_c6_ce_57;\n for (let index = 0; index < input.length; index++) {\n const ch = input.codePointAt(index)!;\n h1 = Math.imul(h1 ^ ch, 0x9e_37_79_b1);\n h2 = Math.imul(h2 ^ ch, 0x5f_35_64_95);\n }\n h1 =\n Math.imul(h1 ^ (h1 >>> 16), 0x85_eb_ca_6b) ^\n Math.imul(h2 ^ (h2 >>> 13), 0xc2_b2_ae_35);\n h2 =\n Math.imul(h2 ^ (h2 >>> 16), 0x85_eb_ca_6b) ^\n Math.imul(h1 ^ (h1 >>> 13), 0xc2_b2_ae_35);\n const hi = (h2 >>> 0).toString(16).padStart(8, \"0\");\n const lo = (h1 >>> 0).toString(16).padStart(8, \"0\");\n return `${hi}${lo}`.slice(0, 8);\n}\n\n/**\n * Generates a consistent index name for a vector index.\n *\n * Format: `idx_emb_{graphId}_{nodeKind}_{fieldPath}_{metric}`\n * Names are sanitized to be valid SQL identifiers.\n * If the name exceeds PostgreSQL's 63-char identifier limit,\n * it is truncated with a hash suffix to prevent collisions.\n */\nexport function generateVectorIndexName(\n graphId: string,\n nodeKind: string,\n fieldPath: string,\n metric: VectorMetric = \"cosine\",\n): string {\n const parts = [\n \"idx_emb\",\n sanitizeIdentifier(graphId),\n sanitizeIdentifier(nodeKind),\n sanitizeIdentifier(fieldPath),\n metric,\n ];\n\n const name = parts.join(\"_\");\n\n if (name.length <= MAX_IDENTIFIER_LENGTH) {\n return name;\n }\n\n const hash = shortHash(name);\n // Reserve space for _hash suffix\n const truncated = name.slice(0, MAX_IDENTIFIER_LENGTH - 1 - hash.length);\n return `${truncated}_${hash}`;\n}\n\n// ============================================================\n// PostgreSQL Vector Index Operations\n// ============================================================\n\n/**\n * Gets the pgvector operator class for a given metric.\n */\nfunction getOperatorClass(metric: VectorMetric): string {\n switch (metric) {\n case \"cosine\": {\n return \"vector_cosine_ops\";\n }\n case \"l2\": {\n return \"vector_l2_ops\";\n }\n case \"inner_product\": {\n return \"vector_ip_ops\";\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(\"Unsupported vector metric: \" + String(_exhaustive));\n }\n }\n}\n\n/**\n * Escapes a string for use in a SQL string literal.\n * Uses dollar quoting to avoid issues with embedded quotes.\n */\nfunction escapeSqlString(value: string): string {\n const tag = `tg${crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 8)}`;\n return `$${tag}$${value}$${tag}$`;\n}\n\n/**\n * Creates a vector index on the embeddings table (PostgreSQL/pgvector).\n *\n * This should be called after the embeddings table is created.\n * The index significantly improves similarity search performance.\n *\n * @example\n * ```typescript\n * await createVectorIndex(db, {\n * graphId: \"my-graph\",\n * nodeKind: \"Document\",\n * fieldPath: \"embedding\",\n * dimensions: 1536,\n * indexType: \"hnsw\",\n * metric: \"cosine\",\n * });\n * ```\n */\nexport async function createPostgresVectorIndex(\n db: AnyPgDatabase,\n options: VectorIndexOptions,\n): Promise<VectorIndexResult> {\n const {\n graphId,\n nodeKind,\n fieldPath,\n dimensions,\n embeddingsTableName = \"typegraph_node_embeddings\",\n indexType = \"hnsw\",\n metric = \"cosine\",\n hnswM = 16,\n hnswEfConstruction = 64,\n ivfflatLists = 100,\n } = options;\n\n // Validate all numeric parameters\n assertPositiveInteger(dimensions, \"dimensions\");\n assertPositiveInteger(hnswM, \"hnswM\");\n assertPositiveInteger(hnswEfConstruction, \"hnswEfConstruction\");\n assertPositiveInteger(ivfflatLists, \"ivfflatLists\");\n\n const indexName = generateVectorIndexName(graphId, nodeKind, fieldPath, metric);\n const operatorClass = getOperatorClass(metric);\n const quotedEmbeddingsTableName = quoteIdentifier(embeddingsTableName);\n\n // Validate that the generated index name is safe\n assertSafeIdentifier(indexName, \"indexName\");\n\n // Use dollar quoting for string values to prevent SQL injection\n const safeGraphId = escapeSqlString(graphId);\n const safeNodeKind = escapeSqlString(nodeKind);\n const safeFieldPath = escapeSqlString(fieldPath);\n\n // Build the CREATE INDEX statement\n let indexSql: SQL;\n\n if (indexType === \"hnsw\") {\n // HNSW index with optional parameters\n // Column is native VECTOR type, but we still specify dimensions in the\n // index expression to ensure consistent index behavior\n indexSql = sql.raw(`\n CREATE INDEX IF NOT EXISTS ${indexName}\n ON ${quotedEmbeddingsTableName}\n USING hnsw ((embedding::vector(${dimensions})) ${operatorClass})\n WITH (m = ${hnswM}, ef_construction = ${hnswEfConstruction})\n WHERE graph_id = ${safeGraphId}\n AND node_kind = ${safeNodeKind}\n AND field_path = ${safeFieldPath}\n `);\n } else if (indexType === \"ivfflat\") {\n // IVFFlat index\n // Column is native VECTOR type, but we still specify dimensions in the\n // index expression to ensure consistent index behavior\n indexSql = sql.raw(`\n CREATE INDEX IF NOT EXISTS ${indexName}\n ON ${quotedEmbeddingsTableName}\n USING ivfflat ((embedding::vector(${dimensions})) ${operatorClass})\n WITH (lists = ${ivfflatLists})\n WHERE graph_id = ${safeGraphId}\n AND node_kind = ${safeNodeKind}\n AND field_path = ${safeFieldPath}\n `);\n } else {\n // No index (or unsupported type)\n return {\n indexName,\n success: true,\n message: `Index type \"${indexType}\" not supported, skipping index creation`,\n };\n }\n\n try {\n await db.execute(indexSql);\n return {\n indexName,\n success: true,\n message: `Created ${indexType.toUpperCase()} index \"${indexName}\" for ${nodeKind}.${fieldPath}`,\n };\n } catch (error) {\n return {\n indexName,\n success: false,\n message: `Failed to create index: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Drops a vector index (PostgreSQL).\n *\n * @param indexName - Must be a valid SQL identifier (alphanumeric + underscore only)\n */\nexport async function dropPostgresVectorIndex(\n db: AnyPgDatabase,\n indexName: string,\n): Promise<VectorIndexResult> {\n // Validate index name to prevent SQL injection\n assertSafeIdentifier(indexName, \"indexName\");\n\n try {\n const dropSql = sql.raw(`DROP INDEX IF EXISTS ${indexName}`);\n await db.execute(dropSql);\n return {\n indexName,\n success: true,\n message: `Dropped index \"${indexName}\"`,\n };\n } catch (error) {\n return {\n indexName,\n success: false,\n message: `Failed to drop index: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n// ============================================================\n// SQLite Vector Index Operations\n// ============================================================\n\n/**\n * SQLite/sqlite-vec doesn't support traditional indexes on virtual tables.\n * Vector search is optimized through the extension itself.\n *\n * This function is a no-op for SQLite but provides a consistent API.\n */\nexport function createSqliteVectorIndex(\n _options: VectorIndexOptions,\n): VectorIndexResult {\n const indexName = generateVectorIndexName(\n _options.graphId,\n _options.nodeKind,\n _options.fieldPath,\n _options.metric,\n );\n\n return {\n indexName,\n success: true,\n message: \"SQLite/sqlite-vec uses optimized internal indexing, no explicit index needed\",\n };\n}\n\n/**\n * SQLite vector index drop (no-op for consistency).\n */\nexport function dropSqliteVectorIndex(\n graphId: string,\n nodeKind: string,\n fieldPath: string,\n metric: VectorMetric = \"cosine\",\n): VectorIndexResult {\n const indexName = generateVectorIndexName(graphId, nodeKind, fieldPath, metric);\n\n return {\n indexName,\n success: true,\n message: \"SQLite/sqlite-vec does not use explicit indexes\",\n };\n}\n","import { type SQL } from \"drizzle-orm\";\n\nexport type CompiledSqlQuery = Readonly<{\n params: readonly unknown[];\n sql: string;\n}>;\n\nexport type PreparedSqlStatement = Readonly<{\n execute: <TRow>(params: readonly unknown[]) => Promise<readonly TRow[]>;\n}>;\n\nexport type SqlExecutionAdapter = Readonly<{\n compile: (query: SQL) => CompiledSqlQuery;\n execute: <TRow>(query: SQL) => Promise<readonly TRow[]>;\n executeCompiled?: <TRow>(\n compiledQuery: CompiledSqlQuery,\n ) => Promise<readonly TRow[]>;\n prepare?: (sqlText: string) => PreparedSqlStatement;\n}>;\n\ntype SqlCompiler = Readonly<{\n sqlToQuery: (query: SQL) => CompiledSqlQuery;\n}>;\n\ntype DatabaseWithCompiler = Readonly<{\n dialect?: SqlCompiler;\n}>;\n\nexport function compileQueryWithDialect(\n db: unknown,\n query: SQL,\n backendName: string,\n): CompiledSqlQuery {\n const databaseWithCompiler = db as DatabaseWithCompiler;\n const compiler = databaseWithCompiler.dialect;\n if (compiler === undefined) {\n throw new Error(`${backendName} backend is missing a SQL compiler`);\n }\n return compiler.sqlToQuery(query);\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk44SXEVF4_cjs = require('./chunk-44SXEVF4.cjs');
|
|
4
4
|
|
|
5
5
|
// src/core/types.ts
|
|
6
6
|
var NODE_TYPE_BRAND = "__nodeType";
|
|
@@ -21,7 +21,7 @@ function validateConstraintNarrowing(name, edgeType, registration) {
|
|
|
21
21
|
const builtInFromNames = new Set(edgeType.from.map((n) => n.kind));
|
|
22
22
|
for (const fromNode of registration.from) {
|
|
23
23
|
if (!builtInFromNames.has(fromNode.kind)) {
|
|
24
|
-
throw new
|
|
24
|
+
throw new chunk44SXEVF4_cjs.ConfigurationError(
|
|
25
25
|
`Edge "${name}" registration has 'from' kind "${fromNode.kind}" not in edge's built-in domain: [${[...builtInFromNames].join(", ")}]`,
|
|
26
26
|
{
|
|
27
27
|
edgeName: name,
|
|
@@ -37,7 +37,7 @@ function validateConstraintNarrowing(name, edgeType, registration) {
|
|
|
37
37
|
const builtInToNames = new Set(edgeType.to.map((n) => n.kind));
|
|
38
38
|
for (const toNode of registration.to) {
|
|
39
39
|
if (!builtInToNames.has(toNode.kind)) {
|
|
40
|
-
throw new
|
|
40
|
+
throw new chunk44SXEVF4_cjs.ConfigurationError(
|
|
41
41
|
`Edge "${name}" registration has 'to' kind "${toNode.kind}" not in edge's built-in range: [${[...builtInToNames].join(", ")}]`,
|
|
42
42
|
{
|
|
43
43
|
edgeName: name,
|
|
@@ -107,7 +107,7 @@ function isValidIsoDate(value) {
|
|
|
107
107
|
}
|
|
108
108
|
function validateIsoDate(value, fieldName) {
|
|
109
109
|
if (!isValidIsoDate(value)) {
|
|
110
|
-
throw new
|
|
110
|
+
throw new chunk44SXEVF4_cjs.ValidationError(
|
|
111
111
|
`Invalid ISO 8601 datetime for "${fieldName}": "${value}". Expected format: YYYY-MM-DDTHH:mm:ss.sssZ`,
|
|
112
112
|
{
|
|
113
113
|
issues: [
|
|
@@ -143,5 +143,5 @@ exports.isGraphDef = isGraphDef;
|
|
|
143
143
|
exports.isNodeType = isNodeType;
|
|
144
144
|
exports.nowIso = nowIso;
|
|
145
145
|
exports.validateOptionalIsoDate = validateOptionalIsoDate;
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-K2ROKOK3.cjs.map
|
|
147
|
+
//# sourceMappingURL=chunk-K2ROKOK3.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/types.ts","../src/core/define-graph.ts","../src/utils/date.ts"],"names":["ConfigurationError","ValidationError"],"mappings":"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","file":"chunk-ZJHQZZT2.cjs","sourcesContent":["import { type z } from \"zod\";\n\n// ============================================================\n// Brand Keys for Nominal Typing\n// ============================================================\n\n/** Brand key for NodeType */\nexport const NODE_TYPE_BRAND = \"__nodeType\" as const;\n\n/** Brand key for EdgeType */\nexport const EDGE_TYPE_BRAND = \"__edgeType\" as const;\n\n/** Brand symbol for NodeId */\ndeclare const __nodeId: unique symbol;\n\n// ============================================================\n// Node Type\n// ============================================================\n\n/**\n * A node type definition.\n *\n * Created via `defineNode()`. Represents a type of node in the graph\n * with an associated Zod schema for properties.\n */\nexport type NodeType<\n K extends string = string,\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n [NODE_TYPE_BRAND]: true;\n kind: K;\n schema: S;\n description: string | undefined;\n}>;\n\n/**\n * Branded node ID type.\n *\n * Prevents mixing IDs from different node types at compile time.\n */\nexport type NodeId<N extends NodeType> = string &\n Readonly<{\n [__nodeId]: N;\n }>;\n\n/**\n * Infer the props type from a NodeType.\n */\nexport type NodeProps<N extends NodeType> = z.infer<N[\"schema\"]>;\n\n// ============================================================\n// Edge Type\n// ============================================================\n\n/**\n * An edge type definition.\n *\n * Created via `defineEdge()`. Represents a type of edge in the graph\n * with an optional Zod schema for properties.\n *\n * Optionally includes `from` and `to` arrays that define the allowed\n * source and target node types (domain and range constraints).\n */\nexport type EdgeType<\n K extends string = string,\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined = undefined,\n To extends readonly NodeType[] | undefined = undefined,\n> = Readonly<{\n [EDGE_TYPE_BRAND]: true;\n kind: K;\n schema: S;\n description: string | undefined;\n from: From;\n to: To;\n}>;\n\n/**\n * Base edge type for use in constraints - accepts any from/to configuration.\n */\nexport type AnyEdgeType = EdgeType<\n string,\n z.ZodObject<z.ZodRawShape>,\n readonly NodeType[] | undefined,\n readonly NodeType[] | undefined\n>;\n\n/**\n * An edge type that has both from and to constraints defined.\n * Can be used directly in defineGraph without an EdgeRegistration wrapper.\n */\nexport type EdgeTypeWithEndpoints = EdgeType<\n string,\n z.ZodObject<z.ZodRawShape>,\n readonly NodeType[],\n readonly NodeType[]\n>;\n\n/**\n * Infer the props type from an EdgeType.\n */\nexport type EdgeProps<E extends AnyEdgeType> = z.infer<E[\"schema\"]>;\n\n// ============================================================\n// Configuration Types\n// ============================================================\n\n/**\n * Delete behaviors for nodes.\n */\nexport type DeleteBehavior = \"restrict\" | \"cascade\" | \"disconnect\";\n\n/**\n * Edge cardinality constraints.\n */\nexport type Cardinality =\n | \"many\" // No constraint (default)\n | \"one\" // At most one edge of this kind from any source node\n | \"unique\" // At most one edge of this kind between any (source, target) pair\n | \"oneActive\"; // At most one edge with valid_to IS NULL from any source\n\n/**\n * Endpoint existence modes for edge validation.\n */\nexport type EndpointExistence =\n | \"notDeleted\" // Endpoint deleted_at IS NULL (default)\n | \"currentlyValid\" // Endpoint not deleted AND temporally valid\n | \"ever\"; // Endpoint exists in any state\n\n/**\n * Temporal query modes.\n */\nexport type TemporalMode =\n | \"current\" // Valid now AND not deleted\n | \"asOf\" // Valid at specific date AND not deleted\n | \"includeEnded\" // All validity periods AND not deleted\n | \"includeTombstones\"; // Everything including soft-deleted\n\n/**\n * Uniqueness constraint scope.\n */\nexport type UniquenessScope =\n | \"kind\" // Unique within this exact kind only\n | \"kindWithSubClasses\"; // Unique across this kind and all subclasses\n\n/**\n * Collation for uniqueness constraints.\n */\nexport type Collation = \"binary\" | \"caseInsensitive\";\n\n// ============================================================\n// Uniqueness Constraint\n// ============================================================\n\n/**\n * Uniqueness constraint definition.\n */\nexport type UniqueConstraint<\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n name: string;\n fields: readonly (keyof z.infer<S> & string)[];\n where?: (\n props: UniqueConstraintPredicateBuilder<S>,\n ) => UniqueConstraintPredicate;\n scope: UniquenessScope;\n collation: Collation;\n}>;\n\n/**\n * Predicate builder for uniqueness constraint where clause.\n * Uses -? to make all fields required in the builder, even if optional in the schema.\n */\nexport type UniqueConstraintPredicateBuilder<\n S extends z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n [K in keyof z.infer<S>]-?: UniqueConstraintField;\n}>;\n\n/**\n * Field operations for uniqueness constraint predicates.\n */\ntype UniqueConstraintField = Readonly<{\n isNull: () => UniqueConstraintPredicate;\n isNotNull: () => UniqueConstraintPredicate;\n}>;\n\n/**\n * A uniqueness constraint predicate (internal representation).\n */\nexport type UniqueConstraintPredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\n// ============================================================\n// Node Registration\n// ============================================================\n\n/**\n * Node registration in a graph definition.\n */\nexport type NodeRegistration<N extends NodeType = NodeType> = Readonly<{\n type: N;\n unique?: readonly UniqueConstraint<N[\"schema\"]>[];\n onDelete?: DeleteBehavior;\n}>;\n\n// ============================================================\n// Edge Registration\n// ============================================================\n\n/**\n * Edge registration in a graph definition.\n */\nexport type EdgeRegistration<\n E extends AnyEdgeType = AnyEdgeType,\n FromTypes extends NodeType = NodeType,\n ToTypes extends NodeType = NodeType,\n> = Readonly<{\n type: E;\n from: readonly FromTypes[];\n to: readonly ToTypes[];\n cardinality?: Cardinality;\n endpointExistence?: EndpointExistence;\n}>;\n\n// ============================================================\n// Graph Defaults\n// ============================================================\n\n/**\n * Default settings for a graph.\n */\nexport type GraphDefaults = Readonly<{\n onNodeDelete?: DeleteBehavior;\n temporalMode?: TemporalMode;\n}>;\n\n// ============================================================\n// Type Helpers\n// ============================================================\n\n/**\n * Checks if a value is a NodeType.\n */\nexport function isNodeType(value: unknown): value is NodeType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n NODE_TYPE_BRAND in value &&\n (value as Record<string, unknown>)[NODE_TYPE_BRAND] === true\n );\n}\n\n/**\n * Checks if a value is an EdgeType.\n */\nexport function isEdgeType(value: unknown): value is AnyEdgeType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n EDGE_TYPE_BRAND in value &&\n (value as Record<string, unknown>)[EDGE_TYPE_BRAND] === true\n );\n}\n\n/**\n * Checks if a value is an EdgeType with both from and to constraints defined.\n * Such edges can be used directly in defineGraph without an EdgeRegistration wrapper.\n */\nexport function isEdgeTypeWithEndpoints(\n value: unknown,\n): value is EdgeTypeWithEndpoints {\n return (\n isEdgeType(value) &&\n Array.isArray(value.from) &&\n value.from.length > 0 &&\n Array.isArray(value.to) &&\n value.to.length > 0\n );\n}\n","import { ConfigurationError } from \"../errors/index\";\nimport { type OntologyRelation } from \"../ontology/types\";\nimport {\n type DeleteBehavior,\n type EdgeRegistration,\n type EdgeTypeWithEndpoints,\n type GraphDefaults,\n isEdgeTypeWithEndpoints,\n type NodeRegistration,\n type NodeType,\n type TemporalMode,\n} from \"./types\";\n\n// ============================================================\n// Graph Definition Brand Symbol\n// ============================================================\n\n/** Brand key for GraphDef */\nconst GRAPH_DEF_BRAND = \"__graphDef\" as const;\n\n// ============================================================\n// Edge Entry Types\n// ============================================================\n\n/**\n * An edge entry in the graph definition.\n * Can be:\n * - EdgeType directly (if it has from/to defined)\n * - EdgeRegistration object (always works, can override/narrow defaults)\n */\ntype EdgeEntry = EdgeRegistration | EdgeTypeWithEndpoints;\n\n/**\n * Normalized edge map type - all entries become EdgeRegistration.\n */\ntype NormalizedEdges<TEdges extends Record<string, EdgeEntry>> = {\n [K in keyof TEdges]: TEdges[K] extends EdgeRegistration ? TEdges[K]\n : TEdges[K] extends EdgeTypeWithEndpoints ?\n EdgeRegistration<\n TEdges[K],\n TEdges[K][\"from\"][number],\n TEdges[K][\"to\"][number]\n >\n : never;\n};\n\n// ============================================================\n// Edge Normalization Functions\n// ============================================================\n\n/**\n * Validates that an EdgeRegistration's constraints don't widen beyond\n * the edge type's built-in domain/range constraints.\n */\nfunction validateConstraintNarrowing(\n name: string,\n edgeType: EdgeTypeWithEndpoints,\n registration: EdgeRegistration,\n): void {\n const builtInFromNames = new Set(edgeType.from.map((n) => n.kind));\n for (const fromNode of registration.from) {\n if (!builtInFromNames.has(fromNode.kind)) {\n throw new ConfigurationError(\n `Edge \"${name}\" registration has 'from' kind \"${fromNode.kind}\" ` +\n `not in edge's built-in domain: [${[...builtInFromNames].join(\", \")}]`,\n {\n edgeName: name,\n invalidFrom: fromNode.kind,\n allowedFrom: [...builtInFromNames],\n },\n {\n suggestion: `Edge registration can only narrow, not widen, the edge type's built-in constraints.`,\n },\n );\n }\n }\n\n const builtInToNames = new Set(edgeType.to.map((n) => n.kind));\n for (const toNode of registration.to) {\n if (!builtInToNames.has(toNode.kind)) {\n throw new ConfigurationError(\n `Edge \"${name}\" registration has 'to' kind \"${toNode.kind}\" ` +\n `not in edge's built-in range: [${[...builtInToNames].join(\", \")}]`,\n {\n edgeName: name,\n invalidTo: toNode.kind,\n allowedTo: [...builtInToNames],\n },\n {\n suggestion: `Edge registration can only narrow, not widen, the edge type's built-in constraints.`,\n },\n );\n }\n }\n}\n\n/**\n * Normalizes a single edge entry to EdgeRegistration.\n */\nfunction normalizeEdgeEntry(name: string, entry: EdgeEntry): EdgeRegistration {\n if (isEdgeTypeWithEndpoints(entry)) {\n // EdgeType with from/to - convert to EdgeRegistration\n return {\n type: entry,\n from: entry.from,\n to: entry.to,\n };\n }\n\n // Already EdgeRegistration - validate narrowing if edge has built-in constraints\n if (isEdgeTypeWithEndpoints(entry.type)) {\n validateConstraintNarrowing(name, entry.type, entry);\n }\n\n return entry;\n}\n\n/**\n * Normalizes all edge entries to EdgeRegistration.\n */\nfunction normalizeEdges(\n edges: Record<string, EdgeEntry>,\n): Record<string, EdgeRegistration> {\n const result: Record<string, EdgeRegistration> = {};\n for (const [name, entry] of Object.entries(edges)) {\n result[name] = normalizeEdgeEntry(name, entry);\n }\n return result;\n}\n\n// ============================================================\n// Graph Definition Configuration\n// ============================================================\n\n/**\n * Configuration for defineGraph.\n */\ntype GraphDefConfig<\n TNodes extends Record<string, NodeRegistration>,\n TEdges extends Record<string, EdgeEntry>,\n TOntology extends readonly OntologyRelation[],\n> = Readonly<{\n /** Unique identifier for this graph */\n id: string;\n /** Node registrations */\n nodes: TNodes;\n /** Edge registrations or EdgeTypes with built-in domain/range */\n edges: TEdges;\n /** Ontology relations */\n ontology?: TOntology;\n /** Graph-wide defaults */\n defaults?: GraphDefaults;\n}>;\n\n// ============================================================\n// Graph Definition Type\n// ============================================================\n\n/**\n * A graph definition.\n *\n * This is a compile-time artifact that describes the structure of a graph.\n * Use `createStore()` to create a runtime store from this definition.\n */\nexport type GraphDef<\n TNodes extends Record<string, NodeRegistration> = Record<\n string,\n NodeRegistration\n >,\n TEdges extends Record<string, EdgeRegistration> = Record<\n string,\n EdgeRegistration\n >,\n TOntology extends readonly OntologyRelation[] = readonly OntologyRelation[],\n> = Readonly<{\n [GRAPH_DEF_BRAND]: true;\n id: string;\n nodes: TNodes;\n edges: TEdges;\n ontology: TOntology;\n defaults: Readonly<{\n onNodeDelete: DeleteBehavior;\n temporalMode: TemporalMode;\n }>;\n}>;\n\n// ============================================================\n// Type Helpers\n// ============================================================\n\n/**\n * Extract node kind names from a GraphDef.\n */\nexport type NodeKinds<G extends GraphDef> = keyof G[\"nodes\"] & string;\n\n/**\n * Extract edge kind names from a GraphDef.\n */\nexport type EdgeKinds<G extends GraphDef> = keyof G[\"edges\"] & string;\n\n/**\n * Get a NodeType from a GraphDef by kind name.\n */\nexport type GetNodeType<\n G extends GraphDef,\n K extends NodeKinds<G>,\n> = G[\"nodes\"][K][\"type\"];\n\n/**\n * Get an EdgeType from a GraphDef by kind name.\n */\nexport type GetEdgeType<\n G extends GraphDef,\n K extends EdgeKinds<G>,\n> = G[\"edges\"][K][\"type\"];\n\n/**\n * Get all NodeTypes from a GraphDef.\n */\nexport type AllNodeTypes<G extends GraphDef> = {\n [K in NodeKinds<G>]: G[\"nodes\"][K][\"type\"];\n}[NodeKinds<G>];\n\n/**\n * Get all EdgeTypes from a GraphDef.\n */\nexport type AllEdgeTypes<G extends GraphDef> = {\n [K in EdgeKinds<G>]: G[\"edges\"][K][\"type\"];\n}[EdgeKinds<G>];\n\n// ============================================================\n// Define Graph Function\n// ============================================================\n\n/**\n * Creates a graph definition.\n *\n * @example\n * ```typescript\n * const graph = defineGraph({\n * id: \"my_graph\",\n * nodes: {\n * Person: { type: Person },\n * Company: { type: Company },\n * },\n * edges: {\n * // Traditional EdgeRegistration syntax\n * worksAt: {\n * type: worksAt,\n * from: [Person],\n * to: [Company],\n * cardinality: \"many\",\n * },\n * // Or use EdgeType directly if it has from/to defined\n * knows, // EdgeType with built-in domain/range\n * },\n * ontology: [\n * subClassOf(Company, Organization),\n * disjointWith(Person, Organization),\n * ],\n * defaults: {\n * onNodeDelete: \"restrict\",\n * temporalMode: \"current\",\n * },\n * });\n * ```\n */\nexport function defineGraph<\n TNodes extends Record<string, NodeRegistration<NodeType>>,\n TEdges extends Record<string, EdgeEntry>,\n TOntology extends readonly OntologyRelation[],\n>(\n config: GraphDefConfig<TNodes, TEdges, TOntology>,\n): GraphDef<TNodes, NormalizedEdges<TEdges>, TOntology> {\n const defaults = {\n onNodeDelete: config.defaults?.onNodeDelete ?? \"restrict\",\n temporalMode: config.defaults?.temporalMode ?? \"current\",\n } as const;\n\n const normalizedEdges = normalizeEdges(config.edges);\n\n return Object.freeze({\n [GRAPH_DEF_BRAND]: true as const,\n id: config.id,\n nodes: config.nodes,\n edges: normalizedEdges,\n ontology: config.ontology ?? ([] as unknown as TOntology),\n defaults,\n }) as GraphDef<TNodes, NormalizedEdges<TEdges>, TOntology>;\n}\n\n// ============================================================\n// Graph Definition Utilities\n// ============================================================\n\n/**\n * Checks if a value is a GraphDef.\n */\nexport function isGraphDef(value: unknown): value is GraphDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n GRAPH_DEF_BRAND in value &&\n (value as Record<string, unknown>)[GRAPH_DEF_BRAND] === true\n );\n}\n\n/**\n * Gets all node kind names from a GraphDef.\n */\nexport function getNodeKinds<G extends GraphDef>(graph: G): readonly string[] {\n return Object.keys(graph.nodes);\n}\n\n/**\n * Gets all edge kind names from a GraphDef.\n */\nexport function getEdgeKinds<G extends GraphDef>(graph: G): readonly string[] {\n return Object.keys(graph.edges);\n}\n","/**\n * Date encoding utilities for consistent storage.\n *\n * Contract: All dates are stored as ISO 8601 strings in UTC.\n * - Always includes milliseconds\n * - Always UTC (Z suffix)\n * - Sorts correctly as strings\n */\n\nimport { ValidationError } from \"../errors\";\n\n/**\n * ISO 8601 datetime pattern.\n * Matches formats like:\n * - 2024-01-15T10:30:00.000Z\n * - 2024-01-15T10:30:00Z\n * - 2024-01-15T10:30:00.123Z\n */\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$/;\n\n/**\n * Checks if a string is a valid ISO 8601 datetime.\n *\n * @param value - String to validate\n * @returns True if valid ISO 8601 datetime\n */\nexport function isValidIsoDate(value: string): boolean {\n if (!ISO_DATE_PATTERN.test(value)) {\n return false;\n }\n // Also check that Date parsing produces a valid date\n const date = new Date(value);\n return !Number.isNaN(date.getTime());\n}\n\n/**\n * Validates that a string is a valid ISO 8601 datetime.\n * Throws ValidationError if invalid.\n *\n * @param value - String to validate\n * @param fieldName - Name of field for error message\n * @returns The validated string\n * @throws ValidationError if not a valid ISO datetime\n */\nexport function validateIsoDate(value: string, fieldName: string): string {\n if (!isValidIsoDate(value)) {\n throw new ValidationError(\n `Invalid ISO 8601 datetime for \"${fieldName}\": \"${value}\". ` +\n `Expected format: YYYY-MM-DDTHH:mm:ss.sssZ`,\n {\n issues: [\n {\n path: fieldName,\n message: `Invalid ISO 8601 datetime format. Expected: YYYY-MM-DDTHH:mm:ss.sssZ, got: \"${value}\"`,\n },\n ],\n },\n {\n suggestion: `Use a valid ISO 8601 UTC datetime like \"2024-01-15T10:30:00.000Z\"`,\n },\n );\n }\n return value;\n}\n\n/**\n * Validates an optional ISO date string.\n * Returns undefined if value is undefined, otherwise validates.\n */\nexport function validateOptionalIsoDate(\n value: string | undefined,\n fieldName: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return validateIsoDate(value, fieldName);\n}\n\n/**\n * Encodes a Date to an ISO 8601 string for storage.\n */\nexport function encodeDate(date: Date): string {\n return date.toISOString();\n}\n\n/**\n * Decodes an ISO 8601 string to a Date.\n * Validates the string format first.\n *\n * @throws ValidationError if not a valid ISO datetime\n */\nexport function decodeDate(isoString: string): Date {\n validateIsoDate(isoString, \"date\");\n return new Date(isoString);\n}\n\n/**\n * Returns the current timestamp as an ISO string.\n */\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/core/define-graph.ts","../src/utils/date.ts"],"names":["ConfigurationError","ValidationError"],"mappings":"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","file":"chunk-K2ROKOK3.cjs","sourcesContent":["import { type z } from \"zod\";\n\n// ============================================================\n// Brand Keys for Nominal Typing\n// ============================================================\n\n/** Brand key for NodeType */\nexport const NODE_TYPE_BRAND = \"__nodeType\" as const;\n\n/** Brand key for EdgeType */\nexport const EDGE_TYPE_BRAND = \"__edgeType\" as const;\n\n/** Brand symbol for NodeId */\ndeclare const __nodeId: unique symbol;\n\n// ============================================================\n// Node Type\n// ============================================================\n\n/**\n * A node type definition.\n *\n * Created via `defineNode()`. Represents a type of node in the graph\n * with an associated Zod schema for properties.\n */\nexport type NodeType<\n K extends string = string,\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n [NODE_TYPE_BRAND]: true;\n kind: K;\n schema: S;\n description: string | undefined;\n}>;\n\n/**\n * Branded node ID type.\n *\n * Prevents mixing IDs from different node types at compile time.\n */\nexport type NodeId<N extends NodeType> = string &\n Readonly<{\n [__nodeId]: N;\n }>;\n\n/**\n * Infer the props type from a NodeType.\n */\nexport type NodeProps<N extends NodeType> = z.infer<N[\"schema\"]>;\n\n// ============================================================\n// Edge Type\n// ============================================================\n\n/**\n * An edge type definition.\n *\n * Created via `defineEdge()`. Represents a type of edge in the graph\n * with an optional Zod schema for properties.\n *\n * Optionally includes `from` and `to` arrays that define the allowed\n * source and target node types (domain and range constraints).\n */\nexport type EdgeType<\n K extends string = string,\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined = undefined,\n To extends readonly NodeType[] | undefined = undefined,\n> = Readonly<{\n [EDGE_TYPE_BRAND]: true;\n kind: K;\n schema: S;\n description: string | undefined;\n from: From;\n to: To;\n}>;\n\n/**\n * Base edge type for use in constraints - accepts any from/to configuration.\n */\nexport type AnyEdgeType = EdgeType<\n string,\n z.ZodObject<z.ZodRawShape>,\n readonly NodeType[] | undefined,\n readonly NodeType[] | undefined\n>;\n\n/**\n * An edge type that has both from and to constraints defined.\n * Can be used directly in defineGraph without an EdgeRegistration wrapper.\n */\nexport type EdgeTypeWithEndpoints = EdgeType<\n string,\n z.ZodObject<z.ZodRawShape>,\n readonly NodeType[],\n readonly NodeType[]\n>;\n\n/**\n * Infer the props type from an EdgeType.\n */\nexport type EdgeProps<E extends AnyEdgeType> = z.infer<E[\"schema\"]>;\n\n// ============================================================\n// Configuration Types\n// ============================================================\n\n/**\n * Delete behaviors for nodes.\n */\nexport type DeleteBehavior = \"restrict\" | \"cascade\" | \"disconnect\";\n\n/**\n * Edge cardinality constraints.\n */\nexport type Cardinality =\n | \"many\" // No constraint (default)\n | \"one\" // At most one edge of this kind from any source node\n | \"unique\" // At most one edge of this kind between any (source, target) pair\n | \"oneActive\"; // At most one edge with valid_to IS NULL from any source\n\n/**\n * Endpoint existence modes for edge validation.\n */\nexport type EndpointExistence =\n | \"notDeleted\" // Endpoint deleted_at IS NULL (default)\n | \"currentlyValid\" // Endpoint not deleted AND temporally valid\n | \"ever\"; // Endpoint exists in any state\n\n/**\n * Temporal query modes.\n */\nexport type TemporalMode =\n | \"current\" // Valid now AND not deleted\n | \"asOf\" // Valid at specific date AND not deleted\n | \"includeEnded\" // All validity periods AND not deleted\n | \"includeTombstones\"; // Everything including soft-deleted\n\n/**\n * Uniqueness constraint scope.\n */\nexport type UniquenessScope =\n | \"kind\" // Unique within this exact kind only\n | \"kindWithSubClasses\"; // Unique across this kind and all subclasses\n\n/**\n * Collation for uniqueness constraints.\n */\nexport type Collation = \"binary\" | \"caseInsensitive\";\n\n// ============================================================\n// Uniqueness Constraint\n// ============================================================\n\n/**\n * Uniqueness constraint definition.\n */\nexport type UniqueConstraint<\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n name: string;\n fields: readonly (keyof z.infer<S> & string)[];\n where?: (\n props: UniqueConstraintPredicateBuilder<S>,\n ) => UniqueConstraintPredicate;\n scope: UniquenessScope;\n collation: Collation;\n}>;\n\n/**\n * Predicate builder for uniqueness constraint where clause.\n * Uses -? to make all fields required in the builder, even if optional in the schema.\n */\nexport type UniqueConstraintPredicateBuilder<\n S extends z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n [K in keyof z.infer<S>]-?: UniqueConstraintField;\n}>;\n\n/**\n * Field operations for uniqueness constraint predicates.\n */\ntype UniqueConstraintField = Readonly<{\n isNull: () => UniqueConstraintPredicate;\n isNotNull: () => UniqueConstraintPredicate;\n}>;\n\n/**\n * A uniqueness constraint predicate (internal representation).\n */\nexport type UniqueConstraintPredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\n// ============================================================\n// Node Registration\n// ============================================================\n\n/**\n * Node registration in a graph definition.\n */\nexport type NodeRegistration<N extends NodeType = NodeType> = Readonly<{\n type: N;\n unique?: readonly UniqueConstraint<N[\"schema\"]>[];\n onDelete?: DeleteBehavior;\n}>;\n\n// ============================================================\n// Edge Registration\n// ============================================================\n\n/**\n * Edge registration in a graph definition.\n */\nexport type EdgeRegistration<\n E extends AnyEdgeType = AnyEdgeType,\n FromTypes extends NodeType = NodeType,\n ToTypes extends NodeType = NodeType,\n> = Readonly<{\n type: E;\n from: readonly FromTypes[];\n to: readonly ToTypes[];\n cardinality?: Cardinality;\n endpointExistence?: EndpointExistence;\n}>;\n\n// ============================================================\n// Graph Defaults\n// ============================================================\n\n/**\n * Default settings for a graph.\n */\nexport type GraphDefaults = Readonly<{\n onNodeDelete?: DeleteBehavior;\n temporalMode?: TemporalMode;\n}>;\n\n// ============================================================\n// Type Helpers\n// ============================================================\n\n/**\n * Checks if a value is a NodeType.\n */\nexport function isNodeType(value: unknown): value is NodeType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n NODE_TYPE_BRAND in value &&\n (value as Record<string, unknown>)[NODE_TYPE_BRAND] === true\n );\n}\n\n/**\n * Checks if a value is an EdgeType.\n */\nexport function isEdgeType(value: unknown): value is AnyEdgeType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n EDGE_TYPE_BRAND in value &&\n (value as Record<string, unknown>)[EDGE_TYPE_BRAND] === true\n );\n}\n\n/**\n * Checks if a value is an EdgeType with both from and to constraints defined.\n * Such edges can be used directly in defineGraph without an EdgeRegistration wrapper.\n */\nexport function isEdgeTypeWithEndpoints(\n value: unknown,\n): value is EdgeTypeWithEndpoints {\n return (\n isEdgeType(value) &&\n Array.isArray(value.from) &&\n value.from.length > 0 &&\n Array.isArray(value.to) &&\n value.to.length > 0\n );\n}\n","import { ConfigurationError } from \"../errors/index\";\nimport { type OntologyRelation } from \"../ontology/types\";\nimport {\n type DeleteBehavior,\n type EdgeRegistration,\n type EdgeTypeWithEndpoints,\n type GraphDefaults,\n isEdgeTypeWithEndpoints,\n type NodeRegistration,\n type NodeType,\n type TemporalMode,\n} from \"./types\";\n\n// ============================================================\n// Graph Definition Brand Symbol\n// ============================================================\n\n/** Brand key for GraphDef */\nconst GRAPH_DEF_BRAND = \"__graphDef\" as const;\n\n// ============================================================\n// Edge Entry Types\n// ============================================================\n\n/**\n * An edge entry in the graph definition.\n * Can be:\n * - EdgeType directly (if it has from/to defined)\n * - EdgeRegistration object (always works, can override/narrow defaults)\n */\ntype EdgeEntry = EdgeRegistration | EdgeTypeWithEndpoints;\n\n/**\n * Normalized edge map type - all entries become EdgeRegistration.\n */\ntype NormalizedEdges<TEdges extends Record<string, EdgeEntry>> = {\n [K in keyof TEdges]: TEdges[K] extends EdgeRegistration ? TEdges[K]\n : TEdges[K] extends EdgeTypeWithEndpoints ?\n EdgeRegistration<\n TEdges[K],\n TEdges[K][\"from\"][number],\n TEdges[K][\"to\"][number]\n >\n : never;\n};\n\n// ============================================================\n// Edge Normalization Functions\n// ============================================================\n\n/**\n * Validates that an EdgeRegistration's constraints don't widen beyond\n * the edge type's built-in domain/range constraints.\n */\nfunction validateConstraintNarrowing(\n name: string,\n edgeType: EdgeTypeWithEndpoints,\n registration: EdgeRegistration,\n): void {\n const builtInFromNames = new Set(edgeType.from.map((n) => n.kind));\n for (const fromNode of registration.from) {\n if (!builtInFromNames.has(fromNode.kind)) {\n throw new ConfigurationError(\n `Edge \"${name}\" registration has 'from' kind \"${fromNode.kind}\" ` +\n `not in edge's built-in domain: [${[...builtInFromNames].join(\", \")}]`,\n {\n edgeName: name,\n invalidFrom: fromNode.kind,\n allowedFrom: [...builtInFromNames],\n },\n {\n suggestion: `Edge registration can only narrow, not widen, the edge type's built-in constraints.`,\n },\n );\n }\n }\n\n const builtInToNames = new Set(edgeType.to.map((n) => n.kind));\n for (const toNode of registration.to) {\n if (!builtInToNames.has(toNode.kind)) {\n throw new ConfigurationError(\n `Edge \"${name}\" registration has 'to' kind \"${toNode.kind}\" ` +\n `not in edge's built-in range: [${[...builtInToNames].join(\", \")}]`,\n {\n edgeName: name,\n invalidTo: toNode.kind,\n allowedTo: [...builtInToNames],\n },\n {\n suggestion: `Edge registration can only narrow, not widen, the edge type's built-in constraints.`,\n },\n );\n }\n }\n}\n\n/**\n * Normalizes a single edge entry to EdgeRegistration.\n */\nfunction normalizeEdgeEntry(name: string, entry: EdgeEntry): EdgeRegistration {\n if (isEdgeTypeWithEndpoints(entry)) {\n // EdgeType with from/to - convert to EdgeRegistration\n return {\n type: entry,\n from: entry.from,\n to: entry.to,\n };\n }\n\n // Already EdgeRegistration - validate narrowing if edge has built-in constraints\n if (isEdgeTypeWithEndpoints(entry.type)) {\n validateConstraintNarrowing(name, entry.type, entry);\n }\n\n return entry;\n}\n\n/**\n * Normalizes all edge entries to EdgeRegistration.\n */\nfunction normalizeEdges(\n edges: Record<string, EdgeEntry>,\n): Record<string, EdgeRegistration> {\n const result: Record<string, EdgeRegistration> = {};\n for (const [name, entry] of Object.entries(edges)) {\n result[name] = normalizeEdgeEntry(name, entry);\n }\n return result;\n}\n\n// ============================================================\n// Graph Definition Configuration\n// ============================================================\n\n/**\n * Configuration for defineGraph.\n */\ntype GraphDefConfig<\n TNodes extends Record<string, NodeRegistration>,\n TEdges extends Record<string, EdgeEntry>,\n TOntology extends readonly OntologyRelation[],\n> = Readonly<{\n /** Unique identifier for this graph */\n id: string;\n /** Node registrations */\n nodes: TNodes;\n /** Edge registrations or EdgeTypes with built-in domain/range */\n edges: TEdges;\n /** Ontology relations */\n ontology?: TOntology;\n /** Graph-wide defaults */\n defaults?: GraphDefaults;\n}>;\n\n// ============================================================\n// Graph Definition Type\n// ============================================================\n\n/**\n * A graph definition.\n *\n * This is a compile-time artifact that describes the structure of a graph.\n * Use `createStore()` to create a runtime store from this definition.\n */\nexport type GraphDef<\n TNodes extends Record<string, NodeRegistration> = Record<\n string,\n NodeRegistration\n >,\n TEdges extends Record<string, EdgeRegistration> = Record<\n string,\n EdgeRegistration\n >,\n TOntology extends readonly OntologyRelation[] = readonly OntologyRelation[],\n> = Readonly<{\n [GRAPH_DEF_BRAND]: true;\n id: string;\n nodes: TNodes;\n edges: TEdges;\n ontology: TOntology;\n defaults: Readonly<{\n onNodeDelete: DeleteBehavior;\n temporalMode: TemporalMode;\n }>;\n}>;\n\n// ============================================================\n// Type Helpers\n// ============================================================\n\n/**\n * Extract node kind names from a GraphDef.\n */\nexport type NodeKinds<G extends GraphDef> = keyof G[\"nodes\"] & string;\n\n/**\n * Extract edge kind names from a GraphDef.\n */\nexport type EdgeKinds<G extends GraphDef> = keyof G[\"edges\"] & string;\n\n/**\n * Get a NodeType from a GraphDef by kind name.\n */\nexport type GetNodeType<\n G extends GraphDef,\n K extends NodeKinds<G>,\n> = G[\"nodes\"][K][\"type\"];\n\n/**\n * Get an EdgeType from a GraphDef by kind name.\n */\nexport type GetEdgeType<\n G extends GraphDef,\n K extends EdgeKinds<G>,\n> = G[\"edges\"][K][\"type\"];\n\n/**\n * Get all NodeTypes from a GraphDef.\n */\nexport type AllNodeTypes<G extends GraphDef> = {\n [K in NodeKinds<G>]: G[\"nodes\"][K][\"type\"];\n}[NodeKinds<G>];\n\n/**\n * Get all EdgeTypes from a GraphDef.\n */\nexport type AllEdgeTypes<G extends GraphDef> = {\n [K in EdgeKinds<G>]: G[\"edges\"][K][\"type\"];\n}[EdgeKinds<G>];\n\n// ============================================================\n// Define Graph Function\n// ============================================================\n\n/**\n * Creates a graph definition.\n *\n * @example\n * ```typescript\n * const graph = defineGraph({\n * id: \"my_graph\",\n * nodes: {\n * Person: { type: Person },\n * Company: { type: Company },\n * },\n * edges: {\n * // Traditional EdgeRegistration syntax\n * worksAt: {\n * type: worksAt,\n * from: [Person],\n * to: [Company],\n * cardinality: \"many\",\n * },\n * // Or use EdgeType directly if it has from/to defined\n * knows, // EdgeType with built-in domain/range\n * },\n * ontology: [\n * subClassOf(Company, Organization),\n * disjointWith(Person, Organization),\n * ],\n * defaults: {\n * onNodeDelete: \"restrict\",\n * temporalMode: \"current\",\n * },\n * });\n * ```\n */\nexport function defineGraph<\n TNodes extends Record<string, NodeRegistration<NodeType>>,\n TEdges extends Record<string, EdgeEntry>,\n TOntology extends readonly OntologyRelation[],\n>(\n config: GraphDefConfig<TNodes, TEdges, TOntology>,\n): GraphDef<TNodes, NormalizedEdges<TEdges>, TOntology> {\n const defaults = {\n onNodeDelete: config.defaults?.onNodeDelete ?? \"restrict\",\n temporalMode: config.defaults?.temporalMode ?? \"current\",\n } as const;\n\n const normalizedEdges = normalizeEdges(config.edges);\n\n return Object.freeze({\n [GRAPH_DEF_BRAND]: true as const,\n id: config.id,\n nodes: config.nodes,\n edges: normalizedEdges,\n ontology: config.ontology ?? ([] as unknown as TOntology),\n defaults,\n }) as GraphDef<TNodes, NormalizedEdges<TEdges>, TOntology>;\n}\n\n// ============================================================\n// Graph Definition Utilities\n// ============================================================\n\n/**\n * Checks if a value is a GraphDef.\n */\nexport function isGraphDef(value: unknown): value is GraphDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n GRAPH_DEF_BRAND in value &&\n (value as Record<string, unknown>)[GRAPH_DEF_BRAND] === true\n );\n}\n\n/**\n * Gets all node kind names from a GraphDef.\n */\nexport function getNodeKinds<G extends GraphDef>(graph: G): readonly string[] {\n return Object.keys(graph.nodes);\n}\n\n/**\n * Gets all edge kind names from a GraphDef.\n */\nexport function getEdgeKinds<G extends GraphDef>(graph: G): readonly string[] {\n return Object.keys(graph.edges);\n}\n","/**\n * Date encoding utilities for consistent storage.\n *\n * Contract: All dates are stored as ISO 8601 strings in UTC.\n * - Always includes milliseconds\n * - Always UTC (Z suffix)\n * - Sorts correctly as strings\n */\n\nimport { ValidationError } from \"../errors\";\n\n/**\n * ISO 8601 datetime pattern.\n * Matches formats like:\n * - 2024-01-15T10:30:00.000Z\n * - 2024-01-15T10:30:00Z\n * - 2024-01-15T10:30:00.123Z\n */\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$/;\n\n/**\n * Checks if a string is a valid ISO 8601 datetime.\n *\n * @param value - String to validate\n * @returns True if valid ISO 8601 datetime\n */\nexport function isValidIsoDate(value: string): boolean {\n if (!ISO_DATE_PATTERN.test(value)) {\n return false;\n }\n // Also check that Date parsing produces a valid date\n const date = new Date(value);\n return !Number.isNaN(date.getTime());\n}\n\n/**\n * Validates that a string is a valid ISO 8601 datetime.\n * Throws ValidationError if invalid.\n *\n * @param value - String to validate\n * @param fieldName - Name of field for error message\n * @returns The validated string\n * @throws ValidationError if not a valid ISO datetime\n */\nexport function validateIsoDate(value: string, fieldName: string): string {\n if (!isValidIsoDate(value)) {\n throw new ValidationError(\n `Invalid ISO 8601 datetime for \"${fieldName}\": \"${value}\". ` +\n `Expected format: YYYY-MM-DDTHH:mm:ss.sssZ`,\n {\n issues: [\n {\n path: fieldName,\n message: `Invalid ISO 8601 datetime format. Expected: YYYY-MM-DDTHH:mm:ss.sssZ, got: \"${value}\"`,\n },\n ],\n },\n {\n suggestion: `Use a valid ISO 8601 UTC datetime like \"2024-01-15T10:30:00.000Z\"`,\n },\n );\n }\n return value;\n}\n\n/**\n * Validates an optional ISO date string.\n * Returns undefined if value is undefined, otherwise validates.\n */\nexport function validateOptionalIsoDate(\n value: string | undefined,\n fieldName: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return validateIsoDate(value, fieldName);\n}\n\n/**\n * Encodes a Date to an ISO 8601 string for storage.\n */\nexport function encodeDate(date: Date): string {\n return date.toISOString();\n}\n\n/**\n * Decodes an ISO 8601 string to a Date.\n * Validates the string format first.\n *\n * @throws ValidationError if not a valid ISO datetime\n */\nexport function decodeDate(isoString: string): Date {\n validateIsoDate(isoString, \"date\");\n return new Date(isoString);\n}\n\n/**\n * Returns the current timestamp as an ISO string.\n */\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n"]}
|