@foretag/tanstack-db-surrealdb 0.3.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +73 -48
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +74 -49
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TanstackDB SurrealDB Collections
|
|
2
2
|
|
|
3
|
-
Add Offline / Local First Caching & Syncing to your SurrealDB app with TanstackDB and Loro (CRDTs). Designed for SurrealDB v3
|
|
3
|
+
Add Offline / Local First Caching & Syncing to your SurrealDB app with TanstackDB and Loro (CRDTs). Designed for SurrealDB v3 and SurrealDB JS SDK v2.
|
|
4
4
|
|
|
5
5
|
- Local / Offline first applications with TanstackDB and Loro
|
|
6
6
|
- High performance with Low resource consumption
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,7 @@ var normalizeRecordIdLikeValue = (value) => {
|
|
|
29
29
|
if (typeof value !== "string") return value;
|
|
30
30
|
const trimmed = value.trim();
|
|
31
31
|
const unquoted = stripOuterQuotes(trimmed);
|
|
32
|
-
const parsed = parseRecordIdString(unquoted) ?? parseRecordIdString(trimmed);
|
|
32
|
+
const parsed = parseRecordIdString(unquoted) ?? (unquoted === trimmed ? void 0 : parseRecordIdString(trimmed));
|
|
33
33
|
if (parsed) return parsed;
|
|
34
34
|
return value;
|
|
35
35
|
};
|
|
@@ -57,23 +57,22 @@ var joinOrderBy = (o) => {
|
|
|
57
57
|
};
|
|
58
58
|
function manageTable(db, useLoro, { name, ...args }) {
|
|
59
59
|
const fields = normalizeFields(args.fields);
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
60
|
+
const selectFields = fields.join(", ");
|
|
61
|
+
const table = new surrealdb.Table(name);
|
|
62
|
+
const aliveWhere = useLoro ? surrealdb.eq("sync_deleted", false) : void 0;
|
|
63
|
+
const baseWhere = aliveWhere ? args.where ? surrealdb.and(args.where, aliveWhere) : aliveWhere : args.where;
|
|
64
|
+
const listAllSql = `SELECT ${selectFields} FROM type::table($table)${baseWhere ? " WHERE $where" : ""};`;
|
|
65
|
+
const getBaseWhere = () => baseWhere;
|
|
65
66
|
const listAll = async () => {
|
|
66
|
-
const where =
|
|
67
|
-
const
|
|
68
|
-
const sql = `SELECT ${fields.join(", ")} FROM type::table($table)${whereSql};`;
|
|
69
|
-
const [res] = await db.query(sql, {
|
|
67
|
+
const where = getBaseWhere();
|
|
68
|
+
const [res] = await db.query(listAllSql, {
|
|
70
69
|
table: name,
|
|
71
70
|
where
|
|
72
71
|
});
|
|
73
72
|
return res ?? [];
|
|
74
73
|
};
|
|
75
74
|
const loadSubset = async (subset) => {
|
|
76
|
-
const b =
|
|
75
|
+
const b = getBaseWhere();
|
|
77
76
|
const w = subset?.where;
|
|
78
77
|
const where = b && w ? surrealdb.and(b, w) : b ?? w;
|
|
79
78
|
const whereSql = where ? " WHERE $where" : "";
|
|
@@ -81,7 +80,7 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
81
80
|
const orderSql = order ? ` ORDER BY ${order}` : "";
|
|
82
81
|
const limitSql = typeof subset?.limit === "number" ? " LIMIT $limit" : "";
|
|
83
82
|
const startSql = typeof subset?.offset === "number" ? " START $offset" : "";
|
|
84
|
-
const sql = `SELECT ${
|
|
83
|
+
const sql = `SELECT ${selectFields} FROM type::table($table)${whereSql}${orderSql}${limitSql}${startSql};`;
|
|
85
84
|
const [res] = await db.query(sql, {
|
|
86
85
|
table: name,
|
|
87
86
|
where,
|
|
@@ -93,12 +92,12 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
93
92
|
const create = async (data) => {
|
|
94
93
|
const id = data.id;
|
|
95
94
|
if (!id) {
|
|
96
|
-
await db.create(
|
|
95
|
+
await db.create(table).content(data);
|
|
97
96
|
return;
|
|
98
97
|
}
|
|
99
98
|
const payload = { ...data };
|
|
100
99
|
payload.id = toRecordId(name, id);
|
|
101
|
-
await db.insert(
|
|
100
|
+
await db.insert(table, payload);
|
|
102
101
|
};
|
|
103
102
|
const update = async (id, data) => {
|
|
104
103
|
if (!useLoro) {
|
|
@@ -137,7 +136,7 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
137
136
|
};
|
|
138
137
|
const start = async () => {
|
|
139
138
|
if (!db.isFeatureSupported(surrealdb.Features.LiveQueries)) return;
|
|
140
|
-
live = await db.live(
|
|
139
|
+
live = await db.live(table).where(args.where);
|
|
141
140
|
live.subscribe(on);
|
|
142
141
|
};
|
|
143
142
|
void start();
|
|
@@ -159,22 +158,32 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
159
158
|
}
|
|
160
159
|
|
|
161
160
|
// src/index.ts
|
|
161
|
+
var TEMP_ID_PREFIX = "__temp__";
|
|
162
|
+
var NOOP = () => {
|
|
163
|
+
};
|
|
164
|
+
var createTempRecordId = (tableName) => {
|
|
165
|
+
const suffix = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
166
|
+
return new surrealdb.RecordId(tableName, `${TEMP_ID_PREFIX}${suffix}`);
|
|
167
|
+
};
|
|
168
|
+
var isTempId = (id, tableName) => {
|
|
169
|
+
if (id instanceof surrealdb.RecordId) {
|
|
170
|
+
const recordKey = id.id;
|
|
171
|
+
return typeof recordKey === "string" && recordKey.startsWith(TEMP_ID_PREFIX);
|
|
172
|
+
}
|
|
173
|
+
const raw = toRecordIdString(id);
|
|
174
|
+
const key = raw.startsWith(`${tableName}:`) ? raw.slice(tableName.length + 1) : raw;
|
|
175
|
+
return key.startsWith(TEMP_ID_PREFIX);
|
|
176
|
+
};
|
|
162
177
|
function toCleanup(res) {
|
|
163
|
-
if (!res) return
|
|
164
|
-
};
|
|
178
|
+
if (!res) return NOOP;
|
|
165
179
|
if (typeof res === "function") return res;
|
|
166
180
|
const cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;
|
|
167
|
-
return typeof cleanup === "function" ? cleanup :
|
|
168
|
-
};
|
|
181
|
+
return typeof cleanup === "function" ? cleanup : NOOP;
|
|
169
182
|
}
|
|
170
183
|
function hasLoadSubset(res) {
|
|
171
184
|
return typeof res === "object" && res !== null && "loadSubset" in res;
|
|
172
185
|
}
|
|
173
186
|
function createInsertSchema(tableName) {
|
|
174
|
-
const createId = () => {
|
|
175
|
-
const uuid = typeof globalThis !== "undefined" && "crypto" in globalThis && typeof globalThis.crypto?.randomUUID === "function" ? globalThis.crypto.randomUUID() : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
176
|
-
return new surrealdb.RecordId(tableName, uuid);
|
|
177
|
-
};
|
|
178
187
|
return {
|
|
179
188
|
"~standard": {
|
|
180
189
|
version: 1,
|
|
@@ -188,7 +197,7 @@ function createInsertSchema(tableName) {
|
|
|
188
197
|
const data = normalizeRecordIdLikeFields({
|
|
189
198
|
...value
|
|
190
199
|
});
|
|
191
|
-
if (!data.id) data.id =
|
|
200
|
+
if (!data.id) data.id = createTempRecordId(tableName);
|
|
192
201
|
return { value: data };
|
|
193
202
|
},
|
|
194
203
|
types: void 0
|
|
@@ -210,28 +219,29 @@ function surrealCollectionOptions({
|
|
|
210
219
|
const table = manageTable(db, useLoro, config.table);
|
|
211
220
|
const keyOf = (rid) => toRecordIdString(rid);
|
|
212
221
|
const getKey = (row) => keyOf(row.id);
|
|
222
|
+
const normalizeMutationId = (rid) => new surrealdb.RecordId(config.table.name, keyOf(rid));
|
|
213
223
|
const loroKey = loro?.key ?? id ?? "surreal";
|
|
214
224
|
const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
|
|
215
|
-
const
|
|
225
|
+
const commitLoro = () => {
|
|
226
|
+
loro?.doc?.commit?.();
|
|
227
|
+
};
|
|
228
|
+
const loroPut = (row, commit = true) => {
|
|
216
229
|
if (!loroMap) return;
|
|
217
230
|
loroMap.set(getKey(row), row);
|
|
218
|
-
|
|
231
|
+
if (commit) commitLoro();
|
|
219
232
|
};
|
|
220
|
-
const loroRemove = (idStr) => {
|
|
233
|
+
const loroRemove = (idStr, commit = true) => {
|
|
221
234
|
if (!loroMap) return;
|
|
222
235
|
loroMap.delete(idStr);
|
|
223
|
-
|
|
236
|
+
if (commit) commitLoro();
|
|
224
237
|
};
|
|
225
238
|
const mergeLocalOverServer = (serverRows) => {
|
|
226
239
|
if (!useLoro || !loroMap) return serverRows;
|
|
227
240
|
const localJson = loroMap.toJSON?.() ?? {};
|
|
228
|
-
const localById = new Map(
|
|
229
|
-
Object.values(localJson).map((r) => [getKey(r), r])
|
|
230
|
-
);
|
|
231
241
|
const out = [];
|
|
232
242
|
for (const s of serverRows) {
|
|
233
243
|
const idStr = getKey(s);
|
|
234
|
-
const l =
|
|
244
|
+
const l = localJson[idStr];
|
|
235
245
|
if (!l) {
|
|
236
246
|
out.push(s);
|
|
237
247
|
continue;
|
|
@@ -243,7 +253,7 @@ function surrealCollectionOptions({
|
|
|
243
253
|
};
|
|
244
254
|
const base = queryDbCollection.queryCollectionOptions({
|
|
245
255
|
schema: createInsertSchema(config.table.name),
|
|
246
|
-
getKey
|
|
256
|
+
getKey,
|
|
247
257
|
queryKey,
|
|
248
258
|
queryClient,
|
|
249
259
|
syncMode,
|
|
@@ -258,25 +268,36 @@ function surrealCollectionOptions({
|
|
|
258
268
|
}
|
|
259
269
|
},
|
|
260
270
|
onInsert: (async (p) => {
|
|
261
|
-
const now =
|
|
271
|
+
const now = /* @__PURE__ */ new Date();
|
|
262
272
|
const resultRows = [];
|
|
273
|
+
let shouldCommitLoro = false;
|
|
263
274
|
for (const m of p.transaction.mutations) {
|
|
264
275
|
if (m.type !== "insert") continue;
|
|
265
276
|
const baseRow = { ...m.modified };
|
|
266
277
|
const row = useLoro ? {
|
|
267
278
|
...baseRow,
|
|
268
|
-
updated_at: now
|
|
279
|
+
updated_at: now,
|
|
269
280
|
sync_deleted: false
|
|
270
281
|
} : baseRow;
|
|
271
|
-
if (useLoro)
|
|
272
|
-
|
|
282
|
+
if (useLoro) {
|
|
283
|
+
loroPut(row, false);
|
|
284
|
+
shouldCommitLoro = true;
|
|
285
|
+
}
|
|
286
|
+
if (isTempId(row.id, config.table.name)) {
|
|
287
|
+
const { id: _id, ...payload } = row;
|
|
288
|
+
await table.create(payload);
|
|
289
|
+
} else {
|
|
290
|
+
await table.create(row);
|
|
291
|
+
}
|
|
273
292
|
resultRows.push(row);
|
|
274
293
|
}
|
|
294
|
+
if (shouldCommitLoro) commitLoro();
|
|
275
295
|
return resultRows;
|
|
276
296
|
}),
|
|
277
297
|
onUpdate: (async (p) => {
|
|
278
|
-
const now =
|
|
298
|
+
const now = /* @__PURE__ */ new Date();
|
|
279
299
|
const resultRows = [];
|
|
300
|
+
let shouldCommitLoro = false;
|
|
280
301
|
for (const m of p.transaction.mutations) {
|
|
281
302
|
if (m.type !== "update") continue;
|
|
282
303
|
const idKey = m.key;
|
|
@@ -284,25 +305,29 @@ function surrealCollectionOptions({
|
|
|
284
305
|
...m.modified
|
|
285
306
|
});
|
|
286
307
|
const baseRow = { ...normalizedModified, id: idKey };
|
|
287
|
-
const row = useLoro ? { ...baseRow, updated_at: now
|
|
288
|
-
if (useLoro)
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
);
|
|
308
|
+
const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
|
|
309
|
+
if (useLoro) {
|
|
310
|
+
loroPut(row, false);
|
|
311
|
+
shouldCommitLoro = true;
|
|
312
|
+
}
|
|
313
|
+
await table.update(normalizeMutationId(idKey), row);
|
|
293
314
|
resultRows.push(row);
|
|
294
315
|
}
|
|
316
|
+
if (shouldCommitLoro) commitLoro();
|
|
295
317
|
return resultRows;
|
|
296
318
|
}),
|
|
297
319
|
onDelete: (async (p) => {
|
|
320
|
+
let shouldCommitLoro = false;
|
|
298
321
|
for (const m of p.transaction.mutations) {
|
|
299
322
|
if (m.type !== "delete") continue;
|
|
300
323
|
const idKey = m.key;
|
|
301
|
-
if (useLoro)
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
324
|
+
if (useLoro) {
|
|
325
|
+
loroRemove(keyOf(idKey), false);
|
|
326
|
+
shouldCommitLoro = true;
|
|
327
|
+
}
|
|
328
|
+
await table.softDelete(normalizeMutationId(idKey));
|
|
305
329
|
}
|
|
330
|
+
if (shouldCommitLoro) commitLoro();
|
|
306
331
|
return [];
|
|
307
332
|
})
|
|
308
333
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/id.ts","../src/table.ts","../src/index.ts"],"names":["RecordId","eq","and","Table","Features","LoroDoc","queryCollectionOptions"],"mappings":"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","file":"index.js","sourcesContent":["import { RecordId } from 'surrealdb';\n\nexport const stripOuterQuotes = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSingleQuoted =\n\t\ttrimmed.startsWith(\"'\") && trimmed.endsWith(\"'\") && trimmed.length >= 2;\n\tconst isDoubleQuoted =\n\t\ttrimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2;\n\treturn isSingleQuoted || isDoubleQuoted ? trimmed.slice(1, -1) : trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string =>\n\ttypeof rid === 'string'\n\t\t? stripOuterQuotes(rid)\n\t\t: stripOuterQuotes(rid.toString());\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tif (!isRecordIdString(value)) return undefined;\n\n\tconst idx = value.indexOf(':');\n\tconst table = value.slice(0, idx).trim();\n\tconst key = value.slice(idx + 1).trim();\n\tif (!table || !key) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ?? 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;\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\n\tconst baseWhere = (): ExprLike | undefined => {\n\t\tif (!useLoro) return args.where;\n\t\tconst alive = eq('sync_deleted', false);\n\t\treturn args.where ? and(args.where, alive) : alive;\n\t};\n\n\tconst listAll = async (): Promise<T[]> => {\n\t\tconst where = baseWhere();\n\t\tconst whereSql = where ? ' WHERE $where' : '';\n\t\tconst sql = `SELECT ${fields.join(', ')} FROM type::table($table)${whereSql};`;\n\t\tconst [res] = await db.query<[QueryResult<T>]>(sql, {\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 = baseWhere();\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 ${fields.join(', ')} 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>) => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tawait db.create(new Table(name)).content(data);\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tawait db.insert(new Table(name), payload);\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(new Table(name)).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 { normalizeRecordIdLikeFields, toRecordIdString } 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 { SurrealSubset } from './types';\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\nfunction toCleanup(res: SyncReturn): Cleanup {\n\tif (!res) return () => {};\n\tif (typeof res === 'function') return res;\n\n\tconst cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;\n\n\treturn typeof cleanup === 'function' ? cleanup : () => {};\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\nfunction createInsertSchema<T extends { id: string | RecordId }>(\n\ttableName: string,\n): StandardSchemaV1<MutationInput<T>, T> {\n\tconst createId = (): RecordId => {\n\t\tconst uuid =\n\t\t\ttypeof globalThis !== 'undefined' &&\n\t\t\t'crypto' in globalThis &&\n\t\t\ttypeof globalThis.crypto?.randomUUID === 'function'\n\t\t\t\t? globalThis.crypto.randomUUID()\n\t\t\t\t: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n\n\t\treturn new RecordId(tableName, uuid);\n\t};\n\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) data.id = createId() 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\n\tconst loroKey = loro?.key ?? id ?? 'surreal';\n\tconst loroMap = useLoro ? (loro?.doc?.getMap?.(loroKey) ?? null) : null;\n\n\tconst loroPut = (row: T) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.set(getKey(row), row as unknown);\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst loroRemove = (idStr: string) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.delete(idStr);\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst mergeLocalOverServer = (serverRows: T[]): T[] => {\n\t\tif (!useLoro || !loroMap) return serverRows;\n\n\t\tconst localJson = loroMap.toJSON?.() ?? {};\n\t\tconst localById = new Map<string, T>(\n\t\t\tObject.values(localJson).map((r) => [getKey(r as T), r as T]),\n\t\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 = localById.get(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: (row) => getKey(row),\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\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) loroPut(row);\n\t\t\t\tawait table.create(row);\n\t\t\t\tresultRows.push(row);\n\t\t\t}\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\n\t\t\tconst resultRows: T[] = [];\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t}) as Partial<T>;\n\t\t\t\tconst baseRow = { ...normalizedModified, id: idKey } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now() } as T)\n\t\t\t\t\t: baseRow;\n\n\t\t\t\tif (useLoro) loroPut(row);\n\n\t\t\t\tawait table.update(\n\t\t\t\t\tnew RecordId(config.table.name, keyOf(idKey)),\n\t\t\t\t\trow,\n\t\t\t\t);\n\n\t\t\t\tresultRows.push(row);\n\t\t\t}\n\n\t\t\treturn resultRows 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\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\tif (useLoro) loroRemove(keyOf(idKey));\n\n\t\t\t\tawait table.softDelete(\n\t\t\t\t\tnew RecordId(config.table.name, keyOf(idKey)),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [] as unknown as StandardSchema<T>;\n\t\t}) as DeleteMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\t} as never) as SurrealCollectionOptionsReturn<T>;\n\n\t// LIVE updates -> invalidate all subsets under base queryKey\n\tconst baseSync = base.sync?.sync;\n\n\tconst sync = baseSync\n\t\t? {\n\t\t\t\tsync: (ctx: Parameters<NonNullable<typeof baseSync>>[0]) => {\n\t\t\t\t\t// IMPORTANT: call baseSync exactly once\n\t\t\t\t\tconst baseRes = baseSync(ctx) as SyncReturn;\n\t\t\t\t\tconst baseCleanup = toCleanup(baseRes);\n\n\t\t\t\t\t// If live queries aren't supported, return the base result untouched\n\t\t\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) {\n\t\t\t\t\t\treturn baseRes as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst offLive = table.subscribe((evt) => {\n\t\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\t\tif (evt.type === 'delete') {\n\t\t\t\t\t\t\t\tloroRemove(getKey(evt.row));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloroPut(evt.row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid queryClient\n\t\t\t\t\t\t\t.invalidateQueries({ queryKey, exact: false })\n\t\t\t\t\t\t\t.catch((e) => onError?.(e));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Preserve base return shape, just wrap cleanup\n\t\t\t\t\tif (hasLoadSubset(baseRes)) {\n\t\t\t\t\t\t// on-demand mode relies on this being present\n\t\t\t\t\t\tconst resObj = baseRes as Record<string, unknown>;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...resObj,\n\t\t\t\t\t\t\tcleanup: () => {\n\t\t\t\t\t\t\t\toffLive();\n\t\t\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\t// eager mode usually returns a cleanup function\n\t\t\t\t\treturn (() => {\n\t\t\t\t\t\toffLive();\n\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t}) as unknown as ReturnType<NonNullable<typeof baseSync>>;\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\t...base,\n\t\tsync: sync ?? base.sync,\n\t} as SurrealCollectionOptionsReturn<T>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/id.ts","../src/table.ts","../src/index.ts"],"names":["RecordId","Table","eq","and","Features","LoroDoc","queryCollectionOptions"],"mappings":"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","file":"index.js","sourcesContent":["import { RecordId } from 'surrealdb';\n\nexport const stripOuterQuotes = (value: string): string => {\n\tconst trimmed = value.trim();\n\tconst isSingleQuoted =\n\t\ttrimmed.startsWith(\"'\") && trimmed.endsWith(\"'\") && trimmed.length >= 2;\n\tconst isDoubleQuoted =\n\t\ttrimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2;\n\treturn isSingleQuoted || isDoubleQuoted ? trimmed.slice(1, -1) : trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string =>\n\ttypeof rid === 'string'\n\t\t? stripOuterQuotes(rid)\n\t\t: stripOuterQuotes(rid.toString());\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tif (!isRecordIdString(value)) return undefined;\n\n\tconst idx = value.indexOf(':');\n\tconst table = value.slice(0, idx).trim();\n\tconst key = value.slice(idx + 1).trim();\n\tif (!table || !key) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ??\n\t\t(unquoted === trimmed ? undefined : parseRecordIdString(trimmed));\n\tif (parsed) return parsed;\n\n\t// Keep original value shape if it isn't record-id-like\n\treturn value;\n};\n\nexport const normalizeRecordIdLikeFields = <T extends Record<string, unknown>>(\n\tdata: T,\n): T => {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(data)) {\n\t\tout[k] = normalizeRecordIdLikeValue(v);\n\t}\n\treturn out as T;\n};\n\nexport const toRecordId = (\n\ttableName: string,\n\tid: RecordId | string,\n): RecordId => {\n\tif (id instanceof RecordId) return id;\n\n\tconst normalized = toRecordIdString(id);\n\tconst prefixed = `${tableName}:`;\n\tconst key = normalized.startsWith(prefixed)\n\t\t? normalized.slice(prefixed.length)\n\t\t: normalized;\n\treturn new RecordId(tableName, key);\n};\n","import {\n\tand,\n\ttype ExprLike,\n\teq,\n\tFeatures,\n\ttype LiveMessage,\n\ttype LiveSubscription,\n\ttype RecordId,\n\ttype Surreal,\n\tTable,\n} from 'surrealdb';\nimport { toRecordId } from './id';\nimport type {\n\tFieldList,\n\tSurrealField,\n\tSurrealSubset,\n\tTableOptions,\n} from './types';\n\nconst normalizeFields = <T>(\n\traw: FieldList<T> | undefined,\n): ReadonlyArray<SurrealField<T>> => {\n\tif (!raw || raw === '*') return ['*' as SurrealField<T>];\n\treturn raw;\n};\n\nconst joinOrderBy = (\n\to: string | readonly string[] | undefined,\n): string | undefined => {\n\tif (!o) return undefined;\n\treturn typeof o === 'string' ? o : o.join(', ');\n};\n\ntype QueryResult<T> = T[] | null;\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>) => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tawait db.create(table).content(data);\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tawait db.insert(table, payload);\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 { normalizeRecordIdLikeFields, toRecordIdString } 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 type { SurrealSubset } from './types';\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\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' && recordKey.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\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) data.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\tnew RecordId(config.table.name, keyOf(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 { 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\tawait table.create(payload as Partial<T>);\n\t\t\t\t} else {\n\t\t\t\t\tawait table.create(row);\n\t\t\t\t}\n\t\t\t\tresultRows.push(row);\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\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t}) as Partial<T>;\n\t\t\t\tconst baseRow = { ...normalizedModified, id: idKey } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t: baseRow;\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(row, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), row);\n\n\t\t\t\tresultRows.push(row);\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 UpdateMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonDelete: (async (p: DeleteMutationFnParams<T>) => {\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\tif (useLoro) {\n\t\t\t\t\tloroRemove(keyOf(idKey), 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}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn [] as unknown as StandardSchema<T>;\n\t\t}) as DeleteMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\t} as never) as SurrealCollectionOptionsReturn<T>;\n\n\t// LIVE updates -> invalidate all subsets under base queryKey\n\tconst baseSync = base.sync?.sync;\n\n\tconst sync = baseSync\n\t\t? {\n\t\t\t\tsync: (ctx: Parameters<NonNullable<typeof baseSync>>[0]) => {\n\t\t\t\t\t// IMPORTANT: call baseSync exactly once\n\t\t\t\t\tconst baseRes = baseSync(ctx) as SyncReturn;\n\t\t\t\t\tconst baseCleanup = toCleanup(baseRes);\n\n\t\t\t\t\t// If live queries aren't supported, return the base result untouched\n\t\t\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) {\n\t\t\t\t\t\treturn baseRes as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst offLive = table.subscribe((evt) => {\n\t\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\t\tif (evt.type === 'delete') {\n\t\t\t\t\t\t\t\tloroRemove(getKey(evt.row));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloroPut(evt.row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid queryClient\n\t\t\t\t\t\t\t.invalidateQueries({ queryKey, exact: false })\n\t\t\t\t\t\t\t.catch((e) => onError?.(e));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Preserve base return shape, just wrap cleanup\n\t\t\t\t\tif (hasLoadSubset(baseRes)) {\n\t\t\t\t\t\t// on-demand mode relies on this being present\n\t\t\t\t\t\tconst resObj = baseRes as Record<string, unknown>;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...resObj,\n\t\t\t\t\t\t\tcleanup: () => {\n\t\t\t\t\t\t\t\toffLive();\n\t\t\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\t// eager mode usually returns a cleanup function\n\t\t\t\t\treturn (() => {\n\t\t\t\t\t\toffLive();\n\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t}) as unknown as ReturnType<NonNullable<typeof baseSync>>;\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\t...base,\n\t\tsync: sync ?? base.sync,\n\t} as SurrealCollectionOptionsReturn<T>;\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { queryCollectionOptions } from '@tanstack/query-db-collection';
|
|
2
2
|
import { LoroDoc } from 'loro-crdt';
|
|
3
|
-
import { RecordId, Features, Table,
|
|
3
|
+
import { RecordId, Features, Table, eq, and } from 'surrealdb';
|
|
4
4
|
|
|
5
5
|
// src/index.ts
|
|
6
6
|
var stripOuterQuotes = (value) => {
|
|
@@ -27,7 +27,7 @@ var normalizeRecordIdLikeValue = (value) => {
|
|
|
27
27
|
if (typeof value !== "string") return value;
|
|
28
28
|
const trimmed = value.trim();
|
|
29
29
|
const unquoted = stripOuterQuotes(trimmed);
|
|
30
|
-
const parsed = parseRecordIdString(unquoted) ?? parseRecordIdString(trimmed);
|
|
30
|
+
const parsed = parseRecordIdString(unquoted) ?? (unquoted === trimmed ? void 0 : parseRecordIdString(trimmed));
|
|
31
31
|
if (parsed) return parsed;
|
|
32
32
|
return value;
|
|
33
33
|
};
|
|
@@ -55,23 +55,22 @@ var joinOrderBy = (o) => {
|
|
|
55
55
|
};
|
|
56
56
|
function manageTable(db, useLoro, { name, ...args }) {
|
|
57
57
|
const fields = normalizeFields(args.fields);
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
58
|
+
const selectFields = fields.join(", ");
|
|
59
|
+
const table = new Table(name);
|
|
60
|
+
const aliveWhere = useLoro ? eq("sync_deleted", false) : void 0;
|
|
61
|
+
const baseWhere = aliveWhere ? args.where ? and(args.where, aliveWhere) : aliveWhere : args.where;
|
|
62
|
+
const listAllSql = `SELECT ${selectFields} FROM type::table($table)${baseWhere ? " WHERE $where" : ""};`;
|
|
63
|
+
const getBaseWhere = () => baseWhere;
|
|
63
64
|
const listAll = async () => {
|
|
64
|
-
const where =
|
|
65
|
-
const
|
|
66
|
-
const sql = `SELECT ${fields.join(", ")} FROM type::table($table)${whereSql};`;
|
|
67
|
-
const [res] = await db.query(sql, {
|
|
65
|
+
const where = getBaseWhere();
|
|
66
|
+
const [res] = await db.query(listAllSql, {
|
|
68
67
|
table: name,
|
|
69
68
|
where
|
|
70
69
|
});
|
|
71
70
|
return res ?? [];
|
|
72
71
|
};
|
|
73
72
|
const loadSubset = async (subset) => {
|
|
74
|
-
const b =
|
|
73
|
+
const b = getBaseWhere();
|
|
75
74
|
const w = subset?.where;
|
|
76
75
|
const where = b && w ? and(b, w) : b ?? w;
|
|
77
76
|
const whereSql = where ? " WHERE $where" : "";
|
|
@@ -79,7 +78,7 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
79
78
|
const orderSql = order ? ` ORDER BY ${order}` : "";
|
|
80
79
|
const limitSql = typeof subset?.limit === "number" ? " LIMIT $limit" : "";
|
|
81
80
|
const startSql = typeof subset?.offset === "number" ? " START $offset" : "";
|
|
82
|
-
const sql = `SELECT ${
|
|
81
|
+
const sql = `SELECT ${selectFields} FROM type::table($table)${whereSql}${orderSql}${limitSql}${startSql};`;
|
|
83
82
|
const [res] = await db.query(sql, {
|
|
84
83
|
table: name,
|
|
85
84
|
where,
|
|
@@ -91,12 +90,12 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
91
90
|
const create = async (data) => {
|
|
92
91
|
const id = data.id;
|
|
93
92
|
if (!id) {
|
|
94
|
-
await db.create(
|
|
93
|
+
await db.create(table).content(data);
|
|
95
94
|
return;
|
|
96
95
|
}
|
|
97
96
|
const payload = { ...data };
|
|
98
97
|
payload.id = toRecordId(name, id);
|
|
99
|
-
await db.insert(
|
|
98
|
+
await db.insert(table, payload);
|
|
100
99
|
};
|
|
101
100
|
const update = async (id, data) => {
|
|
102
101
|
if (!useLoro) {
|
|
@@ -135,7 +134,7 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
135
134
|
};
|
|
136
135
|
const start = async () => {
|
|
137
136
|
if (!db.isFeatureSupported(Features.LiveQueries)) return;
|
|
138
|
-
live = await db.live(
|
|
137
|
+
live = await db.live(table).where(args.where);
|
|
139
138
|
live.subscribe(on);
|
|
140
139
|
};
|
|
141
140
|
void start();
|
|
@@ -157,22 +156,32 @@ function manageTable(db, useLoro, { name, ...args }) {
|
|
|
157
156
|
}
|
|
158
157
|
|
|
159
158
|
// src/index.ts
|
|
159
|
+
var TEMP_ID_PREFIX = "__temp__";
|
|
160
|
+
var NOOP = () => {
|
|
161
|
+
};
|
|
162
|
+
var createTempRecordId = (tableName) => {
|
|
163
|
+
const suffix = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
164
|
+
return new RecordId(tableName, `${TEMP_ID_PREFIX}${suffix}`);
|
|
165
|
+
};
|
|
166
|
+
var isTempId = (id, tableName) => {
|
|
167
|
+
if (id instanceof RecordId) {
|
|
168
|
+
const recordKey = id.id;
|
|
169
|
+
return typeof recordKey === "string" && recordKey.startsWith(TEMP_ID_PREFIX);
|
|
170
|
+
}
|
|
171
|
+
const raw = toRecordIdString(id);
|
|
172
|
+
const key = raw.startsWith(`${tableName}:`) ? raw.slice(tableName.length + 1) : raw;
|
|
173
|
+
return key.startsWith(TEMP_ID_PREFIX);
|
|
174
|
+
};
|
|
160
175
|
function toCleanup(res) {
|
|
161
|
-
if (!res) return
|
|
162
|
-
};
|
|
176
|
+
if (!res) return NOOP;
|
|
163
177
|
if (typeof res === "function") return res;
|
|
164
178
|
const cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;
|
|
165
|
-
return typeof cleanup === "function" ? cleanup :
|
|
166
|
-
};
|
|
179
|
+
return typeof cleanup === "function" ? cleanup : NOOP;
|
|
167
180
|
}
|
|
168
181
|
function hasLoadSubset(res) {
|
|
169
182
|
return typeof res === "object" && res !== null && "loadSubset" in res;
|
|
170
183
|
}
|
|
171
184
|
function createInsertSchema(tableName) {
|
|
172
|
-
const createId = () => {
|
|
173
|
-
const uuid = typeof globalThis !== "undefined" && "crypto" in globalThis && typeof globalThis.crypto?.randomUUID === "function" ? globalThis.crypto.randomUUID() : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
174
|
-
return new RecordId(tableName, uuid);
|
|
175
|
-
};
|
|
176
185
|
return {
|
|
177
186
|
"~standard": {
|
|
178
187
|
version: 1,
|
|
@@ -186,7 +195,7 @@ function createInsertSchema(tableName) {
|
|
|
186
195
|
const data = normalizeRecordIdLikeFields({
|
|
187
196
|
...value
|
|
188
197
|
});
|
|
189
|
-
if (!data.id) data.id =
|
|
198
|
+
if (!data.id) data.id = createTempRecordId(tableName);
|
|
190
199
|
return { value: data };
|
|
191
200
|
},
|
|
192
201
|
types: void 0
|
|
@@ -208,28 +217,29 @@ function surrealCollectionOptions({
|
|
|
208
217
|
const table = manageTable(db, useLoro, config.table);
|
|
209
218
|
const keyOf = (rid) => toRecordIdString(rid);
|
|
210
219
|
const getKey = (row) => keyOf(row.id);
|
|
220
|
+
const normalizeMutationId = (rid) => new RecordId(config.table.name, keyOf(rid));
|
|
211
221
|
const loroKey = loro?.key ?? id ?? "surreal";
|
|
212
222
|
const loroMap = useLoro ? loro?.doc?.getMap?.(loroKey) ?? null : null;
|
|
213
|
-
const
|
|
223
|
+
const commitLoro = () => {
|
|
224
|
+
loro?.doc?.commit?.();
|
|
225
|
+
};
|
|
226
|
+
const loroPut = (row, commit = true) => {
|
|
214
227
|
if (!loroMap) return;
|
|
215
228
|
loroMap.set(getKey(row), row);
|
|
216
|
-
|
|
229
|
+
if (commit) commitLoro();
|
|
217
230
|
};
|
|
218
|
-
const loroRemove = (idStr) => {
|
|
231
|
+
const loroRemove = (idStr, commit = true) => {
|
|
219
232
|
if (!loroMap) return;
|
|
220
233
|
loroMap.delete(idStr);
|
|
221
|
-
|
|
234
|
+
if (commit) commitLoro();
|
|
222
235
|
};
|
|
223
236
|
const mergeLocalOverServer = (serverRows) => {
|
|
224
237
|
if (!useLoro || !loroMap) return serverRows;
|
|
225
238
|
const localJson = loroMap.toJSON?.() ?? {};
|
|
226
|
-
const localById = new Map(
|
|
227
|
-
Object.values(localJson).map((r) => [getKey(r), r])
|
|
228
|
-
);
|
|
229
239
|
const out = [];
|
|
230
240
|
for (const s of serverRows) {
|
|
231
241
|
const idStr = getKey(s);
|
|
232
|
-
const l =
|
|
242
|
+
const l = localJson[idStr];
|
|
233
243
|
if (!l) {
|
|
234
244
|
out.push(s);
|
|
235
245
|
continue;
|
|
@@ -241,7 +251,7 @@ function surrealCollectionOptions({
|
|
|
241
251
|
};
|
|
242
252
|
const base = queryCollectionOptions({
|
|
243
253
|
schema: createInsertSchema(config.table.name),
|
|
244
|
-
getKey
|
|
254
|
+
getKey,
|
|
245
255
|
queryKey,
|
|
246
256
|
queryClient,
|
|
247
257
|
syncMode,
|
|
@@ -256,25 +266,36 @@ function surrealCollectionOptions({
|
|
|
256
266
|
}
|
|
257
267
|
},
|
|
258
268
|
onInsert: (async (p) => {
|
|
259
|
-
const now =
|
|
269
|
+
const now = /* @__PURE__ */ new Date();
|
|
260
270
|
const resultRows = [];
|
|
271
|
+
let shouldCommitLoro = false;
|
|
261
272
|
for (const m of p.transaction.mutations) {
|
|
262
273
|
if (m.type !== "insert") continue;
|
|
263
274
|
const baseRow = { ...m.modified };
|
|
264
275
|
const row = useLoro ? {
|
|
265
276
|
...baseRow,
|
|
266
|
-
updated_at: now
|
|
277
|
+
updated_at: now,
|
|
267
278
|
sync_deleted: false
|
|
268
279
|
} : baseRow;
|
|
269
|
-
if (useLoro)
|
|
270
|
-
|
|
280
|
+
if (useLoro) {
|
|
281
|
+
loroPut(row, false);
|
|
282
|
+
shouldCommitLoro = true;
|
|
283
|
+
}
|
|
284
|
+
if (isTempId(row.id, config.table.name)) {
|
|
285
|
+
const { id: _id, ...payload } = row;
|
|
286
|
+
await table.create(payload);
|
|
287
|
+
} else {
|
|
288
|
+
await table.create(row);
|
|
289
|
+
}
|
|
271
290
|
resultRows.push(row);
|
|
272
291
|
}
|
|
292
|
+
if (shouldCommitLoro) commitLoro();
|
|
273
293
|
return resultRows;
|
|
274
294
|
}),
|
|
275
295
|
onUpdate: (async (p) => {
|
|
276
|
-
const now =
|
|
296
|
+
const now = /* @__PURE__ */ new Date();
|
|
277
297
|
const resultRows = [];
|
|
298
|
+
let shouldCommitLoro = false;
|
|
278
299
|
for (const m of p.transaction.mutations) {
|
|
279
300
|
if (m.type !== "update") continue;
|
|
280
301
|
const idKey = m.key;
|
|
@@ -282,25 +303,29 @@ function surrealCollectionOptions({
|
|
|
282
303
|
...m.modified
|
|
283
304
|
});
|
|
284
305
|
const baseRow = { ...normalizedModified, id: idKey };
|
|
285
|
-
const row = useLoro ? { ...baseRow, updated_at: now
|
|
286
|
-
if (useLoro)
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
);
|
|
306
|
+
const row = useLoro ? { ...baseRow, updated_at: now } : baseRow;
|
|
307
|
+
if (useLoro) {
|
|
308
|
+
loroPut(row, false);
|
|
309
|
+
shouldCommitLoro = true;
|
|
310
|
+
}
|
|
311
|
+
await table.update(normalizeMutationId(idKey), row);
|
|
291
312
|
resultRows.push(row);
|
|
292
313
|
}
|
|
314
|
+
if (shouldCommitLoro) commitLoro();
|
|
293
315
|
return resultRows;
|
|
294
316
|
}),
|
|
295
317
|
onDelete: (async (p) => {
|
|
318
|
+
let shouldCommitLoro = false;
|
|
296
319
|
for (const m of p.transaction.mutations) {
|
|
297
320
|
if (m.type !== "delete") continue;
|
|
298
321
|
const idKey = m.key;
|
|
299
|
-
if (useLoro)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
322
|
+
if (useLoro) {
|
|
323
|
+
loroRemove(keyOf(idKey), false);
|
|
324
|
+
shouldCommitLoro = true;
|
|
325
|
+
}
|
|
326
|
+
await table.softDelete(normalizeMutationId(idKey));
|
|
303
327
|
}
|
|
328
|
+
if (shouldCommitLoro) commitLoro();
|
|
304
329
|
return [];
|
|
305
330
|
})
|
|
306
331
|
});
|
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":";;;;;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,OAAO,kBAAkB,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,OAAA;AAClE,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,GAAA,KAChC,OAAO,GAAA,KAAQ,QAAA,GACZ,gBAAA,CAAiB,GAAG,CAAA,GACpB,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,CAAA;AAEnC,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,mBAAA,GAAsB,CAAC,KAAA,KAAwC;AACpE,EAAA,IAAI,CAAC,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,MAAA;AAErC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACvC,EAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AACtC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK,OAAO,MAAA;AAE3B,EAAA,OAAO,IAAI,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA;AAC/B,CAAA;AAEO,IAAM,0BAAA,GAA6B,CAAC,KAAA,KAA4B;AACtE,EAAA,IAAI,KAAA,YAAiB,UAAU,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,mBAAA,CAAoB,QAAQ,CAAA,IAAK,oBAAoB,OAAO,CAAA;AAC7D,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,YAAc,UAAU,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,IAAI,QAAA,CAAS,SAAA,EAAW,GAAG,CAAA;AACnC,CAAA;AClDA,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;AAIO,SAAS,YACf,EAAA,EACA,OAAA,EACA,EAAE,IAAA,EAAM,GAAG,MAAK,EACf;AACD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AAE7C,EAAA,MAAM,YAAY,MAA4B;AAC7C,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,IAAA,CAAK,KAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,cAAA,EAAgB,KAAK,CAAA;AACtC,IAAA,OAAO,KAAK,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,GAAI,KAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,UAAU,YAA0B;AACzC,IAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,IAAA,MAAM,QAAA,GAAW,QAAQ,eAAA,GAAkB,EAAA;AAC3C,IAAA,MAAM,MAAM,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,IAAI,CAAC,4BAA4B,QAAQ,CAAA,CAAA,CAAA;AAC3E,IAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,EAAA,CAAG,MAAwB,GAAA,EAAK;AAAA,MACnD,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,SAAA,EAAU;AACpB,IAAA,MAAM,IAAI,MAAA,EAAQ,KAAA;AAClB,IAAA,MAAM,QAAQ,CAAA,IAAK,CAAA,GAAI,IAAI,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,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,yBAAA,EAA4B,QAAQ,CAAA,EAAG,QAAQ,CAAA,EAAG,QAAQ,GAAG,QAAQ,CAAA,CAAA,CAAA;AAE5G,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,KAAyB;AAC9C,IAAA,MAAM,KAAM,IAAA,CAAiD,EAAA;AAC7D,IAAA,IAAI,CAAC,EAAA,EAAI;AACR,MAAA,MAAM,EAAA,CAAG,OAAO,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,QAAQ,IAAI,CAAA;AAC7C,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAI,IAAA,EAAiC;AACvD,IAAA,OAAA,CAAQ,EAAA,GAAK,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA;AAChC,IAAA,MAAM,GAAG,MAAA,CAAO,IAAI,KAAA,CAAM,IAAI,GAAG,OAAO,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,CAAmB,QAAA,CAAS,WAAW,CAAA,EAAG;AAClD,MAAA,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AACtD,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;;;AClHA,SAAS,UAAU,GAAA,EAA0B;AAC5C,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,MAAM;AAAA,EAAC,CAAA;AACxB,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,MAAM;AAAA,EAAC,CAAA;AACzD;AAEA,SAAS,cACR,GAAA,EAC2D;AAC3D,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,YAAA,IAAgB,GAAA;AACnE;AAEA,SAAS,mBACR,SAAA,EACwC;AACxC,EAAA,MAAM,WAAW,MAAgB;AAChC,IAAA,MAAM,IAAA,GACL,OAAO,UAAA,KAAe,WAAA,IACtB,YAAY,UAAA,IACZ,OAAO,UAAA,CAAW,MAAA,EAAQ,UAAA,KAAe,UAAA,GACtC,UAAA,CAAW,MAAA,CAAO,YAAW,GAC7B,CAAA,EAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAEzE,IAAA,OAAO,IAAIA,QAAAA,CAAS,SAAA,EAAW,IAAI,CAAA;AAAA,EACpC,CAAA;AAEA,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,EAAI,IAAA,CAAK,KAAK,QAAA,EAAS;AAEjC,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,IAAI,OAAA,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;AAE/D,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;AAEnE,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAW;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAc,CAAA;AACvC,IAAA,IAAA,EAAM,KAAK,MAAA,IAAS;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAkB;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,IAAA,IAAA,EAAM,KAAK,MAAA,IAAS;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,UAAA,KAAyB;AACtD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS,OAAO,UAAA;AAEjC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,IAAS,IAAK,EAAC;AACzC,IAAA,MAAM,YAAY,IAAI,GAAA;AAAA,MACrB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,CAAM,CAAA,EAAG,CAAM,CAAC;AAAA,KAC7D;AAEA,IAAA,MAAM,MAAW,EAAC;AAClB,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC3B,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE7B,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,OAAO,sBAAA,CAAuB;AAAA,IACnC,MAAA,EAAQ,kBAAA,CAAsB,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,IAC/C,MAAA,EAAQ,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,IAE3B,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;AAEjC,QAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,MACjC,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,GAAM,sBAAM,IAAI,IAAA,EAAK;AAE3B,MAAA,MAAM,aAAkB,EAAC;AACzB,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;AAEhC,QAAA,MAAM,MAAM,OAAA,GACR;AAAA,UACD,GAAG,OAAA;AAAA,UACH,YAAY,GAAA,EAAI;AAAA,UAChB,YAAA,EAAc;AAAA,SACf,GACC,OAAA;AAEH,QAAA,IAAI,OAAA,UAAiB,GAAG,CAAA;AACxB,QAAA,MAAM,KAAA,CAAM,OAAO,GAAG,CAAA;AACtB,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,UAAA;AAAA,IACR,CAAA,CAAA;AAAA,IAEA,QAAA,GAAW,OAAO,CAAA,KAAiC;AAClD,MAAA,MAAM,GAAA,GAAM,sBAAM,IAAI,IAAA,EAAK;AAE3B,MAAA,MAAM,aAAkB,EAAC;AACzB,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,qBAAqB,2BAAA,CAA4B;AAAA,UACtD,GAAI,CAAA,CAAE;AAAA,SACN,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,kBAAA,EAAoB,IAAI,KAAA,EAAM;AAEnD,QAAA,MAAM,GAAA,GAAM,UACR,EAAE,GAAG,SAAS,UAAA,EAAY,GAAA,IAAM,GACjC,OAAA;AAEH,QAAA,IAAI,OAAA,UAAiB,GAAG,CAAA;AAExB,QAAA,MAAM,KAAA,CAAM,MAAA;AAAA,UACX,IAAIA,QAAAA,CAAS,MAAA,CAAO,MAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,UAC5C;AAAA,SACD;AAEA,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,UAAA;AAAA,IACR,CAAA,CAAA;AAAA,IAEA,QAAA,GAAW,OAAO,CAAA,KAAiC;AAClD,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,IAAI,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA;AAEpC,QAAA,MAAM,KAAA,CAAM,UAAA;AAAA,UACX,IAAIA,QAAAA,CAAS,MAAA,CAAO,MAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC;AAAA,SAC7C;AAAA,MACD;AAEA,MAAA,OAAO,EAAC;AAAA,IACT,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,CAAmBC,QAAAA,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.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\treturn isSingleQuoted || isDoubleQuoted ? trimmed.slice(1, -1) : trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string =>\n\ttypeof rid === 'string'\n\t\t? stripOuterQuotes(rid)\n\t\t: stripOuterQuotes(rid.toString());\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tif (!isRecordIdString(value)) return undefined;\n\n\tconst idx = value.indexOf(':');\n\tconst table = value.slice(0, idx).trim();\n\tconst key = value.slice(idx + 1).trim();\n\tif (!table || !key) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ?? 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;\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\n\tconst baseWhere = (): ExprLike | undefined => {\n\t\tif (!useLoro) return args.where;\n\t\tconst alive = eq('sync_deleted', false);\n\t\treturn args.where ? and(args.where, alive) : alive;\n\t};\n\n\tconst listAll = async (): Promise<T[]> => {\n\t\tconst where = baseWhere();\n\t\tconst whereSql = where ? ' WHERE $where' : '';\n\t\tconst sql = `SELECT ${fields.join(', ')} FROM type::table($table)${whereSql};`;\n\t\tconst [res] = await db.query<[QueryResult<T>]>(sql, {\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 = baseWhere();\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 ${fields.join(', ')} 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>) => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tawait db.create(new Table(name)).content(data);\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tawait db.insert(new Table(name), payload);\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(new Table(name)).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 { normalizeRecordIdLikeFields, toRecordIdString } 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 { SurrealSubset } from './types';\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\nfunction toCleanup(res: SyncReturn): Cleanup {\n\tif (!res) return () => {};\n\tif (typeof res === 'function') return res;\n\n\tconst cleanup = res.cleanup ?? res.unsubscribe ?? res.dispose;\n\n\treturn typeof cleanup === 'function' ? cleanup : () => {};\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\nfunction createInsertSchema<T extends { id: string | RecordId }>(\n\ttableName: string,\n): StandardSchemaV1<MutationInput<T>, T> {\n\tconst createId = (): RecordId => {\n\t\tconst uuid =\n\t\t\ttypeof globalThis !== 'undefined' &&\n\t\t\t'crypto' in globalThis &&\n\t\t\ttypeof globalThis.crypto?.randomUUID === 'function'\n\t\t\t\t? globalThis.crypto.randomUUID()\n\t\t\t\t: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n\n\t\treturn new RecordId(tableName, uuid);\n\t};\n\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) data.id = createId() 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\n\tconst loroKey = loro?.key ?? id ?? 'surreal';\n\tconst loroMap = useLoro ? (loro?.doc?.getMap?.(loroKey) ?? null) : null;\n\n\tconst loroPut = (row: T) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.set(getKey(row), row as unknown);\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst loroRemove = (idStr: string) => {\n\t\tif (!loroMap) return;\n\t\tloroMap.delete(idStr);\n\t\tloro?.doc?.commit?.();\n\t};\n\n\tconst mergeLocalOverServer = (serverRows: T[]): T[] => {\n\t\tif (!useLoro || !loroMap) return serverRows;\n\n\t\tconst localJson = loroMap.toJSON?.() ?? {};\n\t\tconst localById = new Map<string, T>(\n\t\t\tObject.values(localJson).map((r) => [getKey(r as T), r as T]),\n\t\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 = localById.get(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: (row) => getKey(row),\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\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) loroPut(row);\n\t\t\t\tawait table.create(row);\n\t\t\t\tresultRows.push(row);\n\t\t\t}\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\n\t\t\tconst resultRows: T[] = [];\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t}) as Partial<T>;\n\t\t\t\tconst baseRow = { ...normalizedModified, id: idKey } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now() } as T)\n\t\t\t\t\t: baseRow;\n\n\t\t\t\tif (useLoro) loroPut(row);\n\n\t\t\t\tawait table.update(\n\t\t\t\t\tnew RecordId(config.table.name, keyOf(idKey)),\n\t\t\t\t\trow,\n\t\t\t\t);\n\n\t\t\t\tresultRows.push(row);\n\t\t\t}\n\n\t\t\treturn resultRows 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\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\tif (useLoro) loroRemove(keyOf(idKey));\n\n\t\t\t\tawait table.softDelete(\n\t\t\t\t\tnew RecordId(config.table.name, keyOf(idKey)),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [] 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":";;;;;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,OAAO,kBAAkB,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,OAAA;AAClE,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,GAAA,KAChC,OAAO,GAAA,KAAQ,QAAA,GACZ,gBAAA,CAAiB,GAAG,CAAA,GACpB,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,CAAA;AAEnC,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,mBAAA,GAAsB,CAAC,KAAA,KAAwC;AACpE,EAAA,IAAI,CAAC,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,MAAA;AAErC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACvC,EAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AACtC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK,OAAO,MAAA;AAE3B,EAAA,OAAO,IAAI,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA;AAC/B,CAAA;AAEO,IAAM,0BAAA,GAA6B,CAAC,KAAA,KAA4B;AACtE,EAAA,IAAI,KAAA,YAAiB,UAAU,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,YAAc,UAAU,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,IAAI,QAAA,CAAS,SAAA,EAAW,GAAG,CAAA;AACnC,CAAA;ACnDA,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;AAIO,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,IAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,OAAA,GAAU,EAAA,CAAG,cAAA,EAAgB,KAAK,CAAA,GAAI,MAAA;AACzD,EAAA,MAAM,SAAA,GAAY,UAAA,GACd,IAAA,CAAK,KAAA,GAAQ,GAAA,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,GAAI,IAAI,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,KAAyB;AAC9C,IAAA,MAAM,KAAM,IAAA,CAAiD,EAAA;AAC7D,IAAA,IAAI,CAAC,EAAA,EAAI;AACR,MAAA,MAAM,EAAA,CAAG,MAAA,CAAO,KAAK,CAAA,CAAE,QAAQ,IAAI,CAAA;AACnC,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAI,IAAA,EAAiC;AACvD,IAAA,OAAA,CAAQ,EAAA,GAAK,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA;AAChC,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA;AAAA,EAC/B,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,CAAmB,QAAA,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;;;ACrHA,IAAM,cAAA,GAAiB,UAAA;AACvB,IAAM,OAAgB,MAAM;AAAC,CAAA;AAE7B,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,IAAIA,QAAAA,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,QAAAA,EAAU;AAC3B,IAAA,MAAM,YAAa,EAAA,CAAmC,EAAA;AACtD,IAAA,OACC,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,CAAU,WAAW,cAAc,CAAA;AAAA,EAEtE;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,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,EAAI,IAAA,CAAK,EAAA,GAAK,mBAAmB,SAAS,CAAA;AAEpD,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,IAAI,OAAA,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,mBAAA,GAAsB,CAAC,GAAA,KAC5B,IAAIA,QAAAA,CAAS,OAAO,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AAE3C,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,OAAO,sBAAA,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;AAEjC,QAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,MACjC,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;AAEhC,QAAA,MAAM,MAAM,OAAA,GACR;AAAA,UACD,GAAG,OAAA;AAAA,UACH,UAAA,EAAY,GAAA;AAAA,UACZ,YAAA,EAAc;AAAA,SACf,GACC,OAAA;AAEH,QAAA,IAAI,OAAA,EAAS;AACZ,UAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACpB;AACA,QAAA,IAAI,SAAS,GAAA,CAAI,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACxC,UAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAK,GAAG,SAAQ,GAAI,GAAA;AAIhC,UAAA,MAAM,KAAA,CAAM,OAAO,OAAqB,CAAA;AAAA,QACzC,CAAA,MAAO;AACN,UAAA,MAAM,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,QACvB;AACA,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACpB;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;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,QAAQ,CAAA,CAAE,GAAA;AAChB,QAAA,MAAM,qBAAqB,2BAAA,CAA4B;AAAA,UACtD,GAAI,CAAA,CAAE;AAAA,SACN,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,kBAAA,EAAoB,IAAI,KAAA,EAAM;AAEnD,QAAA,MAAM,MAAM,OAAA,GACR,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,KAAI,GAC/B,OAAA;AAEH,QAAA,IAAI,OAAA,EAAS;AACZ,UAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACpB;AAEA,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,mBAAA,CAAoB,KAAK,GAAG,GAAG,CAAA;AAElD,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACpB;AACA,MAAA,IAAI,kBAAkB,UAAA,EAAW;AAEjC,MAAA,OAAO,UAAA;AAAA,IACR,CAAA,CAAA;AAAA,IAEA,QAAA,GAAW,OAAO,CAAA,KAAiC;AAClD,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,IAAI,OAAA,EAAS;AACZ,UAAA,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA,EAAG,KAAK,CAAA;AAC9B,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACpB;AAEA,QAAA,MAAM,KAAA,CAAM,UAAA,CAAW,mBAAA,CAAoB,KAAK,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,kBAAkB,UAAA,EAAW;AAEjC,MAAA,OAAO,EAAC;AAAA,IACT,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,CAAmBC,QAAAA,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.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\treturn isSingleQuoted || isDoubleQuoted ? trimmed.slice(1, -1) : trimmed;\n};\n\nexport const toRecordIdString = (rid: RecordId | string): string =>\n\ttypeof rid === 'string'\n\t\t? stripOuterQuotes(rid)\n\t\t: stripOuterQuotes(rid.toString());\n\nconst isRecordIdString = (value: string): boolean => {\n\tconst idx = value.indexOf(':');\n\treturn idx > 0 && idx < value.length - 1;\n};\n\nconst parseRecordIdString = (value: string): RecordId | undefined => {\n\tif (!isRecordIdString(value)) return undefined;\n\n\tconst idx = value.indexOf(':');\n\tconst table = value.slice(0, idx).trim();\n\tconst key = value.slice(idx + 1).trim();\n\tif (!table || !key) return undefined;\n\n\treturn new RecordId(table, key);\n};\n\nexport const normalizeRecordIdLikeValue = (value: unknown): unknown => {\n\tif (value instanceof RecordId) return value;\n\tif (typeof value !== 'string') return value;\n\n\tconst trimmed = value.trim();\n\tconst unquoted = stripOuterQuotes(trimmed);\n\n\tconst parsed =\n\t\tparseRecordIdString(unquoted) ??\n\t\t(unquoted === trimmed ? undefined : parseRecordIdString(trimmed));\n\tif (parsed) return parsed;\n\n\t// Keep original value shape if it isn't record-id-like\n\treturn value;\n};\n\nexport const normalizeRecordIdLikeFields = <T extends Record<string, unknown>>(\n\tdata: T,\n): T => {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(data)) {\n\t\tout[k] = normalizeRecordIdLikeValue(v);\n\t}\n\treturn out as T;\n};\n\nexport const toRecordId = (\n\ttableName: string,\n\tid: RecordId | string,\n): RecordId => {\n\tif (id instanceof RecordId) return id;\n\n\tconst normalized = toRecordIdString(id);\n\tconst prefixed = `${tableName}:`;\n\tconst key = normalized.startsWith(prefixed)\n\t\t? normalized.slice(prefixed.length)\n\t\t: normalized;\n\treturn new RecordId(tableName, key);\n};\n","import {\n\tand,\n\ttype ExprLike,\n\teq,\n\tFeatures,\n\ttype LiveMessage,\n\ttype LiveSubscription,\n\ttype RecordId,\n\ttype Surreal,\n\tTable,\n} from 'surrealdb';\nimport { toRecordId } from './id';\nimport type {\n\tFieldList,\n\tSurrealField,\n\tSurrealSubset,\n\tTableOptions,\n} from './types';\n\nconst normalizeFields = <T>(\n\traw: FieldList<T> | undefined,\n): ReadonlyArray<SurrealField<T>> => {\n\tif (!raw || raw === '*') return ['*' as SurrealField<T>];\n\treturn raw;\n};\n\nconst joinOrderBy = (\n\to: string | readonly string[] | undefined,\n): string | undefined => {\n\tif (!o) return undefined;\n\treturn typeof o === 'string' ? o : o.join(', ');\n};\n\ntype QueryResult<T> = T[] | null;\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>) => {\n\t\tconst id = (data as Partial<T> & { id?: string | RecordId }).id;\n\t\tif (!id) {\n\t\t\tawait db.create(table).content(data);\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { ...(data as Record<string, unknown>) };\n\t\tpayload.id = toRecordId(name, id);\n\t\tawait db.insert(table, payload);\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 { normalizeRecordIdLikeFields, toRecordIdString } 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 type { SurrealSubset } from './types';\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\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' && recordKey.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\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) data.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\tnew RecordId(config.table.name, keyOf(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 { 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\tawait table.create(payload as Partial<T>);\n\t\t\t\t} else {\n\t\t\t\t\tawait table.create(row);\n\t\t\t\t}\n\t\t\t\tresultRows.push(row);\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\n\t\t\tconst resultRows: T[] = [];\n\t\t\tlet shouldCommitLoro = false;\n\t\t\tfor (const m of p.transaction.mutations) {\n\t\t\t\tif (m.type !== 'update') continue;\n\n\t\t\t\tconst idKey = m.key as RecordId;\n\t\t\t\tconst normalizedModified = normalizeRecordIdLikeFields({\n\t\t\t\t\t...(m.modified as Record<string, unknown>),\n\t\t\t\t}) as Partial<T>;\n\t\t\t\tconst baseRow = { ...normalizedModified, id: idKey } as T;\n\n\t\t\t\tconst row = useLoro\n\t\t\t\t\t? ({ ...baseRow, updated_at: now } as T)\n\t\t\t\t\t: baseRow;\n\n\t\t\t\tif (useLoro) {\n\t\t\t\t\tloroPut(row, false);\n\t\t\t\t\tshouldCommitLoro = true;\n\t\t\t\t}\n\n\t\t\t\tawait table.update(normalizeMutationId(idKey), row);\n\n\t\t\t\tresultRows.push(row);\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 UpdateMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\n\t\tonDelete: (async (p: DeleteMutationFnParams<T>) => {\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\tif (useLoro) {\n\t\t\t\t\tloroRemove(keyOf(idKey), 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}\n\t\t\tif (shouldCommitLoro) commitLoro();\n\n\t\t\treturn [] as unknown as StandardSchema<T>;\n\t\t}) as DeleteMutationFn<T, string, UtilsRecord, StandardSchema<T>>,\n\t} as never) as SurrealCollectionOptionsReturn<T>;\n\n\t// LIVE updates -> invalidate all subsets under base queryKey\n\tconst baseSync = base.sync?.sync;\n\n\tconst sync = baseSync\n\t\t? {\n\t\t\t\tsync: (ctx: Parameters<NonNullable<typeof baseSync>>[0]) => {\n\t\t\t\t\t// IMPORTANT: call baseSync exactly once\n\t\t\t\t\tconst baseRes = baseSync(ctx) as SyncReturn;\n\t\t\t\t\tconst baseCleanup = toCleanup(baseRes);\n\n\t\t\t\t\t// If live queries aren't supported, return the base result untouched\n\t\t\t\t\tif (!db.isFeatureSupported(Features.LiveQueries)) {\n\t\t\t\t\t\treturn baseRes as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst offLive = table.subscribe((evt) => {\n\t\t\t\t\t\tif (useLoro) {\n\t\t\t\t\t\t\tif (evt.type === 'delete') {\n\t\t\t\t\t\t\t\tloroRemove(getKey(evt.row));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloroPut(evt.row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid queryClient\n\t\t\t\t\t\t\t.invalidateQueries({ queryKey, exact: false })\n\t\t\t\t\t\t\t.catch((e) => onError?.(e));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Preserve base return shape, just wrap cleanup\n\t\t\t\t\tif (hasLoadSubset(baseRes)) {\n\t\t\t\t\t\t// on-demand mode relies on this being present\n\t\t\t\t\t\tconst resObj = baseRes as Record<string, unknown>;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...resObj,\n\t\t\t\t\t\t\tcleanup: () => {\n\t\t\t\t\t\t\t\toffLive();\n\t\t\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as unknown as ReturnType<\n\t\t\t\t\t\t\tNonNullable<typeof baseSync>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\n\t\t\t\t\t// eager mode usually returns a cleanup function\n\t\t\t\t\treturn (() => {\n\t\t\t\t\t\toffLive();\n\t\t\t\t\t\tbaseCleanup();\n\t\t\t\t\t}) as unknown as ReturnType<NonNullable<typeof baseSync>>;\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\t...base,\n\t\tsync: sync ?? base.sync,\n\t} as SurrealCollectionOptionsReturn<T>;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foretag/tanstack-db-surrealdb",
|
|
3
3
|
"description": "Add Offline / Local First Caching & Syncing to your SurrealDB app with TanstackDB and Loro (CRDTs)",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.0",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
7
7
|
],
|
|
@@ -44,13 +44,18 @@
|
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"@tanstack/db": "^0.5.26",
|
|
47
|
+
"@tanstack/query-core": "^5.0.0",
|
|
48
|
+
"@tanstack/query-db-collection": "^1.0.23",
|
|
49
|
+
"@standard-schema/spec": "^1.0.0",
|
|
47
50
|
"surrealdb": "2.0.0-alpha.17"
|
|
48
51
|
},
|
|
49
52
|
"devDependencies": {
|
|
53
|
+
"@types/bun": "^1.3.2",
|
|
50
54
|
"@biomejs/biome": "^2.3.15",
|
|
55
|
+
"@standard-schema/spec": "^1.0.0",
|
|
56
|
+
"@tanstack/db": "^0.5.26",
|
|
57
|
+
"@tanstack/query-core": "^5.0.0",
|
|
51
58
|
"@tanstack/query-db-collection": "^1.0.23",
|
|
52
|
-
"@tanstack/react-db": "latest",
|
|
53
|
-
"@tanstack/react-query": "latest",
|
|
54
59
|
"surrealdb": "2.0.0-alpha.17",
|
|
55
60
|
"tsup": "^8.5.1"
|
|
56
61
|
}
|