@foretag/tanstack-db-surrealdb 0.4.6 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -18,7 +18,9 @@ var toRecordIdString = (rid) => {
18
18
  const idx = trimmed.indexOf(":");
19
19
  if (idx <= 0 || idx >= trimmed.length - 1) return trimmed;
20
20
  const table = trimmed.slice(0, idx).trim();
21
- const key = stripOuterQuotes(trimmed.slice(idx + 1).trim());
21
+ const key = stripOuterQuotes(
22
+ stripAngleBrackets(stripOuterQuotes(trimmed.slice(idx + 1).trim()))
23
+ );
22
24
  if (!table || !key) return trimmed;
23
25
  return `${table}:${key}`;
24
26
  };
@@ -32,19 +34,20 @@ var toRecordKeyString = (rid) => {
32
34
  const normalized = toRecordIdString(rid);
33
35
  const idx = normalized.indexOf(":");
34
36
  const rawKey = idx > 0 ? normalized.slice(idx + 1) : normalized;
35
- return stripOuterQuotes(stripAngleBrackets(stripOuterQuotes(rawKey.trim())));
37
+ return stripOuterQuotes(rawKey.trim());
36
38
  };
37
39
  var isRecordIdString = (value) => {
38
40
  const idx = value.indexOf(":");
39
41
  return idx > 0 && idx < value.length - 1;
40
42
  };
43
+ var looksLikeTableName = (value) => /^[A-Za-z_][A-Za-z0-9_-]*$/.test(value);
41
44
  var parseRecordIdString = (value) => {
42
45
  const normalized = toRecordIdString(value);
43
46
  if (!isRecordIdString(normalized)) return void 0;
44
47
  const idx = normalized.indexOf(":");
45
- const table = normalized.slice(0, idx).trim();
48
+ const table = stripOuterQuotes(normalized.slice(0, idx).trim());
46
49
  const key = normalized.slice(idx + 1).trim();
47
- if (!table || !key) return void 0;
50
+ if (!table || !key || !looksLikeTableName(table)) return void 0;
48
51
  return new surrealdb.RecordId(table, key);
49
52
  };
