@foretag/tanstack-db-surrealdb 0.4.14 → 0.5.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/README.md CHANGED
@@ -30,16 +30,18 @@ await db.use({ ns: 'ns', db: 'db' });
30
30
  export const queryClient = new QueryClient();
31
31
 
32
32
  // collections/products.ts
33
- import { eq } from 'surrealdb';
33
+ import { eq } from '@tanstack/db';
34
34
  import { db, queryClient } from '../db';
35
35
  import { createCollection } from '@tanstack/db';
36
36
  import { surrealCollectionOptions } from '@foretag/tanstack-db-surrealdb';
37
+ import { useLiveQuery } from '@tanstack/react-db';
37
38
 
38
39
  // Collection Type, could also be generated
39
40
  type Product = {
40
41
  id: string;
41
42
  name: string;
42
43
  price: number;
44
+ store?: string;
43
45
  };
44
46
 
45
47
  export const products = createCollection(
@@ -48,13 +50,15 @@ export const products = createCollection(
48
50
  queryKey: ['products'],
49
51
  queryClient,
50
52
  useLoro: true, // Optional if you need CRDTs
51
- table: {
52
- name: 'products',
53
- where: eq('store', '123'),
54
- fields: ['name', 'price'] // Optional or defaults to *
55
- },
53
+ table: { name: 'products' },
56
54
  }),
57
55
  )
