event-sourced-collection 0.0.1
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/LICENSE +21 -0
- package/README.md +377 -0
- package/dist/browser.d.mts +34 -0
- package/dist/browser.d.mts.map +1 -0
- package/dist/browser.mjs +107 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/index.d.mts +25 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +584 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react-native.d.mts +19 -0
- package/dist/react-native.d.mts.map +1 -0
- package/dist/react-native.mjs +12 -0
- package/dist/react-native.mjs.map +1 -0
- package/dist/types-CAT14Tbj.d.mts +148 -0
- package/dist/types-CAT14Tbj.d.mts.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/platforms/react-native.ts
|
|
2
|
+
function createReactNativePlatform(deps, config) {
|
|
3
|
+
const persistence = deps.createReactNativeSQLitePersistence({ database: config.database });
|
|
4
|
+
return {
|
|
5
|
+
driver: config.database,
|
|
6
|
+
persistence
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createReactNativePlatform };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=react-native.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native.mjs","names":[],"sources":["../src/platforms/react-native.ts"],"sourcesContent":["import type { PersistedCollectionPersistence, SQLiteDriver } from \"../types\";\n\nexport type ReactNativePlatformDeps = {\n createReactNativeSQLitePersistence: (options: {\n database: SQLiteDriver;\n }) => PersistedCollectionPersistence;\n};\n\nexport type ReactNativePlatformConfig = {\n database: SQLiteDriver;\n};\n\nexport type ReactNativePlatformResult = {\n driver: SQLiteDriver;\n persistence: PersistedCollectionPersistence;\n};\n\nexport function createReactNativePlatform(\n deps: ReactNativePlatformDeps,\n config: ReactNativePlatformConfig,\n): ReactNativePlatformResult {\n const persistence = deps.createReactNativeSQLitePersistence({\n database: config.database,\n });\n\n return {\n driver: config.database,\n persistence,\n };\n}\n"],"mappings":";AAiBA,SAAgB,0BACd,MACA,QAC2B;CAC3B,MAAM,cAAc,KAAK,mCAAmC,EAC1D,UAAU,OAAO,SACnB,CAAC;CAED,OAAO;EACL,QAAQ,OAAO;EACf;CACF;AACF"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Collection, CollectionConfig, UtilsRecord } from "@tanstack/db";
|
|
2
|
+
import { PersistedCollectionPersistence as PersistedCollectionPersistence$1, PersistedCollectionUtils, SQLiteDriver, persistedCollectionOptions } from "@tanstack/db-sqlite-persistence-core";
|
|
3
|
+
|
|
4
|
+
//#region src/persisted-collection.d.ts
|
|
5
|
+
type PersistedCollectionOptionsFn = typeof persistedCollectionOptions;
|
|
6
|
+
type CreateCollectionFn = <T extends object, TKey extends string | number>(options: CollectionConfig<T, TKey, never, UtilsRecord & PersistedCollectionUtils>) => Collection<T, TKey>;
|
|
7
|
+
//#endregion
|
|
8
|
+
//#region src/utils/logger.d.ts
|
|
9
|
+
type EventSourcedLogger = {
|
|
10
|
+
debug: (message: string, data?: Record<string, unknown>) => void;
|
|
11
|
+
info: (message: string, data?: Record<string, unknown>) => void;
|
|
12
|
+
warn: (message: string, data?: Record<string, unknown>) => void;
|
|
13
|
+
error: (message: string, data?: Record<string, unknown>) => void;
|
|
14
|
+
};
|
|
15
|
+
declare function createEventSourcedLogger(debug?: boolean | EventSourcedLogger): EventSourcedLogger;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/types.d.ts
|
|
18
|
+
type MutationType = "insert" | "update" | "delete";
|
|
19
|
+
type OutboxSyncStatus = "pending" | "synced" | "failed";
|
|
20
|
+
type OutboxEntry = {
|
|
21
|
+
eventId: string;
|
|
22
|
+
collectionId: string;
|
|
23
|
+
type: MutationType;
|
|
24
|
+
key: string | number;
|
|
25
|
+
payload: Record<string, unknown>;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
localSeq: number;
|
|
28
|
+
globalSeq: number | null;
|
|
29
|
+
sync: boolean;
|
|
30
|
+
syncStatus: OutboxSyncStatus;
|
|
31
|
+
attemptCount: number;
|
|
32
|
+
lastAttemptAt: number | null;
|
|
33
|
+
lastError: string | null;
|
|
34
|
+
lastErrorCode: string | null;
|
|
35
|
+
retryable: boolean | null;
|
|
36
|
+
};
|
|
37
|
+
type InboxEntry = {
|
|
38
|
+
eventId: string;
|
|
39
|
+
globalSeq: number;
|
|
40
|
+
collectionId: string;
|
|
41
|
+
type: MutationType;
|
|
42
|
+
key: string | number;
|
|
43
|
+
payload: Record<string, unknown>;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
sync: boolean;
|
|
46
|
+
};
|
|
47
|
+
type ServerEvent = {
|
|
48
|
+
globalSeq: number;
|
|
49
|
+
eventId: string;
|
|
50
|
+
collectionId: string;
|
|
51
|
+
type: MutationType;
|
|
52
|
+
key: string | number;
|
|
53
|
+
payload: Record<string, unknown>;
|
|
54
|
+
timestamp: number;
|
|
55
|
+
cursor: string;
|
|
56
|
+
};
|
|
57
|
+
type PushConfirmation = {
|
|
58
|
+
eventId: string;
|
|
59
|
+
globalSeq: number;
|
|
60
|
+
};
|
|
61
|
+
type PushFailure = {
|
|
62
|
+
eventId: string;
|
|
63
|
+
message: string;
|
|
64
|
+
code?: string;
|
|
65
|
+
retryable?: boolean;
|
|
66
|
+
};
|
|
67
|
+
type PushResponse = {
|
|
68
|
+
confirmed: ReadonlyArray<PushConfirmation>;
|
|
69
|
+
failed?: ReadonlyArray<PushFailure>;
|
|
70
|
+
};
|
|
71
|
+
type PullResponse = {
|
|
72
|
+
events: ReadonlyArray<ServerEvent>;
|
|
73
|
+
cursor: string;
|
|
74
|
+
hasMore: boolean;
|
|
75
|
+
};
|
|
76
|
+
type PushEventsFn = (events: ReadonlyArray<OutboundEvent>) => Promise<PushResponse | ReadonlyArray<PushConfirmation>>;
|
|
77
|
+
type PullEventsFn = (params: {
|
|
78
|
+
since: number;
|
|
79
|
+
}) => Promise<PullResponse>;
|
|
80
|
+
type SyncTransport = {
|
|
81
|
+
push: PushEventsFn;
|
|
82
|
+
pull: (since: number) => Promise<PullResponse>;
|
|
83
|
+
};
|
|
84
|
+
type OutboundEvent = {
|
|
85
|
+
eventId: string;
|
|
86
|
+
collectionId: string;
|
|
87
|
+
type: MutationType;
|
|
88
|
+
key: string | number;
|
|
89
|
+
payload: Record<string, unknown>;
|
|
90
|
+
timestamp: number;
|
|
91
|
+
};
|
|
92
|
+
type SyncUrlConfig = {
|
|
93
|
+
push: string;
|
|
94
|
+
pull: string;
|
|
95
|
+
headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);
|
|
96
|
+
};
|
|
97
|
+
type SyncHandlersConfig = {
|
|
98
|
+
pushEvents?: PushEventsFn;
|
|
99
|
+
pullEvents?: PullEventsFn;
|
|
100
|
+
pushUrl?: string;
|
|
101
|
+
pullUrl?: string;
|
|
102
|
+
headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);
|
|
103
|
+
};
|
|
104
|
+
type CollectionDef<TState = object, TKey extends string | number = string> = {
|
|
105
|
+
getKey: (state: TState) => TKey;
|
|
106
|
+
schemaVersion?: number;
|
|
107
|
+
};
|
|
108
|
+
type InferState<T> = T extends {
|
|
109
|
+
getKey: (state: infer S) => string | number;
|
|
110
|
+
} ? [S] extends [never] ? object : S extends object ? S : object : object;
|
|
111
|
+
type InferKey<T> = T extends {
|
|
112
|
+
getKey: (state: never) => infer K;
|
|
113
|
+
} ? K extends string | number ? K : string : string;
|
|
114
|
+
type CollectionDefConstraint = {
|
|
115
|
+
getKey: (state: never) => string | number;
|
|
116
|
+
schemaVersion?: number;
|
|
117
|
+
};
|
|
118
|
+
type CollectionMap<TDefs extends Record<string, CollectionDefConstraint>> = { [K in keyof TDefs]: Collection<InferState<TDefs[K]>, InferKey<TDefs[K]>> };
|
|
119
|
+
type ReservedCollections = {
|
|
120
|
+
outbox: Collection<OutboxEntry, string>;
|
|
121
|
+
inbox: Collection<InboxEntry, string>;
|
|
122
|
+
};
|
|
123
|
+
type EventSourcedDBConfig<TDefs extends Record<string, CollectionDefConstraint>> = {
|
|
124
|
+
persistence: PersistedCollectionPersistence$1;
|
|
125
|
+
collections: TDefs;
|
|
126
|
+
sync?: SyncHandlersConfig | SyncUrlConfig | SyncTransport;
|
|
127
|
+
schemaVersion?: number;
|
|
128
|
+
debug?: boolean | EventSourcedLogger;
|
|
129
|
+
createCollection: CreateCollectionFn;
|
|
130
|
+
persistedCollectionOptions: PersistedCollectionOptionsFn;
|
|
131
|
+
};
|
|
132
|
+
type EventSourcedDB<TDefs extends Record<string, CollectionDefConstraint>> = {
|
|
133
|
+
collections: CollectionMap<TDefs> & ReservedCollections;
|
|
134
|
+
sync: () => Promise<SyncResult>;
|
|
135
|
+
manualSync: () => Promise<ManualSyncResult>;
|
|
136
|
+
dispose: () => void;
|
|
137
|
+
};
|
|
138
|
+
type SyncResult = {
|
|
139
|
+
pushed: number;
|
|
140
|
+
pulled: number;
|
|
141
|
+
errors: ReadonlyArray<Error>;
|
|
142
|
+
};
|
|
143
|
+
type ManualSyncResult = SyncResult & {
|
|
144
|
+
replayed: number;
|
|
145
|
+
};
|
|
146
|
+
//#endregion
|
|
147
|
+
export { PersistedCollectionOptionsFn as A, SyncHandlersConfig as C, EventSourcedLogger as D, SyncUrlConfig as E, createEventSourcedLogger as O, ServerEvent as S, SyncTransport as T, PushEventsFn as _, InboxEntry as a, ReservedCollections as b, ManualSyncResult as c, OutboxEntry as d, OutboxSyncStatus as f, PushConfirmation as g, PullResponse as h, EventSourcedDBConfig as i, CreateCollectionFn as k, MutationType as l, PullEventsFn as m, CollectionMap as n, InferKey as o, PersistedCollectionPersistence$1 as p, EventSourcedDB as r, InferState as s, CollectionDef as t, OutboundEvent as u, PushFailure as v, SyncResult as w, SQLiteDriver as x, PushResponse as y };
|
|
148
|
+
//# sourceMappingURL=types-CAT14Tbj.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-CAT14Tbj.d.mts","names":[],"sources":["../src/persisted-collection.ts","../src/utils/logger.ts","../src/types.ts"],"mappings":";;;;KAMY,4BAAA,UAAsC,0BAA0B;AAAA,KAEhE,kBAAA,oDACV,OAAA,EAAS,gBAAA,CAAiB,CAAA,EAAG,IAAA,SAAa,WAAA,GAAc,wBAAA,MACrD,UAAA,CAAW,CAAA,EAAG,IAAA;;;KCRP,kBAAA;EACV,KAAA,GAAQ,OAAA,UAAiB,IAAA,GAAO,MAAA;EAChC,IAAA,GAAO,OAAA,UAAiB,IAAA,GAAO,MAAA;EAC/B,IAAA,GAAO,OAAA,UAAiB,IAAA,GAAO,MAAA;EAC/B,KAAA,GAAQ,OAAA,UAAiB,IAAA,GAAO,MAAA;AAAA;AAAA,iBAYlB,wBAAA,CACd,KAAA,aAAkB,kBAAA,GACjB,kBAAkB;;;KCPT,YAAA;AAAA,KACA,gBAAA;AAAA,KAEA,WAAA;EACV,OAAA;EACA,YAAA;EACA,IAAA,EAAM,YAAA;EACN,GAAA;EACA,OAAA,EAAS,MAAA;EACT,SAAA;EACA,QAAA;EACA,SAAA;EACA,IAAA;EACA,UAAA,EAAY,gBAAA;EACZ,YAAA;EACA,aAAA;EACA,SAAA;EACA,aAAA;EACA,SAAA;AAAA;AAAA,KAGU,UAAA;EACV,OAAA;EACA,SAAA;EACA,YAAA;EACA,IAAA,EAAM,YAAA;EACN,GAAA;EACA,OAAA,EAAS,MAAM;EACf,SAAA;EACA,IAAA;AAAA;AAAA,KAGU,WAAA;EACV,SAAA;EACA,OAAA;EACA,YAAA;EACA,IAAA,EAAM,YAAA;EACN,GAAA;EACA,OAAA,EAAS,MAAM;EACf,SAAA;EACA,MAAA;AAAA;AAAA,KAGU,gBAAA;EACV,OAAA;EACA,SAAS;AAAA;AAAA,KAGC,WAAA;EACV,OAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;AAAA;AAAA,KAGU,YAAA;EACV,SAAA,EAAW,aAAA,CAAc,gBAAA;EACzB,MAAA,GAAS,aAAA,CAAc,WAAA;AAAA;AAAA,KAGb,YAAA;EACV,MAAA,EAAQ,aAAa,CAAC,WAAA;EACtB,MAAA;EACA,OAAA;AAAA;AAAA,KAGU,YAAA,IACV,MAAA,EAAQ,aAAA,CAAc,aAAA,MACnB,OAAA,CAAQ,YAAA,GAAe,aAAA,CAAc,gBAAA;AAAA,KAE9B,YAAA,IAAgB,MAAA;EAAU,KAAA;AAAA,MAAoB,OAAO,CAAC,YAAA;AAAA,KAEtD,aAAA;EACV,IAAA,EAAM,YAAA;EACN,IAAA,GAAO,KAAA,aAAkB,OAAA,CAAQ,YAAA;AAAA;AAAA,KAGvB,aAAA;EACV,OAAA;EACA,YAAA;EACA,IAAA,EAAM,YAAA;EACN,GAAA;EACA,OAAA,EAAS,MAAM;EACf,SAAA;AAAA;AAAA,KAGU,aAAA;EACV,IAAA;EACA,IAAA;EACA,OAAA,GACI,MAAA,0BACO,MAAA,mBAAyB,OAAA,CAAQ,MAAA;AAAA;AAAA,KAGlC,kBAAA;EACV,UAAA,GAAa,YAAA;EACb,UAAA,GAAa,YAAA;EACb,OAAA;EACA,OAAA;EACA,OAAA,GACI,MAAA,0BACO,MAAA,mBAAyB,OAAA,CAAQ,MAAA;AAAA;AAAA,KAGlC,aAAA;EAIV,MAAA,GAAS,KAAA,EAAO,MAAA,KAAW,IAAI;EAC/B,aAAA;AAAA;AAAA,KAGU,UAAA,MAAgB,CAAA;EAAY,MAAA,GAAS,KAAA;AAAA,KAC5C,CAAC,6BAEA,CAAA,kBACE,CAAA;AAAA,KAII,QAAA,MAAc,CAAC;EAAW,MAAA,GAAS,KAAA;AAAA,IAC3C,CAAA,2BACE,CAAA;AAAA,KAID,uBAAA;EACH,MAAA,GAAS,KAAA;EACT,aAAA;AAAA;AAAA,KAGU,aAAA,eAA4B,MAAA,SAAe,uBAAA,mBACzC,KAAA,GAAQ,UAAA,CAAW,UAAA,CAAW,KAAA,CAAM,CAAA,IAAK,QAAA,CAAS,KAAA,CAAM,CAAA;AAAA,KAG1D,mBAAA;EACV,MAAA,EAAQ,UAAA,CAAW,WAAA;EACnB,KAAA,EAAO,UAAA,CAAW,UAAA;AAAA;AAAA,KAGR,oBAAA,eAAmC,MAAA,SAAe,uBAAA;EAC5D,WAAA,EAAa,gCAAA;EACb,WAAA,EAAa,KAAA;EACb,IAAA,GAAO,kBAAA,GAAqB,aAAA,GAAgB,aAAA;EAC5C,aAAA;EACA,KAAA,aAAkB,kBAAA;EAClB,gBAAA,EAAkB,kBAAA;EAClB,0BAAA,EAA4B,4BAAA;AAAA;AAAA,KAGlB,cAAA,eAA6B,MAAA,SAAe,uBAAA;EACtD,WAAA,EAAa,aAAA,CAAc,KAAA,IAAS,mBAAA;EACpC,IAAA,QAAY,OAAA,CAAQ,UAAA;EACpB,UAAA,QAAkB,OAAA,CAAQ,gBAAA;EAC1B,OAAA;AAAA;AAAA,KAGU,UAAA;EACV,MAAA;EACA,MAAA;EACA,MAAA,EAAQ,aAAa,CAAC,KAAA;AAAA;AAAA,KAGZ,gBAAA,GAAmB,UAAU;EACvC,QAAQ;AAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "event-sourced-collection",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Event-sourced local-first database built on TanStack DB persistence",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"event-sourcing",
|
|
7
|
+
"local-first",
|
|
8
|
+
"offline",
|
|
9
|
+
"offline-first",
|
|
10
|
+
"sqlite",
|
|
11
|
+
"sync",
|
|
12
|
+
"tanstack",
|
|
13
|
+
"tanstack-db"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"LICENSE",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"sideEffects": false,
|
|
23
|
+
"types": "./dist/index.d.mts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": "./dist/index.mjs",
|
|
26
|
+
"./browser": "./dist/browser.mjs",
|
|
27
|
+
"./react-native": "./dist/react-native.mjs",
|
|
28
|
+
"./package.json": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public",
|
|
32
|
+
"registry": "https://registry.npmjs.org/"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsdown",
|
|
36
|
+
"dev": "tsdown --watch",
|
|
37
|
+
"check-types": "tsgo --noEmit",
|
|
38
|
+
"prepublishOnly": "pnpm run build",
|
|
39
|
+
"check-exports": "attw --pack . --profile node16 --ignore-rules cjs-resolves-to-esm",
|
|
40
|
+
"postbuild": "npm run check-exports",
|
|
41
|
+
"release": "changeset publish --no-git-checks"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"uuidv7": "^1.2.1"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@arethetypeswrong/cli": "^0.18.4",
|
|
48
|
+
"@changesets/cli": "^2.31.0",
|
|
49
|
+
"@repo/typescript-config": "workspace:*",
|
|
50
|
+
"@tanstack/browser-db-sqlite-persistence": "^0.2.1",
|
|
51
|
+
"@tanstack/db": "^0.6.9",
|
|
52
|
+
"@tanstack/db-sqlite-persistence-core": "^0.2.1",
|
|
53
|
+
"tsdown": "^0.22.3",
|
|
54
|
+
"typescript": "catalog:"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@tanstack/browser-db-sqlite-persistence": ">=0.2.0",
|
|
58
|
+
"@tanstack/db": ">=0.6.0",
|
|
59
|
+
"@tanstack/db-sqlite-persistence-core": ">=0.2.0",
|
|
60
|
+
"@tanstack/expo-db-sqlite-persistence": ">=0.2.0",
|
|
61
|
+
"@tanstack/node-db-sqlite-persistence": ">=0.2.0",
|
|
62
|
+
"@tanstack/react-native-db-sqlite-persistence": ">=0.2.0"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"@tanstack/browser-db-sqlite-persistence": {
|
|
66
|
+
"optional": true
|
|
67
|
+
},
|
|
68
|
+
"@tanstack/react-native-db-sqlite-persistence": {
|
|
69
|
+
"optional": true
|
|
70
|
+
},
|
|
71
|
+
"@tanstack/expo-db-sqlite-persistence": {
|
|
72
|
+
"optional": true
|
|
73
|
+
},
|
|
74
|
+
"@tanstack/node-db-sqlite-persistence": {
|
|
75
|
+
"optional": true
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"engines": {
|
|
79
|
+
"node": ">=18"
|
|
80
|
+
}
|
|
81
|
+
}
|