@foretag/tanstack-db-surrealdb 0.4.7 → 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 +28 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +28 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -257,6 +257,7 @@ function surrealCollectionOptions({
|
|
|
257
257
|
const keyOf = (rid) => toRecordIdString(rid);
|
|
258
258
|
const getKey = (row) => keyOf(row.id);
|
|
259
259
|
const normalizeMutationId = (rid) => toRecordId(config.table.name, rid);
|
|
260
|
+
const withNormalizedId = (row) => ({ ...row, id: keyOf(row.id) });
|
|
260
261
|
const loroKey = loro?.key ?? id ?? "surreal";
|
|
261
262
|
const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
|
|
262
263
|
const commitLoro = () => {
|
|
@@ -298,7 +299,9 @@ function surrealCollectionOptions({
|
|
|
298
299
|
try {
|
|
299
300
|
const subset = syncMode === "on-demand" ? meta.surrealSubset : void 0;
|
|
300
301
|
const rows = syncMode === "eager" ? await table.listAll() : await table.loadSubset(subset);
|
|
301
|
-
return mergeLocalOverServer(rows)
|
|
302
|
+
return mergeLocalOverServer(rows).map(
|
|
303
|
+
(row) => withNormalizedId(row)
|
|
304
|
+
);
|
|
302
305
|
} catch (e) {
|
|
303
306
|
onError?.(e);
|
|
304
307
|
return [];
|
|
@@ -316,24 +319,33 @@ function surrealCollectionOptions({
|
|
|
316
319
|
updated_at: now,
|
|
317
320
|
sync_deleted: false
|
|
318
321
|
} : baseRow;
|
|
322
|
+
const normalizedRow = withNormalizedId(row);
|
|
319
323
|
if (useLoro) {
|
|
320
|
-
loroPut(
|
|
324
|
+
loroPut(normalizedRow, false);
|
|
321
325
|
shouldCommitLoro = true;
|
|
322
326
|
}
|
|
323
|
-
if (isTempId(
|
|
324
|
-
const tempKey = keyOf(
|
|
325
|
-
const { id: _id, ...payload } =
|
|
327
|
+
if (isTempId(normalizedRow.id, config.table.name)) {
|
|
328
|
+
const tempKey = keyOf(normalizedRow.id);
|
|
329
|
+
const { id: _id, ...payload } = normalizedRow;
|
|
326
330
|
const persisted = await table.create(payload);
|
|
327
|
-
const resolvedRow = persisted?.id ?
|
|
331
|
+
const resolvedRow = persisted?.id ? withNormalizedId(
|
|
332
|
+
{
|
|
333
|
+
...normalizedRow,
|
|
334
|
+
...persisted,
|
|
335
|
+
id: persisted.id
|
|
336
|
+
}
|
|
337
|
+
) : normalizedRow;
|
|
328
338
|
if (useLoro && persisted?.id) {
|
|
329
339
|
loroRemove(tempKey, false);
|
|
330
340
|
loroPut(resolvedRow, false);
|
|
331
341
|
}
|
|
332
342
|
resultRows.push(resolvedRow);
|
|
333
343
|
} else {
|
|
334
|
-
const persisted = await table.create(
|
|
344
|
+
const persisted = await table.create(normalizedRow);
|
|
335
345
|
resultRows.push(
|
|
336
|
-
persisted ?
|
|
346
|
+
persisted ? withNormalizedId(
|
|
347
|
+
{ ...normalizedRow, ...persisted }
|
|
348
|
+
) : normalizedRow
|
|
337
349
|
);
|
|
338
350
|
}
|
|
339
351
|
}
|
|
@@ -352,14 +364,18 @@ function surrealCollectionOptions({
|
|
|
352
364
|
...m.modified
|
|
353
365
|
})
|
|
354
366
|
);
|
|
355
|
-
const baseRow = {
|
|
367
|
+
const baseRow = {
|
|
368
|
+
...normalizedModified,
|
|
369
|
+
id: keyOf(idKey)
|
|
370
|
+
};
|
|
356
371
|
const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
|
|
372
|
+
const normalizedRow = withNormalizedId(row);
|
|
357
373
|
if (useLoro) {
|
|
358
|
-
loroPut(
|
|
374
|
+
loroPut(normalizedRow, false);
|
|
359
375
|
shouldCommitLoro = true;
|
|
360
376
|
}
|
|
361
|
-
await table.update(normalizeMutationId(idKey),
|
|
362
|
-
writeUtils.writeUpsert?.(
|
|
377
|
+
await table.update(normalizeMutationId(idKey), normalizedRow);
|
|
378
|
+
writeUtils.writeUpsert?.(normalizedRow);
|
|
363
379
|
}
|
|
364
380
|
if (shouldCommitLoro) commitLoro();
|
|
365
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(\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\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 = omitUndefined(\n\t\t\t\t\tnormalizeRecordIdLikeFields({\n\t\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t\t}) as Record<string, unknown>,\n\t\t\t\t) as Partial<T>;\n\t\t\t\tconst baseRow = { ...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":";;;;;;;AAEO,IAAM,gBAAA,GAAmB,CAAC,KAAA,KAA0B;AAC1D,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,MAAM,cAAA,GACL,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,CAAA;AACvE,EAAA,MAAM,cAAA,GACL,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,CAAA;AACvE,EAAA,MAAM,gBAAA,GACL,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,CAAA;AACvE,EAAA,OAAO,kBAAkB,cAAA,IAAkB,gBAAA,GACxC,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GACnB,OAAA;AACJ,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,GAAA,KAAmC;AACnE,EAAA,MAAM,GAAA,GACL,OAAO,GAAA,KAAQ,QAAA,GAAW,iBAAiB,GAAG,CAAA,GAAI,IAAI,QAAA,EAAS;AAChE,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAG,CAAA,CAAE,IAAA,EAAK;AAC3C,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,IAAI,OAAO,CAAA,IAAK,GAAA,IAAO,OAAA,CAAQ,MAAA,GAAS,GAAG,OAAO,OAAA;AAElD,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACzC,EAAA,MAAM,GAAA,GAAM,gBAAA;AAAA,IACX,kBAAA,CAAmB,iBAAiB,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC;AAAA,GACnE;AACA,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK,OAAO,OAAA;AAC3B,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACvB,CAAA;AAEA,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAA0B;AACrD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,MAAM,eAAA,GACL,OAAA,CAAQ,UAAA,CAAW,QAAG,CAAA,IAAK,QAAQ,QAAA,CAAS,QAAG,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,CAAA;AACvE,EAAA,MAAM,aAAA,GACL,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,CAAA;AACvE,EAAA,OAAO,eAAA,IAAmB,gBACvB,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,MAAK,GAC1B,OAAA;AACJ,CAAA;AAEO,IAAM,iBAAA,GAAoB,CAAC,GAAA,KAAmC;AACpE,EAAA,MAAM,UAAA,GAAa,iBAAiB,GAAG,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,MAAM,SAAS,GAAA,GAAM,CAAA,GAAI,WAAW,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,GAAI,UAAA;AACrD,EAAA,OAAO,gBAAA,CAAiB,MAAA,CAAO,IAAA,EAAM,CAAA;AACtC;AAEA,IAAM,gBAAA,GAAmB,CAAC,KAAA,KAA2B;AACpD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,OAAO,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AACxC,CAAA;AAEA,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAC3B,2BAAA,CAA4B,KAAK,KAAK,CAAA;AAEvC,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAAwC;AACpE,EAAA,MAAM,UAAA,GAAa,iBAAiB,KAAK,CAAA;AACzC,EAAA,IAAI,CAAC,gBAAA,CAAiB,UAAU,CAAA,EAAG,OAAO,MAAA;AAE1C,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,iBAAiB,UAAA,CAAW,KAAA,CAAM,GAAG,GAAG,CAAA,CAAE,MAAM,CAAA;AAC9D,EAAA,MAAM,MAAM,UAAA,CAAW,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AAC3C,EAAA,IAAI,CAAC,SAAS,CAAC,GAAA,IAAO,CAAC,kBAAA,CAAmB,KAAK,GAAG,OAAO,MAAA;AAEzD,EAAA,OAAO,IAAIA,kBAAA,CAAS,KAAA,EAAO,GAAG,CAAA;AAC/B,CAAA;AAEO,IAAM,0BAAA,GAA6B,CAAC,KAAA,KAA4B;AACtE,EAAA,IAAI,KAAA,YAAiBA,oBAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AAEzC,EAAA,MAAM,MAAA,GACL,oBAAoB,QAAQ,CAAA,KAC3B,aAAa,OAAA,GAAU,MAAA,GAAY,oBAAoB,OAAO,CAAA,CAAA;AAChE,EAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,EAAA,OAAO,KAAA;AACR,CAAA;AAEO,IAAM,2BAAA,GAA8B,CAC1C,IAAA,KACO;AACP,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC1C,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,0BAAA,CAA2B,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,GAAA;AACR,CAAA;AAEO,IAAM,UAAA,GAAa,CACzB,SAAA,EACA,EAAA,KACc;AACd,EAAA,IAAI,EAAA,YAAcA,oBAAU,OAAO,EAAA;AAEnC,EAAA,MAAM,UAAA,GAAa,iBAAiB,EAAE,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,GAAG,SAAS,CAAA,CAAA,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,WAAW,UAAA,CAAW,QAAQ,IACvC,UAAA,CAAW,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,GAChC,UAAA;AACH,EAAA,OAAO,IAAIA,kBAAA,CAAS,SAAA,EAAW,GAAG,CAAA;AACnC,CAAA;ACvFA,IAAM,eAAA,GAAkB,CACvB,GAAA,KACoC;AACpC,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,GAAA,EAAK,OAAO,CAAC,GAAsB,CAAA;AACvD,EAAA,OAAO,GAAA;AACR,CAAA;AAEA,IAAM,WAAA,GAAc,CACnB,CAAA,KACwB;AACxB,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AAC/C,CAAA;AAKA,IAAM,QAAA,GAAW,CAAI,GAAA,KAAqC;AACzD,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,IAAI,MAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,IAAI,CAAC,CAAA;AACpC,EAAA,OAAO,GAAA;AACR,CAAA;AAEO,SAAS,YACf,EAAA,EACA,OAAA,EACA,EAAE,IAAA,EAAM,GAAG,MAAK,EACf;AACD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,IAAIC,eAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,OAAA,GAAUC,YAAA,CAAG,cAAA,EAAgB,KAAK,CAAA,GAAI,MAAA;AACzD,EAAA,MAAM,SAAA,GAAY,UAAA,GACd,IAAA,CAAK,KAAA,GAAQC,aAAA,CAAI,KAAK,KAAA,EAAO,UAAU,CAAA,GAAI,UAAA,GAC5C,IAAA,CAAK,KAAA;AACR,EAAA,MAAM,aAAa,CAAA,OAAA,EAAU,YAAY,CAAA,yBAAA,EACxC,SAAA,GAAY,kBAAkB,EAC/B,CAAA,CAAA,CAAA;AAEA,EAAA,MAAM,eAAe,MAA4B,SAAA;AAEjD,EAAA,MAAM,UAAU,YAA0B;AACzC,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,EAAA,CAAG,MAAwB,UAAA,EAAY;AAAA,MAC1D,KAAA,EAAO,IAAA;AAAA,MACP;AAAA,KACA,CAAA;AACD,IAAA,OAAO,OAAO,EAAC;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,MAAA,KAAyC;AAClE,IAAA,MAAM,IAAI,YAAA,EAAa;AACvB,IAAA,MAAM,IAAI,MAAA,EAAQ,KAAA;AAClB,IAAA,MAAM,QAAQ,CAAA,IAAK,CAAA,GAAIA,cAAI,CAAA,EAAG,CAAC,IAAK,CAAA,IAAK,CAAA;AAEzC,IAAA,MAAM,QAAA,GAAW,QAAQ,eAAA,GAAkB,EAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,GAAK,EAAA;AAChD,IAAA,MAAM,QAAA,GACL,OAAO,MAAA,EAAQ,KAAA,KAAU,WAAW,eAAA,GAAkB,EAAA;AACvD,IAAA,MAAM,QAAA,GACL,OAAO,MAAA,EAAQ,MAAA,KAAW,WAAW,gBAAA,GAAmB,EAAA;AAEzD,IAAA,MAAM,GAAA,GAAM,CAAA,OAAA,EAAU,YAAY,CAAA,yBAAA,EAA4B,QAAQ,GAAG,QAAQ,CAAA,EAAG,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAEvG,IAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,EAAA,CAAG,MAAwB,GAAA,EAAK;AAAA,MACnD,KAAA,EAAO,IAAA;AAAA,MACP,KAAA;AAAA,MACA,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,QAAQ,MAAA,EAAQ;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,OAAO,EAAC;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAiD;AACtE,IAAA,MAAM,KAAM,IAAA,CAAiD,EAAA;AAC7D,IAAA,IAAI,CAAC,EAAA,EAAI;AACR,MAAA,MAAM,UAAU,MAAM,EAAA,CAAG,OAAO,KAAK,CAAA,CAAE,QAAQ,IAAI,CAAA;AACnD,MAAA,OAAO,SAAS,OAAuB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAI,IAAA,EAAiC;AACvD,IAAA,OAAA,CAAQ,EAAA,GAAK,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,MAAA,CAAO,OAAO,OAAO,CAAA;AAC/C,IAAA,OAAO,SAAS,QAAwB,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,EAAc,IAAA,KAAyB;AAC5D,IAAA,IAAI,CAAC,OAAA,EAAS;AACb,MAAA,MAAM,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,CAAE,MAAM,IAAI,CAAA;AAC9B,MAAA;AAAA,IACD;AACA,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,CAAE,KAAA,CAAM;AAAA,MACzB,GAAG,IAAA;AAAA,MACH,YAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAY,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,KAAiB;AACtC,IAAA,MAAM,EAAA,CAAG,OAAO,EAAE,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,EAAA,KAAiB;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACb,MAAA,MAAM,EAAA,CAAG,OAAO,EAAE,CAAA;AAClB,MAAA;AAAA,IACD;AACA,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,CAAE,KAAA,CAAM;AAAA,MACzB,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CACjB,EAAA,KACI;AACJ,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAI,IAAA;AAEJ,IAAA,MAAM,EAAA,GAAK,CAAC,GAAA,KAAqB;AAChC,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,GAAA;AAK1B,MAAA,IAAI,WAAW,QAAA,EAAU;AAEzB,MAAA,IAAI,MAAA,KAAW,UAAU,EAAA,CAAG,EAAE,MAAM,QAAA,EAAU,GAAA,EAAK,OAAO,CAAA;AAAA,WAAA,IACjD,MAAA,KAAW,UAAU,EAAA,CAAG,EAAE,MAAM,QAAA,EAAU,GAAA,EAAK,OAAO,CAAA;AAAA,WAAA,IACtD,MAAA,KAAW,QAAA;AACnB,QAAA,EAAA,CAAG,EAAE,MAAM,QAAA,EAAU,GAAA,EAAK,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAG,EAAQ,CAAA;AAAA,IACnD,CAAA;AAEA,IAAA,MAAM,QAAQ,YAAY;AACzB,MAAA,IAAI,CAAC,EAAA,CAAG,kBAAA,CAAmBC,kBAAA,CAAS,WAAW,CAAA,EAAG;AAClD,MAAA,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,CAAM,KAAK,KAAK,CAAA;AAC5C,MAAA,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,KAAK,KAAA,EAAM;AAEX,IAAA,OAAO,MAAM;AACZ,MAAA,IAAI,MAAA,EAAQ;AACZ,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,IAAI,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA,EAAK;AAAA,IAC1B,CAAA;AAAA,EACD,CAAA;AAEA,EAAA,OAAO;AAAA,IACN,OAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD;AACD;;;ACzHA,IAAM,cAAA,GAAiB,UAAA;AACvB,IAAM,OAAgB,MAAM;AAAC,CAAA;AAO7B,IAAM,kBAAA,GAAqB,CAAC,SAAA,KAAgC;AAC3D,EAAA,MAAM,SAAS,CAAA,EAAG,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACpF,EAAA,OAAO,IAAIJ,kBAAAA,CAAS,SAAA,EAAW,GAAG,cAAc,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAC5D,CAAA;AAEA,IAAM,QAAA,GAAW,CAAC,EAAA,EAAuB,SAAA,KAA+B;AACvE,EAAA,IAAI,cAAcA,kBAAAA,EAAU;AAC3B,IAAA,MAAM,YAAa,EAAA,CAAmC,EAAA;AACtD,IAAA,OACC,OAAO,SAAA,KAAc,QAAA,IACrB,SAAA,CAAU,WAAW,cAAc,CAAA;AAAA,EAErC;AAEA,EAAA,MAAM,GAAA,GAAM,iBAAiB,EAAE,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,CAAA,CAAG,CAAA,GACvC,GAAA,CAAI,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA,GAC9B,GAAA;AACH,EAAA,OAAO,GAAA,CAAI,WAAW,cAAc,CAAA;AACrC,CAAA;AAEA,SAAS,UAAU,GAAA,EAA0B;AAC5C,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,OAAO,GAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,eAAe,GAAA,CAAI,OAAA;AAEtD,EAAA,OAAO,OAAO,OAAA,KAAY,UAAA,GAAa,OAAA,GAAU,IAAA;AAClD;AAEA,SAAS,cACR,GAAA,EAC2D;AAC3D,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,YAAA,IAAgB,GAAA;AACnE;AAEA,IAAM,aAAA,GAAgB,CAAC,KAAA,KACtB,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,IAAA,GACnC,KAAA,GACD,EAAC;AAEL,IAAM,aAAA,GAAgB,CAAoC,GAAA,KACzD,MAAA,CAAO,WAAA;AAAA,EACN,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAC9D,CAAA;AAED,SAAS,mBACR,SAAA,EACwC;AACxC,EAAA,OAAO;AAAA,IACN,WAAA,EAAa;AAAA,MACZ,OAAA,EAAS,CAAA;AAAA,MACT,MAAA,EAAQ,uBAAA;AAAA,MACR,QAAA,EAAU,CAAC,KAAA,KAAmB;AAC7B,QAAA,IACC,CAAC,SACD,OAAO,KAAA,KAAU,YACjB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAClB;AACD,UAAA,OAAO;AAAA,YACN,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,kCAAkC;AAAA,WACvD;AAAA,QACD;AAEA,QAAA,MAAM,OAAO,2BAAA,CAA4B;AAAA,UACxC,GAAI;AAAA,SACJ,CAAA;AAED,QAAA,IAAI,CAAC,IAAA,CAAK,EAAA;AACT,UAAA,IAAA,CAAK,EAAA,GAAK,mBAAmB,SAAS,CAAA;AAEvC,QAAA,OAAO,EAAE,OAAO,IAAA,EAAU;AAAA,MAC3B,CAAA;AAAA,MACA,KAAA,EAAO;AAAA;AACR,GACD;AACD;AAEO,SAAS,wBAAA,CAGd;AAAA,EACD,EAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,EAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,OAAA;AAAA,EACX,GAAG;AACJ,CAAA,EAQE;AACD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,OAAA,SAAgB,EAAE,GAAA,EAAK,IAAIK,gBAAA,EAAQ,EAAG,KAAK,EAAA,EAAG;AAElD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAe,EAAA,EAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAmC,gBAAA,CAAiB,GAAG,CAAA;AAEtE,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAmC,KAAA,CAAM,IAAI,EAAE,CAAA;AAC/D,EAAA,MAAM,sBAAsB,CAAC,GAAA,KAC5B,WAAW,MAAA,CAAO,KAAA,CAAM,MAAM,GAAG,CAAA;AAClC,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,MACxB,EAAE,GAAG,KAAK,EAAA,EAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAE,CAAA;AAE9B,EAAA,MAAM,OAAA,GAAU,IAAA,EAAM,GAAA,IAAO,EAAA,IAAM,SAAA;AACnC,EAAA,MAAM,UAAU,OAAA,GAAW,IAAA,EAAM,KAAK,MAAA,GAAS,OAAO,KAAK,IAAA,GAAQ,IAAA;AACnE,EAAA,MAAM,aAAa,MAAM;AACxB,IAAA,IAAA,EAAM,KAAK,MAAA,IAAS;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAQ,MAAA,GAAS,IAAA,KAAS;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAc,CAAA;AACvC,IAAA,IAAI,QAAQ,UAAA,EAAW;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAe,MAAA,GAAS,IAAA,KAAS;AACpD,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,IAAA,IAAI,QAAQ,UAAA,EAAW;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,UAAA,KAAyB;AACtD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS,OAAO,UAAA;AAEjC,IAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,MAAA,IAAS,IAAK,EAAC;AAE1C,IAAA,MAAM,MAAW,EAAC;AAClB,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC3B,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AAEzB,MAAA,IAAI,CAAC,CAAA,EAAG;AACP,QAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,QAAA;AAAA,MACD;AAEA,MAAA,IAAA,CAAK,CAAA,CAAE,YAAA,IAAgB,KAAA,MAAW,IAAA,EAAM;AACxC,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACX;AAEA,IAAA,OAAO,GAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,OAAOC,wCAAA,CAAuB;AAAA,IACnC,MAAA,EAAQ,kBAAA,CAAsB,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,IAC/C,MAAA;AAAA,IAEA,QAAA;AAAA,IACA,WAAA;AAAA,IAEA,QAAA;AAAA,IAEA,OAAA,EAAS,OAAO,EAAE,IAAA,EAAK,KAAM;AAC5B,MAAA,IAAI;AACH,QAAA,MAAM,MAAA,GACL,QAAA,KAAa,WAAA,GACT,IAAA,CAAK,aAAA,GACN,KAAA,CAAA;AAEJ,QAAA,MAAM,IAAA,GACL,QAAA,KAAa,OAAA,GACV,MAAM,KAAA,CAAM,SAAQ,GACpB,MAAM,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAEhC,QAAA,OAAO,oBAAA,CAAqB,IAAI,CAAA,CAAE,GAAA;AAAA,UAAI,CAAC,GAAA,KACtC,gBAAA,CAAiB,GAAG;AAAA,SACrB;AAAA,MACF,SAAS,CAAA,EAAG;AACX,QAAA,OAAA,GAAU,CAAC,CAAA;AACX,QAAA,OAAO,EAAC;AAAA,MACT;AAAA,IACD,CAAA;AAAA,IAEA,QAAA,GAAW,OAAO,CAAA,KAAiC;AAClD,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,MAAA,MAAM,aAAkB,EAAC;AACzB,MAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,MAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,WAAA,CAAY,SAAA,EAAW;AACxC,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAEzB,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,CAAA,CAAE,QAAA,EAAS;AAE/B,QAAA,MAAM,MAAM,OAAA,GACR;AAAA,UACD,GAAG,OAAA;AAAA,UACH,UAAA,EAAY,GAAA;AAAA,UACZ,YAAA,EAAc;AAAA,SACf,GACC,OAAA;AACH,QAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAE1C,QAAA,IAAI,OAAA,EAAS;AACZ,UAAA,OAAA,CAAQ,eAAe,KAAK,CAAA;AAC5B,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACpB;AACA,QAAA,IAAI,SAAS,aAAA,CAAc,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AAClD,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,aAAA,CAAc,EAAE,CAAA;AACtC,UAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAK,GAAG,SAAQ,GAAI,aAAA;AAIhC,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,OAAqB,CAAA;AAC1D,UAAA,MAAM,WAAA,GAAc,WAAW,EAAA,GAC5B,gBAAA;AAAA,YACA;AAAA,cACC,GAAG,aAAA;AAAA,cACH,GAAG,SAAA;AAAA,cACH,IAAI,SAAA,CAAU;AAAA;AACf,WACD,GACC,aAAA;AAEH,UAAA,IAAI,OAAA,IAAW,WAAW,EAAA,EAAI;AAC7B,YAAA,UAAA,CAAW,SAAS,KAAK,CAAA;AACzB,YAAA,OAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,UAC3B;AACA,UAAA,UAAA,CAAW,KAAK,WAAW,CAAA;AAAA,QAC5B,CAAA,MAAO;AACN,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,aAAa,CAAA;AAClD,UAAA,UAAA,CAAW,IAAA;AAAA,YACV,SAAA,GACG,gBAAA;AAAA,cACA,EAAE,GAAG,aAAA,EAAe,GAAG,SAAA;AAAU,aAClC,GACC;AAAA,WACJ;AAAA,QACD;AAAA,MACF;AACA,MAAA,IAAI,kBAAkB,UAAA,EAAW;AAEjC,MAAA,OAAO,UAAA;AAAA,IACR,CAAA,CAAA;AAAA,IAEA,QAAA,GAAW,OAAO,CAAA,KAAiC;AAClD,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA;AAGnD,MAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,MAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,WAAA,CAAY,SAAA,EAAW;AACxC,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAEzB,QAAA,MAAM,QAAQ,CAAA,CAAE,GAAA;AAChB,QAAA,MAAM,kBAAA,GAAqB,aAAA;AAAA,UAC1B,2BAAA,CAA4B;AAAA,YAC3B,GAAI,CAAA,CAAE;AAAA,WACN;AAAA,SACF;AACC,QAAA,MAAM,OAAA,GAAU;AAAA,UACf,GAAG,kBAAA;AAAA,UACH,EAAA,EAAI,MAAM,KAAK;AAAA,SAChB;AAEA,QAAA,MAAM,MAAM,OAAA,GACR,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,KAAI,GAC/B,OAAA;AACH,QAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAE1C,QAAA,IAAI,OAAA,EAAS;AACZ,UAAA,OAAA,CAAQ,eAAe,KAAK,CAAA;AAC5B,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACpB;AAEA,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,mBAAA,CAAoB,KAAK,GAAG,aAAa,CAAA;AAC5D,QAAA,UAAA,CAAW,cAAc,aAAa,CAAA;AAET,MAC9B;AACD,MAAA,IAAI,kBAAkB,UAAA,EAAW;AAGjC,MAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,IACzB,CAAA,CAAA;AAAA,IAEA,QAAA,GAAW,OAAO,CAAA,KAAiC;AAClD,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA;AACnD,MAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,MAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,WAAA,CAAY,SAAA,EAAW;AACxC,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAEzB,QAAA,MAAM,QAAQ,CAAA,CAAE,GAAA;AAChB,QAAA,MAAM,GAAA,GAAM,MAAM,KAAK,CAAA;AACvB,QAAA,IAAI,OAAA,EAAS;AACZ,UAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACpB;AAEA,QAAA,MAAM,KAAA,CAAM,UAAA,CAAW,mBAAA,CAAoB,KAAK,CAAC,CAAA;AACjD,QAAA,UAAA,CAAW,cAAc,GAAG,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,kBAAkB,UAAA,EAAW;AAEjC,MAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,IACzB,CAAA;AAAA,GACS,CAAA;AAGV,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAM,IAAA;AAE5B,EAAA,MAAM,OAAO,QAAA,GACV;AAAA,IACA,IAAA,EAAM,CAAC,GAAA,KAAqD;AAE3D,MAAA,MAAM,OAAA,GAAU,SAAS,GAAG,CAAA;AAC5B,MAAA,MAAM,WAAA,GAAc,UAAU,OAAO,CAAA;AAGrC,MAAA,IAAI,CAAC,EAAA,CAAG,kBAAA,CAAmBF,kBAAAA,CAAS,WAAW,CAAA,EAAG;AACjD,QAAA,OAAO,OAAA;AAAA,MAGR;AAEA,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,CAAC,GAAA,KAAQ;AACxC,QAAA,IAAI,OAAA,EAAS;AACZ,UAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AAC1B,YAAA,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,UAC3B,CAAA,MAAO;AACN,YAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,UAChB;AAAA,QACD;AAEA,QAAA,KAAK,WAAA,CACH,iBAAA,CAAkB,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,CAAA,CAC5C,KAAA,CAAM,CAAC,CAAA,KAAM,OAAA,GAAU,CAAC,CAAC,CAAA;AAAA,MAC5B,CAAC,CAAA;AAGD,MAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAE3B,QAAA,MAAM,MAAA,GAAS,OAAA;AACf,QAAA,OAAO;AAAA,UACN,GAAG,MAAA;AAAA,UACH,SAAS,MAAM;AACd,YAAA,OAAA,EAAQ;AACR,YAAA,WAAA,EAAY;AAAA,UACb;AAAA,SACD;AAAA,MAGD;AAGA,MAAA,QAAQ,MAAM;AACb,QAAA,OAAA,EAAQ;AACR,QAAA,WAAA,EAAY;AAAA,MACb,CAAA;AAAA,IACD;AAAA,GACD,GACC,MAAA;AAEH,EAAA,OAAO;AAAA,IACN,GAAG,IAAA;AAAA,IACH,IAAA,EAAM,QAAQ,IAAA,CAAK;AAAA,GACpB;AACD","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
|
@@ -255,6 +255,7 @@ function surrealCollectionOptions({
|
|
|
255
255
|
const keyOf = (rid) => toRecordIdString(rid);
|
|
256
256
|
const getKey = (row) => keyOf(row.id);
|
|
257
257
|
const normalizeMutationId = (rid) => toRecordId(config.table.name, rid);
|
|
258
|
+
const withNormalizedId = (row) => ({ ...row, id: keyOf(row.id) });
|
|
258
259
|
const loroKey = loro?.key ?? id ?? "surreal";
|
|
259
260
|
const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
|
|
260
261
|
const commitLoro = () => {
|
|
@@ -296,7 +297,9 @@ function surrealCollectionOptions({
|
|
|
296
297
|
try {
|
|
297
298
|
const subset = syncMode === "on-demand" ? meta.surrealSubset : void 0;
|
|
298
299
|
const rows = syncMode === "eager" ? await table.listAll() : await table.loadSubset(subset);
|
|
299
|
-
return mergeLocalOverServer(rows)
|
|
300
|
+
return mergeLocalOverServer(rows).map(
|
|
301
|
+
(row) => withNormalizedId(row)
|
|
302
|
+
);
|
|
300
303
|
} catch (e) {
|
|
301
304
|
onError?.(e);
|
|
302
305
|
return [];
|
|
@@ -314,24 +317,33 @@ function surrealCollectionOptions({
|
|
|
314
317
|
updated_at: now,
|
|
315
318
|
sync_deleted: false
|
|
316
319
|
} : baseRow;
|
|
320
|
+
const normalizedRow = withNormalizedId(row);
|
|
317
321
|
if (useLoro) {
|
|
318
|
-
loroPut(
|
|
322
|
+
loroPut(normalizedRow, false);
|
|
319
323
|
shouldCommitLoro = true;
|
|
320
324
|
}
|
|
321
|
-
if (isTempId(
|
|
322
|
-
const tempKey = keyOf(
|
|
323
|
-
const { id: _id, ...payload } =
|
|
325
|
+
if (isTempId(normalizedRow.id, config.table.name)) {
|
|
326
|
+
const tempKey = keyOf(normalizedRow.id);
|
|
327
|
+
const { id: _id, ...payload } = normalizedRow;
|
|
324
328
|
const persisted = await table.create(payload);
|
|
325
|
-
const resolvedRow = persisted?.id ?
|
|
329
|
+
const resolvedRow = persisted?.id ? withNormalizedId(
|
|
330
|
+
{
|
|
331
|
+
...normalizedRow,
|
|
332
|
+
...persisted,
|
|
333
|
+
id: persisted.id
|
|
334
|
+
}
|
|
335
|
+
) : normalizedRow;
|
|
326
336
|
if (useLoro && persisted?.id) {
|
|
327
337
|
loroRemove(tempKey, false);
|
|
328
338
|
loroPut(resolvedRow, false);
|
|
329
339
|
}
|
|
330
340
|
resultRows.push(resolvedRow);
|
|
331
341
|
} else {
|
|
332
|
-
const persisted = await table.create(
|
|
342
|
+
const persisted = await table.create(normalizedRow);
|
|
333
343
|
resultRows.push(
|
|
334
|
-
persisted ?
|
|
344
|
+
persisted ? withNormalizedId(
|
|
345
|
+
{ ...normalizedRow, ...persisted }
|
|
346
|
+
) : normalizedRow
|
|
335
347
|
);
|
|
336
348
|
}
|
|
337
349
|
}
|
|
@@ -350,14 +362,18 @@ function surrealCollectionOptions({
|
|
|
350
362
|
...m.modified
|
|
351
363
|
})
|
|
352
364
|
);
|
|
353
|
-
const baseRow = {
|
|
365
|
+
const baseRow = {
|
|
366
|
+
...normalizedModified,
|
|
367
|
+
id: keyOf(idKey)
|
|
368
|
+
};
|
|
354
369
|
const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
|
|
370
|
+
const normalizedRow = withNormalizedId(row);
|
|
355
371
|
if (useLoro) {
|
|
356
|
-
loroPut(
|
|
372
|
+
loroPut(normalizedRow, false);
|
|
357
373
|
shouldCommitLoro = true;
|
|
358
374
|
}
|
|
359
|
-
await table.update(normalizeMutationId(idKey),
|
|
360
|
-
writeUtils.writeUpsert?.(
|
|
375
|
+
await table.update(normalizeMutationId(idKey), normalizedRow);
|
|
376
|
+
writeUtils.writeUpsert?.(normalizedRow);
|
|
361
377
|
}
|
|
362
378
|
if (shouldCommitLoro) commitLoro();
|
|
363
379
|
return { refetch: false };
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/id.ts","../src/table.ts","../src/index.ts"],"names":["RecordId","Features"],"mappings":"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","file":"index.mjs","sourcesContent":["import { RecordId } from 'surrealdb';\n\nexport const stripOuterQuotes = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSingleQuoted =\n\t\ttrimmed.startsWith(\"'\") && trimmed.endsWith(\"'\") && trimmed.length >= 2;\n\tconst isDoubleQuoted =\n\t\ttrimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2;\n\tconst isBacktickQuoted =\n\t\ttrimmed.startsWith('`') && trimmed.endsWith('`') && trimmed.length >= 2;\n\treturn isSingleQuoted || isDoubleQuoted || isBacktickQuoted\n\t\t? trimmed.slice(1, -1)\n\t\t: trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string => {\n\tconst raw =\n\t\ttypeof rid === 'string' ? stripOuterQuotes(rid) : rid.toString();\n\tconst trimmed = stripOuterQuotes(raw).trim();\n\tconst idx = trimmed.indexOf(':');\n\tif (idx <= 0 || idx >= trimmed.length - 1) return trimmed;\n\n\tconst table = trimmed.slice(0, idx).trim();\n\tconst key = stripOuterQuotes(\n\t\tstripAngleBrackets(stripOuterQuotes(trimmed.slice(idx + 1).trim())),\n\t);\n\tif (!table || !key) return trimmed;\n\treturn `${table}:${key}`;\n};\n\nconst stripAngleBrackets = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSurrealAngles =\n\t\ttrimmed.startsWith('⟨') && trimmed.endsWith('⟩') && trimmed.length >= 2;\n\tconst isAsciiAngles =\n\t\ttrimmed.startsWith('<') && trimmed.endsWith('>') && trimmed.length >= 2;\n\treturn isSurrealAngles || isAsciiAngles\n\t\t? trimmed.slice(1, -1).trim()\n\t\t: trimmed;\n};\n\nexport const toRecordKeyString = (rid: RecordId | string): string => {\n\tconst normalized = toRecordIdString(rid);\n\tconst idx = normalized.indexOf(':');\n\tconst rawKey = idx > 0 ? normalized.slice(idx + 1) : normalized;\n\treturn stripOuterQuotes(rawKey.trim());\n};\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst looksLikeTableName = (value: string): boolean =>\n\t/^[A-Za-z_][A-Za-z0-9_-]*$/.test(value);\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tconst normalized = toRecordIdString(value);\n\tif (!isRecordIdString(normalized)) return undefined;\n\n\tconst idx = normalized.indexOf(':');\n\tconst table = stripOuterQuotes(normalized.slice(0, idx).trim());\n\tconst key = normalized.slice(idx + 1).trim();\n\tif (!table || !key || !looksLikeTableName(table)) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ??\n\t\t(unquoted === trimmed ? undefined : parseRecordIdString(trimmed));\n\tif (parsed) return parsed;\n\n\t// Keep original value shape if it isn't record-id-like\n\treturn value;\n};\n\nexport const normalizeRecordIdLikeFields = <T extends Record<string, unknown>>(\n\tdata: T,\n): T => {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(data)) {\n\t\tout[k] = normalizeRecordIdLikeValue(v);\n\t}\n\treturn out as T;\n};\n\nexport const toRecordId = (\n\ttableName: string,\n\tid: RecordId | string,\n): RecordId => {\n\tif (id instanceof RecordId) return id;\n\n\tconst normalized = toRecordIdString(id);\n\tconst prefixed = `${tableName}:`;\n\tconst key = normalized.startsWith(prefixed)\n\t\t? normalized.slice(prefixed.length)\n\t\t: normalized;\n\treturn new RecordId(tableName, key);\n};\n","import {\n\tand,\n\ttype ExprLike,\n\teq,\n\tFeatures,\n\ttype LiveMessage,\n\ttype LiveSubscription,\n\ttype RecordId,\n\ttype Surreal,\n\tTable,\n} from 'surrealdb';\nimport { toRecordId } from './id';\nimport type {\n\tFieldList,\n\tSurrealField,\n\tSurrealSubset,\n\tTableOptions,\n} from './types';\n\nconst normalizeFields = <T>(\n\traw: FieldList<T> | undefined,\n): ReadonlyArray<SurrealField<T>> => {\n\tif (!raw || raw === '*') return ['*' as SurrealField<T>];\n\treturn raw;\n};\n\nconst joinOrderBy = (\n\to: string | readonly string[] | undefined,\n): string | undefined => {\n\tif (!o) return undefined;\n\treturn typeof o === 'string' ? o : o.join(', ');\n};\n\ntype QueryResult<T> = T[] | null;\ntype RowResult<T> = T | T[] | null;\n\nconst firstRow = <T>(res: RowResult<T>): T | undefined => {\n\tif (!res) return undefined;\n\tif (Array.isArray(res)) return res[0];\n\treturn res;\n};\n\nexport function manageTable<T extends { id: string | RecordId }>(\n\tdb: Surreal,\n\tuseLoro: boolean,\n\t{ name, ...args }: TableOptions<T>,\n) {\n\tconst fields = normalizeFields<T>(args.fields);\n\tconst selectFields = fields.join(', ');\n\tconst table = new Table(name);\n\tconst aliveWhere = useLoro ? eq('sync_deleted', false) : undefined;\n\tconst baseWhere = aliveWhere\n\t\t? (args.where ? and(args.where, aliveWhere) : aliveWhere)\n\t\t: args.where;\n\tconst listAllSql = `SELECT ${selectFields} FROM type::table($table)${\n\t\tbaseWhere ? ' WHERE $where' : ''\n\t};`;\n\n\tconst getBaseWhere = (): ExprLike | undefined => baseWhere;\n\n\tconst listAll = async (): Promise<T[]> => {\n\t\tconst where = getBaseWhere();\n\t\tconst [res] = await db.query<[QueryResult<T>]>(listAllSql, {\n\t\t\ttable: name,\n\t\t\twhere,\n\t\t});\n\t\treturn res ?? [];\n\t};\n\n\tconst loadSubset = async (subset?: SurrealSubset): Promise<T[]> => {\n\t\tconst b = getBaseWhere();\n\t\tconst w = subset?.where;\n\t\tconst where = b && w ? and(b, w) : (b ?? w);\n\n\t\tconst whereSql = where ? ' WHERE $where' : '';\n\t\tconst order = joinOrderBy(subset?.orderBy);\n\t\tconst orderSql = order ? ` ORDER BY ${order}` : '';\n\t\tconst limitSql =\n\t\t\ttypeof subset?.limit === 'number' ? ' LIMIT $limit' : '';\n\t\tconst startSql =\n\t\t\ttypeof subset?.offset === 'number' ? ' START $offset' : '';\n\n\t\tconst sql = `SELECT ${selectFields} FROM type::table($table)${whereSql}${orderSql}${limitSql}${startSql};`;\n\n\t\tconst [res] = await db.query<[QueryResult<T>]>(sql, {\n\t\t\ttable: name,\n\t\t\twhere,\n\t\t\tlimit: subset?.limit,\n\t\t\toffset: subset?.offset,\n\t\t});\n\n\t\treturn res ?? [];\n\t};\n\n\tconst create = async (data: T | Partial<T>): Promise<T | undefined> => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tconst created = await db.create(table).content(data);\n\t\t\treturn firstRow(created as RowResult<T>);\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tconst inserted = await db.insert(table, payload);\n\t\treturn firstRow(inserted as RowResult<T>);\n\t};\n\n\tconst update = async (id: RecordId, data: T | Partial<T>) => {\n\t\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\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 = omitUndefined(\n\t\t\t\t\tnormalizeRecordIdLikeFields({\n\t\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t\t}) as Record<string, unknown>,\n\t\t\t\t) as Partial<T>;\n\t\t\t\tconst baseRow = { ...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"]}
|