50
53
  var normalizeRecordIdLikeValue = (value) => {
@@ -213,6 +216,9 @@ function hasLoadSubset(res) {
213
216
  return typeof res === "object" && res !== null && "loadSubset" in res;
214
217
  }
215
218
  var getWriteUtils = (utils) => typeof utils === "object" && utils !== null ? utils : {};
219
+ var omitUndefined = (obj) => Object.fromEntries(
220
+ Object.entries(obj).filter(([, value]) => value !== void 0)
221
+ );
216
222
  function createInsertSchema(tableName) {
217
223
  return {
218
224
  "~standard": {
@@ -248,9 +254,10 @@ function surrealCollectionOptions({
248
254
  let loro;
249
255
  if (useLoro) loro = { doc: new loroCrdt.LoroDoc(), key: id };
250
256
  const table = manageTable(db, useLoro, config.table);
251
- const keyOf = (rid) => toRecordKeyString(rid);
257
+ const keyOf = (rid) => toRecordIdString(rid);
252
258
  const getKey = (row) => keyOf(row.id);
253
259
  const normalizeMutationId = (rid) => toRecordId(config.table.name, rid);
260
+ const withNormalizedId = (row) => ({ ...row, id: keyOf(row.id) });
254
261
  const loroKey = loro?.key ?? id ?? "surreal";
255
262
  const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
256
263
  const commitLoro = () => {
@@ -292,7 +299,9 @@ function surrealCollectionOptions({
292
299
  try {
293
300
  const subset = syncMode === "on-demand" ? meta.surrealSubset : void 0;
294
301
  const rows = syncMode === "eager" ? await table.listAll() : await table.loadSubset(subset);
295
- return mergeLocalOverServer(rows);
302
+ return mergeLocalOverServer(rows).map(
303
+ (row) => withNormalizedId(row)
304
+ );
296
305
  } catch (e) {
297
306
  onError?.(e);
298
307
  return [];
@@ -310,24 +319,33 @@ function surrealCollectionOptions({
310
319
  updated_at: now,
311
320
  sync_deleted: false
312
321
  } : baseRow;
322
+ const normalizedRow = withNormalizedId(row);
313
323
  if (useLoro) {
314
- loroPut(row, false);
324
+ loroPut(normalizedRow, false);
315
325
  shouldCommitLoro = true;
316
326
  }
317
- if (isTempId(row.id, config.table.name)) {
318
- const tempKey = keyOf(row.id);
319
- const { id: _id, ...payload } = row;
327
+ if (isTempId(normalizedRow.id, config.table.name)) {
328
+ const tempKey = keyOf(normalizedRow.id);
329
+ const { id: _id, ...payload } = normalizedRow;
320
330
  const persisted = await table.create(payload);
321
- const resolvedRow = persisted?.id ? { ...row, ...persisted, id: persisted.id } : row;
331
+ const resolvedRow = persisted?.id ? withNormalizedId(
332
+ {
333
+ ...normalizedRow,
334
+ ...persisted,
335
+ id: persisted.id
336
+ }
337
+ ) : normalizedRow;
322
338
  if (useLoro && persisted?.id) {
323
339
  loroRemove(tempKey, false);
324
340
  loroPut(resolvedRow, false);
325
341
  }
326
342
  resultRows.push(resolvedRow);
327
343
  } else {
328
- const persisted = await table.create(row);
344
+ const persisted = await table.create(normalizedRow);
329
345
  resultRows.push(
330
- persisted ? { ...row, ...persisted } : row
346
+ persisted ? withNormalizedId(
347
+ { ...normalizedRow, ...persisted }
348
+ ) : normalizedRow
331
349
  );
332
350
  }
333
351
  }
@@ -341,17 +359,23 @@ function surrealCollectionOptions({
341
359
  for (const m of p.transaction.mutations) {
342
360
  if (m.type !== "update") continue;
343
361
  const idKey = m.key;
344
- const normalizedModified = normalizeRecordIdLikeFields({
345
- ...m.modified
346
- });
347
- const baseRow = { ...normalizedModified, id: idKey };
362
+ const normalizedModified = omitUndefined(
363
+ normalizeRecordIdLikeFields({
364
+ ...m.modified
365
+ })
366
+ );
367
+ const baseRow = {
368
+ ...normalizedModified,
369
+ id: keyOf(idKey)
370
+ };
348
371
  const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
372
+ const normalizedRow = withNormalizedId(row);
349
373
  if (useLoro) {
350
- loroPut(row, false);
374
+ loroPut(normalizedRow, false);
351
375
  shouldCommitLoro = true;
352
376
  }
353
- await table.update(normalizeMutationId(idKey), row);
354
- writeUtils.writeUpsert?.(row);
377
+ await table.update(normalizeMutationId(idKey), normalizedRow);
378
+ writeUtils.writeUpsert?.(normalizedRow);
355
379
  }
356
380
  if (shouldCommitLoro) commitLoro();
357
381
  return { refetch: false };
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(trimmed.slice(idx + 1).trim());\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(stripAngleBrackets(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 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 = normalized.slice(0, idx).trim();\n\tconst key = normalized.slice(idx + 1).trim();\n\tif (!table || !key) 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\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(data);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...data,\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\tStandardSchema,\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\ttoRecordKeyString,\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';\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\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 => toRecordKeyString(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\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);\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\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(row, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\t\t\t\tif (isTempId(row.id, config.table.name)) {\n\t\t\t\t\tconst tempKey = keyOf(row.id);\n\t\t\t\t\tconst { id: _id, ...payload } = row 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? ({ ...row, ...persisted, id: persisted.id } as T)\n\t\t\t\t\t\t: row;\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(row);\n\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\t(persisted ? { ...row, ...persisted } : row) as T,\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 = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t}) as Partial<T>;\n\t\t\t\tconst baseRow = { ...normalizedModified, id: idKey } 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\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(row, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), row);\n\t\t\t\twriteUtils.writeUpsert?.(row);\n\n\t\t\t\tresultRows.push(row);\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","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\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(data);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...data,\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\tStandardSchema,\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';\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\t\treturn mergeLocalOverServer(rows).map((row) =>\n\t\t\t\t\t\twithNormalizedId(row),\n\t\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\t\tconst row = useLoro\n\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t...baseRow,\n\t\t\t\t\t\t\t\tupdated_at: now,\n\t\t\t\t\t\t\t\tsync_deleted: false,\n\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t: baseRow;\n\t\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (isTempId(normalizedRow.id, config.table.name)) {\n\t\t\t\t\t\tconst tempKey = keyOf(normalizedRow.id);\n\t\t\t\t\t\tconst { id: _id, ...payload } = normalizedRow as Record<\n\t\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>;\n\t\t\t\t\t\tconst persisted = await table.create(payload as Partial<T>);\n\t\t\t\t\t\tconst resolvedRow = persisted?.id\n\t\t\t\t\t\t\t? withNormalizedId(\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\t\t\tid: persisted.id,\n\t\t\t\t\t\t\t\t\t} as T,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: normalizedRow;\n\n\t\t\t\t\t\tif (useLoro && persisted?.id) {\n\t\t\t\t\t\t\tloroRemove(tempKey, false);\n\t\t\t\t\t\t\tloroPut(resolvedRow, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresultRows.push(resolvedRow);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst persisted = await table.create(normalizedRow);\n\t\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\t\tpersisted\n\t\t\t\t\t\t\t\t? withNormalizedId(\n\t\t\t\t\t\t\t\t\t\t{ ...normalizedRow, ...persisted } as T,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: normalizedRow,\n\t\t\t\t\t\t);\n\t\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\t\tconst baseRow = {\n\t\t\t\t\t\t...normalizedModified,\n\t\t\t\t\t\tid: keyOf(idKey),\n\t\t\t\t\t} as T;\n\n\t\t\t\t\tconst row = useLoro\n\t\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t\t: baseRow;\n\t\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait table.update(normalizeMutationId(idKey), normalizedRow);\n\t\t\t\t\twriteUtils.writeUpsert?.(normalizedRow);\n\n\t\t\t\t\tresultRows.push(normalizedRow);\n\t\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
@@ -16,7 +16,9 @@ var toRecordIdString = (rid) => {
16
16
  const idx = trimmed.indexOf(":");
17
17
  if (idx <= 0 || idx >= trimmed.length - 1) return trimmed;
18
18
  const table = trimmed.slice(0, idx).trim();
19
- const key = stripOuterQuotes(trimmed.slice(idx + 1).trim());
19
+ const key = stripOuterQuotes(
20
+ stripAngleBrackets(stripOuterQuotes(trimmed.slice(idx + 1).trim()))
21
+ );
20
22
  if (!table || !key) return trimmed;
21
23
  return `${table}:${key}`;
22
24
  };
@@ -30,19 +32,20 @@ var toRecordKeyString = (rid) => {
30
32
  const normalized = toRecordIdString(rid);
31
33
  const idx = normalized.indexOf(":");
32
34
  const rawKey = idx > 0 ? normalized.slice(idx + 1) : normalized;
33
- return stripOuterQuotes(stripAngleBrackets(stripOuterQuotes(rawKey.trim())));
35
+ return stripOuterQuotes(rawKey.trim());
34
36
  };
35
37
  var isRecordIdString = (value) => {
36
38
  const idx = value.indexOf(":");
37
39
  return idx > 0 && idx < value.length - 1;
38
40
  };
41
+ var looksLikeTableName = (value) => /^[A-Za-z_][A-Za-z0-9_-]*$/.test(value);
39
42
  var parseRecordIdString = (value) => {
40
43
  const normalized = toRecordIdString(value);
41
44
  if (!isRecordIdString(normalized)) return void 0;
42
45
  const idx = normalized.indexOf(":");
43
- const table = normalized.slice(0, idx).trim();
46
+ const table = stripOuterQuotes(normalized.slice(0, idx).trim());
44
47
  const key = normalized.slice(idx + 1).trim();
45
- if (!table || !key) return void 0;
48
+ if (!table || !key || !looksLikeTableName(table)) return void 0;
46
49
  return new RecordId(table, key);
47
50
  };
48
51
  var normalizeRecordIdLikeValue = (value) => {
@@ -211,6 +214,9 @@ function hasLoadSubset(res) {
211
214
  return typeof res === "object" && res !== null && "loadSubset" in res;
212
215
  }
213
216
  var getWriteUtils = (utils) => typeof utils === "object" && utils !== null ? utils : {};
217
+ var omitUndefined = (obj) => Object.fromEntries(
218
+ Object.entries(obj).filter(([, value]) => value !== void 0)
219
+ );
214
220
  function createInsertSchema(tableName) {
215
221
  return {
216
222
  "~standard": {
@@ -246,9 +252,10 @@ function surrealCollectionOptions({
246
252
  let loro;
247
253
  if (useLoro) loro = { doc: new LoroDoc(), key: id };
248
254
  const table = manageTable(db, useLoro, config.table);
249
- const keyOf = (rid) => toRecordKeyString(rid);
255
+ const keyOf = (rid) => toRecordIdString(rid);
250
256
  const getKey = (row) => keyOf(row.id);
251
257
  const normalizeMutationId = (rid) => toRecordId(config.table.name, rid);
258
+ const withNormalizedId = (row) => ({ ...row, id: keyOf(row.id) });
252
259
  const loroKey = loro?.key ?? id ?? "surreal";
253
260
  const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
254
261
  const commitLoro = () => {
@@ -290,7 +297,9 @@ function surrealCollectionOptions({
290
297
  try {
291
298
  const subset = syncMode === "on-demand" ? meta.surrealSubset : void 0;
292
299
  const rows = syncMode === "eager" ? await table.listAll() : await table.loadSubset(subset);
293
- return mergeLocalOverServer(rows);
300
+ return mergeLocalOverServer(rows).map(
301
+ (row) => withNormalizedId(row)
302
+ );
294
303
  } catch (e) {
295
304
  onError?.(e);
296
305
  return [];
@@ -308,24 +317,33 @@ function surrealCollectionOptions({
308
317
  updated_at: now,
309
318
  sync_deleted: false
310
319
  } : baseRow;
320
+ const normalizedRow = withNormalizedId(row);
311
321
  if (useLoro) {
312
- loroPut(row, false);
322
+ loroPut(normalizedRow, false);
313
323
  shouldCommitLoro = true;
314
324
  }
315
- if (isTempId(row.id, config.table.name)) {
316
- const tempKey = keyOf(row.id);
317
- const { id: _id, ...payload } = row;
325
+ if (isTempId(normalizedRow.id, config.table.name)) {
326
+ const tempKey = keyOf(normalizedRow.id);
327
+ const { id: _id, ...payload } = normalizedRow;
318
328
  const persisted = await table.create(payload);
319
- const resolvedRow = persisted?.id ? { ...row, ...persisted, id: persisted.id } : row;
329
+ const resolvedRow = persisted?.id ? withNormalizedId(
330
+ {
331
+ ...normalizedRow,
332
+ ...persisted,
333
+ id: persisted.id
334
+ }
335
+ ) : normalizedRow;
320
336
  if (useLoro && persisted?.id) {
321
337
  loroRemove(tempKey, false);
322
338
  loroPut(resolvedRow, false);
323
339
  }
324
340
  resultRows.push(resolvedRow);
325
341
  } else {
326
- const persisted = await table.create(row);
342
+ const persisted = await table.create(normalizedRow);
327
343
  resultRows.push(
328
- persisted ? { ...row, ...persisted } : row
344
+ persisted ? withNormalizedId(
345
+ { ...normalizedRow, ...persisted }
346
+ ) : normalizedRow
329
347
  );
330
348
  }
331
349
  }
@@ -339,17 +357,23 @@ function surrealCollectionOptions({
339
357
  for (const m of p.transaction.mutations) {
340
358
  if (m.type !== "update") continue;
341
359
  const idKey = m.key;
342
- const normalizedModified = normalizeRecordIdLikeFields({
343
- ...m.modified
344
- });
345
- const baseRow = { ...normalizedModified, id: idKey };
360
+ const normalizedModified = omitUndefined(
361
+ normalizeRecordIdLikeFields({
362
+ ...m.modified
363
+ })
364
+ );
365
+ const baseRow = {
366
+ ...normalizedModified,
367
+ id: keyOf(idKey)
368
+ };
346
369
  const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
370
+ const normalizedRow = withNormalizedId(row);
347
371
  if (useLoro) {
348
- loroPut(row, false);
372
+ loroPut(normalizedRow, false);
349
373
  shouldCommitLoro = true;
350
374
  }
351
- await table.update(normalizeMutationId(idKey), row);
352
- writeUtils.writeUpsert?.(row);
375
+ await table.update(normalizeMutationId(idKey), normalizedRow);
376
+ writeUtils.writeUpsert?.(normalizedRow);
353
377
  }
354
378
  if (shouldCommitLoro) commitLoro();
355
379
  return { refetch: false };
@@ -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(trimmed.slice(idx + 1).trim());\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(stripAngleBrackets(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 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 = normalized.slice(0, idx).trim();\n\tconst key = normalized.slice(idx + 1).trim();\n\tif (!table || !key) 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\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(data);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...data,\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\tStandardSchema,\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\ttoRecordKeyString,\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';\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\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 => toRecordKeyString(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\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);\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\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(row, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\t\t\t\tif (isTempId(row.id, config.table.name)) {\n\t\t\t\t\tconst tempKey = keyOf(row.id);\n\t\t\t\t\tconst { id: _id, ...payload } = row 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? ({ ...row, ...persisted, id: persisted.id } as T)\n\t\t\t\t\t\t: row;\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(row);\n\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\t(persisted ? { ...row, ...persisted } : row) as T,\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 = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t}) as Partial<T>;\n\t\t\t\tconst baseRow = { ...normalizedModified, id: idKey } 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\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(row, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), row);\n\t\t\t\twriteUtils.writeUpsert?.(row);\n\n\t\t\t\tresultRows.push(row);\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 {\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\tif (!useLoro) {\n\t\t\tawait db.update(id).merge(data);\n\t\t\treturn;\n\t\t}\n\t\tawait db.update(id).merge({\n\t\t\t...data,\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\tStandardSchema,\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';\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\t\treturn mergeLocalOverServer(rows).map((row) =>\n\t\t\t\t\t\twithNormalizedId(row),\n\t\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\t\tconst row = useLoro\n\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t...baseRow,\n\t\t\t\t\t\t\t\tupdated_at: now,\n\t\t\t\t\t\t\t\tsync_deleted: false,\n\t\t\t\t\t\t\t} as T)\n\t\t\t\t\t\t: baseRow;\n\t\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (isTempId(normalizedRow.id, config.table.name)) {\n\t\t\t\t\t\tconst tempKey = keyOf(normalizedRow.id);\n\t\t\t\t\t\tconst { id: _id, ...payload } = normalizedRow as Record<\n\t\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>;\n\t\t\t\t\t\tconst persisted = await table.create(payload as Partial<T>);\n\t\t\t\t\t\tconst resolvedRow = persisted?.id\n\t\t\t\t\t\t\t? withNormalizedId(\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...normalizedRow,\n\t\t\t\t\t\t\t\t\t\t...persisted,\n\t\t\t\t\t\t\t\t\t\tid: persisted.id,\n\t\t\t\t\t\t\t\t\t} as T,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: normalizedRow;\n\n\t\t\t\t\t\tif (useLoro && persisted?.id) {\n\t\t\t\t\t\t\tloroRemove(tempKey, false);\n\t\t\t\t\t\t\tloroPut(resolvedRow, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresultRows.push(resolvedRow);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst persisted = await table.create(normalizedRow);\n\t\t\t\t\t\tresultRows.push(\n\t\t\t\t\t\t\tpersisted\n\t\t\t\t\t\t\t\t? withNormalizedId(\n\t\t\t\t\t\t\t\t\t\t{ ...normalizedRow, ...persisted } as T,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: normalizedRow,\n\t\t\t\t\t\t);\n\t\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\t\tconst baseRow = {\n\t\t\t\t\t\t...normalizedModified,\n\t\t\t\t\t\tid: keyOf(idKey),\n\t\t\t\t\t} as T;\n\n\t\t\t\t\tconst row = useLoro\n\t\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t\t: baseRow;\n\t\t\t\t\tconst normalizedRow = withNormalizedId(row);\n\n\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\tloroPut(normalizedRow, false);\n\t\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait table.update(normalizeMutationId(idKey), normalizedRow);\n\t\t\t\t\twriteUtils.writeUpsert?.(normalizedRow);\n\n\t\t\t\t\tresultRows.push(normalizedRow);\n\t\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.6",
4
+ "version": "0.4.8",
5
5
  "files": [
6
6
  "dist"
7
7
  ],