@fragno-dev/tanstack-db-adapter 0.0.0-stage → 0.0.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.
Files changed (37) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +207 -2
  3. package/dist/checkpoint.d.ts +9 -0
  4. package/dist/checkpoint.d.ts.map +1 -0
  5. package/dist/checkpoint.js +11 -0
  6. package/dist/checkpoint.js.map +1 -0
  7. package/dist/coordinator/fragno-browser-persistence-startup.d.ts +92 -0
  8. package/dist/coordinator/fragno-browser-persistence-startup.d.ts.map +1 -0
  9. package/dist/coordinator/fragno-browser-persistence-startup.js +366 -0
  10. package/dist/coordinator/fragno-browser-persistence-startup.js.map +1 -0
  11. package/dist/coordinator/fragno-collection-registry.js +85 -0
  12. package/dist/coordinator/fragno-collection-registry.js.map +1 -0
  13. package/dist/coordinator/fragno-internal-collection.d.ts +40 -0
  14. package/dist/coordinator/fragno-internal-collection.d.ts.map +1 -0
  15. package/dist/coordinator/fragno-internal-collection.js +142 -0
  16. package/dist/coordinator/fragno-internal-collection.js.map +1 -0
  17. package/dist/coordinator/fragno-internal-fetcher.d.ts +23 -0
  18. package/dist/coordinator/fragno-internal-fetcher.d.ts.map +1 -0
  19. package/dist/coordinator/fragno-internal-fetcher.js +60 -0
  20. package/dist/coordinator/fragno-internal-fetcher.js.map +1 -0
  21. package/dist/coordinator/fragno-ordered-persistence.js +66 -0
  22. package/dist/coordinator/fragno-ordered-persistence.js.map +1 -0
  23. package/dist/coordinator/fragno-outbox-synchronizer.js +193 -0
  24. package/dist/coordinator/fragno-outbox-synchronizer.js.map +1 -0
  25. package/dist/coordinator/fragno-table-collection.js +91 -0
  26. package/dist/coordinator/fragno-table-collection.js.map +1 -0
  27. package/dist/coordinator.d.ts +113 -0
  28. package/dist/coordinator.d.ts.map +1 -0
  29. package/dist/coordinator.js +231 -0
  30. package/dist/coordinator.js.map +1 -0
  31. package/dist/outbox-stream.js +85 -0
  32. package/dist/outbox-stream.js.map +1 -0
  33. package/dist/outbox-transport-error.js +12 -0
  34. package/dist/outbox-transport-error.js.map +1 -0
  35. package/dist/protocol.js +115 -0
  36. package/dist/protocol.js.map +1 -0
  37. package/package.json +83 -3
