@tanstack/db-sqlite-persistence-core 0.4.3 → 0.4.5
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 +14 -6
- package/dist/cjs/errors.cjs.map +1 -1
- package/dist/cjs/index.cjs +5 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/persisted.cjs +59 -62
- package/dist/cjs/persisted.cjs.map +1 -1
- package/dist/cjs/persisted.d.cts +7 -1
- package/dist/cjs/remote-subset-wire.cjs +100 -73
- package/dist/cjs/remote-subset-wire.cjs.map +1 -1
- package/dist/cjs/remote-subset-wire.d.cts +2 -0
- package/dist/cjs/sqlite-core-adapter.cjs +433 -184
- package/dist/cjs/sqlite-core-adapter.cjs.map +1 -1
- package/dist/cjs/sqlite-value.cjs +51 -0
- package/dist/cjs/sqlite-value.cjs.map +1 -1
- package/dist/cjs/sqlite-value.d.cts +12 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +8 -3
- package/dist/esm/persisted.d.ts +7 -1
- package/dist/esm/persisted.js +63 -66
- package/dist/esm/persisted.js.map +1 -1
- package/dist/esm/remote-subset-wire.d.ts +2 -0
- package/dist/esm/remote-subset-wire.js +101 -74
- package/dist/esm/remote-subset-wire.js.map +1 -1
- package/dist/esm/sqlite-core-adapter.js +435 -186
- package/dist/esm/sqlite-core-adapter.js.map +1 -1
- package/dist/esm/sqlite-value.d.ts +12 -0
- package/dist/esm/sqlite-value.js +53 -2
- package/dist/esm/sqlite-value.js.map +1 -1
- package/package.json +4 -3
- package/src/errors.ts +1 -2
- package/src/persisted.ts +111 -91
- package/src/remote-subset-wire.ts +150 -85
- package/src/sqlite-core-adapter.ts +686 -235
- package/src/sqlite-value.ts +98 -1
|
@@ -8,3 +8,15 @@ export type SerializedSQLiteBigInt = {
|
|
|
8
8
|
};
|
|
9
9
|
export declare function assertSQLiteBigIntInRange(value: bigint): bigint;
|
|
10
10
|
export declare function serializeSQLiteBigInt(value: bigint): SerializedSQLiteBigInt;
|
|
11
|
+
type SQLiteTemporalKind = `Temporal.Instant` | `Temporal.PlainDate`;
|
|
12
|
+
export type SerializedSQLiteTemporal = {
|
|
13
|
+
[PERSISTED_TYPE_TAG]: SQLiteTemporalKind;
|
|
14
|
+
[PERSISTED_VALUE_TAG]: string;
|
|
15
|
+
order: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function sqliteTemporalKind(value: unknown): SQLiteTemporalKind | undefined;
|
|
18
|
+
export declare function reviveSQLiteTemporal(kind: SQLiteTemporalKind, value: string): unknown;
|
|
19
|
+
/** Registered prototype methods validate the brand; user toString is ignored. */
|
|
20
|
+
export declare function serializeSQLiteTemporal(value: unknown): SerializedSQLiteTemporal | undefined;
|
|
21
|
+
export declare function sqliteTemporalIdentity(value: SerializedSQLiteTemporal): string;
|
|
22
|
+
export {};
|
package/dist/esm/sqlite-value.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SQLiteBigIntOutOfRangeError } from "./errors.js";
|
|
1
|
+
import { SQLiteBigIntOutOfRangeError, InvalidPersistedCollectionConfigError } from "./errors.js";
|
|
2
2
|
const SQLITE_BIGINT_MIN = -9223372036854775808n;
|
|
3
3
|
const SQLITE_BIGINT_MAX = 9223372036854775807n;
|
|
4
4
|
const PERSISTED_TYPE_TAG = `__tanstack_db_persisted_type__`;
|
|
@@ -20,12 +20,63 @@ function serializeSQLiteBigInt(value) {
|
|
|
20
20
|
[PERSISTED_VALUE_TAG]: value.toString()
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
+
function sqliteTemporalKind(value) {
|
|
24
|
+
if (value === null || typeof value !== `object`) return;
|
|
25
|
+
const tag = value[Symbol.toStringTag];
|
|
26
|
+
if (tag === `Temporal.Instant` || tag === `Temporal.PlainDate`) return tag;
|
|
27
|
+
return void 0;
|
|
28
|
+
}
|
|
29
|
+
function requireSQLiteTemporalConstructor(kind) {
|
|
30
|
+
const name = kind.slice(`Temporal.`.length);
|
|
31
|
+
const constructor = globalThis.Temporal?.[name];
|
|
32
|
+
if (typeof constructor?.from !== `function` || typeof constructor.prototype.toString !== `function`) {
|
|
33
|
+
throw new InvalidPersistedCollectionConfigError(
|
|
34
|
+
`Missing global ${kind} constructor for SQLite persistence`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
return constructor;
|
|
38
|
+
}
|
|
39
|
+
function reviveSQLiteTemporal(kind, value) {
|
|
40
|
+
return requireSQLiteTemporalConstructor(kind).from(value);
|
|
41
|
+
}
|
|
42
|
+
function serializeSQLiteTemporal(value) {
|
|
43
|
+
if (value === null || typeof value !== `object`) return;
|
|
44
|
+
const prototype = Object.getPrototypeOf(value);
|
|
45
|
+
if (prototype === null || prototype === Object.prototype) return;
|
|
46
|
+
const tag = value[Symbol.toStringTag];
|
|
47
|
+
if (typeof tag !== `string` || !tag.startsWith(`Temporal.`)) return;
|
|
48
|
+
const kind = sqliteTemporalKind(value);
|
|
49
|
+
if (!kind)
|
|
50
|
+
throw new InvalidPersistedCollectionConfigError(
|
|
51
|
+
`Unsupported ${tag} value for SQLite persistence`
|
|
52
|
+
);
|
|
53
|
+
const constructor = requireSQLiteTemporalConstructor(kind);
|
|
54
|
+
let text;
|
|
55
|
+
try {
|
|
56
|
+
text = constructor.prototype.toString.call(value);
|
|
57
|
+
} catch {
|
|
58
|
+
throw new InvalidPersistedCollectionConfigError(
|
|
59
|
+
`Invalid ${kind} value for the registered global constructor`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
const native = constructor.from(text);
|
|
63
|
+
const iso = kind === `Temporal.PlainDate` ? native.withCalendar(`iso8601`) : void 0;
|
|
64
|
+
const order = iso ? `${String(iso.year + 1e6).padStart(7, `0`)}${String(iso.month).padStart(2, `0`)}${String(iso.day).padStart(2, `0`)}` : (native.epochNanoseconds + 10000000000000000000000n).toString().padStart(23, `0`);
|
|
65
|
+
return { [PERSISTED_TYPE_TAG]: kind, [PERSISTED_VALUE_TAG]: text, order };
|
|
66
|
+
}
|
|
67
|
+
function sqliteTemporalIdentity(value) {
|
|
68
|
+
return `${value[PERSISTED_TYPE_TAG]}:${value[PERSISTED_VALUE_TAG]}`;
|
|
69
|
+
}
|
|
23
70
|
export {
|
|
24
71
|
PERSISTED_TYPE_TAG,
|
|
25
72
|
PERSISTED_VALUE_TAG,
|
|
26
73
|
SQLITE_BIGINT_MAX,
|
|
27
74
|
SQLITE_BIGINT_MIN,
|
|
28
75
|
assertSQLiteBigIntInRange,
|
|
29
|
-
|
|
76
|
+
reviveSQLiteTemporal,
|
|
77
|
+
serializeSQLiteBigInt,
|
|
78
|
+
serializeSQLiteTemporal,
|
|
79
|
+
sqliteTemporalIdentity,
|
|
80
|
+
sqliteTemporalKind
|
|
30
81
|
};
|
|
31
82
|
//# sourceMappingURL=sqlite-value.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-value.js","sources":["../../src/sqlite-value.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"sqlite-value.js","sources":["../../src/sqlite-value.ts"],"sourcesContent":["import {\n InvalidPersistedCollectionConfigError,\n SQLiteBigIntOutOfRangeError,\n} from './errors'\n\nexport const SQLITE_BIGINT_MIN = -9_223_372_036_854_775_808n\nexport const SQLITE_BIGINT_MAX = 9_223_372_036_854_775_807n\nexport const PERSISTED_TYPE_TAG = `__tanstack_db_persisted_type__`\nexport const PERSISTED_VALUE_TAG = `value`\n\nexport type SerializedSQLiteBigInt = {\n [PERSISTED_TYPE_TAG]: `bigint`\n [PERSISTED_VALUE_TAG]: string\n}\n\nexport function assertSQLiteBigIntInRange(value: bigint): bigint {\n if (value < SQLITE_BIGINT_MIN || value > SQLITE_BIGINT_MAX) {\n throw new SQLiteBigIntOutOfRangeError(\n value,\n SQLITE_BIGINT_MIN,\n SQLITE_BIGINT_MAX,\n )\n }\n return value\n}\n\nexport function serializeSQLiteBigInt(value: bigint): SerializedSQLiteBigInt {\n assertSQLiteBigIntInRange(value)\n return {\n [PERSISTED_TYPE_TAG]: `bigint`,\n [PERSISTED_VALUE_TAG]: value.toString(),\n }\n}\n\ntype SQLiteTemporalKind = `Temporal.Instant` | `Temporal.PlainDate`\ntype SQLiteTemporal = {\n epochNanoseconds: bigint\n year: number\n month: number\n day: number\n withCalendar: (calendar: string) => SQLiteTemporal\n}\ntype TemporalConstructor = {\n from: (value: string) => SQLiteTemporal\n prototype: { toString: () => string }\n}\n\nexport type SerializedSQLiteTemporal = {\n [PERSISTED_TYPE_TAG]: SQLiteTemporalKind\n [PERSISTED_VALUE_TAG]: string\n order: string\n}\n\nexport function sqliteTemporalKind(\n value: unknown,\n): SQLiteTemporalKind | undefined {\n if (value === null || typeof value !== `object`) return\n const tag = (value as { [Symbol.toStringTag]?: unknown })[Symbol.toStringTag]\n if (tag === `Temporal.Instant` || tag === `Temporal.PlainDate`) return tag\n return undefined\n}\n\nfunction requireSQLiteTemporalConstructor(\n kind: SQLiteTemporalKind,\n): TemporalConstructor {\n const name = kind.slice(`Temporal.`.length)\n const constructor = (\n globalThis as { Temporal?: Record<string, TemporalConstructor> }\n ).Temporal?.[name]\n if (\n typeof constructor?.from !== `function` ||\n typeof constructor.prototype.toString !== `function`\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Missing global ${kind} constructor for SQLite persistence`,\n )\n }\n return constructor\n}\n\nexport function reviveSQLiteTemporal(\n kind: SQLiteTemporalKind,\n value: string,\n): unknown {\n return requireSQLiteTemporalConstructor(kind).from(value)\n}\n\n/** Registered prototype methods validate the brand; user toString is ignored. */\nexport function serializeSQLiteTemporal(\n value: unknown,\n): SerializedSQLiteTemporal | undefined {\n if (value === null || typeof value !== `object`) return\n const prototype = Object.getPrototypeOf(value)\n if (prototype === null || prototype === Object.prototype) return\n const tag = (value as { [Symbol.toStringTag]?: unknown })[Symbol.toStringTag]\n if (typeof tag !== `string` || !tag.startsWith(`Temporal.`)) return\n const kind = sqliteTemporalKind(value)\n if (!kind)\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported ${tag} value for SQLite persistence`,\n )\n const constructor = requireSQLiteTemporalConstructor(kind)\n let text: string\n try {\n text = constructor.prototype.toString.call(value)\n } catch {\n throw new InvalidPersistedCollectionConfigError(\n `Invalid ${kind} value for the registered global constructor`,\n )\n }\n const native = constructor.from(text)\n const iso =\n kind === `Temporal.PlainDate` ? native.withCalendar(`iso8601`) : undefined\n // Text keys avoid both floating-point precision loss and SQLite's int64 cap.\n const order = iso\n ? `${String(iso.year + 1_000_000).padStart(7, `0`)}${String(iso.month).padStart(2, `0`)}${String(iso.day).padStart(2, `0`)}`\n : (native.epochNanoseconds + 10_000_000_000_000_000_000_000n)\n .toString()\n .padStart(23, `0`)\n return { [PERSISTED_TYPE_TAG]: kind, [PERSISTED_VALUE_TAG]: text, order }\n}\n\nexport function sqliteTemporalIdentity(\n value: SerializedSQLiteTemporal,\n): string {\n return `${value[PERSISTED_TYPE_TAG]}:${value[PERSISTED_VALUE_TAG]}`\n}\n"],"names":[],"mappings":";AAKO,MAAM,oBAAoB,CAAC;AAC3B,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAO5B,SAAS,0BAA0B,OAAuB;AAC/D,MAAI,QAAQ,qBAAqB,QAAQ,mBAAmB;AAC1D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAuC;AAC3E,4BAA0B,KAAK;AAC/B,SAAO;AAAA,IACL,CAAC,kBAAkB,GAAG;AAAA,IACtB,CAAC,mBAAmB,GAAG,MAAM,SAAA;AAAA,EAAS;AAE1C;AAqBO,SAAS,mBACd,OACgC;AAChC,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU;AACjD,QAAM,MAAO,MAA6C,OAAO,WAAW;AAC5E,MAAI,QAAQ,sBAAsB,QAAQ,qBAAsB,QAAO;AACvE,SAAO;AACT;AAEA,SAAS,iCACP,MACqB;AACrB,QAAM,OAAO,KAAK,MAAM,YAAY,MAAM;AAC1C,QAAM,cACJ,WACA,WAAW,IAAI;AACjB,MACE,OAAO,aAAa,SAAS,cAC7B,OAAO,YAAY,UAAU,aAAa,YAC1C;AACA,UAAM,IAAI;AAAA,MACR,kBAAkB,IAAI;AAAA,IAAA;AAAA,EAE1B;AACA,SAAO;AACT;AAEO,SAAS,qBACd,MACA,OACS;AACT,SAAO,iCAAiC,IAAI,EAAE,KAAK,KAAK;AAC1D;AAGO,SAAS,wBACd,OACsC;AACtC,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU;AACjD,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,MAAI,cAAc,QAAQ,cAAc,OAAO,UAAW;AAC1D,QAAM,MAAO,MAA6C,OAAO,WAAW;AAC5E,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,WAAW,WAAW,EAAG;AAC7D,QAAM,OAAO,mBAAmB,KAAK;AACrC,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR,eAAe,GAAG;AAAA,IAAA;AAEtB,QAAM,cAAc,iCAAiC,IAAI;AACzD,MAAI;AACJ,MAAI;AACF,WAAO,YAAY,UAAU,SAAS,KAAK,KAAK;AAAA,EAClD,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,IAAA;AAAA,EAEnB;AACA,QAAM,SAAS,YAAY,KAAK,IAAI;AACpC,QAAM,MACJ,SAAS,uBAAuB,OAAO,aAAa,SAAS,IAAI;AAEnE,QAAM,QAAQ,MACV,GAAG,OAAO,IAAI,OAAO,GAAS,EAAE,SAAS,GAAG,GAAG,CAAC,GAAG,OAAO,IAAI,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,GAAG,OAAO,IAAI,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC,MACvH,OAAO,mBAAmB,0BACxB,WACA,SAAS,IAAI,GAAG;AACvB,SAAO,EAAE,CAAC,kBAAkB,GAAG,MAAM,CAAC,mBAAmB,GAAG,MAAM,MAAA;AACpE;AAEO,SAAS,uBACd,OACQ;AACR,SAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,MAAM,mBAAmB,CAAC;AACnE;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/db-sqlite-persistence-core",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "SQLite persisted collection core for TanStack DB",
|
|
5
5
|
"author": "TanStack Team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -50,13 +50,14 @@
|
|
|
50
50
|
],
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@standard-schema/spec": "^1.1.0",
|
|
53
|
-
"@tanstack/db": "0.
|
|
53
|
+
"@tanstack/db": "0.12.1"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"typescript": ">=4.7"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@vitest/coverage-istanbul": "^3.2.4"
|
|
59
|
+
"@vitest/coverage-istanbul": "^3.2.4",
|
|
60
|
+
"temporal-polyfill": "^0.3.0"
|
|
60
61
|
},
|
|
61
62
|
"scripts": {
|
|
62
63
|
"build": "vite build",
|
package/src/errors.ts
CHANGED
|
@@ -90,8 +90,7 @@ export function toPersistedCollectionDurabilityError(
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
export type IndeterminateCommitRequestType =
|
|
93
|
-
| `rpc:
|
|
94
|
-
| `rpc:applyCommittedTx:req`
|
|
93
|
+
`rpc:applyLocalMutations:req` | `rpc:applyCommittedTx:req`
|
|
95
94
|
|
|
96
95
|
export type IndeterminateCommitErrorOptions = {
|
|
97
96
|
collectionId: string
|