56
+
57
+ const data = useLiveQuery((q) =>
58
+ q
59
+ .from({ products })
60
+ .where(({ products }) => eq(products.store, '123'))
61
+ )
58
62
  ```
59
63
 
60
64
  For syncModes, please see [Example](https://github.com/ForetagInc/tanstack-db-surrealdb/blob/master/examples/syncMode.ts)
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { StandardSchemaV1 } from '@standard-schema/spec';
2
2
  import { UtilsRecord, OperationConfig, Transaction, CollectionConfig } from '@tanstack/db';
3
3
  import { Container } from 'loro-crdt';
4
- import { RecordId, Surreal, ExprLike } from 'surrealdb';
4
+ import { RecordId, Surreal } from 'surrealdb';
5
5
  import { QueryClient } from '@tanstack/query-core';
6
6
 
7
7
  type WithId<T> = T & {
@@ -11,26 +11,15 @@ type SyncedTable<T> = WithId<T & {
11
11
  sync_deleted?: boolean;
12
12
  updated_at?: Date | number | string;
13
13
  }>;
14
- type SurrealField<T> = Extract<keyof T, string> | (string & {});
15
- type FieldList<T> = '*' | ReadonlyArray<SurrealField<T>>;
16
- type SurrealSubset = {
17
- where?: ExprLike;
18
- orderBy?: string | readonly string[];
19
- limit?: number;
20
- offset?: number;
21
- };
22
- type TableOptions<T> = {
14
+ type TableOptions = {
23
15
  name: string;
24
- fields?: FieldList<T>;
25
- where?: ExprLike;
16
+ relation?: boolean;
26
17
  };
27
18
  type SyncMode = 'eager' | 'on-demand';
28
- type SurrealCollectionConfig<T extends {
29
- id: string | RecordId;
30
- }> = {
19
+ type SurrealCollectionConfig = {
31
20
  id?: string;
32
21
  db: Surreal;
33
- table: TableOptions<T>;
22
+ table: TableOptions;
34
23
  syncMode?: SyncMode;
35
24
  queryKey: readonly unknown[];
36
25
  queryClient: QueryClient;
@@ -53,9 +42,9 @@ declare module '@tanstack/db' {
53
42
  }
54
43
  declare function surrealCollectionOptions<T extends SyncedTable<object>, S extends Record<string, Container> = {
55
44
  [k: string]: never;
56
- }>({ id, useLoro, onError, db, queryClient, queryKey, syncMode, ...config }: SurrealCollectionConfig<T>): CollectionConfig<T, string, StandardSchemaV1<MutationInput<T>, T>, UtilsRecord> & {
45
+ }>({ id, useLoro, onError, db, queryClient, queryKey, syncMode, ...config }: SurrealCollectionConfig): CollectionConfig<T, string, StandardSchemaV1<MutationInput<T>, T>, UtilsRecord> & {
57
46
  schema: StandardSchemaV1<MutationInput<T>, T>;
58
47
  utils: UtilsRecord;
59
48
  };
60
49
 
61
- export { type SurrealSubset, surrealCollectionOptions, toRecordKeyString };
50
+ export { surrealCollectionOptions, toRecordKeyString };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { StandardSchemaV1 } from '@standard-schema/spec';
2
2
  import { UtilsRecord, OperationConfig, Transaction, CollectionConfig } from '@tanstack/db';
3
3
  import { Container } from 'loro-crdt';
4
- import { RecordId, Surreal, ExprLike } from 'surrealdb';
4
+ import { RecordId, Surreal } from 'surrealdb';
5
5
  import { QueryClient } from '@tanstack/query-core';
6
6
 
7
7
  type WithId<T> = T & {
@@ -11,26 +11,15 @@ type SyncedTable<T> = WithId<T & {
11
11
  sync_deleted?: boolean;
12
12
  updated_at?: Date | number | string;
13
13
  }>;
14
- type SurrealField<T> = Extract<keyof T, string> | (string & {});
15
- type FieldList<T> = '*' | ReadonlyArray<SurrealField<T>>;
16
- type SurrealSubset = {
17
- where?: ExprLike;
18
- orderBy?: string | readonly string[];
19
- limit?: number;
20
- offset?: number;
21
- };
22
- type TableOptions<T> = {
14
+ type TableOptions = {
23
15
  name: string;
24
- fields?: FieldList<T>;
25
- where?: ExprLike;
16
+ relation?: boolean;
26
17
  };
27
18
  type SyncMode = 'eager' | 'on-demand';
28
- type SurrealCollectionConfig<T extends {
29
- id: string | RecordId;
30
- }> = {
19
+ type SurrealCollectionConfig = {
31
20
  id?: string;
32
21
  db: Surreal;
33
- table: TableOptions<T>;
22
+ table: TableOptions;
34
23
  syncMode?: SyncMode;
35
24
  queryKey: readonly unknown[];
36
25
  queryClient: QueryClient;
@@ -53,9 +42,9 @@ declare module '@tanstack/db' {
53
42
  }
54
43
  declare function surrealCollectionOptions<T extends SyncedTable<object>, S extends Record<string, Container> = {
55
44
  [k: string]: never;
56
- }>({ id, useLoro, onError, db, queryClient, queryKey, syncMode, ...config }: SurrealCollectionConfig<T>): CollectionConfig<T, string, StandardSchemaV1<MutationInput<T>, T>, UtilsRecord> & {
45
+ }>({ id, useLoro, onError, db, queryClient, queryKey, syncMode, ...config }: SurrealCollectionConfig): CollectionConfig<T, string, StandardSchemaV1<MutationInput<T>, T>, UtilsRecord> & {
57
46
  schema: StandardSchemaV1<MutationInput<T>, T>;
58
47
  utils: UtilsRecord;
59
48
  };
60
49
 
61
- export { type SurrealSubset, surrealCollectionOptions, toRecordKeyString };
50
+ export { surrealCollectionOptions, toRecordKeyString };
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  var queryDbCollection = require('@tanstack/query-db-collection');
4
4
  var loroCrdt = require('loro-crdt');
5
5
  var surrealdb = require('surrealdb');
6
+ var db = require('@tanstack/db');
6
7
 
7
8
  // src/index.ts
8
9
  var stripOuterQuotes = (value) => {
@@ -73,51 +74,161 @@ var toRecordId = (tableName, id) => {
73
74
  const key = normalized.startsWith(prefixed) ? normalized.slice(prefixed.length) : normalized;
74
75
  return new surrealdb.RecordId(tableName, key);
75
76
  };
76
- var normalizeFields = (raw) => {
77
- if (!raw || raw === "*") return ["*"];
78
- return raw;
79
- };
80
- var joinOrderBy = (o) => {
81
- if (!o) return void 0;
82
- return typeof o === "string" ? o : o.join(", ");
83
- };
77
+ var IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
84
78
  var firstRow = (res) => {
85
79
  if (!res) return void 0;
86
80
  if (Array.isArray(res)) return res[0];
87
81
  return res;
88
82
  };
89
- function manageTable(db, useLoro, { name, ...args }) {
90
- const fields = normalizeFields(args.fields);
91
- const selectFields = fields.join(", ");
83
+ var toFieldPath = (value) => {
84
+ if (!Array.isArray(value)) {
85
+ throw new Error("Expected a field path array in where expression.");
86
+ }
87
+ return value;
88
+ };
89
+ var quoteIdentifier = (segment) => {
90
+ if (IDENTIFIER_RE.test(segment)) return segment;
91
+ return `\`${segment.replaceAll("`", "\\`")}\``;
92
+ };
93
+ var formatFieldPath = (path) => {
94
+ let out = "";
95
+ for (const segment of path) {
96
+ if (typeof segment === "number") {
97
+ out += `[${segment}]`;
98
+ continue;
99
+ }
100
+ const next = quoteIdentifier(segment);
101
+ out = out ? `${out}.${next}` : next;
102
+ }
103
+ return out;
104
+ };
105
+ var isReferencePathCandidate = (value) => Array.isArray(value) && value.length > 0 && typeof value[0] === "string" && value.every(
106
+ (segment) => typeof segment === "string" || typeof segment === "number"
107
+ );
108
+ var mapRelationPath = (path, relation) => {
109
+ if (!relation) return path;
110
+ if (path[0] === "from") return ["in", ...path.slice(1)];
111
+ if (path[0] === "to") return ["out", ...path.slice(1)];
112
+ return path;
113
+ };
114
+ var toSqlFragment = (value) => {
115
+ if (typeof value === "object" && value !== null && "sql" in value && typeof value.sql === "string") {
116
+ return value;
117
+ }
118
+ throw new Error("Unsupported where expression node.");
119
+ };
120
+ var joinLogical = (op, args) => {
121
+ const parts = args.map(toSqlFragment).map((frag) => frag.sql);
122
+ if (parts.length === 0) {
123
+ return { sql: op === "AND" ? "true" : "false" };
124
+ }
125
+ if (parts.length === 1) return { sql: parts[0] };
126
+ return {
127
+ sql: parts.map((part) => `(${part})`).join(` ${op} `)
128
+ };
129
+ };
130
+ var buildSubsetQuery = (table, useLoro, subset) => {
131
+ let paramIdx = 0;
132
+ const params = { table: table.name };
133
+ const nextParam = (value) => {
134
+ const key = `p${paramIdx++}`;
135
+ params[key] = value;
136
+ return `$${key}`;
137
+ };
138
+ const comparison = (fieldPath, op, value) => {
139
+ const field = formatFieldPath(
140
+ mapRelationPath(toFieldPath(fieldPath), table.relation)
141
+ );
142
+ if (isReferencePathCandidate(value)) {
143
+ throw new Error(
144
+ "Field-to-field comparisons are not supported in loadSubset where translation."
145
+ );
146
+ }
147
+ return { sql: `${field} ${op} ${nextParam(value)}` };
148
+ };
149
+ const whereSqlFrom = (expr) => {
150
+ const fragment = db.parseWhereExpression(expr, {
151
+ handlers: {
152
+ and: (...args) => joinLogical("AND", args),
153
+ or: (...args) => joinLogical("OR", args),
154
+ not: (arg) => ({ sql: `NOT (${toSqlFragment(arg).sql})` }),
155
+ eq: (field, value) => comparison(field, "=", value),
156
+ gt: (field, value) => comparison(field, ">", value),
157
+ gte: (field, value) => comparison(field, ">=", value),
158
+ lt: (field, value) => comparison(field, "<", value),
159
+ lte: (field, value) => comparison(field, "<=", value),
160
+ like: (field, value) => comparison(field, "LIKE", value),
161
+ ilike: (field, value) => {
162
+ const f = formatFieldPath(
163
+ mapRelationPath(toFieldPath(field), table.relation)
164
+ );
165
+ const p = nextParam(value);
166
+ return {
167
+ sql: `string::lower(${f}) LIKE string::lower(${p})`
168
+ };
169
+ },
170
+ in: (field, value) => {
171
+ const f = formatFieldPath(
172
+ mapRelationPath(toFieldPath(field), table.relation)
173
+ );
174
+ if (Array.isArray(value) && value.length === 0) {
175
+ return { sql: "false" };
176
+ }
177
+ return { sql: `${f} IN ${nextParam(value)}` };
178
+ },
179
+ isNull: (field) => ({
180
+ sql: `${formatFieldPath(
181
+ mapRelationPath(toFieldPath(field), table.relation)
182
+ )} IS NULL`
183
+ }),
184
+ isUndefined: (field) => ({
185
+ sql: `${formatFieldPath(
186
+ mapRelationPath(toFieldPath(field), table.relation)
187
+ )} IS NONE`
188
+ })
189
+ },
190
+ onUnknownOperator: (op) => {
191
+ throw new Error(
192
+ `Unsupported where operator '${op}' for SurrealQL translation.`
193
+ );
194
+ }
195
+ });
196
+ if (!fragment) return "";
197
+ return fragment.sql;
198
+ };
199
+ const whereParts = [];
200
+ if (subset?.where) {
201
+ const parsed = whereSqlFrom(subset.where);
202
+ if (parsed) whereParts.push(parsed);
203
+ }
204
+ if (subset?.cursor?.whereFrom) {
205
+ const cursorWhere = whereSqlFrom(subset.cursor.whereFrom);
206
+ if (cursorWhere) whereParts.push(cursorWhere);
207
+ }
208
+ if (useLoro) whereParts.push("sync_deleted = false");
209
+ const whereSql = whereParts.length ? ` WHERE ${whereParts.map((part) => `(${part})`).join(" AND ")}` : "";
210
+ const order = db.parseOrderByExpression(subset?.orderBy);
211
+ const orderSql = order.length ? ` ORDER BY ${order.map(
212
+ (clause) => `${formatFieldPath(
213
+ mapRelationPath(clause.field, table.relation)
214
+ )} ${clause.direction.toUpperCase()}`
215
+ ).join(", ")}` : "";
216
+ const limitSql = typeof subset?.limit === "number" ? ` LIMIT ${nextParam(subset.limit)}` : "";
217
+ const offsetSql = typeof subset?.offset === "number" ? ` START ${nextParam(subset.offset)}` : "";
218
+ return {
219
+ sql: `SELECT * FROM type::table($table)${whereSql}${orderSql}${limitSql}${offsetSql};`,
220
+ params
221
+ };
222
+ };
223
+ function manageTable(db, useLoro, config) {
224
+ const { name } = config;
92
225
  const table = new surrealdb.Table(name);
93
- const aliveWhere = useLoro ? surrealdb.eq("sync_deleted", false) : void 0;
94
- const baseWhere = aliveWhere ? args.where ? surrealdb.and(args.where, aliveWhere) : aliveWhere : args.where;
95
- const listAllSql = `SELECT ${selectFields} FROM type::table($table)${baseWhere ? " WHERE $where" : ""};`;
96
- const getBaseWhere = () => baseWhere;
97
226
  const listAll = async () => {
98
- const where = getBaseWhere();
99
- const [res] = await db.query(listAllSql, {
100
- table: name,
101
- where
102
- });
103
- return res ?? [];
227
+ return loadSubset();
104
228
  };
105
229
  const loadSubset = async (subset) => {
106
- const b = getBaseWhere();
107
- const w = subset?.where;
108
- const where = b && w ? surrealdb.and(b, w) : b ?? w;
109
- const whereSql = where ? " WHERE $where" : "";
110
- const order = joinOrderBy(subset?.orderBy);
111
- const orderSql = order ? ` ORDER BY ${order}` : "";
112
- const limitSql = typeof subset?.limit === "number" ? " LIMIT $limit" : "";
113
- const startSql = typeof subset?.offset === "number" ? " START $offset" : "";
114
- const sql = `SELECT ${selectFields} FROM type::table($table)${whereSql}${orderSql}${limitSql}${startSql};`;
115
- const [res] = await db.query(sql, {
116
- table: name,
117
- where,
118
- limit: subset?.limit,
119
- offset: subset?.offset
120
- });
230
+ const { sql, params } = buildSubsetQuery(config, useLoro, subset);
231
+ const [res] = await db.query(sql, params);
121
232
  return res ?? [];
122
233
  };
123
234
  const create = async (data) => {
@@ -169,7 +280,7 @@ function manageTable(db, useLoro, { name, ...args }) {
169
280
  };
170
281
  const start = async () => {
171
282
  if (!db.isFeatureSupported(surrealdb.Features.LiveQueries)) return;
172
- live = await db.live(table).where(args.where);
283
+ live = await db.live(table);
173
284
  live.subscribe(on);
174
285
  };
175
286
  void start();
@@ -258,7 +369,8 @@ function surrealCollectionOptions({
258
369
  const keyOf = (rid) => toRecordIdString(rid);
259
370
  const getKey = (row) => keyOf(row.id);
260
371
  const normalizeMutationId = (rid) => toRecordId(config.table.name, rid);
261
- const withNormalizedId = (row) => ({ ...row, id: keyOf(row.id) });
372
+ const withRecordId = (row) => ({ ...row, id: normalizeMutationId(row.id) });
373
+ const toLoroStoredRow = (row) => ({ ...row, id: keyOf(row.id) });
262
374
  const loroKey = loro?.key ?? id ?? "surreal";
263
375
  const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
264
376
  const commitLoro = () => {
@@ -266,7 +378,7 @@ function surrealCollectionOptions({
266
378
  };
267
379
  const loroPut = (row, commit = true) => {
268
380
  if (!loroMap) return;
269
- loroMap.set(getKey(row), row);
381
+ loroMap.set(getKey(row), toLoroStoredRow(row));
270
382
  if (commit) commitLoro();
271
383
  };
272
384
  const loroRemove = (idStr, commit = true) => {
@@ -286,7 +398,7 @@ function surrealCollectionOptions({
286
398
  continue;
287
399
  }
288
400
  if ((l.sync_deleted ?? false) === true) continue;
289
- out.push(l);
401
+ out.push(withRecordId(l));
290
402
  }
291
403
  return out;
292
404
  };
@@ -298,10 +410,10 @@ function surrealCollectionOptions({
298
410
  syncMode,
299
411
  queryFn: async ({ meta }) => {
300
412
  try {
301
- const subset = syncMode === "on-demand" ? meta.surrealSubset : void 0;
413
+ const subset = syncMode === "on-demand" ? meta?.loadSubsetOptions : void 0;
302
414
  const rows = syncMode === "eager" ? await table.listAll() : await table.loadSubset(subset);
303
415
  return mergeLocalOverServer(rows).map(
304
- (row) => withNormalizedId(row)
416
+ (row) => withRecordId(row)
305
417
  );
306
418
  } catch (e) {
307
419
  onError?.(e);
@@ -320,7 +432,7 @@ function surrealCollectionOptions({
320
432
  updated_at: now,
321
433
  sync_deleted: false
322
434
  } : baseRow;
323
- const normalizedRow = withNormalizedId(row);
435
+ const normalizedRow = withRecordId(row);
324
436
  if (useLoro) {
325
437
  loroPut(normalizedRow, false);
326
438
  shouldCommitLoro = true;
@@ -329,7 +441,7 @@ function surrealCollectionOptions({
329
441
  const tempKey = keyOf(normalizedRow.id);
330
442
  const { id: _id, ...payload } = normalizedRow;
331
443
  const persisted = await table.create(payload);
332
- const resolvedRow = persisted?.id ? withNormalizedId({
444
+ const resolvedRow = persisted?.id ? withRecordId({
333
445
  ...normalizedRow,
334
446
  ...persisted,
335
447
  id: persisted.id
@@ -342,7 +454,7 @@ function surrealCollectionOptions({
342
454
  } else {
343
455
  const persisted = await table.create(normalizedRow);
344
456
  resultRows.push(
345
- persisted ? withNormalizedId({
457
+ persisted ? withRecordId({
346
458
  ...normalizedRow,
347
459
  ...persisted
348
460
  }) : normalizedRow
@@ -366,10 +478,10 @@ function surrealCollectionOptions({
366
478
  );
367
479
  const baseRow = {
368
480
  ...normalizedModified,
369
- id: keyOf(idKey)
481
+ id: normalizeMutationId(idKey)
370
482
  };
371
483
  const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
372
- const normalizedRow = withNormalizedId(row);
484
+ const normalizedRow = withRecordId(row);
373
485
  if (useLoro) {
374
486
  loroPut(normalizedRow, false);
375
487
  shouldCommitLoro = true;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/id.ts","../src/table.ts","../src/index.ts"],"names":["RecordId","Table","eq","and","Features","LoroDoc","queryCollectionOptions"],"mappings":"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","file":"index.js","sourcesContent":["import { RecordId } from 'surrealdb';\n\nexport const stripOuterQuotes = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSingleQuoted =\n\t\ttrimmed.startsWith(\"'\") && trimmed.endsWith(\"'\") && trimmed.length >= 2;\n\tconst isDoubleQuoted =\n\t\ttrimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2;\n\tconst isBacktickQuoted =\n\t\ttrimmed.startsWith('`') && trimmed.endsWith('`') && trimmed.length >= 2;\n\treturn isSingleQuoted || isDoubleQuoted || isBacktickQuoted\n\t\t? trimmed.slice(1, -1)\n\t\t: trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string => {\n\tconst raw =\n\t\ttypeof rid === 'string' ? stripOuterQuotes(rid) : rid.toString();\n\tconst trimmed = stripOuterQuotes(raw).trim();\n\tconst idx = trimmed.indexOf(':');\n\tif (idx <= 0 || idx >= trimmed.length - 1) return trimmed;\n\n\tconst table = trimmed.slice(0, idx).trim();\n\tconst key = stripOuterQuotes(\n\t\tstripAngleBrackets(stripOuterQuotes(trimmed.slice(idx + 1).trim())),\n\t);\n\tif (!table || !key) return trimmed;\n\treturn `${table}:${key}`;\n};\n\nconst stripAngleBrackets = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSurrealAngles =\n\t\ttrimmed.startsWith('⟨') && trimmed.endsWith('⟩') && trimmed.length >= 2;\n\tconst isAsciiAngles =\n\t\ttrimmed.startsWith('<') && trimmed.endsWith('>') && trimmed.length >= 2;\n\treturn isSurrealAngles || isAsciiAngles\n\t\t? trimmed.slice(1, -1).trim()\n\t\t: trimmed;\n};\n\nexport const toRecordKeyString = (rid: RecordId | string): string => {\n\tconst normalized = toRecordIdString(rid);\n\tconst idx = normalized.indexOf(':');\n\tconst rawKey = idx > 0 ? normalized.slice(idx + 1) : normalized;\n\treturn stripOuterQuotes(rawKey.trim());\n};\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst looksLikeTableName = (value: string): boolean =>\n\t/^[A-Za-z_][A-Za-z0-9_-]*$/.test(value);\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tconst normalized = toRecordIdString(value);\n\tif (!isRecordIdString(normalized)) return undefined;\n\n\tconst idx = normalized.indexOf(':');\n\tconst table = stripOuterQuotes(normalized.slice(0, idx).trim());\n\tconst key = normalized.slice(idx + 1).trim();\n\tif (!table || !key || !looksLikeTableName(table)) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ??\n\t\t(unquoted === trimmed ? undefined : parseRecordIdString(trimmed));\n\tif (parsed) return parsed;\n\n\t// Keep original value shape if it isn't record-id-like\n\treturn value;\n};\n\nexport const normalizeRecordIdLikeFields = <T extends Record<string, unknown>>(\n\tdata: T,\n): T => {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(data)) {\n\t\tout[k] = normalizeRecordIdLikeValue(v);\n\t}\n\treturn out as T;\n};\n\nexport const toRecordId = (\n\ttableName: string,\n\tid: RecordId | string,\n): RecordId => {\n\tif (id instanceof RecordId) return id;\n\n\tconst normalized = toRecordIdString(id);\n\tconst prefixed = `${tableName}:`;\n\tconst key = normalized.startsWith(prefixed)\n\t\t? normalized.slice(prefixed.length)\n\t\t: normalized;\n\treturn new RecordId(tableName, key);\n};\n","import {\n\tand,\n\ttype ExprLike,\n\teq,\n\tFeatures,\n\ttype LiveMessage,\n\ttype LiveSubscription,\n\ttype RecordId,\n\ttype Surreal,\n\tTable,\n} from 'surrealdb';\nimport { toRecordId } from './id';\nimport type {\n\tFieldList,\n\tSurrealField,\n\tSurrealSubset,\n\tTableOptions,\n} from './types';\n\nconst normalizeFields = <T>(\n\traw: FieldList<T> | undefined,\n): ReadonlyArray<SurrealField<T>> => {\n\tif (!raw || raw === '*') return ['*' as SurrealField<T>];\n\treturn raw;\n};\n\nconst joinOrderBy = (\n\to: string | readonly string[] | undefined,\n): string | undefined => {\n\tif (!o) return undefined;\n\treturn typeof o === 'string' ? o : o.join(', ');\n};\n\ntype QueryResult<T> = T[] | null;\ntype RowResult<T> = T | T[] | null;\n\nconst firstRow = <T>(res: RowResult<T>): T | undefined => {\n\tif (!res) return undefined;\n\tif (Array.isArray(res)) return res[0];\n\treturn res;\n};\n\nexport function manageTable<T extends { id: string | RecordId }>(\n\tdb: Surreal,\n\tuseLoro: boolean,\n\t{ name, ...args }: TableOptions<T>,\n) {\n\tconst fields = normalizeFields<T>(args.fields);\n\tconst selectFields = fields.join(', ');\n\tconst table = new Table(name);\n\tconst aliveWhere = useLoro ? eq('sync_deleted', false) : undefined;\n\tconst baseWhere = aliveWhere\n\t\t? (args.where ? and(args.where, aliveWhere) : aliveWhere)\n\t\t: args.where;\n\tconst listAllSql = `SELECT ${selectFields} FROM type::table($table)${\n\t\tbaseWhere ? ' WHERE $where' : ''\n\t};`;\n\n\tconst getBaseWhere = (): ExprLike | undefined => baseWhere;\n\n\tconst listAll = async (): Promise<T[]> => {\n\t\tconst where = getBaseWhere();\n\t\tconst [res] = await db.query<[QueryResult<T>]>(listAllSql, {\n\t\t\ttable: name,\n\t\t\twhere,\n\t\t});\n\t\treturn res ?? [];\n\t};\n\n\tconst loadSubset = async (subset?: SurrealSubset): Promise<T[]> => {\n\t\tconst b = getBaseWhere();\n\t\tconst w = subset?.where;\n\t\tconst where = b && w ? and(b, w) : (b ?? w);\n\n\t\tconst whereSql = where ? ' WHERE $where' : '';\n\t\tconst order = joinOrderBy(subset?.orderBy);\n\t\tconst orderSql = order ? ` ORDER BY ${order}` : '';\n\t\tconst limitSql =\n\t\t\ttypeof subset?.limit === 'number' ? ' LIMIT $limit' : '';\n\t\tconst startSql =\n\t\t\ttypeof subset?.offset === 'number' ? ' START $offset' : '';\n\n\t\tconst sql = `SELECT ${selectFields} FROM type::table($table)${whereSql}${orderSql}${limitSql}${startSql};`;\n\n\t\tconst [res] = await db.query<[QueryResult<T>]>(sql, {\n\t\t\ttable: name,\n\t\t\twhere,\n\t\t\tlimit: subset?.limit,\n\t\t\toffset: subset?.offset,\n\t\t});\n\n\t\treturn res ?? [];\n\t};\n\n\tconst create = async (data: T | Partial<T>): Promise<T | undefined> => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tconst created = await db.create(table).content(data);\n\t\t\treturn firstRow(created as RowResult<T>);\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tconst inserted = await db.insert(table, payload);\n\t\treturn firstRow(inserted as RowResult<T>);\n\t};\n\n\tconst update = async (id: RecordId, data: T | Partial<T>) => {\n\t\tconst { id: _ignoredId, ...rest } = data as Record<string, unknown>;\n\t\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(rest);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...rest,\n\t\t\tsync_deleted: false,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst remove = async (id: RecordId) => {\n\t\tawait db.delete(id);\n\t};\n\n\tconst softDelete = async (id: RecordId) => {\n\t\tif (!useLoro) {\n\t\t\tawait db.delete(id);\n\t\t\treturn;\n\t\t}\n\t\tawait db.upsert(id).merge({\n\t\t\tsync_deleted: true,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst subscribe = (\n\t\tcb: (e: { type: 'insert' | 'update' | 'delete'; row: T }) => void,\n\t) => {\n\t\tlet killed = false;\n\t\tlet live: LiveSubscription | undefined;\n\n\t\tconst on = (msg: LiveMessage) => {\n\t\t\tconst { action, value } = msg as unknown as {\n\t\t\t\taction: 'CREATE' | 'UPDATE' | 'DELETE' | 'KILLED';\n\t\t\t\tvalue: T & { id: string | RecordId };\n\t\t\t};\n\n\t\t\tif (action === 'KILLED') return;\n\n\t\t\tif (action === 'CREATE') cb({ type: 'insert', row: value });\n\t\t\telse if (action === 'UPDATE') cb({ type: 'update', row: value });\n\t\t\telse if (action === 'DELETE')\n\t\t\t\tcb({ type: 'delete', row: { id: value.id } as T });\n\t\t};\n\n\t\tconst start = async () => {\n\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) return;\n\t\t\tlive = await db.live(table).where(args.where);\n\t\t\tlive.subscribe(on);\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tif (killed) return;\n\t\t\tkilled = true;\n\t\t\tif (live) void live.kill();\n\t\t};\n\t};\n\n\treturn {\n\t\tlistAll,\n\t\tloadSubset,\n\t\tcreate,\n\t\tupdate,\n\t\tremove,\n\t\tsoftDelete,\n\t\tsubscribe,\n\t};\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n\tCollectionConfig,\n\tDeleteMutationFn,\n\tDeleteMutationFnParams,\n\tInsertMutationFn,\n\tInsertMutationFnParams,\n\tOperationConfig,\n\tStandardSchema,\n\tTransaction,\n\tUpdateMutationFn,\n\tUpdateMutationFnParams,\n\tUtilsRecord,\n} from '@tanstack/db';\nimport { queryCollectionOptions } from '@tanstack/query-db-collection';\nimport { type Container, LoroDoc } from 'loro-crdt';\nimport { Features, RecordId } from 'surrealdb';\n\nimport {\n\tnormalizeRecordIdLikeFields,\n\ttoRecordId,\n\ttoRecordIdString,\n} from './id';\nimport { manageTable } from './table';\nimport type {\n\tSurrealCollectionConfig,\n\tSurrealSubset,\n\tSyncedTable,\n} from './types';\n\ntype Cleanup = () => void;\n\ntype MutationInput<T extends { id: string | RecordId }> = Omit<T, 'id'> & {\n\tid?: T['id'];\n};\n\ntype SurrealCollectionOptionsReturn<T extends { id: string | RecordId }> =\n\tCollectionConfig<\n\t\tT,\n\t\tstring,\n\t\tStandardSchemaV1<MutationInput<T>, T>,\n\t\tUtilsRecord\n\t> & {\n\t\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\t\tutils: UtilsRecord;\n\t};\n\nexport { toRecordKeyString } from './id';\nexport type { SurrealSubset } from './types';\n\ndeclare module '@tanstack/db' {\n\tinterface Collection<\n\t\tT extends object = Record<string, unknown>,\n\t\tTKey extends string | number = string | number,\n\t\tTUtils extends UtilsRecord = UtilsRecord,\n\t\tTSchema extends StandardSchemaV1 = StandardSchemaV1,\n\t\tTInsertInput extends object = T,\n\t> {\n\t\tdelete(\n\t\t\tkeys: Array<TKey | RecordId | string> | TKey | RecordId | string,\n\t\t\tconfig?: OperationConfig,\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Match TanstackDB\n\t\t): Transaction<any>;\n\t}\n}\n\ntype SyncReturn =\n\t| undefined\n\t| Cleanup\n\t| {\n\t\t\tcleanup?: Cleanup;\n\t\t\tunsubscribe?: Cleanup;\n\t\t\tdispose?: Cleanup;\n\t\t\tloadSubset?: unknown; // keep unknown; Only pass through\n\t };\n\nconst TEMP_ID_PREFIX = '__temp__';\nconst NOOP: Cleanup = () => {};\n\ntype QueryWriteUtils = {\n\twriteUpsert?: (data: unknown) => void;\n\twriteDelete?: (key: string) => void;\n};\n\nconst createTempRecordId = (tableName: string): RecordId => {\n\tconst suffix = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n\treturn new RecordId(tableName, `${TEMP_ID_PREFIX}${suffix}`);\n};\n\nconst isTempId = (id: string | RecordId, tableName: string): boolean => {\n\tif (id instanceof RecordId) {\n\t\tconst recordKey = (id as unknown as { id?: unknown }).id;\n\t\treturn (\n\t\t\ttypeof recordKey === 'string' &&\n\t\t\trecordKey.startsWith(TEMP_ID_PREFIX)\n\t\t);\n\t}\n\n\tconst raw = toRecordIdString(id);\n\tconst key = raw.startsWith(`${tableName}:`)\n\t\t? raw.slice(tableName.length + 1)\n\t\t: raw;\n\treturn key.startsWith(TEMP_ID_PREFIX);\n};\n\nfunction toCleanup(res: SyncReturn): Cleanup {\n\tif (!res) return NOOP;\n\tif (typeof res === 'function') return res;\n\n\tconst cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;\n\n\treturn typeof cleanup === 'function' ? cleanup : NOOP;\n}\n\nfunction hasLoadSubset(\n\tres: SyncReturn,\n): res is { loadSubset: unknown } & Record<string, unknown> {\n\treturn typeof res === 'object' && res !== null && 'loadSubset' in res;\n}\n\nconst getWriteUtils = (utils: unknown): QueryWriteUtils =>\n\ttypeof utils === 'object' && utils !== null\n\t\t? (utils as QueryWriteUtils)\n\t\t: {};\n\nconst omitUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).filter(([, value]) => value !== undefined),\n\t) as Partial<T>;\n\nfunction createInsertSchema<T extends { id: string | RecordId }>(\n\ttableName: string,\n): StandardSchemaV1<MutationInput<T>, T> {\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'tanstack-db-surrealdb',\n\t\t\tvalidate: (value: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\t!value ||\n\t\t\t\t\ttypeof value !== 'object' ||\n\t\t\t\t\tArray.isArray(value)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tissues: [{ message: 'Insert data must be an object.' }],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst data = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(value as Record<string, unknown>),\n\t\t\t\t}) as MutationInput<T>;\n\n\t\t\t\tif (!data.id)\n\t\t\t\t\tdata.id = createTempRecordId(tableName) as T['id'];\n\n\t\t\t\treturn { value: data as T };\n\t\t\t},\n\t\t\ttypes: undefined,\n\t\t},\n\t};\n}\n\nexport function surrealCollectionOptions<\n\tT extends SyncedTable<object>,\n\tS extends Record<string, Container> = { [k: string]: never },\n>({\n\tid,\n\tuseLoro = false,\n\tonError,\n\tdb,\n\tqueryClient,\n\tqueryKey,\n\tsyncMode = 'eager',\n\t...config\n}: SurrealCollectionConfig<T>): CollectionConfig<\n\tT,\n\tstring,\n\tStandardSchemaV1<MutationInput<T>, T>,\n\tUtilsRecord\n> & {\n\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\tutils: UtilsRecord;\n} {\n\tlet loro: { doc: LoroDoc<S>; key?: string } | undefined;\n\tif (useLoro) loro = { doc: new LoroDoc(), key: id };\n\n\tconst table = manageTable<T>(db, useLoro, config.table);\n\n\tconst keyOf = (rid: RecordId | string): string => toRecordIdString(rid);\n\n\tconst getKey = (row: { id: string | RecordId }) => keyOf(row.id);\n\tconst normalizeMutationId = (rid: RecordId | string): RecordId =>\n\t\ttoRecordId(config.table.name, rid);\n\tconst withNormalizedId = (row: T): T =>\n\t\t({ ...row, id: keyOf(row.id) }) as T;\n\n\tconst loroKey = loro?.key ?? id ?? 'surreal';\n\tconst loroMap = useLoro ? (loro?.doc?.getMap?.(loroKey) ?? null) : null;\n\tconst commitLoro = () => {\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst loroPut = (row: T, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.set(getKey(row), row as unknown);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst loroRemove = (idStr: string, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.delete(idStr);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst mergeLocalOverServer = (serverRows: T[]): T[] => {\n\t\tif (!useLoro || !loroMap) return serverRows;\n\n\t\tconst localJson = (loroMap.toJSON?.() ?? {}) as Record<string, T>;\n\n\t\tconst out: T[] = [];\n\t\tfor (const s of serverRows) {\n\t\t\tconst idStr = getKey(s);\n\t\t\tconst l = localJson[idStr];\n\n\t\t\tif (!l) {\n\t\t\t\tout.push(s);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((l.sync_deleted ?? false) === true) continue;\n\t\t\tout.push(l);\n\t\t}\n\n\t\treturn out;\n\t};\n\n\tconst base = queryCollectionOptions({\n\t\tschema: createInsertSchema<T>(config.table.name),\n\t\tgetKey,\n\n\t\tqueryKey,\n\t\tqueryClient,\n\n\t\tsyncMode,\n\n\t\tqueryFn: async ({ meta }) => {\n\t\t\ttry {\n\t\t\t\tconst subset =\n\t\t\t\t\tsyncMode === 'on-demand'\n\t\t\t\t\t\t? (meta.surrealSubset as SurrealSubset | undefined)\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst rows =\n\t\t\t\t\tsyncMode === 'eager'\n\t\t\t\t\t\t? await table.listAll()\n\t\t\t\t\t\t: await table.loadSubset(subset);\n\n\t\t\t\treturn mergeLocalOverServer(rows).map((row) =>\n\t\t\t\t\twithNormalizedId(row),\n\t\t\t\t);\n\t\t\t} catch (e) {\n\t\t\t\tonError?.(e);\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonInsert: (async (p: InsertMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'insert') continue;\n\n\t\t\t\tconst baseRow = { ...m.modified } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({\n\t\t\t\t\t\t\t...baseRow,\n\t\t\t\t\t\t\tupdated_at: now,\n\t\t\t\t\t\t\tsync_deleted: false,\n\t\t\t\t\t\t} as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\t\t\t\tif (isTempId(normalizedRow.id, config.table.name)) {\n\t\t\t\t\tconst tempKey = keyOf(normalizedRow.id);\n\t\t\t\t\tconst { id: _id, ...payload } = normalizedRow as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\tconst persisted = await table.create(payload as Partial<T>);\n\t\t\t\t\tconst resolvedRow = persisted?.id\n\t\t\t\t\t\t? withNormalizedId({\n\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\tid: persisted.id,\n\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t: normalizedRow;\n\n\t\t\t\t\tif (useLoro && persisted?.id) {\n\t\t\t\t\t\tloroRemove(tempKey, false);\n\t\t\t\t\t\tloroPut(resolvedRow, false);\n\t\t\t\t\t}\n\t\t\t\t\tresultRows.push(resolvedRow);\n\t\t\t\t} else {\n\t\t\t\t\tconst persisted = await table.create(normalizedRow);\n\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\tpersisted\n\t\t\t\t\t\t\t? withNormalizedId({\n\t\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t\t: normalizedRow,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn resultRows as unknown as StandardSchema<T>;\n\t\t}) as InsertMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonUpdate: (async (p: UpdateMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = omitUndefined(\n\t\t\t\t\tnormalizeRecordIdLikeFields({\n\t\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t\t}) as Record<string, unknown>,\n\t\t\t\t) as Partial<T>;\n\t\t\t\tconst baseRow = {\n\t\t\t\t\t...normalizedModified,\n\t\t\t\t\tid: keyOf(idKey),\n\t\t\t\t} as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), normalizedRow);\n\t\t\t\twriteUtils.writeUpsert?.(normalizedRow);\n\n\t\t\t\tresultRows.push(normalizedRow);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\tvoid resultRows;\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as UpdateMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonDelete: (async (p: DeleteMutationFnParams<T>) => {\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'delete') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst key = keyOf(idKey);\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroRemove(key, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.softDelete(normalizeMutationId(idKey));\n\t\t\t\twriteUtils.writeDelete?.(key);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as DeleteMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\t} as never) as SurrealCollectionOptionsReturn<T>;\n\n\t// LIVE updates -> invalidate all subsets under base queryKey\n\tconst baseSync = base.sync?.sync;\n\n\tconst sync = baseSync\n\t\t? {\n\t\t\t\tsync: (ctx: Parameters<NonNullable<typeof baseSync>>[0]) => {\n\t\t\t\t\t// IMPORTANT: call baseSync exactly once\n\t\t\t\t\tconst baseRes = baseSync(ctx) as SyncReturn;\n\t\t\t\t\tconst baseCleanup = toCleanup(baseRes);\n\n\t\t\t\t\t// If live queries aren't supported, return the base result untouched\n\t\t\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) {\n\t\t\t\t\t\treturn baseRes as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst offLive = table.subscribe((evt) => {\n\t\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\t\tif (evt.type === 'delete') {\n\t\t\t\t\t\t\t\tloroRemove(getKey(evt.row));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloroPut(evt.row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid queryClient\n\t\t\t\t\t\t\t.invalidateQueries({ queryKey, exact: false })\n\t\t\t\t\t\t\t.catch((e) => onError?.(e));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Preserve base return shape, just wrap cleanup\n\t\t\t\t\tif (hasLoadSubset(baseRes)) {\n\t\t\t\t\t\t// on-demand mode relies on this being present\n\t\t\t\t\t\tconst resObj = baseRes as Record<string, unknown>;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...resObj,\n\t\t\t\t\t\t\tcleanup: () => {\n\t\t\t\t\t\t\t\toffLive();\n\t\t\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\t// eager mode usually returns a cleanup function\n\t\t\t\t\treturn (() => {\n\t\t\t\t\t\toffLive();\n\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t}) as unknown as ReturnType<NonNullable<typeof baseSync>>;\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\t...base,\n\t\tsync: sync ?? base.sync,\n\t} as SurrealCollectionOptionsReturn<T>;\n}\n"]}
1
+ {"version":3,"sources":["../src/id.ts","../src/table.ts","../src/index.ts"],"names":["RecordId","parseWhereExpression","parseOrderByExpression","Table","Features","LoroDoc","queryCollectionOptions"],"mappings":"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","file":"index.js","sourcesContent":["import { RecordId } from 'surrealdb';\n\nexport const stripOuterQuotes = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSingleQuoted =\n\t\ttrimmed.startsWith(\"'\") && trimmed.endsWith(\"'\") && trimmed.length >= 2;\n\tconst isDoubleQuoted =\n\t\ttrimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2;\n\tconst isBacktickQuoted =\n\t\ttrimmed.startsWith('`') && trimmed.endsWith('`') && trimmed.length >= 2;\n\treturn isSingleQuoted || isDoubleQuoted || isBacktickQuoted\n\t\t? trimmed.slice(1, -1)\n\t\t: trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string => {\n\tconst raw =\n\t\ttypeof rid === 'string' ? stripOuterQuotes(rid) : rid.toString();\n\tconst trimmed = stripOuterQuotes(raw).trim();\n\tconst idx = trimmed.indexOf(':');\n\tif (idx <= 0 || idx >= trimmed.length - 1) return trimmed;\n\n\tconst table = trimmed.slice(0, idx).trim();\n\tconst key = stripOuterQuotes(\n\t\tstripAngleBrackets(stripOuterQuotes(trimmed.slice(idx + 1).trim())),\n\t);\n\tif (!table || !key) return trimmed;\n\treturn `${table}:${key}`;\n};\n\nconst stripAngleBrackets = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSurrealAngles =\n\t\ttrimmed.startsWith('⟨') && trimmed.endsWith('⟩') && trimmed.length >= 2;\n\tconst isAsciiAngles =\n\t\ttrimmed.startsWith('<') && trimmed.endsWith('>') && trimmed.length >= 2;\n\treturn isSurrealAngles || isAsciiAngles\n\t\t? trimmed.slice(1, -1).trim()\n\t\t: trimmed;\n};\n\nexport const toRecordKeyString = (rid: RecordId | string): string => {\n\tconst normalized = toRecordIdString(rid);\n\tconst idx = normalized.indexOf(':');\n\tconst rawKey = idx > 0 ? normalized.slice(idx + 1) : normalized;\n\treturn stripOuterQuotes(rawKey.trim());\n};\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst looksLikeTableName = (value: string): boolean =>\n\t/^[A-Za-z_][A-Za-z0-9_-]*$/.test(value);\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tconst normalized = toRecordIdString(value);\n\tif (!isRecordIdString(normalized)) return undefined;\n\n\tconst idx = normalized.indexOf(':');\n\tconst table = stripOuterQuotes(normalized.slice(0, idx).trim());\n\tconst key = normalized.slice(idx + 1).trim();\n\tif (!table || !key || !looksLikeTableName(table)) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ??\n\t\t(unquoted === trimmed ? undefined : parseRecordIdString(trimmed));\n\tif (parsed) return parsed;\n\n\t// Keep original value shape if it isn't record-id-like\n\treturn value;\n};\n\nexport const normalizeRecordIdLikeFields = <T extends Record<string, unknown>>(\n\tdata: T,\n): T => {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(data)) {\n\t\tout[k] = normalizeRecordIdLikeValue(v);\n\t}\n\treturn out as T;\n};\n\nexport const toRecordId = (\n\ttableName: string,\n\tid: RecordId | string,\n): RecordId => {\n\tif (id instanceof RecordId) return id;\n\n\tconst normalized = toRecordIdString(id);\n\tconst prefixed = `${tableName}:`;\n\tconst key = normalized.startsWith(prefixed)\n\t\t? normalized.slice(prefixed.length)\n\t\t: normalized;\n\treturn new RecordId(tableName, key);\n};\n","import { parseOrderByExpression, parseWhereExpression } from '@tanstack/db';\nimport {\n\tFeatures,\n\ttype LiveMessage,\n\ttype LiveSubscription,\n\ttype RecordId,\n\ttype Surreal,\n\tTable,\n} from 'surrealdb';\nimport { toRecordId } from './id';\nimport type { SurrealSubset, TableOptions } from './types';\n\ntype QueryResult<T> = T[] | null;\ntype RowResult<T> = T | T[] | null;\ntype FieldPath = Array<string | number>;\ntype SqlFragment = { sql: string };\n\nconst IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nconst firstRow = <T>(res: RowResult<T>): T | undefined => {\n\tif (!res) return undefined;\n\tif (Array.isArray(res)) return res[0];\n\treturn res;\n};\n\nconst toFieldPath = (value: unknown): FieldPath => {\n\tif (!Array.isArray(value)) {\n\t\tthrow new Error('Expected a field path array in where expression.');\n\t}\n\treturn value as FieldPath;\n};\n\nconst quoteIdentifier = (segment: string): string => {\n\tif (IDENTIFIER_RE.test(segment)) return segment;\n\treturn `\\`${segment.replaceAll('`', '\\\\`')}\\``;\n};\n\nconst formatFieldPath = (path: FieldPath): string => {\n\tlet out = '';\n\tfor (const segment of path) {\n\t\tif (typeof segment === 'number') {\n\t\t\tout += `[${segment}]`;\n\t\t\tcontinue;\n\t\t}\n\t\tconst next = quoteIdentifier(segment);\n\t\tout = out ? `${out}.${next}` : next;\n\t}\n\treturn out;\n};\n\nconst isReferencePathCandidate = (value: unknown): value is FieldPath =>\n\tArray.isArray(value) &&\n\tvalue.length > 0 &&\n\ttypeof value[0] === 'string' &&\n\tvalue.every(\n\t\t(segment) => typeof segment === 'string' || typeof segment === 'number',\n\t);\n\nconst mapRelationPath = (path: FieldPath, relation?: boolean): FieldPath => {\n\tif (!relation) return path;\n\tif (path[0] === 'from') return ['in', ...path.slice(1)];\n\tif (path[0] === 'to') return ['out', ...path.slice(1)];\n\treturn path;\n};\n\nconst toSqlFragment = (value: unknown): SqlFragment => {\n\tif (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t'sql' in value &&\n\t\ttypeof (value as { sql: unknown }).sql === 'string'\n\t) {\n\t\treturn value as SqlFragment;\n\t}\n\tthrow new Error('Unsupported where expression node.');\n};\n\nconst joinLogical = (op: 'AND' | 'OR', args: Array<unknown>): SqlFragment => {\n\tconst parts = args.map(toSqlFragment).map((frag) => frag.sql);\n\tif (parts.length === 0) {\n\t\treturn { sql: op === 'AND' ? 'true' : 'false' };\n\t}\n\tif (parts.length === 1) return { sql: parts[0] };\n\treturn {\n\t\tsql: parts.map((part) => `(${part})`).join(` ${op} `),\n\t};\n};\n\nconst buildSubsetQuery = (\n\ttable: TableOptions,\n\tuseLoro: boolean,\n\tsubset?: SurrealSubset,\n): { sql: string; params: Record<string, unknown> } => {\n\tlet paramIdx = 0;\n\tconst params: Record<string, unknown> = { table: table.name };\n\tconst nextParam = (value: unknown): string => {\n\t\tconst key = `p${paramIdx++}`;\n\t\tparams[key] = value;\n\t\treturn `$${key}`;\n\t};\n\tconst comparison = (\n\t\tfieldPath: unknown,\n\t\top: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'LIKE',\n\t\tvalue: unknown,\n\t): SqlFragment => {\n\t\tconst field = formatFieldPath(\n\t\t\tmapRelationPath(toFieldPath(fieldPath), table.relation),\n\t\t);\n\t\tif (isReferencePathCandidate(value)) {\n\t\t\t// WHERE subset filters should use concrete values, not ref-to-ref comparisons.\n\t\t\tthrow new Error(\n\t\t\t\t'Field-to-field comparisons are not supported in loadSubset where translation.',\n\t\t\t);\n\t\t}\n\t\treturn { sql: `${field} ${op} ${nextParam(value)}` };\n\t};\n\tconst whereSqlFrom = (\n\t\texpr: NonNullable<SurrealSubset['where']>,\n\t): string => {\n\t\tconst fragment = parseWhereExpression<SqlFragment>(expr, {\n\t\t\thandlers: {\n\t\t\t\tand: (...args) => joinLogical('AND', args),\n\t\t\t\tor: (...args) => joinLogical('OR', args),\n\t\t\t\tnot: (arg) => ({ sql: `NOT (${toSqlFragment(arg).sql})` }),\n\t\t\t\teq: (field, value) => comparison(field, '=', value),\n\t\t\t\tgt: (field, value) => comparison(field, '>', value),\n\t\t\t\tgte: (field, value) => comparison(field, '>=', value),\n\t\t\t\tlt: (field, value) => comparison(field, '<', value),\n\t\t\t\tlte: (field, value) => comparison(field, '<=', value),\n\t\t\t\tlike: (field, value) => comparison(field, 'LIKE', value),\n\t\t\t\tilike: (field, value) => {\n\t\t\t\t\tconst f = formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t);\n\t\t\t\t\tconst p = nextParam(value);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: `string::lower(${f}) LIKE string::lower(${p})`,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tin: (field, value) => {\n\t\t\t\t\tconst f = formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t);\n\t\t\t\t\tif (Array.isArray(value) && value.length === 0) {\n\t\t\t\t\t\treturn { sql: 'false' };\n\t\t\t\t\t}\n\t\t\t\t\treturn { sql: `${f} IN ${nextParam(value)}` };\n\t\t\t\t},\n\t\t\t\tisNull: (field) => ({\n\t\t\t\t\tsql: `${formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t)} IS NULL`,\n\t\t\t\t}),\n\t\t\t\tisUndefined: (field) => ({\n\t\t\t\t\tsql: `${formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t)} IS NONE`,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tonUnknownOperator: (op) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unsupported where operator '${op}' for SurrealQL translation.`,\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\n\t\tif (!fragment) return '';\n\t\treturn fragment.sql;\n\t};\n\n\tconst whereParts: string[] = [];\n\tif (subset?.where) {\n\t\tconst parsed = whereSqlFrom(subset.where);\n\t\tif (parsed) whereParts.push(parsed);\n\t}\n\tif (subset?.cursor?.whereFrom) {\n\t\tconst cursorWhere = whereSqlFrom(subset.cursor.whereFrom);\n\t\tif (cursorWhere) whereParts.push(cursorWhere);\n\t}\n\tif (useLoro) whereParts.push('sync_deleted = false');\n\n\tconst whereSql = whereParts.length\n\t\t? ` WHERE ${whereParts.map((part) => `(${part})`).join(' AND ')}`\n\t\t: '';\n\n\tconst order = parseOrderByExpression(subset?.orderBy);\n\tconst orderSql = order.length\n\t\t? ` ORDER BY ${order\n\t\t\t\t.map(\n\t\t\t\t\t(clause) =>\n\t\t\t\t\t\t`${formatFieldPath(\n\t\t\t\t\t\t\tmapRelationPath(clause.field, table.relation),\n\t\t\t\t\t\t)} ${clause.direction.toUpperCase()}`,\n\t\t\t\t)\n\t\t\t\t.join(', ')}`\n\t\t: '';\n\tconst limitSql =\n\t\ttypeof subset?.limit === 'number'\n\t\t\t? ` LIMIT ${nextParam(subset.limit)}`\n\t\t\t: '';\n\tconst offsetSql =\n\t\ttypeof subset?.offset === 'number'\n\t\t\t? ` START ${nextParam(subset.offset)}`\n\t\t\t: '';\n\n\treturn {\n\t\tsql: `SELECT * FROM type::table($table)${whereSql}${orderSql}${limitSql}${offsetSql};`,\n\t\tparams,\n\t};\n};\n\nexport function manageTable<T extends { id: string | RecordId }>(\n\tdb: Surreal,\n\tuseLoro: boolean,\n\tconfig: TableOptions,\n) {\n\tconst { name } = config;\n\tconst table = new Table(name);\n\n\tconst listAll = async (): Promise<T[]> => {\n\t\treturn loadSubset();\n\t};\n\n\tconst loadSubset = async (subset?: SurrealSubset): Promise<T[]> => {\n\t\tconst { sql, params } = buildSubsetQuery(config, useLoro, subset);\n\t\tconst [res] = await db.query<[QueryResult<T>]>(sql, params);\n\n\t\treturn res ?? [];\n\t};\n\n\tconst create = async (data: T | Partial<T>): Promise<T | undefined> => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tconst created = await db.create(table).content(data);\n\t\t\treturn firstRow(created as RowResult<T>);\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tconst inserted = await db.insert(table, payload);\n\t\treturn firstRow(inserted as RowResult<T>);\n\t};\n\n\tconst update = async (id: RecordId, data: T | Partial<T>) => {\n\t\tconst { id: _ignoredId, ...rest } = data as Record<string, unknown>;\n\t\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(rest);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...rest,\n\t\t\tsync_deleted: false,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst remove = async (id: RecordId) => {\n\t\tawait db.delete(id);\n\t};\n\n\tconst softDelete = async (id: RecordId) => {\n\t\tif (!useLoro) {\n\t\t\tawait db.delete(id);\n\t\t\treturn;\n\t\t}\n\t\tawait db.upsert(id).merge({\n\t\t\tsync_deleted: true,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst subscribe = (\n\t\tcb: (e: { type: 'insert' | 'update' | 'delete'; row: T }) => void,\n\t) => {\n\t\tlet killed = false;\n\t\tlet live: LiveSubscription | undefined;\n\n\t\tconst on = (msg: LiveMessage) => {\n\t\t\tconst { action, value } = msg as unknown as {\n\t\t\t\taction: 'CREATE' | 'UPDATE' | 'DELETE' | 'KILLED';\n\t\t\t\tvalue: T & { id: string | RecordId };\n\t\t\t};\n\n\t\t\tif (action === 'KILLED') return;\n\n\t\t\tif (action === 'CREATE') cb({ type: 'insert', row: value });\n\t\t\telse if (action === 'UPDATE') cb({ type: 'update', row: value });\n\t\t\telse if (action === 'DELETE')\n\t\t\t\tcb({ type: 'delete', row: { id: value.id } as T });\n\t\t};\n\n\t\tconst start = async () => {\n\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) return;\n\t\t\tlive = await db.live(table);\n\t\t\tlive.subscribe(on);\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tif (killed) return;\n\t\t\tkilled = true;\n\t\t\tif (live) void live.kill();\n\t\t};\n\t};\n\n\treturn {\n\t\tlistAll,\n\t\tloadSubset,\n\t\tcreate,\n\t\tupdate,\n\t\tremove,\n\t\tsoftDelete,\n\t\tsubscribe,\n\t};\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n\tCollectionConfig,\n\tDeleteMutationFn,\n\tDeleteMutationFnParams,\n\tInsertMutationFn,\n\tInsertMutationFnParams,\n\tOperationConfig,\n\tStandardSchema,\n\tTransaction,\n\tUpdateMutationFn,\n\tUpdateMutationFnParams,\n\tUtilsRecord,\n} from '@tanstack/db';\nimport { queryCollectionOptions } from '@tanstack/query-db-collection';\nimport { type Container, LoroDoc } from 'loro-crdt';\nimport { Features, RecordId } from 'surrealdb';\n\nimport {\n\tnormalizeRecordIdLikeFields,\n\ttoRecordId,\n\ttoRecordIdString,\n} from './id';\nimport { manageTable } from './table';\nimport type { SurrealCollectionConfig, SyncedTable } from './types';\n\ntype Cleanup = () => void;\n\ntype MutationInput<T extends { id: string | RecordId }> = Omit<T, 'id'> & {\n\tid?: T['id'];\n};\n\ntype SurrealCollectionOptionsReturn<T extends { id: string | RecordId }> =\n\tCollectionConfig<\n\t\tT,\n\t\tstring,\n\t\tStandardSchemaV1<MutationInput<T>, T>,\n\t\tUtilsRecord\n\t> & {\n\t\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\t\tutils: UtilsRecord;\n\t};\n\nexport { toRecordKeyString } from './id';\n\ndeclare module '@tanstack/db' {\n\tinterface Collection<\n\t\tT extends object = Record<string, unknown>,\n\t\tTKey extends string | number = string | number,\n\t\tTUtils extends UtilsRecord = UtilsRecord,\n\t\tTSchema extends StandardSchemaV1 = StandardSchemaV1,\n\t\tTInsertInput extends object = T,\n\t> {\n\t\tdelete(\n\t\t\tkeys: Array<TKey | RecordId | string> | TKey | RecordId | string,\n\t\t\tconfig?: OperationConfig,\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Match TanstackDB\n\t\t): Transaction<any>;\n\t}\n}\n\ntype SyncReturn =\n\t| undefined\n\t| Cleanup\n\t| {\n\t\t\tcleanup?: Cleanup;\n\t\t\tunsubscribe?: Cleanup;\n\t\t\tdispose?: Cleanup;\n\t\t\tloadSubset?: unknown; // keep unknown; Only pass through\n\t };\n\nconst TEMP_ID_PREFIX = '__temp__';\nconst NOOP: Cleanup = () => {};\n\ntype QueryWriteUtils = {\n\twriteUpsert?: (data: unknown) => void;\n\twriteDelete?: (key: string) => void;\n};\n\nconst createTempRecordId = (tableName: string): RecordId => {\n\tconst suffix = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n\treturn new RecordId(tableName, `${TEMP_ID_PREFIX}${suffix}`);\n};\n\nconst isTempId = (id: string | RecordId, tableName: string): boolean => {\n\tif (id instanceof RecordId) {\n\t\tconst recordKey = (id as unknown as { id?: unknown }).id;\n\t\treturn (\n\t\t\ttypeof recordKey === 'string' &&\n\t\t\trecordKey.startsWith(TEMP_ID_PREFIX)\n\t\t);\n\t}\n\n\tconst raw = toRecordIdString(id);\n\tconst key = raw.startsWith(`${tableName}:`)\n\t\t? raw.slice(tableName.length + 1)\n\t\t: raw;\n\treturn key.startsWith(TEMP_ID_PREFIX);\n};\n\nfunction toCleanup(res: SyncReturn): Cleanup {\n\tif (!res) return NOOP;\n\tif (typeof res === 'function') return res;\n\n\tconst cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;\n\n\treturn typeof cleanup === 'function' ? cleanup : NOOP;\n}\n\nfunction hasLoadSubset(\n\tres: SyncReturn,\n): res is { loadSubset: unknown } & Record<string, unknown> {\n\treturn typeof res === 'object' && res !== null && 'loadSubset' in res;\n}\n\nconst getWriteUtils = (utils: unknown): QueryWriteUtils =>\n\ttypeof utils === 'object' && utils !== null\n\t\t? (utils as QueryWriteUtils)\n\t\t: {};\n\nconst omitUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).filter(([, value]) => value !== undefined),\n\t) as Partial<T>;\n\nfunction createInsertSchema<T extends { id: string | RecordId }>(\n\ttableName: string,\n): StandardSchemaV1<MutationInput<T>, T> {\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'tanstack-db-surrealdb',\n\t\t\tvalidate: (value: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\t!value ||\n\t\t\t\t\ttypeof value !== 'object' ||\n\t\t\t\t\tArray.isArray(value)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tissues: [{ message: 'Insert data must be an object.' }],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst data = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(value as Record<string, unknown>),\n\t\t\t\t}) as MutationInput<T>;\n\n\t\t\t\tif (!data.id)\n\t\t\t\t\tdata.id = createTempRecordId(tableName) as T['id'];\n\n\t\t\t\treturn { value: data as T };\n\t\t\t},\n\t\t\ttypes: undefined,\n\t\t},\n\t};\n}\n\nexport function surrealCollectionOptions<\n\tT extends SyncedTable<object>,\n\tS extends Record<string, Container> = { [k: string]: never },\n>({\n\tid,\n\tuseLoro = false,\n\tonError,\n\tdb,\n\tqueryClient,\n\tqueryKey,\n\tsyncMode = 'eager',\n\t...config\n}: SurrealCollectionConfig): CollectionConfig<\n\tT,\n\tstring,\n\tStandardSchemaV1<MutationInput<T>, T>,\n\tUtilsRecord\n> & {\n\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\tutils: UtilsRecord;\n} {\n\tlet loro: { doc: LoroDoc<S>; key?: string } | undefined;\n\tif (useLoro) loro = { doc: new LoroDoc(), key: id };\n\n\tconst table = manageTable<T>(db, useLoro, config.table);\n\n\tconst keyOf = (rid: RecordId | string): string => toRecordIdString(rid);\n\n\tconst getKey = (row: { id: string | RecordId }) => keyOf(row.id);\n\tconst normalizeMutationId = (rid: RecordId | string): RecordId =>\n\t\ttoRecordId(config.table.name, rid);\n\tconst withRecordId = (row: T): T =>\n\t\t({ ...row, id: normalizeMutationId(row.id) }) as T;\n\tconst toLoroStoredRow = (row: T): T => ({ ...row, id: keyOf(row.id) }) as T;\n\n\tconst loroKey = loro?.key ?? id ?? 'surreal';\n\tconst loroMap = useLoro ? (loro?.doc?.getMap?.(loroKey) ?? null) : null;\n\tconst commitLoro = () => {\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst loroPut = (row: T, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.set(getKey(row), toLoroStoredRow(row) as unknown);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst loroRemove = (idStr: string, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.delete(idStr);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst mergeLocalOverServer = (serverRows: T[]): T[] => {\n\t\tif (!useLoro || !loroMap) return serverRows;\n\n\t\tconst localJson = (loroMap.toJSON?.() ?? {}) as Record<string, T>;\n\n\t\tconst out: T[] = [];\n\t\tfor (const s of serverRows) {\n\t\t\tconst idStr = getKey(s);\n\t\t\tconst l = localJson[idStr];\n\n\t\t\tif (!l) {\n\t\t\t\tout.push(s);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((l.sync_deleted ?? false) === true) continue;\n\t\t\tout.push(withRecordId(l));\n\t\t}\n\n\t\treturn out;\n\t};\n\n\tconst base = queryCollectionOptions({\n\t\tschema: createInsertSchema<T>(config.table.name),\n\t\tgetKey,\n\n\t\tqueryKey,\n\t\tqueryClient,\n\n\t\tsyncMode,\n\n\t\tqueryFn: async ({ meta }) => {\n\t\t\ttry {\n\t\t\t\tconst subset =\n\t\t\t\t\tsyncMode === 'on-demand'\n\t\t\t\t\t\t? meta?.loadSubsetOptions\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst rows =\n\t\t\t\t\tsyncMode === 'eager'\n\t\t\t\t\t\t? await table.listAll()\n\t\t\t\t\t\t: await table.loadSubset(subset);\n\n\t\t\t\treturn mergeLocalOverServer(rows).map((row) =>\n\t\t\t\t\twithRecordId(row),\n\t\t\t\t);\n\t\t\t} catch (e) {\n\t\t\t\tonError?.(e);\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonInsert: (async (p: InsertMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'insert') continue;\n\n\t\t\t\tconst baseRow = { ...m.modified } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({\n\t\t\t\t\t\t\t...baseRow,\n\t\t\t\t\t\t\tupdated_at: now,\n\t\t\t\t\t\t\tsync_deleted: false,\n\t\t\t\t\t\t} as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withRecordId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\t\t\t\tif (isTempId(normalizedRow.id, config.table.name)) {\n\t\t\t\t\tconst tempKey = keyOf(normalizedRow.id);\n\t\t\t\t\tconst { id: _id, ...payload } = normalizedRow as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\tconst persisted = await table.create(payload as Partial<T>);\n\t\t\t\t\tconst resolvedRow = persisted?.id\n\t\t\t\t\t\t? withRecordId({\n\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\tid: persisted.id,\n\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t: normalizedRow;\n\n\t\t\t\t\tif (useLoro && persisted?.id) {\n\t\t\t\t\t\tloroRemove(tempKey, false);\n\t\t\t\t\t\tloroPut(resolvedRow, false);\n\t\t\t\t\t}\n\t\t\t\t\tresultRows.push(resolvedRow);\n\t\t\t\t} else {\n\t\t\t\t\tconst persisted = await table.create(normalizedRow);\n\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\tpersisted\n\t\t\t\t\t\t\t? withRecordId({\n\t\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t\t: normalizedRow,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn resultRows as unknown as StandardSchema<T>;\n\t\t}) as InsertMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonUpdate: (async (p: UpdateMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = omitUndefined(\n\t\t\t\t\tnormalizeRecordIdLikeFields({\n\t\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t\t}) as Record<string, unknown>,\n\t\t\t\t) as Partial<T>;\n\t\t\t\tconst baseRow = {\n\t\t\t\t\t...normalizedModified,\n\t\t\t\t\tid: normalizeMutationId(idKey),\n\t\t\t\t} as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withRecordId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), normalizedRow);\n\t\t\t\twriteUtils.writeUpsert?.(normalizedRow);\n\n\t\t\t\tresultRows.push(normalizedRow);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\tvoid resultRows;\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as UpdateMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonDelete: (async (p: DeleteMutationFnParams<T>) => {\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'delete') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst key = keyOf(idKey);\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroRemove(key, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.softDelete(normalizeMutationId(idKey));\n\t\t\t\twriteUtils.writeDelete?.(key);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as DeleteMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\t} as never) as SurrealCollectionOptionsReturn<T>;\n\n\t// LIVE updates -> invalidate all subsets under base queryKey\n\tconst baseSync = base.sync?.sync;\n\n\tconst sync = baseSync\n\t\t? {\n\t\t\t\tsync: (ctx: Parameters<NonNullable<typeof baseSync>>[0]) => {\n\t\t\t\t\t// IMPORTANT: call baseSync exactly once\n\t\t\t\t\tconst baseRes = baseSync(ctx) as SyncReturn;\n\t\t\t\t\tconst baseCleanup = toCleanup(baseRes);\n\n\t\t\t\t\t// If live queries aren't supported, return the base result untouched\n\t\t\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) {\n\t\t\t\t\t\treturn baseRes as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst offLive = table.subscribe((evt) => {\n\t\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\t\tif (evt.type === 'delete') {\n\t\t\t\t\t\t\t\tloroRemove(getKey(evt.row));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloroPut(evt.row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid queryClient\n\t\t\t\t\t\t\t.invalidateQueries({ queryKey, exact: false })\n\t\t\t\t\t\t\t.catch((e) => onError?.(e));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Preserve base return shape, just wrap cleanup\n\t\t\t\t\tif (hasLoadSubset(baseRes)) {\n\t\t\t\t\t\t// on-demand mode relies on this being present\n\t\t\t\t\t\tconst resObj = baseRes as Record<string, unknown>;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...resObj,\n\t\t\t\t\t\t\tcleanup: () => {\n\t\t\t\t\t\t\t\toffLive();\n\t\t\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\t// eager mode usually returns a cleanup function\n\t\t\t\t\treturn (() => {\n\t\t\t\t\t\toffLive();\n\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t}) as unknown as ReturnType<NonNullable<typeof baseSync>>;\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\t...base,\n\t\tsync: sync ?? base.sync,\n\t} as SurrealCollectionOptionsReturn<T>;\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  import { queryCollectionOptions } from '@tanstack/query-db-collection';
2
2
  import { LoroDoc } from 'loro-crdt';
3
- import { Features, Table, eq, and, RecordId } from 'surrealdb';
3
+ import { Features, Table, RecordId } from 'surrealdb';
4
+ import { parseOrderByExpression, parseWhereExpression } from '@tanstack/db';
4
5
 
5
6
  // src/index.ts
6
7
  var stripOuterQuotes = (value) => {
@@ -71,51 +72,161 @@ var toRecordId = (tableName, id) => {
71
72
  const key = normalized.startsWith(prefixed) ? normalized.slice(prefixed.length) : normalized;
72
73
  return new RecordId(tableName, key);
73
74
  };
74
- var normalizeFields = (raw) => {
75
- if (!raw || raw === "*") return ["*"];
76
- return raw;
77
- };
78
- var joinOrderBy = (o) => {
79
- if (!o) return void 0;
80
- return typeof o === "string" ? o : o.join(", ");
81
- };
75
+ var IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
82
76
  var firstRow = (res) => {
83
77
  if (!res) return void 0;
84
78
  if (Array.isArray(res)) return res[0];
85
79
  return res;
86
80
  };
87
- function manageTable(db, useLoro, { name, ...args }) {
88
- const fields = normalizeFields(args.fields);
89
- const selectFields = fields.join(", ");
81
+ var toFieldPath = (value) => {
82
+ if (!Array.isArray(value)) {
83
+ throw new Error("Expected a field path array in where expression.");
84
+ }
85
+ return value;
86
+ };
87
+ var quoteIdentifier = (segment) => {
88
+ if (IDENTIFIER_RE.test(segment)) return segment;
89
+ return `\`${segment.replaceAll("`", "\\`")}\``;
90
+ };
91
+ var formatFieldPath = (path) => {
92
+ let out = "";
93
+ for (const segment of path) {
94
+ if (typeof segment === "number") {
95
+ out += `[${segment}]`;
96
+ continue;
97
+ }
98
+ const next = quoteIdentifier(segment);
99
+ out = out ? `${out}.${next}` : next;
100
+ }
101
+ return out;
102
+ };
103
+ var isReferencePathCandidate = (value) => Array.isArray(value) && value.length > 0 && typeof value[0] === "string" && value.every(
104
+ (segment) => typeof segment === "string" || typeof segment === "number"
105
+ );
106
+ var mapRelationPath = (path, relation) => {
107
+ if (!relation) return path;
108
+ if (path[0] === "from") return ["in", ...path.slice(1)];
109
+ if (path[0] === "to") return ["out", ...path.slice(1)];
110
+ return path;
111
+ };
112
+ var toSqlFragment = (value) => {
113
+ if (typeof value === "object" && value !== null && "sql" in value && typeof value.sql === "string") {
114
+ return value;
115
+ }
116
+ throw new Error("Unsupported where expression node.");
117
+ };
118
+ var joinLogical = (op, args) => {
119
+ const parts = args.map(toSqlFragment).map((frag) => frag.sql);
120
+ if (parts.length === 0) {
121
+ return { sql: op === "AND" ? "true" : "false" };
122
+ }
123
+ if (parts.length === 1) return { sql: parts[0] };
124
+ return {
125
+ sql: parts.map((part) => `(${part})`).join(` ${op} `)
126
+ };
127
+ };
128
+ var buildSubsetQuery = (table, useLoro, subset) => {
129
+ let paramIdx = 0;
130
+ const params = { table: table.name };
131
+ const nextParam = (value) => {
132
+ const key = `p${paramIdx++}`;
133
+ params[key] = value;
134
+ return `$${key}`;
135
+ };
136
+ const comparison = (fieldPath, op, value) => {
137
+ const field = formatFieldPath(
138
+ mapRelationPath(toFieldPath(fieldPath), table.relation)
139
+ );
140
+ if (isReferencePathCandidate(value)) {
141
+ throw new Error(
142
+ "Field-to-field comparisons are not supported in loadSubset where translation."
143
+ );
144
+ }
145
+ return { sql: `${field} ${op} ${nextParam(value)}` };
146
+ };
147
+ const whereSqlFrom = (expr) => {
148
+ const fragment = parseWhereExpression(expr, {
149
+ handlers: {
150
+ and: (...args) => joinLogical("AND", args),
151
+ or: (...args) => joinLogical("OR", args),
152
+ not: (arg) => ({ sql: `NOT (${toSqlFragment(arg).sql})` }),
153
+ eq: (field, value) => comparison(field, "=", value),
154
+ gt: (field, value) => comparison(field, ">", value),
155
+ gte: (field, value) => comparison(field, ">=", value),
156
+ lt: (field, value) => comparison(field, "<", value),
157
+ lte: (field, value) => comparison(field, "<=", value),
158
+ like: (field, value) => comparison(field, "LIKE", value),
159
+ ilike: (field, value) => {
160
+ const f = formatFieldPath(
161
+ mapRelationPath(toFieldPath(field), table.relation)
162
+ );
163
+ const p = nextParam(value);
164
+ return {
165
+ sql: `string::lower(${f}) LIKE string::lower(${p})`
166
+ };
167
+ },
168
+ in: (field, value) => {
169
+ const f = formatFieldPath(
170
+ mapRelationPath(toFieldPath(field), table.relation)
171
+ );
172
+ if (Array.isArray(value) && value.length === 0) {
173
+ return { sql: "false" };
174
+ }
175
+ return { sql: `${f} IN ${nextParam(value)}` };
176
+ },
177
+ isNull: (field) => ({
178
+ sql: `${formatFieldPath(
179
+ mapRelationPath(toFieldPath(field), table.relation)
180
+ )} IS NULL`
181
+ }),
182
+ isUndefined: (field) => ({
183
+ sql: `${formatFieldPath(
184
+ mapRelationPath(toFieldPath(field), table.relation)
185
+ )} IS NONE`
186
+ })
187
+ },
188
+ onUnknownOperator: (op) => {
189
+ throw new Error(
190
+ `Unsupported where operator '${op}' for SurrealQL translation.`
191
+ );
192
+ }
193
+ });
194
+ if (!fragment) return "";
195
+ return fragment.sql;
196
+ };
197
+ const whereParts = [];
198
+ if (subset?.where) {
199
+ const parsed = whereSqlFrom(subset.where);
200
+ if (parsed) whereParts.push(parsed);
201
+ }
202
+ if (subset?.cursor?.whereFrom) {
203
+ const cursorWhere = whereSqlFrom(subset.cursor.whereFrom);
204
+ if (cursorWhere) whereParts.push(cursorWhere);
205
+ }
206
+ if (useLoro) whereParts.push("sync_deleted = false");
207
+ const whereSql = whereParts.length ? ` WHERE ${whereParts.map((part) => `(${part})`).join(" AND ")}` : "";
208
+ const order = parseOrderByExpression(subset?.orderBy);
209
+ const orderSql = order.length ? ` ORDER BY ${order.map(
210
+ (clause) => `${formatFieldPath(
211
+ mapRelationPath(clause.field, table.relation)
212
+ )} ${clause.direction.toUpperCase()}`
213
+ ).join(", ")}` : "";
214
+ const limitSql = typeof subset?.limit === "number" ? ` LIMIT ${nextParam(subset.limit)}` : "";
215
+ const offsetSql = typeof subset?.offset === "number" ? ` START ${nextParam(subset.offset)}` : "";
216
+ return {
217
+ sql: `SELECT * FROM type::table($table)${whereSql}${orderSql}${limitSql}${offsetSql};`,
218
+ params
219
+ };
220
+ };
221
+ function manageTable(db, useLoro, config) {
222
+ const { name } = config;
90
223
  const table = new Table(name);
91
- const aliveWhere = useLoro ? eq("sync_deleted", false) : void 0;
92
- const baseWhere = aliveWhere ? args.where ? and(args.where, aliveWhere) : aliveWhere : args.where;
93
- const listAllSql = `SELECT ${selectFields} FROM type::table($table)${baseWhere ? " WHERE $where" : ""};`;
94
- const getBaseWhere = () => baseWhere;
95
224
  const listAll = async () => {
96
- const where = getBaseWhere();
97
- const [res] = await db.query(listAllSql, {
98
- table: name,
99
- where
100
- });
101
- return res ?? [];
225
+ return loadSubset();
102
226
  };
103
227
  const loadSubset = async (subset) => {
104
- const b = getBaseWhere();
105
- const w = subset?.where;
106
- const where = b && w ? and(b, w) : b ?? w;
107
- const whereSql = where ? " WHERE $where" : "";
108
- const order = joinOrderBy(subset?.orderBy);
109
- const orderSql = order ? ` ORDER BY ${order}` : "";
110
- const limitSql = typeof subset?.limit === "number" ? " LIMIT $limit" : "";
111
- const startSql = typeof subset?.offset === "number" ? " START $offset" : "";
112
- const sql = `SELECT ${selectFields} FROM type::table($table)${whereSql}${orderSql}${limitSql}${startSql};`;
113
- const [res] = await db.query(sql, {
114
- table: name,
115
- where,
116
- limit: subset?.limit,
117
- offset: subset?.offset
118
- });
228
+ const { sql, params } = buildSubsetQuery(config, useLoro, subset);
229
+ const [res] = await db.query(sql, params);
119
230
  return res ?? [];
120
231
  };
121
232
  const create = async (data) => {
@@ -167,7 +278,7 @@ function manageTable(db, useLoro, { name, ...args }) {
167
278
  };
168
279
  const start = async () => {
169
280
  if (!db.isFeatureSupported(Features.LiveQueries)) return;
170
- live = await db.live(table).where(args.where);
281
+ live = await db.live(table);
171
282
  live.subscribe(on);
172
283
  };
173
284
  void start();
@@ -256,7 +367,8 @@ function surrealCollectionOptions({
256
367
  const keyOf = (rid) => toRecordIdString(rid);
257
368
  const getKey = (row) => keyOf(row.id);
258
369
  const normalizeMutationId = (rid) => toRecordId(config.table.name, rid);
259
- const withNormalizedId = (row) => ({ ...row, id: keyOf(row.id) });
370
+ const withRecordId = (row) => ({ ...row, id: normalizeMutationId(row.id) });
371
+ const toLoroStoredRow = (row) => ({ ...row, id: keyOf(row.id) });
260
372
  const loroKey = loro?.key ?? id ?? "surreal";
261
373
  const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
262
374
  const commitLoro = () => {
@@ -264,7 +376,7 @@ function surrealCollectionOptions({
264
376
  };
265
377
  const loroPut = (row, commit = true) => {
266
378
  if (!loroMap) return;
267
- loroMap.set(getKey(row), row);
379
+ loroMap.set(getKey(row), toLoroStoredRow(row));
268
380
  if (commit) commitLoro();
269
381
  };
270
382
  const loroRemove = (idStr, commit = true) => {
@@ -284,7 +396,7 @@ function surrealCollectionOptions({
284
396
  continue;
285
397
  }
286
398
  if ((l.sync_deleted ?? false) === true) continue;
287
- out.push(l);
399
+ out.push(withRecordId(l));
288
400
  }
289
401
  return out;
290
402
  };
@@ -296,10 +408,10 @@ function surrealCollectionOptions({
296
408
  syncMode,
297
409
  queryFn: async ({ meta }) => {
298
410
  try {
299
- const subset = syncMode === "on-demand" ? meta.surrealSubset : void 0;
411
+ const subset = syncMode === "on-demand" ? meta?.loadSubsetOptions : void 0;
300
412
  const rows = syncMode === "eager" ? await table.listAll() : await table.loadSubset(subset);
301
413
  return mergeLocalOverServer(rows).map(
302
- (row) => withNormalizedId(row)
414
+ (row) => withRecordId(row)
303
415
  );
304
416
  } catch (e) {
305
417
  onError?.(e);
@@ -318,7 +430,7 @@ function surrealCollectionOptions({
318
430
  updated_at: now,
319
431
  sync_deleted: false
320
432
  } : baseRow;
321
- const normalizedRow = withNormalizedId(row);
433
+ const normalizedRow = withRecordId(row);
322
434
  if (useLoro) {
323
435
  loroPut(normalizedRow, false);
324
436
  shouldCommitLoro = true;
@@ -327,7 +439,7 @@ function surrealCollectionOptions({
327
439
  const tempKey = keyOf(normalizedRow.id);
328
440
  const { id: _id, ...payload } = normalizedRow;
329
441
  const persisted = await table.create(payload);
330
- const resolvedRow = persisted?.id ? withNormalizedId({
442
+ const resolvedRow = persisted?.id ? withRecordId({
331
443
  ...normalizedRow,
332
444
  ...persisted,
333
445
  id: persisted.id
@@ -340,7 +452,7 @@ function surrealCollectionOptions({
340
452
  } else {
341
453
  const persisted = await table.create(normalizedRow);
342
454
  resultRows.push(
343
- persisted ? withNormalizedId({
455
+ persisted ? withRecordId({
344
456
  ...normalizedRow,
345
457
  ...persisted
346
458
  }) : normalizedRow
@@ -364,10 +476,10 @@ function surrealCollectionOptions({
364
476
  );
365
477
  const baseRow = {
366
478
  ...normalizedModified,
367
- id: keyOf(idKey)
479
+ id: normalizeMutationId(idKey)
368
480
  };
369
481
  const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
370
- const normalizedRow = withNormalizedId(row);
482
+ const normalizedRow = withRecordId(row);
371
483
  if (useLoro) {
372
484
  loroPut(normalizedRow, false);
373
485
  shouldCommitLoro = true;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/id.ts","../src/table.ts","../src/index.ts"],"names":["RecordId","Features"],"mappings":"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","file":"index.mjs","sourcesContent":["import { RecordId } from 'surrealdb';\n\nexport const stripOuterQuotes = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSingleQuoted =\n\t\ttrimmed.startsWith(\"'\") && trimmed.endsWith(\"'\") && trimmed.length >= 2;\n\tconst isDoubleQuoted =\n\t\ttrimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2;\n\tconst isBacktickQuoted =\n\t\ttrimmed.startsWith('`') && trimmed.endsWith('`') && trimmed.length >= 2;\n\treturn isSingleQuoted || isDoubleQuoted || isBacktickQuoted\n\t\t? trimmed.slice(1, -1)\n\t\t: trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string => {\n\tconst raw =\n\t\ttypeof rid === 'string' ? stripOuterQuotes(rid) : rid.toString();\n\tconst trimmed = stripOuterQuotes(raw).trim();\n\tconst idx = trimmed.indexOf(':');\n\tif (idx <= 0 || idx >= trimmed.length - 1) return trimmed;\n\n\tconst table = trimmed.slice(0, idx).trim();\n\tconst key = stripOuterQuotes(\n\t\tstripAngleBrackets(stripOuterQuotes(trimmed.slice(idx + 1).trim())),\n\t);\n\tif (!table || !key) return trimmed;\n\treturn `${table}:${key}`;\n};\n\nconst stripAngleBrackets = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSurrealAngles =\n\t\ttrimmed.startsWith('⟨') && trimmed.endsWith('⟩') && trimmed.length >= 2;\n\tconst isAsciiAngles =\n\t\ttrimmed.startsWith('<') && trimmed.endsWith('>') && trimmed.length >= 2;\n\treturn isSurrealAngles || isAsciiAngles\n\t\t? trimmed.slice(1, -1).trim()\n\t\t: trimmed;\n};\n\nexport const toRecordKeyString = (rid: RecordId | string): string => {\n\tconst normalized = toRecordIdString(rid);\n\tconst idx = normalized.indexOf(':');\n\tconst rawKey = idx > 0 ? normalized.slice(idx + 1) : normalized;\n\treturn stripOuterQuotes(rawKey.trim());\n};\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst looksLikeTableName = (value: string): boolean =>\n\t/^[A-Za-z_][A-Za-z0-9_-]*$/.test(value);\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tconst normalized = toRecordIdString(value);\n\tif (!isRecordIdString(normalized)) return undefined;\n\n\tconst idx = normalized.indexOf(':');\n\tconst table = stripOuterQuotes(normalized.slice(0, idx).trim());\n\tconst key = normalized.slice(idx + 1).trim();\n\tif (!table || !key || !looksLikeTableName(table)) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ??\n\t\t(unquoted === trimmed ? undefined : parseRecordIdString(trimmed));\n\tif (parsed) return parsed;\n\n\t// Keep original value shape if it isn't record-id-like\n\treturn value;\n};\n\nexport const normalizeRecordIdLikeFields = <T extends Record<string, unknown>>(\n\tdata: T,\n): T => {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(data)) {\n\t\tout[k] = normalizeRecordIdLikeValue(v);\n\t}\n\treturn out as T;\n};\n\nexport const toRecordId = (\n\ttableName: string,\n\tid: RecordId | string,\n): RecordId => {\n\tif (id instanceof RecordId) return id;\n\n\tconst normalized = toRecordIdString(id);\n\tconst prefixed = `${tableName}:`;\n\tconst key = normalized.startsWith(prefixed)\n\t\t? normalized.slice(prefixed.length)\n\t\t: normalized;\n\treturn new RecordId(tableName, key);\n};\n","import {\n\tand,\n\ttype ExprLike,\n\teq,\n\tFeatures,\n\ttype LiveMessage,\n\ttype LiveSubscription,\n\ttype RecordId,\n\ttype Surreal,\n\tTable,\n} from 'surrealdb';\nimport { toRecordId } from './id';\nimport type {\n\tFieldList,\n\tSurrealField,\n\tSurrealSubset,\n\tTableOptions,\n} from './types';\n\nconst normalizeFields = <T>(\n\traw: FieldList<T> | undefined,\n): ReadonlyArray<SurrealField<T>> => {\n\tif (!raw || raw === '*') return ['*' as SurrealField<T>];\n\treturn raw;\n};\n\nconst joinOrderBy = (\n\to: string | readonly string[] | undefined,\n): string | undefined => {\n\tif (!o) return undefined;\n\treturn typeof o === 'string' ? o : o.join(', ');\n};\n\ntype QueryResult<T> = T[] | null;\ntype RowResult<T> = T | T[] | null;\n\nconst firstRow = <T>(res: RowResult<T>): T | undefined => {\n\tif (!res) return undefined;\n\tif (Array.isArray(res)) return res[0];\n\treturn res;\n};\n\nexport function manageTable<T extends { id: string | RecordId }>(\n\tdb: Surreal,\n\tuseLoro: boolean,\n\t{ name, ...args }: TableOptions<T>,\n) {\n\tconst fields = normalizeFields<T>(args.fields);\n\tconst selectFields = fields.join(', ');\n\tconst table = new Table(name);\n\tconst aliveWhere = useLoro ? eq('sync_deleted', false) : undefined;\n\tconst baseWhere = aliveWhere\n\t\t? (args.where ? and(args.where, aliveWhere) : aliveWhere)\n\t\t: args.where;\n\tconst listAllSql = `SELECT ${selectFields} FROM type::table($table)${\n\t\tbaseWhere ? ' WHERE $where' : ''\n\t};`;\n\n\tconst getBaseWhere = (): ExprLike | undefined => baseWhere;\n\n\tconst listAll = async (): Promise<T[]> => {\n\t\tconst where = getBaseWhere();\n\t\tconst [res] = await db.query<[QueryResult<T>]>(listAllSql, {\n\t\t\ttable: name,\n\t\t\twhere,\n\t\t});\n\t\treturn res ?? [];\n\t};\n\n\tconst loadSubset = async (subset?: SurrealSubset): Promise<T[]> => {\n\t\tconst b = getBaseWhere();\n\t\tconst w = subset?.where;\n\t\tconst where = b && w ? and(b, w) : (b ?? w);\n\n\t\tconst whereSql = where ? ' WHERE $where' : '';\n\t\tconst order = joinOrderBy(subset?.orderBy);\n\t\tconst orderSql = order ? ` ORDER BY ${order}` : '';\n\t\tconst limitSql =\n\t\t\ttypeof subset?.limit === 'number' ? ' LIMIT $limit' : '';\n\t\tconst startSql =\n\t\t\ttypeof subset?.offset === 'number' ? ' START $offset' : '';\n\n\t\tconst sql = `SELECT ${selectFields} FROM type::table($table)${whereSql}${orderSql}${limitSql}${startSql};`;\n\n\t\tconst [res] = await db.query<[QueryResult<T>]>(sql, {\n\t\t\ttable: name,\n\t\t\twhere,\n\t\t\tlimit: subset?.limit,\n\t\t\toffset: subset?.offset,\n\t\t});\n\n\t\treturn res ?? [];\n\t};\n\n\tconst create = async (data: T | Partial<T>): Promise<T | undefined> => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tconst created = await db.create(table).content(data);\n\t\t\treturn firstRow(created as RowResult<T>);\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tconst inserted = await db.insert(table, payload);\n\t\treturn firstRow(inserted as RowResult<T>);\n\t};\n\n\tconst update = async (id: RecordId, data: T | Partial<T>) => {\n\t\tconst { id: _ignoredId, ...rest } = data as Record<string, unknown>;\n\t\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(rest);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...rest,\n\t\t\tsync_deleted: false,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst remove = async (id: RecordId) => {\n\t\tawait db.delete(id);\n\t};\n\n\tconst softDelete = async (id: RecordId) => {\n\t\tif (!useLoro) {\n\t\t\tawait db.delete(id);\n\t\t\treturn;\n\t\t}\n\t\tawait db.upsert(id).merge({\n\t\t\tsync_deleted: true,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst subscribe = (\n\t\tcb: (e: { type: 'insert' | 'update' | 'delete'; row: T }) => void,\n\t) => {\n\t\tlet killed = false;\n\t\tlet live: LiveSubscription | undefined;\n\n\t\tconst on = (msg: LiveMessage) => {\n\t\t\tconst { action, value } = msg as unknown as {\n\t\t\t\taction: 'CREATE' | 'UPDATE' | 'DELETE' | 'KILLED';\n\t\t\t\tvalue: T & { id: string | RecordId };\n\t\t\t};\n\n\t\t\tif (action === 'KILLED') return;\n\n\t\t\tif (action === 'CREATE') cb({ type: 'insert', row: value });\n\t\t\telse if (action === 'UPDATE') cb({ type: 'update', row: value });\n\t\t\telse if (action === 'DELETE')\n\t\t\t\tcb({ type: 'delete', row: { id: value.id } as T });\n\t\t};\n\n\t\tconst start = async () => {\n\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) return;\n\t\t\tlive = await db.live(table).where(args.where);\n\t\t\tlive.subscribe(on);\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tif (killed) return;\n\t\t\tkilled = true;\n\t\t\tif (live) void live.kill();\n\t\t};\n\t};\n\n\treturn {\n\t\tlistAll,\n\t\tloadSubset,\n\t\tcreate,\n\t\tupdate,\n\t\tremove,\n\t\tsoftDelete,\n\t\tsubscribe,\n\t};\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n\tCollectionConfig,\n\tDeleteMutationFn,\n\tDeleteMutationFnParams,\n\tInsertMutationFn,\n\tInsertMutationFnParams,\n\tOperationConfig,\n\tStandardSchema,\n\tTransaction,\n\tUpdateMutationFn,\n\tUpdateMutationFnParams,\n\tUtilsRecord,\n} from '@tanstack/db';\nimport { queryCollectionOptions } from '@tanstack/query-db-collection';\nimport { type Container, LoroDoc } from 'loro-crdt';\nimport { Features, RecordId } from 'surrealdb';\n\nimport {\n\tnormalizeRecordIdLikeFields,\n\ttoRecordId,\n\ttoRecordIdString,\n} from './id';\nimport { manageTable } from './table';\nimport type {\n\tSurrealCollectionConfig,\n\tSurrealSubset,\n\tSyncedTable,\n} from './types';\n\ntype Cleanup = () => void;\n\ntype MutationInput<T extends { id: string | RecordId }> = Omit<T, 'id'> & {\n\tid?: T['id'];\n};\n\ntype SurrealCollectionOptionsReturn<T extends { id: string | RecordId }> =\n\tCollectionConfig<\n\t\tT,\n\t\tstring,\n\t\tStandardSchemaV1<MutationInput<T>, T>,\n\t\tUtilsRecord\n\t> & {\n\t\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\t\tutils: UtilsRecord;\n\t};\n\nexport { toRecordKeyString } from './id';\nexport type { SurrealSubset } from './types';\n\ndeclare module '@tanstack/db' {\n\tinterface Collection<\n\t\tT extends object = Record<string, unknown>,\n\t\tTKey extends string | number = string | number,\n\t\tTUtils extends UtilsRecord = UtilsRecord,\n\t\tTSchema extends StandardSchemaV1 = StandardSchemaV1,\n\t\tTInsertInput extends object = T,\n\t> {\n\t\tdelete(\n\t\t\tkeys: Array<TKey | RecordId | string> | TKey | RecordId | string,\n\t\t\tconfig?: OperationConfig,\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Match TanstackDB\n\t\t): Transaction<any>;\n\t}\n}\n\ntype SyncReturn =\n\t| undefined\n\t| Cleanup\n\t| {\n\t\t\tcleanup?: Cleanup;\n\t\t\tunsubscribe?: Cleanup;\n\t\t\tdispose?: Cleanup;\n\t\t\tloadSubset?: unknown; // keep unknown; Only pass through\n\t };\n\nconst TEMP_ID_PREFIX = '__temp__';\nconst NOOP: Cleanup = () => {};\n\ntype QueryWriteUtils = {\n\twriteUpsert?: (data: unknown) => void;\n\twriteDelete?: (key: string) => void;\n};\n\nconst createTempRecordId = (tableName: string): RecordId => {\n\tconst suffix = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n\treturn new RecordId(tableName, `${TEMP_ID_PREFIX}${suffix}`);\n};\n\nconst isTempId = (id: string | RecordId, tableName: string): boolean => {\n\tif (id instanceof RecordId) {\n\t\tconst recordKey = (id as unknown as { id?: unknown }).id;\n\t\treturn (\n\t\t\ttypeof recordKey === 'string' &&\n\t\t\trecordKey.startsWith(TEMP_ID_PREFIX)\n\t\t);\n\t}\n\n\tconst raw = toRecordIdString(id);\n\tconst key = raw.startsWith(`${tableName}:`)\n\t\t? raw.slice(tableName.length + 1)\n\t\t: raw;\n\treturn key.startsWith(TEMP_ID_PREFIX);\n};\n\nfunction toCleanup(res: SyncReturn): Cleanup {\n\tif (!res) return NOOP;\n\tif (typeof res === 'function') return res;\n\n\tconst cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;\n\n\treturn typeof cleanup === 'function' ? cleanup : NOOP;\n}\n\nfunction hasLoadSubset(\n\tres: SyncReturn,\n): res is { loadSubset: unknown } & Record<string, unknown> {\n\treturn typeof res === 'object' && res !== null && 'loadSubset' in res;\n}\n\nconst getWriteUtils = (utils: unknown): QueryWriteUtils =>\n\ttypeof utils === 'object' && utils !== null\n\t\t? (utils as QueryWriteUtils)\n\t\t: {};\n\nconst omitUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).filter(([, value]) => value !== undefined),\n\t) as Partial<T>;\n\nfunction createInsertSchema<T extends { id: string | RecordId }>(\n\ttableName: string,\n): StandardSchemaV1<MutationInput<T>, T> {\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'tanstack-db-surrealdb',\n\t\t\tvalidate: (value: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\t!value ||\n\t\t\t\t\ttypeof value !== 'object' ||\n\t\t\t\t\tArray.isArray(value)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tissues: [{ message: 'Insert data must be an object.' }],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst data = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(value as Record<string, unknown>),\n\t\t\t\t}) as MutationInput<T>;\n\n\t\t\t\tif (!data.id)\n\t\t\t\t\tdata.id = createTempRecordId(tableName) as T['id'];\n\n\t\t\t\treturn { value: data as T };\n\t\t\t},\n\t\t\ttypes: undefined,\n\t\t},\n\t};\n}\n\nexport function surrealCollectionOptions<\n\tT extends SyncedTable<object>,\n\tS extends Record<string, Container> = { [k: string]: never },\n>({\n\tid,\n\tuseLoro = false,\n\tonError,\n\tdb,\n\tqueryClient,\n\tqueryKey,\n\tsyncMode = 'eager',\n\t...config\n}: SurrealCollectionConfig<T>): CollectionConfig<\n\tT,\n\tstring,\n\tStandardSchemaV1<MutationInput<T>, T>,\n\tUtilsRecord\n> & {\n\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\tutils: UtilsRecord;\n} {\n\tlet loro: { doc: LoroDoc<S>; key?: string } | undefined;\n\tif (useLoro) loro = { doc: new LoroDoc(), key: id };\n\n\tconst table = manageTable<T>(db, useLoro, config.table);\n\n\tconst keyOf = (rid: RecordId | string): string => toRecordIdString(rid);\n\n\tconst getKey = (row: { id: string | RecordId }) => keyOf(row.id);\n\tconst normalizeMutationId = (rid: RecordId | string): RecordId =>\n\t\ttoRecordId(config.table.name, rid);\n\tconst withNormalizedId = (row: T): T =>\n\t\t({ ...row, id: keyOf(row.id) }) as T;\n\n\tconst loroKey = loro?.key ?? id ?? 'surreal';\n\tconst loroMap = useLoro ? (loro?.doc?.getMap?.(loroKey) ?? null) : null;\n\tconst commitLoro = () => {\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst loroPut = (row: T, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.set(getKey(row), row as unknown);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst loroRemove = (idStr: string, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.delete(idStr);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst mergeLocalOverServer = (serverRows: T[]): T[] => {\n\t\tif (!useLoro || !loroMap) return serverRows;\n\n\t\tconst localJson = (loroMap.toJSON?.() ?? {}) as Record<string, T>;\n\n\t\tconst out: T[] = [];\n\t\tfor (const s of serverRows) {\n\t\t\tconst idStr = getKey(s);\n\t\t\tconst l = localJson[idStr];\n\n\t\t\tif (!l) {\n\t\t\t\tout.push(s);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((l.sync_deleted ?? false) === true) continue;\n\t\t\tout.push(l);\n\t\t}\n\n\t\treturn out;\n\t};\n\n\tconst base = queryCollectionOptions({\n\t\tschema: createInsertSchema<T>(config.table.name),\n\t\tgetKey,\n\n\t\tqueryKey,\n\t\tqueryClient,\n\n\t\tsyncMode,\n\n\t\tqueryFn: async ({ meta }) => {\n\t\t\ttry {\n\t\t\t\tconst subset =\n\t\t\t\t\tsyncMode === 'on-demand'\n\t\t\t\t\t\t? (meta.surrealSubset as SurrealSubset | undefined)\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst rows =\n\t\t\t\t\tsyncMode === 'eager'\n\t\t\t\t\t\t? await table.listAll()\n\t\t\t\t\t\t: await table.loadSubset(subset);\n\n\t\t\t\treturn mergeLocalOverServer(rows).map((row) =>\n\t\t\t\t\twithNormalizedId(row),\n\t\t\t\t);\n\t\t\t} catch (e) {\n\t\t\t\tonError?.(e);\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonInsert: (async (p: InsertMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'insert') continue;\n\n\t\t\t\tconst baseRow = { ...m.modified } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({\n\t\t\t\t\t\t\t...baseRow,\n\t\t\t\t\t\t\tupdated_at: now,\n\t\t\t\t\t\t\tsync_deleted: false,\n\t\t\t\t\t\t} as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\t\t\t\tif (isTempId(normalizedRow.id, config.table.name)) {\n\t\t\t\t\tconst tempKey = keyOf(normalizedRow.id);\n\t\t\t\t\tconst { id: _id, ...payload } = normalizedRow as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\tconst persisted = await table.create(payload as Partial<T>);\n\t\t\t\t\tconst resolvedRow = persisted?.id\n\t\t\t\t\t\t? withNormalizedId({\n\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\tid: persisted.id,\n\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t: normalizedRow;\n\n\t\t\t\t\tif (useLoro && persisted?.id) {\n\t\t\t\t\t\tloroRemove(tempKey, false);\n\t\t\t\t\t\tloroPut(resolvedRow, false);\n\t\t\t\t\t}\n\t\t\t\t\tresultRows.push(resolvedRow);\n\t\t\t\t} else {\n\t\t\t\t\tconst persisted = await table.create(normalizedRow);\n\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\tpersisted\n\t\t\t\t\t\t\t? withNormalizedId({\n\t\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t\t: normalizedRow,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn resultRows as unknown as StandardSchema<T>;\n\t\t}) as InsertMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonUpdate: (async (p: UpdateMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = omitUndefined(\n\t\t\t\t\tnormalizeRecordIdLikeFields({\n\t\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t\t}) as Record<string, unknown>,\n\t\t\t\t) as Partial<T>;\n\t\t\t\tconst baseRow = {\n\t\t\t\t\t...normalizedModified,\n\t\t\t\t\tid: keyOf(idKey),\n\t\t\t\t} as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), normalizedRow);\n\t\t\t\twriteUtils.writeUpsert?.(normalizedRow);\n\n\t\t\t\tresultRows.push(normalizedRow);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\tvoid resultRows;\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as UpdateMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonDelete: (async (p: DeleteMutationFnParams<T>) => {\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'delete') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst key = keyOf(idKey);\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroRemove(key, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.softDelete(normalizeMutationId(idKey));\n\t\t\t\twriteUtils.writeDelete?.(key);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as DeleteMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\t} as never) as SurrealCollectionOptionsReturn<T>;\n\n\t// LIVE updates -> invalidate all subsets under base queryKey\n\tconst baseSync = base.sync?.sync;\n\n\tconst sync = baseSync\n\t\t? {\n\t\t\t\tsync: (ctx: Parameters<NonNullable<typeof baseSync>>[0]) => {\n\t\t\t\t\t// IMPORTANT: call baseSync exactly once\n\t\t\t\t\tconst baseRes = baseSync(ctx) as SyncReturn;\n\t\t\t\t\tconst baseCleanup = toCleanup(baseRes);\n\n\t\t\t\t\t// If live queries aren't supported, return the base result untouched\n\t\t\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) {\n\t\t\t\t\t\treturn baseRes as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst offLive = table.subscribe((evt) => {\n\t\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\t\tif (evt.type === 'delete') {\n\t\t\t\t\t\t\t\tloroRemove(getKey(evt.row));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloroPut(evt.row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid queryClient\n\t\t\t\t\t\t\t.invalidateQueries({ queryKey, exact: false })\n\t\t\t\t\t\t\t.catch((e) => onError?.(e));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Preserve base return shape, just wrap cleanup\n\t\t\t\t\tif (hasLoadSubset(baseRes)) {\n\t\t\t\t\t\t// on-demand mode relies on this being present\n\t\t\t\t\t\tconst resObj = baseRes as Record<string, unknown>;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...resObj,\n\t\t\t\t\t\t\tcleanup: () => {\n\t\t\t\t\t\t\t\toffLive();\n\t\t\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\t// eager mode usually returns a cleanup function\n\t\t\t\t\treturn (() => {\n\t\t\t\t\t\toffLive();\n\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t}) as unknown as ReturnType<NonNullable<typeof baseSync>>;\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\t...base,\n\t\tsync: sync ?? base.sync,\n\t} as SurrealCollectionOptionsReturn<T>;\n}\n"]}
1
+ {"version":3,"sources":["../src/id.ts","../src/table.ts","../src/index.ts"],"names":["RecordId","Features"],"mappings":"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","file":"index.mjs","sourcesContent":["import { RecordId } from 'surrealdb';\n\nexport const stripOuterQuotes = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSingleQuoted =\n\t\ttrimmed.startsWith(\"'\") && trimmed.endsWith(\"'\") && trimmed.length >= 2;\n\tconst isDoubleQuoted =\n\t\ttrimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2;\n\tconst isBacktickQuoted =\n\t\ttrimmed.startsWith('`') && trimmed.endsWith('`') && trimmed.length >= 2;\n\treturn isSingleQuoted || isDoubleQuoted || isBacktickQuoted\n\t\t? trimmed.slice(1, -1)\n\t\t: trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string => {\n\tconst raw =\n\t\ttypeof rid === 'string' ? stripOuterQuotes(rid) : rid.toString();\n\tconst trimmed = stripOuterQuotes(raw).trim();\n\tconst idx = trimmed.indexOf(':');\n\tif (idx <= 0 || idx >= trimmed.length - 1) return trimmed;\n\n\tconst table = trimmed.slice(0, idx).trim();\n\tconst key = stripOuterQuotes(\n\t\tstripAngleBrackets(stripOuterQuotes(trimmed.slice(idx + 1).trim())),\n\t);\n\tif (!table || !key) return trimmed;\n\treturn `${table}:${key}`;\n};\n\nconst stripAngleBrackets = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSurrealAngles =\n\t\ttrimmed.startsWith('⟨') && trimmed.endsWith('⟩') && trimmed.length >= 2;\n\tconst isAsciiAngles =\n\t\ttrimmed.startsWith('<') && trimmed.endsWith('>') && trimmed.length >= 2;\n\treturn isSurrealAngles || isAsciiAngles\n\t\t? trimmed.slice(1, -1).trim()\n\t\t: trimmed;\n};\n\nexport const toRecordKeyString = (rid: RecordId | string): string => {\n\tconst normalized = toRecordIdString(rid);\n\tconst idx = normalized.indexOf(':');\n\tconst rawKey = idx > 0 ? normalized.slice(idx + 1) : normalized;\n\treturn stripOuterQuotes(rawKey.trim());\n};\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst looksLikeTableName = (value: string): boolean =>\n\t/^[A-Za-z_][A-Za-z0-9_-]*$/.test(value);\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tconst normalized = toRecordIdString(value);\n\tif (!isRecordIdString(normalized)) return undefined;\n\n\tconst idx = normalized.indexOf(':');\n\tconst table = stripOuterQuotes(normalized.slice(0, idx).trim());\n\tconst key = normalized.slice(idx + 1).trim();\n\tif (!table || !key || !looksLikeTableName(table)) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ??\n\t\t(unquoted === trimmed ? undefined : parseRecordIdString(trimmed));\n\tif (parsed) return parsed;\n\n\t// Keep original value shape if it isn't record-id-like\n\treturn value;\n};\n\nexport const normalizeRecordIdLikeFields = <T extends Record<string, unknown>>(\n\tdata: T,\n): T => {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(data)) {\n\t\tout[k] = normalizeRecordIdLikeValue(v);\n\t}\n\treturn out as T;\n};\n\nexport const toRecordId = (\n\ttableName: string,\n\tid: RecordId | string,\n): RecordId => {\n\tif (id instanceof RecordId) return id;\n\n\tconst normalized = toRecordIdString(id);\n\tconst prefixed = `${tableName}:`;\n\tconst key = normalized.startsWith(prefixed)\n\t\t? normalized.slice(prefixed.length)\n\t\t: normalized;\n\treturn new RecordId(tableName, key);\n};\n","import { parseOrderByExpression, parseWhereExpression } from '@tanstack/db';\nimport {\n\tFeatures,\n\ttype LiveMessage,\n\ttype LiveSubscription,\n\ttype RecordId,\n\ttype Surreal,\n\tTable,\n} from 'surrealdb';\nimport { toRecordId } from './id';\nimport type { SurrealSubset, TableOptions } from './types';\n\ntype QueryResult<T> = T[] | null;\ntype RowResult<T> = T | T[] | null;\ntype FieldPath = Array<string | number>;\ntype SqlFragment = { sql: string };\n\nconst IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nconst firstRow = <T>(res: RowResult<T>): T | undefined => {\n\tif (!res) return undefined;\n\tif (Array.isArray(res)) return res[0];\n\treturn res;\n};\n\nconst toFieldPath = (value: unknown): FieldPath => {\n\tif (!Array.isArray(value)) {\n\t\tthrow new Error('Expected a field path array in where expression.');\n\t}\n\treturn value as FieldPath;\n};\n\nconst quoteIdentifier = (segment: string): string => {\n\tif (IDENTIFIER_RE.test(segment)) return segment;\n\treturn `\\`${segment.replaceAll('`', '\\\\`')}\\``;\n};\n\nconst formatFieldPath = (path: FieldPath): string => {\n\tlet out = '';\n\tfor (const segment of path) {\n\t\tif (typeof segment === 'number') {\n\t\t\tout += `[${segment}]`;\n\t\t\tcontinue;\n\t\t}\n\t\tconst next = quoteIdentifier(segment);\n\t\tout = out ? `${out}.${next}` : next;\n\t}\n\treturn out;\n};\n\nconst isReferencePathCandidate = (value: unknown): value is FieldPath =>\n\tArray.isArray(value) &&\n\tvalue.length > 0 &&\n\ttypeof value[0] === 'string' &&\n\tvalue.every(\n\t\t(segment) => typeof segment === 'string' || typeof segment === 'number',\n\t);\n\nconst mapRelationPath = (path: FieldPath, relation?: boolean): FieldPath => {\n\tif (!relation) return path;\n\tif (path[0] === 'from') return ['in', ...path.slice(1)];\n\tif (path[0] === 'to') return ['out', ...path.slice(1)];\n\treturn path;\n};\n\nconst toSqlFragment = (value: unknown): SqlFragment => {\n\tif (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t'sql' in value &&\n\t\ttypeof (value as { sql: unknown }).sql === 'string'\n\t) {\n\t\treturn value as SqlFragment;\n\t}\n\tthrow new Error('Unsupported where expression node.');\n};\n\nconst joinLogical = (op: 'AND' | 'OR', args: Array<unknown>): SqlFragment => {\n\tconst parts = args.map(toSqlFragment).map((frag) => frag.sql);\n\tif (parts.length === 0) {\n\t\treturn { sql: op === 'AND' ? 'true' : 'false' };\n\t}\n\tif (parts.length === 1) return { sql: parts[0] };\n\treturn {\n\t\tsql: parts.map((part) => `(${part})`).join(` ${op} `),\n\t};\n};\n\nconst buildSubsetQuery = (\n\ttable: TableOptions,\n\tuseLoro: boolean,\n\tsubset?: SurrealSubset,\n): { sql: string; params: Record<string, unknown> } => {\n\tlet paramIdx = 0;\n\tconst params: Record<string, unknown> = { table: table.name };\n\tconst nextParam = (value: unknown): string => {\n\t\tconst key = `p${paramIdx++}`;\n\t\tparams[key] = value;\n\t\treturn `$${key}`;\n\t};\n\tconst comparison = (\n\t\tfieldPath: unknown,\n\t\top: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'LIKE',\n\t\tvalue: unknown,\n\t): SqlFragment => {\n\t\tconst field = formatFieldPath(\n\t\t\tmapRelationPath(toFieldPath(fieldPath), table.relation),\n\t\t);\n\t\tif (isReferencePathCandidate(value)) {\n\t\t\t// WHERE subset filters should use concrete values, not ref-to-ref comparisons.\n\t\t\tthrow new Error(\n\t\t\t\t'Field-to-field comparisons are not supported in loadSubset where translation.',\n\t\t\t);\n\t\t}\n\t\treturn { sql: `${field} ${op} ${nextParam(value)}` };\n\t};\n\tconst whereSqlFrom = (\n\t\texpr: NonNullable<SurrealSubset['where']>,\n\t): string => {\n\t\tconst fragment = parseWhereExpression<SqlFragment>(expr, {\n\t\t\thandlers: {\n\t\t\t\tand: (...args) => joinLogical('AND', args),\n\t\t\t\tor: (...args) => joinLogical('OR', args),\n\t\t\t\tnot: (arg) => ({ sql: `NOT (${toSqlFragment(arg).sql})` }),\n\t\t\t\teq: (field, value) => comparison(field, '=', value),\n\t\t\t\tgt: (field, value) => comparison(field, '>', value),\n\t\t\t\tgte: (field, value) => comparison(field, '>=', value),\n\t\t\t\tlt: (field, value) => comparison(field, '<', value),\n\t\t\t\tlte: (field, value) => comparison(field, '<=', value),\n\t\t\t\tlike: (field, value) => comparison(field, 'LIKE', value),\n\t\t\t\tilike: (field, value) => {\n\t\t\t\t\tconst f = formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t);\n\t\t\t\t\tconst p = nextParam(value);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: `string::lower(${f}) LIKE string::lower(${p})`,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tin: (field, value) => {\n\t\t\t\t\tconst f = formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t);\n\t\t\t\t\tif (Array.isArray(value) && value.length === 0) {\n\t\t\t\t\t\treturn { sql: 'false' };\n\t\t\t\t\t}\n\t\t\t\t\treturn { sql: `${f} IN ${nextParam(value)}` };\n\t\t\t\t},\n\t\t\t\tisNull: (field) => ({\n\t\t\t\t\tsql: `${formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t)} IS NULL`,\n\t\t\t\t}),\n\t\t\t\tisUndefined: (field) => ({\n\t\t\t\t\tsql: `${formatFieldPath(\n\t\t\t\t\t\tmapRelationPath(toFieldPath(field), table.relation),\n\t\t\t\t\t)} IS NONE`,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tonUnknownOperator: (op) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unsupported where operator '${op}' for SurrealQL translation.`,\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\n\t\tif (!fragment) return '';\n\t\treturn fragment.sql;\n\t};\n\n\tconst whereParts: string[] = [];\n\tif (subset?.where) {\n\t\tconst parsed = whereSqlFrom(subset.where);\n\t\tif (parsed) whereParts.push(parsed);\n\t}\n\tif (subset?.cursor?.whereFrom) {\n\t\tconst cursorWhere = whereSqlFrom(subset.cursor.whereFrom);\n\t\tif (cursorWhere) whereParts.push(cursorWhere);\n\t}\n\tif (useLoro) whereParts.push('sync_deleted = false');\n\n\tconst whereSql = whereParts.length\n\t\t? ` WHERE ${whereParts.map((part) => `(${part})`).join(' AND ')}`\n\t\t: '';\n\n\tconst order = parseOrderByExpression(subset?.orderBy);\n\tconst orderSql = order.length\n\t\t? ` ORDER BY ${order\n\t\t\t\t.map(\n\t\t\t\t\t(clause) =>\n\t\t\t\t\t\t`${formatFieldPath(\n\t\t\t\t\t\t\tmapRelationPath(clause.field, table.relation),\n\t\t\t\t\t\t)} ${clause.direction.toUpperCase()}`,\n\t\t\t\t)\n\t\t\t\t.join(', ')}`\n\t\t: '';\n\tconst limitSql =\n\t\ttypeof subset?.limit === 'number'\n\t\t\t? ` LIMIT ${nextParam(subset.limit)}`\n\t\t\t: '';\n\tconst offsetSql =\n\t\ttypeof subset?.offset === 'number'\n\t\t\t? ` START ${nextParam(subset.offset)}`\n\t\t\t: '';\n\n\treturn {\n\t\tsql: `SELECT * FROM type::table($table)${whereSql}${orderSql}${limitSql}${offsetSql};`,\n\t\tparams,\n\t};\n};\n\nexport function manageTable<T extends { id: string | RecordId }>(\n\tdb: Surreal,\n\tuseLoro: boolean,\n\tconfig: TableOptions,\n) {\n\tconst { name } = config;\n\tconst table = new Table(name);\n\n\tconst listAll = async (): Promise<T[]> => {\n\t\treturn loadSubset();\n\t};\n\n\tconst loadSubset = async (subset?: SurrealSubset): Promise<T[]> => {\n\t\tconst { sql, params } = buildSubsetQuery(config, useLoro, subset);\n\t\tconst [res] = await db.query<[QueryResult<T>]>(sql, params);\n\n\t\treturn res ?? [];\n\t};\n\n\tconst create = async (data: T | Partial<T>): Promise<T | undefined> => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tconst created = await db.create(table).content(data);\n\t\t\treturn firstRow(created as RowResult<T>);\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tconst inserted = await db.insert(table, payload);\n\t\treturn firstRow(inserted as RowResult<T>);\n\t};\n\n\tconst update = async (id: RecordId, data: T | Partial<T>) => {\n\t\tconst { id: _ignoredId, ...rest } = data as Record<string, unknown>;\n\t\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(rest);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...rest,\n\t\t\tsync_deleted: false,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst remove = async (id: RecordId) => {\n\t\tawait db.delete(id);\n\t};\n\n\tconst softDelete = async (id: RecordId) => {\n\t\tif (!useLoro) {\n\t\t\tawait db.delete(id);\n\t\t\treturn;\n\t\t}\n\t\tawait db.upsert(id).merge({\n\t\t\tsync_deleted: true,\n\t\t\tupdated_at: Date.now(),\n\t\t});\n\t};\n\n\tconst subscribe = (\n\t\tcb: (e: { type: 'insert' | 'update' | 'delete'; row: T }) => void,\n\t) => {\n\t\tlet killed = false;\n\t\tlet live: LiveSubscription | undefined;\n\n\t\tconst on = (msg: LiveMessage) => {\n\t\t\tconst { action, value } = msg as unknown as {\n\t\t\t\taction: 'CREATE' | 'UPDATE' | 'DELETE' | 'KILLED';\n\t\t\t\tvalue: T & { id: string | RecordId };\n\t\t\t};\n\n\t\t\tif (action === 'KILLED') return;\n\n\t\t\tif (action === 'CREATE') cb({ type: 'insert', row: value });\n\t\t\telse if (action === 'UPDATE') cb({ type: 'update', row: value });\n\t\t\telse if (action === 'DELETE')\n\t\t\t\tcb({ type: 'delete', row: { id: value.id } as T });\n\t\t};\n\n\t\tconst start = async () => {\n\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) return;\n\t\t\tlive = await db.live(table);\n\t\t\tlive.subscribe(on);\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tif (killed) return;\n\t\t\tkilled = true;\n\t\t\tif (live) void live.kill();\n\t\t};\n\t};\n\n\treturn {\n\t\tlistAll,\n\t\tloadSubset,\n\t\tcreate,\n\t\tupdate,\n\t\tremove,\n\t\tsoftDelete,\n\t\tsubscribe,\n\t};\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n\tCollectionConfig,\n\tDeleteMutationFn,\n\tDeleteMutationFnParams,\n\tInsertMutationFn,\n\tInsertMutationFnParams,\n\tOperationConfig,\n\tStandardSchema,\n\tTransaction,\n\tUpdateMutationFn,\n\tUpdateMutationFnParams,\n\tUtilsRecord,\n} from '@tanstack/db';\nimport { queryCollectionOptions } from '@tanstack/query-db-collection';\nimport { type Container, LoroDoc } from 'loro-crdt';\nimport { Features, RecordId } from 'surrealdb';\n\nimport {\n\tnormalizeRecordIdLikeFields,\n\ttoRecordId,\n\ttoRecordIdString,\n} from './id';\nimport { manageTable } from './table';\nimport type { SurrealCollectionConfig, SyncedTable } from './types';\n\ntype Cleanup = () => void;\n\ntype MutationInput<T extends { id: string | RecordId }> = Omit<T, 'id'> & {\n\tid?: T['id'];\n};\n\ntype SurrealCollectionOptionsReturn<T extends { id: string | RecordId }> =\n\tCollectionConfig<\n\t\tT,\n\t\tstring,\n\t\tStandardSchemaV1<MutationInput<T>, T>,\n\t\tUtilsRecord\n\t> & {\n\t\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\t\tutils: UtilsRecord;\n\t};\n\nexport { toRecordKeyString } from './id';\n\ndeclare module '@tanstack/db' {\n\tinterface Collection<\n\t\tT extends object = Record<string, unknown>,\n\t\tTKey extends string | number = string | number,\n\t\tTUtils extends UtilsRecord = UtilsRecord,\n\t\tTSchema extends StandardSchemaV1 = StandardSchemaV1,\n\t\tTInsertInput extends object = T,\n\t> {\n\t\tdelete(\n\t\t\tkeys: Array<TKey | RecordId | string> | TKey | RecordId | string,\n\t\t\tconfig?: OperationConfig,\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Match TanstackDB\n\t\t): Transaction<any>;\n\t}\n}\n\ntype SyncReturn =\n\t| undefined\n\t| Cleanup\n\t| {\n\t\t\tcleanup?: Cleanup;\n\t\t\tunsubscribe?: Cleanup;\n\t\t\tdispose?: Cleanup;\n\t\t\tloadSubset?: unknown; // keep unknown; Only pass through\n\t };\n\nconst TEMP_ID_PREFIX = '__temp__';\nconst NOOP: Cleanup = () => {};\n\ntype QueryWriteUtils = {\n\twriteUpsert?: (data: unknown) => void;\n\twriteDelete?: (key: string) => void;\n};\n\nconst createTempRecordId = (tableName: string): RecordId => {\n\tconst suffix = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n\treturn new RecordId(tableName, `${TEMP_ID_PREFIX}${suffix}`);\n};\n\nconst isTempId = (id: string | RecordId, tableName: string): boolean => {\n\tif (id instanceof RecordId) {\n\t\tconst recordKey = (id as unknown as { id?: unknown }).id;\n\t\treturn (\n\t\t\ttypeof recordKey === 'string' &&\n\t\t\trecordKey.startsWith(TEMP_ID_PREFIX)\n\t\t);\n\t}\n\n\tconst raw = toRecordIdString(id);\n\tconst key = raw.startsWith(`${tableName}:`)\n\t\t? raw.slice(tableName.length + 1)\n\t\t: raw;\n\treturn key.startsWith(TEMP_ID_PREFIX);\n};\n\nfunction toCleanup(res: SyncReturn): Cleanup {\n\tif (!res) return NOOP;\n\tif (typeof res === 'function') return res;\n\n\tconst cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;\n\n\treturn typeof cleanup === 'function' ? cleanup : NOOP;\n}\n\nfunction hasLoadSubset(\n\tres: SyncReturn,\n): res is { loadSubset: unknown } & Record<string, unknown> {\n\treturn typeof res === 'object' && res !== null && 'loadSubset' in res;\n}\n\nconst getWriteUtils = (utils: unknown): QueryWriteUtils =>\n\ttypeof utils === 'object' && utils !== null\n\t\t? (utils as QueryWriteUtils)\n\t\t: {};\n\nconst omitUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).filter(([, value]) => value !== undefined),\n\t) as Partial<T>;\n\nfunction createInsertSchema<T extends { id: string | RecordId }>(\n\ttableName: string,\n): StandardSchemaV1<MutationInput<T>, T> {\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'tanstack-db-surrealdb',\n\t\t\tvalidate: (value: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\t!value ||\n\t\t\t\t\ttypeof value !== 'object' ||\n\t\t\t\t\tArray.isArray(value)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tissues: [{ message: 'Insert data must be an object.' }],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst data = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(value as Record<string, unknown>),\n\t\t\t\t}) as MutationInput<T>;\n\n\t\t\t\tif (!data.id)\n\t\t\t\t\tdata.id = createTempRecordId(tableName) as T['id'];\n\n\t\t\t\treturn { value: data as T };\n\t\t\t},\n\t\t\ttypes: undefined,\n\t\t},\n\t};\n}\n\nexport function surrealCollectionOptions<\n\tT extends SyncedTable<object>,\n\tS extends Record<string, Container> = { [k: string]: never },\n>({\n\tid,\n\tuseLoro = false,\n\tonError,\n\tdb,\n\tqueryClient,\n\tqueryKey,\n\tsyncMode = 'eager',\n\t...config\n}: SurrealCollectionConfig): CollectionConfig<\n\tT,\n\tstring,\n\tStandardSchemaV1<MutationInput<T>, T>,\n\tUtilsRecord\n> & {\n\tschema: StandardSchemaV1<MutationInput<T>, T>;\n\tutils: UtilsRecord;\n} {\n\tlet loro: { doc: LoroDoc<S>; key?: string } | undefined;\n\tif (useLoro) loro = { doc: new LoroDoc(), key: id };\n\n\tconst table = manageTable<T>(db, useLoro, config.table);\n\n\tconst keyOf = (rid: RecordId | string): string => toRecordIdString(rid);\n\n\tconst getKey = (row: { id: string | RecordId }) => keyOf(row.id);\n\tconst normalizeMutationId = (rid: RecordId | string): RecordId =>\n\t\ttoRecordId(config.table.name, rid);\n\tconst withRecordId = (row: T): T =>\n\t\t({ ...row, id: normalizeMutationId(row.id) }) as T;\n\tconst toLoroStoredRow = (row: T): T => ({ ...row, id: keyOf(row.id) }) as T;\n\n\tconst loroKey = loro?.key ?? id ?? 'surreal';\n\tconst loroMap = useLoro ? (loro?.doc?.getMap?.(loroKey) ?? null) : null;\n\tconst commitLoro = () => {\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst loroPut = (row: T, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.set(getKey(row), toLoroStoredRow(row) as unknown);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst loroRemove = (idStr: string, commit = true) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.delete(idStr);\n\t\tif (commit) commitLoro();\n\t};\n\n\tconst mergeLocalOverServer = (serverRows: T[]): T[] => {\n\t\tif (!useLoro || !loroMap) return serverRows;\n\n\t\tconst localJson = (loroMap.toJSON?.() ?? {}) as Record<string, T>;\n\n\t\tconst out: T[] = [];\n\t\tfor (const s of serverRows) {\n\t\t\tconst idStr = getKey(s);\n\t\t\tconst l = localJson[idStr];\n\n\t\t\tif (!l) {\n\t\t\t\tout.push(s);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((l.sync_deleted ?? false) === true) continue;\n\t\t\tout.push(withRecordId(l));\n\t\t}\n\n\t\treturn out;\n\t};\n\n\tconst base = queryCollectionOptions({\n\t\tschema: createInsertSchema<T>(config.table.name),\n\t\tgetKey,\n\n\t\tqueryKey,\n\t\tqueryClient,\n\n\t\tsyncMode,\n\n\t\tqueryFn: async ({ meta }) => {\n\t\t\ttry {\n\t\t\t\tconst subset =\n\t\t\t\t\tsyncMode === 'on-demand'\n\t\t\t\t\t\t? meta?.loadSubsetOptions\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst rows =\n\t\t\t\t\tsyncMode === 'eager'\n\t\t\t\t\t\t? await table.listAll()\n\t\t\t\t\t\t: await table.loadSubset(subset);\n\n\t\t\t\treturn mergeLocalOverServer(rows).map((row) =>\n\t\t\t\t\twithRecordId(row),\n\t\t\t\t);\n\t\t\t} catch (e) {\n\t\t\t\tonError?.(e);\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonInsert: (async (p: InsertMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'insert') continue;\n\n\t\t\t\tconst baseRow = { ...m.modified } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({\n\t\t\t\t\t\t\t...baseRow,\n\t\t\t\t\t\t\tupdated_at: now,\n\t\t\t\t\t\t\tsync_deleted: false,\n\t\t\t\t\t\t} as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withRecordId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\t\t\t\tif (isTempId(normalizedRow.id, config.table.name)) {\n\t\t\t\t\tconst tempKey = keyOf(normalizedRow.id);\n\t\t\t\t\tconst { id: _id, ...payload } = normalizedRow as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\tconst persisted = await table.create(payload as Partial<T>);\n\t\t\t\t\tconst resolvedRow = persisted?.id\n\t\t\t\t\t\t? withRecordId({\n\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\tid: persisted.id,\n\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t: normalizedRow;\n\n\t\t\t\t\tif (useLoro && persisted?.id) {\n\t\t\t\t\t\tloroRemove(tempKey, false);\n\t\t\t\t\t\tloroPut(resolvedRow, false);\n\t\t\t\t\t}\n\t\t\t\t\tresultRows.push(resolvedRow);\n\t\t\t\t} else {\n\t\t\t\t\tconst persisted = await table.create(normalizedRow);\n\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\tpersisted\n\t\t\t\t\t\t\t? withRecordId({\n\t\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t\t: normalizedRow,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn resultRows as unknown as StandardSchema<T>;\n\t\t}) as InsertMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonUpdate: (async (p: UpdateMutationFnParams<T>) => {\n\t\t\tconst now = new Date();\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = omitUndefined(\n\t\t\t\t\tnormalizeRecordIdLikeFields({\n\t\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t\t}) as Record<string, unknown>,\n\t\t\t\t) as Partial<T>;\n\t\t\t\tconst baseRow = {\n\t\t\t\t\t...normalizedModified,\n\t\t\t\t\tid: normalizeMutationId(idKey),\n\t\t\t\t} as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t: baseRow;\n\t\t\t\tconst normalizedRow = withRecordId(row);\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), normalizedRow);\n\t\t\t\twriteUtils.writeUpsert?.(normalizedRow);\n\n\t\t\t\tresultRows.push(normalizedRow);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\tvoid resultRows;\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as UpdateMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonDelete: (async (p: DeleteMutationFnParams<T>) => {\n\t\t\tconst writeUtils = getWriteUtils(p.collection.utils);\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'delete') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst key = keyOf(idKey);\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroRemove(key, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.softDelete(normalizeMutationId(idKey));\n\t\t\t\twriteUtils.writeDelete?.(key);\n\t\t\t}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn { refetch: false } as unknown as StandardSchema<T>;\n\t\t}) as DeleteMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\t} as never) as SurrealCollectionOptionsReturn<T>;\n\n\t// LIVE updates -> invalidate all subsets under base queryKey\n\tconst baseSync = base.sync?.sync;\n\n\tconst sync = baseSync\n\t\t? {\n\t\t\t\tsync: (ctx: Parameters<NonNullable<typeof baseSync>>[0]) => {\n\t\t\t\t\t// IMPORTANT: call baseSync exactly once\n\t\t\t\t\tconst baseRes = baseSync(ctx) as SyncReturn;\n\t\t\t\t\tconst baseCleanup = toCleanup(baseRes);\n\n\t\t\t\t\t// If live queries aren't supported, return the base result untouched\n\t\t\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) {\n\t\t\t\t\t\treturn baseRes as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst offLive = table.subscribe((evt) => {\n\t\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\t\tif (evt.type === 'delete') {\n\t\t\t\t\t\t\t\tloroRemove(getKey(evt.row));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloroPut(evt.row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid queryClient\n\t\t\t\t\t\t\t.invalidateQueries({ queryKey, exact: false })\n\t\t\t\t\t\t\t.catch((e) => onError?.(e));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Preserve base return shape, just wrap cleanup\n\t\t\t\t\tif (hasLoadSubset(baseRes)) {\n\t\t\t\t\t\t// on-demand mode relies on this being present\n\t\t\t\t\t\tconst resObj = baseRes as Record<string, unknown>;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...resObj,\n\t\t\t\t\t\t\tcleanup: () => {\n\t\t\t\t\t\t\t\toffLive();\n\t\t\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\t// eager mode usually returns a cleanup function\n\t\t\t\t\treturn (() => {\n\t\t\t\t\t\toffLive();\n\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t}) as unknown as ReturnType<NonNullable<typeof baseSync>>;\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\t...base,\n\t\tsync: sync ?? base.sync,\n\t} as SurrealCollectionOptionsReturn<T>;\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@foretag/tanstack-db-surrealdb",
3
3
  "description": "Add Offline / Local First Caching & Syncing to your SurrealDB app with TanstackDB and Loro (CRDTs)",
4
- "version": "0.4.14",
4
+ "version": "0.5.0",
5
5
  "files": [
6
6
  "dist"
7
7
  ],