@@ -0,0 +1,115 @@
1
+ import "@fragno-dev/db/database-namespace";
2
+ import superjson from "superjson";
3
+ //#region src/protocol.ts
4
+ function decodeFragnoOutboxPayload(payload) {
5
+ const decoded = superjson.deserialize(payload);
6
+ if (!isRecord(decoded)) throw new Error("Invalid Fragno outbox payload.");
7
+ if (decoded["version"] !== 2) throw new Error(`Unsupported Fragno outbox payload version: ${String(decoded["version"])}.`);
8
+ if (!Array.isArray(decoded["operations"])) throw new Error("Invalid Fragno outbox operations.");
9
+ for (const mutation of decoded["operations"]) {
10
+ if (!isRecord(mutation)) throw new Error("Invalid Fragno outbox mutation.");
11
+ const operation = mutation["op"];
12
+ if (operation !== "create" && operation !== "update" && operation !== "delete" && operation !== "truncate") throw new Error(`Unsupported Fragno outbox mutation operation: ${String(operation)}.`);
13
+ if (operation === "truncate") {
14
+ const match = mutation["match"];
15
+ if (!isRecord(match)) throw new Error("Fragno outbox truncate match must be an object.");
16
+ if (!Object.values(match).every(isOutboxMatchScalar)) throw new Error("Fragno outbox truncate match values must be scalars.");
17
+ const externalIds = mutation["externalIds"];
18
+ if (!Array.isArray(externalIds) || externalIds.length === 0 || !externalIds.every((externalId) => typeof externalId === "string" && externalId.length > 0)) throw new Error("Fragno outbox truncate external IDs must be non-empty strings.");
19
+ }
20
+ }
21
+ return decoded;
22
+ }
23
+ function projectFragnoOutboxOperations(entry, operations, target) {
24
+ const table = target.schema.tables[target.table];
25
+ const externalIdColumnName = table.getIdColumn().name;
26
+ const changes = [];
27
+ for (const mutation of operations) {
28
+ if (mutation.op === "truncate") {
29
+ for (const externalId of mutation.externalIds) changes.push({
30
+ type: "delete",
31
+ key: externalId,
32
+ origin: "truncate"
33
+ });
34
+ continue;
35
+ }
36
+ const resolvedMutation = resolveMutationRefs(mutation, table, entry.refMap ?? {});
37
+ if (resolvedMutation.op === "create") {
38
+ changes.push({
39
+ type: "insert",
40
+ key: resolvedMutation.externalId,
41
+ value: {
42
+ ...resolvedMutation.values,
43
+ [externalIdColumnName]: resolvedMutation.externalId
44
+ }
45
+ });
46
+ continue;
47
+ }
48
+ if (resolvedMutation.op === "update") {
49
+ changes.push({
50
+ type: "update",
51
+ key: resolvedMutation.externalId,
52
+ value: {
53
+ ...resolvedMutation.set,
54
+ [externalIdColumnName]: resolvedMutation.externalId
55
+ }
56
+ });
57
+ continue;
58
+ }
59
+ changes.push({
60
+ type: "delete",
61
+ key: resolvedMutation.externalId,
62
+ origin: "delete"
63
+ });
64
+ }
65
+ return changes;
66
+ }
67
+ function fragnoOutboxOperationTarget(operation) {
68
+ return {
69
+ namespace: operation.namespace ?? operation.schema,
70
+ table: operation.table
71
+ };
72
+ }
73
+ /** Converts the protocol plan to TanStack messages at the sync boundary. */
74
+ function toTanStackChangeMessage(change) {
75
+ if (change.type === "delete") return {
76
+ type: "delete",
77
+ key: change.key
78
+ };
79
+ return {
80
+ type: change.type,
81
+ value: change.value
82
+ };
83
+ }
84
+ function isOutboxMatchScalar(value) {
85
+ return value === null || typeof value === "string" || typeof value === "number" || typeof value === "bigint" || typeof value === "boolean";
86
+ }
87
+ function resolveMutationRefs(mutation, table, refMap) {
88
+ if (mutation.op === "create") return {
89
+ ...mutation,
90
+ values: resolveRecordRefs(mutation.values, table, refMap)
91
+ };
92
+ if (mutation.op === "update") return {
93
+ ...mutation,
94
+ set: resolveRecordRefs(mutation.set, table, refMap)
95
+ };
96
+ return mutation;
97
+ }
98
+ function resolveRecordRefs(values, table, refMap) {
99
+ return Object.fromEntries(Object.entries(values).map(([key, value]) => {
100
+ if (table.columns[key]?.role !== "reference" || !isReferencePlaceholder(value)) return [key, value];
101
+ const resolved = refMap[value.__fragno_ref];
102
+ if (resolved === void 0) throw new Error(`Fragno outbox reference ${value.__fragno_ref} was not resolved.`);
103
+ return [key, resolved];
104
+ }));
105
+ }
106
+ function isReferencePlaceholder(value) {
107
+ return isRecord(value) && Object.keys(value).length === 1 && typeof value["__fragno_ref"] === "string";
108
+ }
109
+ function isRecord(value) {
110
+ return typeof value === "object" && value !== null && !Array.isArray(value);
111
+ }
112
+ //#endregion
113
+ export { decodeFragnoOutboxPayload, fragnoOutboxOperationTarget, projectFragnoOutboxOperations, toTanStackChangeMessage };
114
+
115
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","names":[],"sources":["../src/protocol.ts"],"sourcesContent":["import { resolveDatabaseNamespace } from \"@fragno-dev/db/database-namespace\";\nimport type { TableToColumnValues } from \"@fragno-dev/db/query\";\nimport type { AnySchema, AnyTable, FragnoId, FragnoReference } from \"@fragno-dev/db/schema\";\nimport superjson, { type SuperJSONResult } from \"superjson\";\n\nimport type {\n OutboxEntry,\n OutboxMatchScalar,\n OutboxMutation,\n OutboxOperation,\n OutboxPayload,\n} from \"@fragno-dev/db\";\n\nimport type { ChangeMessageOrDeleteKeyMessage } from \"@tanstack/db\";\n\nexport type FragnoCollectionTarget<\n TSchema extends AnySchema = AnySchema,\n TTableName extends keyof TSchema[\"tables\"] & string = keyof TSchema[\"tables\"] & string,\n> = {\n schema: TSchema;\n table: TTableName;\n /** Defaults to the schema's sanitized database namespace. Use null for no namespace. */\n namespace?: string | null;\n};\n\ntype MaterializedColumnValue<TValue> = TValue extends FragnoId | FragnoReference ? string : TValue;\n\ntype VisibleTableValues<TTable extends AnyTable> = TableToColumnValues<TTable>;\n\nexport type FragnoCollectionRow<TTable extends AnyTable> = {\n [TColumnName in keyof VisibleTableValues<TTable> as [\n VisibleTableValues<TTable>[TColumnName],\n ] extends [null]\n ? never\n : TColumnName]: MaterializedColumnValue<VisibleTableValues<TTable>[TColumnName]>;\n};\n\nexport type FragnoOutboxEntry = Pick<OutboxEntry, \"versionstamp\" | \"uowId\" | \"payload\" | \"refMap\">;\n\nexport type FragnoCollectionChange<TRow extends object> =\n | {\n type: \"insert\";\n key: string;\n value: TRow;\n }\n | {\n type: \"update\";\n key: string;\n value: Partial<TRow>;\n }\n | {\n type: \"delete\";\n key: string;\n origin: \"delete\" | \"truncate\";\n };\n\nexport function decodeFragnoOutboxPayload(payload: unknown): OutboxPayload {\n const decoded = superjson.deserialize(payload as SuperJSONResult) as unknown;\n\n if (!isRecord(decoded)) {\n throw new Error(\"Invalid Fragno outbox payload.\");\n }\n if (decoded[\"version\"] !== 2) {\n throw new Error(`Unsupported Fragno outbox payload version: ${String(decoded[\"version\"])}.`);\n }\n if (!Array.isArray(decoded[\"operations\"])) {\n throw new Error(\"Invalid Fragno outbox operations.\");\n }\n\n for (const mutation of decoded[\"operations\"]) {\n if (!isRecord(mutation)) {\n throw new Error(\"Invalid Fragno outbox mutation.\");\n }\n\n const operation = mutation[\"op\"];\n if (\n operation !== \"create\" &&\n operation !== \"update\" &&\n operation !== \"delete\" &&\n operation !== \"truncate\"\n ) {\n throw new Error(`Unsupported Fragno outbox mutation operation: ${String(operation)}.`);\n }\n if (operation === \"truncate\") {\n const match = mutation[\"match\"];\n if (!isRecord(match)) {\n throw new Error(\"Fragno outbox truncate match must be an object.\");\n }\n if (!Object.values(match).every(isOutboxMatchScalar)) {\n throw new Error(\"Fragno outbox truncate match values must be scalars.\");\n }\n const externalIds = mutation[\"externalIds\"];\n if (\n !Array.isArray(externalIds) ||\n externalIds.length === 0 ||\n !externalIds.every((externalId) => typeof externalId === \"string\" && externalId.length > 0)\n ) {\n throw new Error(\"Fragno outbox truncate external IDs must be non-empty strings.\");\n }\n }\n }\n\n return decoded as OutboxPayload;\n}\n\nexport function projectFragnoOutboxEntry<\n TSchema extends AnySchema,\n TTableName extends keyof TSchema[\"tables\"] & string,\n>(\n entry: FragnoOutboxEntry,\n target: FragnoCollectionTarget<TSchema, TTableName>,\n): FragnoCollectionChange<FragnoCollectionRow<TSchema[\"tables\"][TTableName]>>[] {\n const payload = decodeFragnoOutboxPayload(entry.payload);\n const targetNamespace = resolveDatabaseNamespace(target.schema.name, target.namespace) ?? \"\";\n const operations = payload.operations.filter((operation) => {\n const operationTarget = fragnoOutboxOperationTarget(operation);\n return operationTarget.namespace === targetNamespace && operationTarget.table === target.table;\n });\n return projectFragnoOutboxOperations(entry, operations, target);\n}\n\nexport function projectFragnoOutboxOperations<\n TSchema extends AnySchema,\n TTableName extends keyof TSchema[\"tables\"] & string,\n>(\n entry: FragnoOutboxEntry,\n operations: readonly OutboxOperation[],\n target: FragnoCollectionTarget<TSchema, TTableName>,\n): FragnoCollectionChange<FragnoCollectionRow<TSchema[\"tables\"][TTableName]>>[] {\n type Row = FragnoCollectionRow<TSchema[\"tables\"][TTableName]>;\n\n const table = target.schema.tables[target.table];\n const externalIdColumnName = table.getIdColumn().name;\n const changes: FragnoCollectionChange<Row>[] = [];\n\n for (const mutation of operations) {\n if (mutation.op === \"truncate\") {\n for (const externalId of mutation.externalIds) {\n changes.push({\n type: \"delete\",\n key: externalId,\n origin: \"truncate\",\n });\n }\n continue;\n }\n\n const resolvedMutation = resolveMutationRefs(mutation, table, entry.refMap ?? {});\n if (resolvedMutation.op === \"create\") {\n changes.push({\n type: \"insert\",\n key: resolvedMutation.externalId,\n value: {\n ...resolvedMutation.values,\n [externalIdColumnName]: resolvedMutation.externalId,\n } as Row,\n });\n continue;\n }\n\n if (resolvedMutation.op === \"update\") {\n changes.push({\n type: \"update\",\n key: resolvedMutation.externalId,\n value: {\n ...resolvedMutation.set,\n [externalIdColumnName]: resolvedMutation.externalId,\n } as Partial<Row>,\n });\n continue;\n }\n\n changes.push({\n type: \"delete\",\n key: resolvedMutation.externalId,\n origin: \"delete\",\n });\n }\n\n return changes;\n}\n\nexport function fragnoOutboxOperationTarget(operation: OutboxOperation): {\n namespace: string;\n table: string;\n} {\n return {\n namespace: operation.namespace ?? operation.schema,\n table: operation.table,\n };\n}\n\n/** Converts the protocol plan to TanStack messages at the sync boundary. */\nexport function toTanStackChangeMessage<TRow extends object>(\n change: FragnoCollectionChange<TRow>,\n): ChangeMessageOrDeleteKeyMessage<TRow, string> {\n if (change.type === \"delete\") {\n return {\n type: \"delete\",\n key: change.key,\n };\n }\n\n return {\n type: change.type,\n value: change.value as TRow,\n };\n}\n\nfunction isOutboxMatchScalar(value: unknown): value is OutboxMatchScalar {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"bigint\" ||\n typeof value === \"boolean\"\n );\n}\n\nfunction resolveMutationRefs(\n mutation: OutboxMutation,\n table: AnyTable,\n refMap: Record<string, string>,\n): OutboxMutation {\n if (mutation.op === \"create\") {\n return { ...mutation, values: resolveRecordRefs(mutation.values, table, refMap) };\n }\n\n if (mutation.op === \"update\") {\n return { ...mutation, set: resolveRecordRefs(mutation.set, table, refMap) };\n }\n\n return mutation;\n}\n\nfunction resolveRecordRefs(\n values: Record<string, unknown>,\n table: AnyTable,\n refMap: Record<string, string>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).map(([key, value]) => {\n if (table.columns[key]?.role !== \"reference\" || !isReferencePlaceholder(value)) {\n return [key, value];\n }\n\n const resolved = refMap[value.__fragno_ref];\n if (resolved === undefined) {\n throw new Error(`Fragno outbox reference ${value.__fragno_ref} was not resolved.`);\n }\n\n return [key, resolved];\n }),\n );\n}\n\nfunction isReferencePlaceholder(value: unknown): value is { __fragno_ref: string } {\n return (\n isRecord(value) && Object.keys(value).length === 1 && typeof value[\"__fragno_ref\"] === \"string\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,86 @@
1
1
  {
2
2
  "name": "@fragno-dev/tanstack-db-adapter",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.0.0",
4
+ "description": "Ingest Fragno database outboxes into TanStack DB collections",
5
+ "homepage": "https://fragno.dev",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/rejot-dev/fragno.git",
10
+ "directory": "packages/tanstack-db-adapter"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "type": "module",
16
+ "main": "./dist/coordinator.js",
17
+ "module": "./dist/coordinator.js",
18
+ "types": "./dist/coordinator.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/coordinator.d.ts",
22
+ "default": "./dist/coordinator.js"
23
+ }
24
+ },
25
+ "dependencies": {
26
+ "@tanstack/db-sqlite-persistence-core": "0.4.11",
27
+ "superjson": "^2.2.1",
28
+ "@fragno-dev/db": "0.4.1"
29
+ },
30
+ "devDependencies": {
31
+ "@journeyapps/wa-sqlite": "^1.4.1",
32
+ "@tanstack/browser-db-sqlite-persistence": "^0.2.36",
33
+ "@tanstack/db": "^0.15.1",
34
+ "@tanstack/node-db-sqlite-persistence": "^0.2.36",
35
+ "@types/better-sqlite3": "^7.6.13",
36
+ "@types/node": "^22.19.7",
37
+ "@vitest/coverage-istanbul": "^4.1.0",
38
+ "better-sqlite3": "^12.6.2",
39
+ "tsdown": "^0.22.4",
40
+ "vitest": "^4.1.4",
41
+ "@fragno-dev/core": "0.2.2",
42
+ "@fragno-dev/test": "2.0.2",
43
+ "@fragno-private/vitest-config": "0.0.0",
44
+ "@fragno-private/typescript-config": "0.0.1"
45
+ },
46
+ "peerDependencies": {
47
+ "@fragno-dev/core": "^0.2.2",
48
+ "@fragno-dev/test": "^2.0.0",
49
+ "@journeyapps/wa-sqlite": "^1.4.1",
50
+ "@tanstack/browser-db-sqlite-persistence": "^0.2.36",
51
+ "@tanstack/db": "^0.15.1",
52
+ "@tanstack/node-db-sqlite-persistence": "^0.2.36",
53
+ "better-sqlite3": "^12.6.2"
54
+ },
55
+ "peerDependenciesMeta": {
56
+ "@fragno-dev/core": {
57
+ "optional": true
58
+ },
59
+ "@fragno-dev/test": {
60
+ "optional": true
61
+ },
62
+ "@journeyapps/wa-sqlite": {
63
+ "optional": true
64
+ },
65
+ "@tanstack/browser-db-sqlite-persistence": {
66
+ "optional": true
67
+ },
68
+ "@tanstack/node-db-sqlite-persistence": {
69
+ "optional": true
70
+ },
71
+ "better-sqlite3": {
72
+ "optional": true
73
+ }
74
+ },
75
+ "scripts": {
76
+ "build": "tsdown",
77
+ "build:watch": "tsdown --watch",
78
+ "types:check": "tsc --noEmit",
79
+ "test": "vitest run",
80
+ "test:watch": "vitest --watch",
81
+ "format:package": "node ../../scripts/run-package-quality.mjs format",
82
+ "format:check:package": "node ../../scripts/run-package-quality.mjs format:check",
83
+ "lint:package": "node ../../scripts/run-package-quality.mjs lint",
84
+ "lint:fix:package": "node ../../scripts/run-package-quality.mjs lint:fix"
85
+ }
6
86
  }