@prabhask5/stellar-engine 1.0.3

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 (138) hide show
  1. package/README.md +295 -0
  2. package/dist/actions/remoteChange.d.ts +79 -0
  3. package/dist/actions/remoteChange.d.ts.map +1 -0
  4. package/dist/actions/remoteChange.js +300 -0
  5. package/dist/actions/remoteChange.js.map +1 -0
  6. package/dist/auth/admin.d.ts +12 -0
  7. package/dist/auth/admin.d.ts.map +1 -0
  8. package/dist/auth/admin.js +23 -0
  9. package/dist/auth/admin.js.map +1 -0
  10. package/dist/auth/offlineCredentials.d.ts +41 -0
  11. package/dist/auth/offlineCredentials.d.ts.map +1 -0
  12. package/dist/auth/offlineCredentials.js +121 -0
  13. package/dist/auth/offlineCredentials.js.map +1 -0
  14. package/dist/auth/offlineLogin.d.ts +34 -0
  15. package/dist/auth/offlineLogin.d.ts.map +1 -0
  16. package/dist/auth/offlineLogin.js +75 -0
  17. package/dist/auth/offlineLogin.js.map +1 -0
  18. package/dist/auth/offlineSession.d.ts +22 -0
  19. package/dist/auth/offlineSession.d.ts.map +1 -0
  20. package/dist/auth/offlineSession.js +54 -0
  21. package/dist/auth/offlineSession.js.map +1 -0
  22. package/dist/auth/resolveAuthState.d.ts +24 -0
  23. package/dist/auth/resolveAuthState.d.ts.map +1 -0
  24. package/dist/auth/resolveAuthState.js +69 -0
  25. package/dist/auth/resolveAuthState.js.map +1 -0
  26. package/dist/config.d.ts +53 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +55 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/conflicts.d.ts +70 -0
  31. package/dist/conflicts.d.ts.map +1 -0
  32. package/dist/conflicts.js +321 -0
  33. package/dist/conflicts.js.map +1 -0
  34. package/dist/data.d.ts +77 -0
  35. package/dist/data.d.ts.map +1 -0
  36. package/dist/data.js +360 -0
  37. package/dist/data.js.map +1 -0
  38. package/dist/database.d.ts +31 -0
  39. package/dist/database.d.ts.map +1 -0
  40. package/dist/database.js +51 -0
  41. package/dist/database.js.map +1 -0
  42. package/dist/debug.d.ts +11 -0
  43. package/dist/debug.d.ts.map +1 -0
  44. package/dist/debug.js +48 -0
  45. package/dist/debug.js.map +1 -0
  46. package/dist/deviceId.d.ts +16 -0
  47. package/dist/deviceId.d.ts.map +1 -0
  48. package/dist/deviceId.js +48 -0
  49. package/dist/deviceId.js.map +1 -0
  50. package/dist/engine.d.ts +14 -0
  51. package/dist/engine.d.ts.map +1 -0
  52. package/dist/engine.js +1903 -0
  53. package/dist/engine.js.map +1 -0
  54. package/dist/entries/actions.d.ts +2 -0
  55. package/dist/entries/actions.d.ts.map +1 -0
  56. package/dist/entries/actions.js +3 -0
  57. package/dist/entries/actions.js.map +1 -0
  58. package/dist/entries/auth.d.ts +7 -0
  59. package/dist/entries/auth.d.ts.map +1 -0
  60. package/dist/entries/auth.js +6 -0
  61. package/dist/entries/auth.js.map +1 -0
  62. package/dist/entries/config.d.ts +3 -0
  63. package/dist/entries/config.d.ts.map +1 -0
  64. package/dist/entries/config.js +3 -0
  65. package/dist/entries/config.js.map +1 -0
  66. package/dist/entries/stores.d.ts +9 -0
  67. package/dist/entries/stores.d.ts.map +1 -0
  68. package/dist/entries/stores.js +9 -0
  69. package/dist/entries/stores.js.map +1 -0
  70. package/dist/entries/types.d.ts +11 -0
  71. package/dist/entries/types.d.ts.map +1 -0
  72. package/dist/entries/types.js +2 -0
  73. package/dist/entries/types.js.map +1 -0
  74. package/dist/entries/utils.d.ts +3 -0
  75. package/dist/entries/utils.d.ts.map +1 -0
  76. package/dist/entries/utils.js +4 -0
  77. package/dist/entries/utils.js.map +1 -0
  78. package/dist/index.d.ts +32 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +39 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/operations.d.ts +73 -0
  83. package/dist/operations.d.ts.map +1 -0
  84. package/dist/operations.js +227 -0
  85. package/dist/operations.js.map +1 -0
  86. package/dist/queue.d.ts +32 -0
  87. package/dist/queue.d.ts.map +1 -0
  88. package/dist/queue.js +377 -0
  89. package/dist/queue.js.map +1 -0
  90. package/dist/realtime.d.ts +57 -0
  91. package/dist/realtime.d.ts.map +1 -0
  92. package/dist/realtime.js +491 -0
  93. package/dist/realtime.js.map +1 -0
  94. package/dist/reconnectHandler.d.ts +16 -0
  95. package/dist/reconnectHandler.d.ts.map +1 -0
  96. package/dist/reconnectHandler.js +21 -0
  97. package/dist/reconnectHandler.js.map +1 -0
  98. package/dist/runtime/runtimeConfig.d.ts +27 -0
  99. package/dist/runtime/runtimeConfig.d.ts.map +1 -0
  100. package/dist/runtime/runtimeConfig.js +133 -0
  101. package/dist/runtime/runtimeConfig.js.map +1 -0
  102. package/dist/stores/authState.d.ts +57 -0
  103. package/dist/stores/authState.d.ts.map +1 -0
  104. package/dist/stores/authState.js +154 -0
  105. package/dist/stores/authState.js.map +1 -0
  106. package/dist/stores/network.d.ts +9 -0
  107. package/dist/stores/network.d.ts.map +1 -0
  108. package/dist/stores/network.js +97 -0
  109. package/dist/stores/network.js.map +1 -0
  110. package/dist/stores/remoteChanges.d.ts +142 -0
  111. package/dist/stores/remoteChanges.d.ts.map +1 -0
  112. package/dist/stores/remoteChanges.js +353 -0
  113. package/dist/stores/remoteChanges.js.map +1 -0
  114. package/dist/stores/sync.d.ts +35 -0
  115. package/dist/stores/sync.d.ts.map +1 -0
  116. package/dist/stores/sync.js +115 -0
  117. package/dist/stores/sync.js.map +1 -0
  118. package/dist/supabase/auth.d.ts +60 -0
  119. package/dist/supabase/auth.d.ts.map +1 -0
  120. package/dist/supabase/auth.js +298 -0
  121. package/dist/supabase/auth.js.map +1 -0
  122. package/dist/supabase/client.d.ts +15 -0
  123. package/dist/supabase/client.d.ts.map +1 -0
  124. package/dist/supabase/client.js +149 -0
  125. package/dist/supabase/client.js.map +1 -0
  126. package/dist/supabase/validate.d.ts +11 -0
  127. package/dist/supabase/validate.d.ts.map +1 -0
  128. package/dist/supabase/validate.js +38 -0
  129. package/dist/supabase/validate.js.map +1 -0
  130. package/dist/types.d.ts +78 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +16 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/utils.d.ts +24 -0
  135. package/dist/utils.d.ts.map +1 -0
  136. package/dist/utils.js +56 -0
  137. package/dist/utils.js.map +1 -0
  138. package/package.json +84 -0
package/dist/data.js ADDED
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Generic CRUD and Query Operations
3
+ *
4
+ * Replaces repository infrastructure boilerplate.
5
+ * Uses Supabase table names as the API surface, internally resolves to Dexie table names.
6
+ */
7
+ import { getTableMap, getTableColumns } from './config';
8
+ import { getDb } from './database';
9
+ import { queueCreateOperation, queueDeleteOperation, queueSyncOperation } from './queue';
10
+ import { markEntityModified, scheduleSyncPush } from './engine';
11
+ import { generateId, now } from './utils';
12
+ import { debugError } from './debug';
13
+ import { supabase } from './supabase/client';
14
+ // ============================================================
15
+ // HELPERS
16
+ // ============================================================
17
+ function getDexieTableName(supabaseName) {
18
+ const map = getTableMap();
19
+ return map[supabaseName] || supabaseName;
20
+ }
21
+ // ============================================================
22
+ // SINGLE-ENTITY WRITE OPERATIONS
23
+ // ============================================================
24
+ /**
25
+ * Create a new entity. Auto: transaction + queue + markModified + schedulePush.
26
+ * Caller provides all fields including id, timestamps, etc.
27
+ */
28
+ export async function engineCreate(table, data) {
29
+ const db = getDb();
30
+ const dexieTable = getDexieTableName(table);
31
+ const entityId = data.id || generateId();
32
+ const payload = { ...data, id: entityId };
33
+ // Separate out id for the queue payload (queue stores id separately)
34
+ const { id: _id, ...queuePayload } = payload;
35
+ await db.transaction('rw', [db.table(dexieTable), db.table('syncQueue')], async () => {
36
+ await db.table(dexieTable).add(payload);
37
+ await queueCreateOperation(table, entityId, queuePayload);
38
+ });
39
+ markEntityModified(entityId);
40
+ scheduleSyncPush();
41
+ return payload;
42
+ }
43
+ /**
44
+ * Update an entity's fields. Auto-sets updated_at, queues sync, marks modified.
45
+ */
46
+ export async function engineUpdate(table, id, fields) {
47
+ const db = getDb();
48
+ const dexieTable = getDexieTableName(table);
49
+ const timestamp = now();
50
+ const updateFields = { ...fields, updated_at: timestamp };
51
+ let updated;
52
+ await db.transaction('rw', [db.table(dexieTable), db.table('syncQueue')], async () => {
53
+ await db.table(dexieTable).update(id, updateFields);
54
+ updated = await db.table(dexieTable).get(id);
55
+ if (updated) {
56
+ await queueSyncOperation({
57
+ table,
58
+ entityId: id,
59
+ operationType: 'set',
60
+ value: updateFields
61
+ });
62
+ }
63
+ });
64
+ if (updated) {
65
+ markEntityModified(id);
66
+ scheduleSyncPush();
67
+ }
68
+ return updated;
69
+ }
70
+ /**
71
+ * Soft-delete an entity. Sets deleted=true, queues delete op.
72
+ */
73
+ export async function engineDelete(table, id) {
74
+ const db = getDb();
75
+ const dexieTable = getDexieTableName(table);
76
+ const timestamp = now();
77
+ await db.transaction('rw', [db.table(dexieTable), db.table('syncQueue')], async () => {
78
+ await db.table(dexieTable).update(id, { deleted: true, updated_at: timestamp });
79
+ await queueDeleteOperation(table, id);
80
+ });
81
+ markEntityModified(id);
82
+ scheduleSyncPush();
83
+ }
84
+ /**
85
+ * Execute multiple write operations in a single atomic transaction.
86
+ * All ops succeed or all roll back.
87
+ */
88
+ export async function engineBatchWrite(operations) {
89
+ const db = getDb();
90
+ const timestamp = now();
91
+ // Collect all unique Dexie table names needed for the transaction scope
92
+ const tableNames = new Set();
93
+ tableNames.add('syncQueue');
94
+ for (const op of operations) {
95
+ tableNames.add(getDexieTableName(op.table));
96
+ }
97
+ const tables = Array.from(tableNames).map(name => db.table(name));
98
+ const modifiedIds = [];
99
+ await db.transaction('rw', tables, async () => {
100
+ for (const op of operations) {
101
+ const dexieTable = getDexieTableName(op.table);
102
+ switch (op.type) {
103
+ case 'create': {
104
+ const entityId = op.data.id || generateId();
105
+ const payload = { ...op.data, id: entityId };
106
+ const { id: _id, ...queuePayload } = payload;
107
+ await db.table(dexieTable).add(payload);
108
+ await queueCreateOperation(op.table, entityId, queuePayload);
109
+ modifiedIds.push(entityId);
110
+ break;
111
+ }
112
+ case 'update': {
113
+ const updateFields = { ...op.fields, updated_at: timestamp };
114
+ await db.table(dexieTable).update(op.id, updateFields);
115
+ await queueSyncOperation({
116
+ table: op.table,
117
+ entityId: op.id,
118
+ operationType: 'set',
119
+ value: updateFields
120
+ });
121
+ modifiedIds.push(op.id);
122
+ break;
123
+ }
124
+ case 'delete': {
125
+ await db.table(dexieTable).update(op.id, { deleted: true, updated_at: timestamp });
126
+ await queueDeleteOperation(op.table, op.id);
127
+ modifiedIds.push(op.id);
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ });
133
+ for (const id of modifiedIds) {
134
+ markEntityModified(id);
135
+ }
136
+ scheduleSyncPush();
137
+ }
138
+ // ============================================================
139
+ // INCREMENT OPERATION
140
+ // ============================================================
141
+ /**
142
+ * Increment a numeric field on an entity, preserving increment intent for conflict resolution.
143
+ * Uses increment operationType in the sync queue so multi-device increments are additive.
144
+ * Optionally sets additional fields (e.g., completed, updated_at) alongside the increment.
145
+ */
146
+ export async function engineIncrement(table, id, field, amount, additionalFields) {
147
+ const db = getDb();
148
+ const dexieTable = getDexieTableName(table);
149
+ const timestamp = now();
150
+ // Read current value
151
+ const current = await db.table(dexieTable).get(id);
152
+ if (!current)
153
+ return undefined;
154
+ const currentValue = current[field] || 0;
155
+ const newValue = currentValue + amount;
156
+ const updateFields = {
157
+ [field]: newValue,
158
+ updated_at: timestamp,
159
+ ...additionalFields
160
+ };
161
+ let updated;
162
+ await db.transaction('rw', [db.table(dexieTable), db.table('syncQueue')], async () => {
163
+ await db.table(dexieTable).update(id, updateFields);
164
+ updated = await db.table(dexieTable).get(id);
165
+ if (updated) {
166
+ await queueSyncOperation({
167
+ table,
168
+ entityId: id,
169
+ operationType: 'increment',
170
+ field,
171
+ value: amount
172
+ });
173
+ // Queue additional fields as a separate set operation if present
174
+ if (additionalFields && Object.keys(additionalFields).length > 0) {
175
+ await queueSyncOperation({
176
+ table,
177
+ entityId: id,
178
+ operationType: 'set',
179
+ value: { ...additionalFields, updated_at: timestamp }
180
+ });
181
+ }
182
+ }
183
+ });
184
+ if (updated) {
185
+ markEntityModified(id);
186
+ scheduleSyncPush();
187
+ }
188
+ return updated;
189
+ }
190
+ // ============================================================
191
+ // QUERY OPERATIONS
192
+ // ============================================================
193
+ /**
194
+ * Get a single entity by ID. Optional remote fallback if not found locally.
195
+ */
196
+ export async function engineGet(table, id, opts) {
197
+ const db = getDb();
198
+ const dexieTable = getDexieTableName(table);
199
+ const local = await db.table(dexieTable).get(id);
200
+ if (local)
201
+ return local;
202
+ if (opts?.remoteFallback && typeof navigator !== 'undefined' && navigator.onLine) {
203
+ try {
204
+ const columns = getTableColumns(table);
205
+ const { data, error } = await supabase
206
+ .from(table)
207
+ .select(columns)
208
+ .eq('id', id)
209
+ .or('deleted.is.null,deleted.eq.false')
210
+ .maybeSingle();
211
+ if (!error && data) {
212
+ await db.table(dexieTable).put(data);
213
+ return data;
214
+ }
215
+ }
216
+ catch (e) {
217
+ debugError(`[Data] Remote fallback failed for ${table}/${id}:`, e);
218
+ }
219
+ }
220
+ return null;
221
+ }
222
+ /**
223
+ * Get all entities from a table. Optional ordering and remote fallback.
224
+ */
225
+ export async function engineGetAll(table, opts) {
226
+ const db = getDb();
227
+ const dexieTable = getDexieTableName(table);
228
+ let results;
229
+ if (opts?.orderBy) {
230
+ results = await db.table(dexieTable).orderBy(opts.orderBy).toArray();
231
+ }
232
+ else {
233
+ results = await db.table(dexieTable).toArray();
234
+ }
235
+ if (results.length === 0 && opts?.remoteFallback && typeof navigator !== 'undefined' && navigator.onLine) {
236
+ try {
237
+ const columns = getTableColumns(table);
238
+ const { data, error } = await supabase
239
+ .from(table)
240
+ .select(columns)
241
+ .or('deleted.is.null,deleted.eq.false');
242
+ if (!error && data && data.length > 0) {
243
+ await db.table(dexieTable).bulkPut(data);
244
+ if (opts?.orderBy) {
245
+ results = await db.table(dexieTable).orderBy(opts.orderBy).toArray();
246
+ }
247
+ else {
248
+ results = data;
249
+ }
250
+ }
251
+ }
252
+ catch (e) {
253
+ debugError(`[Data] Remote fallback failed for ${table}:`, e);
254
+ }
255
+ }
256
+ return results;
257
+ }
258
+ /**
259
+ * Query entities by index value (WHERE index = value).
260
+ */
261
+ export async function engineQuery(table, index, value, opts) {
262
+ const db = getDb();
263
+ const dexieTable = getDexieTableName(table);
264
+ let results = await db.table(dexieTable).where(index).equals(value).toArray();
265
+ if (results.length === 0 && opts?.remoteFallback && typeof navigator !== 'undefined' && navigator.onLine) {
266
+ try {
267
+ const columns = getTableColumns(table);
268
+ const { data, error } = await supabase
269
+ .from(table)
270
+ .select(columns)
271
+ .eq(index, value)
272
+ .or('deleted.is.null,deleted.eq.false');
273
+ if (!error && data && data.length > 0) {
274
+ await db.table(dexieTable).bulkPut(data);
275
+ results = data;
276
+ }
277
+ }
278
+ catch (e) {
279
+ debugError(`[Data] Remote query fallback failed for ${table}.${index}:`, e);
280
+ }
281
+ }
282
+ return results;
283
+ }
284
+ /**
285
+ * Range query (WHERE index BETWEEN lower AND upper).
286
+ */
287
+ export async function engineQueryRange(table, index, lower, upper, opts) {
288
+ const db = getDb();
289
+ const dexieTable = getDexieTableName(table);
290
+ let results = await db.table(dexieTable).where(index).between(lower, upper, true, true).toArray();
291
+ if (results.length === 0 && opts?.remoteFallback && typeof navigator !== 'undefined' && navigator.onLine) {
292
+ try {
293
+ const columns = getTableColumns(table);
294
+ const { data, error } = await supabase
295
+ .from(table)
296
+ .select(columns)
297
+ .gte(index, lower)
298
+ .lte(index, upper)
299
+ .or('deleted.is.null,deleted.eq.false');
300
+ if (!error && data && data.length > 0) {
301
+ await db.table(dexieTable).bulkPut(data);
302
+ results = data;
303
+ }
304
+ }
305
+ catch (e) {
306
+ debugError(`[Data] Remote range query fallback failed for ${table}.${index}:`, e);
307
+ }
308
+ }
309
+ return results;
310
+ }
311
+ /**
312
+ * Singleton get-or-create with optional remote check.
313
+ * Used for patterns like focus_settings where one record per user exists.
314
+ */
315
+ export async function engineGetOrCreate(table, index, value, defaults, opts) {
316
+ const db = getDb();
317
+ const dexieTable = getDexieTableName(table);
318
+ // Check local first
319
+ const localResults = await db.table(dexieTable).where(index).equals(value).toArray();
320
+ const existing = localResults.find((r) => !r.deleted);
321
+ if (existing)
322
+ return existing;
323
+ // Check remote if requested
324
+ if (opts?.checkRemote && typeof navigator !== 'undefined' && navigator.onLine) {
325
+ try {
326
+ const columns = getTableColumns(table);
327
+ const { data } = await supabase
328
+ .from(table)
329
+ .select(columns)
330
+ .eq(index, value)
331
+ .is('deleted', null)
332
+ .maybeSingle();
333
+ if (data) {
334
+ await db.table(dexieTable).put(data);
335
+ return data;
336
+ }
337
+ }
338
+ catch {
339
+ // Offline or network error - fall through to local create
340
+ }
341
+ }
342
+ // Create new
343
+ const entityId = generateId();
344
+ const timestamp = now();
345
+ const payload = {
346
+ id: entityId,
347
+ ...defaults,
348
+ created_at: timestamp,
349
+ updated_at: timestamp
350
+ };
351
+ const { id: _id, ...queuePayload } = payload;
352
+ await db.transaction('rw', [db.table(dexieTable), db.table('syncQueue')], async () => {
353
+ await db.table(dexieTable).add(payload);
354
+ await queueCreateOperation(table, entityId, queuePayload);
355
+ });
356
+ markEntityModified(entityId);
357
+ scheduleSyncPush();
358
+ return payload;
359
+ }
360
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Database Management
3
+ *
4
+ * Engine creates and owns the Dexie instance when `database` config is provided.
5
+ * System tables (syncQueue, conflictHistory, offlineCredentials, offlineSession)
6
+ * are automatically merged into every schema version.
7
+ */
8
+ import Dexie from 'dexie';
9
+ export interface DatabaseVersionConfig {
10
+ version: number;
11
+ stores: Record<string, string>;
12
+ upgrade?: (tx: import('dexie').Transaction) => Promise<void>;
13
+ }
14
+ export interface DatabaseConfig {
15
+ name: string;
16
+ versions: DatabaseVersionConfig[];
17
+ }
18
+ /**
19
+ * Create a Dexie database with system tables auto-merged into every version.
20
+ */
21
+ export declare function createDatabase(config: DatabaseConfig): Dexie;
22
+ /**
23
+ * Get the engine-managed Dexie instance.
24
+ * Must be set via createDatabase() or _setManagedDb() before use.
25
+ */
26
+ export declare function getDb(): Dexie;
27
+ /**
28
+ * Set the managed database instance (used when db is provided directly via config).
29
+ */
30
+ export declare function _setManagedDb(db: Dexie): void;
31
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAYD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,KAAK,CAgB5D;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,KAAK,CAK7B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAE7C"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Database Management
3
+ *
4
+ * Engine creates and owns the Dexie instance when `database` config is provided.
5
+ * System tables (syncQueue, conflictHistory, offlineCredentials, offlineSession)
6
+ * are automatically merged into every schema version.
7
+ */
8
+ import Dexie from 'dexie';
9
+ // System tables auto-added to every version
10
+ const SYSTEM_TABLES = {
11
+ syncQueue: '++id, table, entityId, timestamp',
12
+ conflictHistory: '++id, entityId, entityType, timestamp',
13
+ offlineCredentials: 'id',
14
+ offlineSession: 'id'
15
+ };
16
+ let managedDb = null;
17
+ /**
18
+ * Create a Dexie database with system tables auto-merged into every version.
19
+ */
20
+ export function createDatabase(config) {
21
+ const db = new Dexie(config.name);
22
+ for (const ver of config.versions) {
23
+ // Merge app tables with system tables
24
+ const mergedStores = { ...ver.stores, ...SYSTEM_TABLES };
25
+ if (ver.upgrade) {
26
+ db.version(ver.version).stores(mergedStores).upgrade(ver.upgrade);
27
+ }
28
+ else {
29
+ db.version(ver.version).stores(mergedStores);
30
+ }
31
+ }
32
+ managedDb = db;
33
+ return db;
34
+ }
35
+ /**
36
+ * Get the engine-managed Dexie instance.
37
+ * Must be set via createDatabase() or _setManagedDb() before use.
38
+ */
39
+ export function getDb() {
40
+ if (!managedDb) {
41
+ throw new Error('No database available. Call initEngine() with database config or db first.');
42
+ }
43
+ return managedDb;
44
+ }
45
+ /**
46
+ * Set the managed database instance (used when db is provided directly via config).
47
+ */
48
+ export function _setManagedDb(db) {
49
+ managedDb = db;
50
+ }
51
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,4CAA4C;AAC5C,MAAM,aAAa,GAA2B;IAC5C,SAAS,EAAE,kCAAkC;IAC7C,eAAe,EAAE,uCAAuC;IACxD,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;CACrB,CAAC;AAEF,IAAI,SAAS,GAAiB,IAAI,CAAC;AAEnC;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,sCAAsC;QACtC,MAAM,YAAY,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAEzD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,SAAS,GAAG,EAAE,CAAC;IACf,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAS;IACrC,SAAS,GAAG,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function _setDebugPrefix(prefix: string): void;
2
+ export declare function isDebugMode(): boolean;
3
+ export declare function setDebugMode(enabled: boolean): void;
4
+ export declare function debugLog(...args: unknown[]): void;
5
+ export declare function debugWarn(...args: unknown[]): void;
6
+ export declare function debugError(...args: unknown[]): void;
7
+ /**
8
+ * Unified debug function. Replaces debugLog/debugWarn/debugError with a single export.
9
+ */
10
+ export declare function debug(level: 'log' | 'warn' | 'error', ...args: unknown[]): void;
11
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,QAE7C;AAED,wBAAgB,WAAW,IAAI,OAAO,CAMrC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,QAG5C;AAED,wBAAgB,QAAQ,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QAE1C;AACD,wBAAgB,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QAE3C;AACD,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QAE5C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAO/E"}
package/dist/debug.js ADDED
@@ -0,0 +1,48 @@
1
+ let debugEnabled = null;
2
+ let debugPrefix = 'stellar';
3
+ export function _setDebugPrefix(prefix) {
4
+ debugPrefix = prefix;
5
+ }
6
+ export function isDebugMode() {
7
+ if (debugEnabled !== null)
8
+ return debugEnabled;
9
+ debugEnabled =
10
+ typeof localStorage !== 'undefined' &&
11
+ localStorage.getItem(`${debugPrefix}_debug_mode`) === 'true';
12
+ return debugEnabled;
13
+ }
14
+ export function setDebugMode(enabled) {
15
+ debugEnabled = enabled;
16
+ localStorage.setItem(`${debugPrefix}_debug_mode`, enabled ? 'true' : 'false');
17
+ }
18
+ export function debugLog(...args) {
19
+ if (isDebugMode())
20
+ console.log(...args);
21
+ }
22
+ export function debugWarn(...args) {
23
+ if (isDebugMode())
24
+ console.warn(...args);
25
+ }
26
+ export function debugError(...args) {
27
+ if (isDebugMode())
28
+ console.error(...args);
29
+ }
30
+ /**
31
+ * Unified debug function. Replaces debugLog/debugWarn/debugError with a single export.
32
+ */
33
+ export function debug(level, ...args) {
34
+ if (!isDebugMode())
35
+ return;
36
+ switch (level) {
37
+ case 'log':
38
+ console.log(...args);
39
+ break;
40
+ case 'warn':
41
+ console.warn(...args);
42
+ break;
43
+ case 'error':
44
+ console.error(...args);
45
+ break;
46
+ }
47
+ }
48
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA,IAAI,YAAY,GAAmB,IAAI,CAAC;AACxC,IAAI,WAAW,GAAG,SAAS,CAAC;AAE5B,MAAM,UAAU,eAAe,CAAC,MAAc;IAC7C,WAAW,GAAG,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,WAAW;IAC1B,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAC/C,YAAY;QACX,OAAO,YAAY,KAAK,WAAW;YACnC,YAAY,CAAC,OAAO,CAAC,GAAG,WAAW,aAAa,CAAC,KAAK,MAAM,CAAC;IAC9D,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC5C,YAAY,GAAG,OAAO,CAAC;IACvB,YAAY,CAAC,OAAO,CAAC,GAAG,WAAW,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAG,IAAe;IAC1C,IAAI,WAAW,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACzC,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,GAAG,IAAe;IAC3C,IAAI,WAAW,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,GAAG,IAAe;IAC5C,IAAI,WAAW,EAAE;QAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAA+B,EAAE,GAAG,IAAe;IACxE,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO;IAC3B,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAAC,MAAM;QACxC,KAAK,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAAC,MAAM;QAC1C,KAAK,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAAC,MAAM;IAC7C,CAAC;AACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Device ID Management
3
+ *
4
+ * Generates and persists a stable device identifier for deterministic conflict resolution.
5
+ * When two operations have the same timestamp, the device ID is used as a tiebreaker
6
+ * to ensure consistent resolution across all devices.
7
+ */
8
+ export declare function _setDeviceIdPrefix(prefix: string): void;
9
+ /**
10
+ * Get or create a stable device ID for this browser/device.
11
+ * The ID is stored in localStorage and persists across sessions.
12
+ *
13
+ * Format: Random UUID v4
14
+ */
15
+ export declare function getDeviceId(): string;
16
+ //# sourceMappingURL=deviceId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deviceId.d.ts","sourceRoot":"","sources":["../src/deviceId.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,QAEhD;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAcpC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Device ID Management
3
+ *
4
+ * Generates and persists a stable device identifier for deterministic conflict resolution.
5
+ * When two operations have the same timestamp, the device ID is used as a tiebreaker
6
+ * to ensure consistent resolution across all devices.
7
+ */
8
+ let _deviceIdPrefix = 'stellar';
9
+ export function _setDeviceIdPrefix(prefix) {
10
+ _deviceIdPrefix = prefix;
11
+ }
12
+ function getDeviceIdKey() {
13
+ return `${_deviceIdPrefix}_device_id`;
14
+ }
15
+ /**
16
+ * Get or create a stable device ID for this browser/device.
17
+ * The ID is stored in localStorage and persists across sessions.
18
+ *
19
+ * Format: Random UUID v4
20
+ */
21
+ export function getDeviceId() {
22
+ if (typeof localStorage === 'undefined') {
23
+ // SSR context - return a placeholder that won't be used
24
+ return 'ssr-placeholder';
25
+ }
26
+ let deviceId = localStorage.getItem(getDeviceIdKey());
27
+ if (!deviceId) {
28
+ deviceId = generateUUID();
29
+ localStorage.setItem(getDeviceIdKey(), deviceId);
30
+ }
31
+ return deviceId;
32
+ }
33
+ /**
34
+ * Generate a UUID v4 (random UUID).
35
+ * Uses crypto.randomUUID if available, otherwise falls back to manual generation.
36
+ */
37
+ function generateUUID() {
38
+ if (typeof crypto !== 'undefined' && crypto.randomUUID) {
39
+ return crypto.randomUUID();
40
+ }
41
+ // Fallback for older browsers
42
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
43
+ const r = (Math.random() * 16) | 0;
44
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
45
+ return v.toString(16);
46
+ });
47
+ }
48
+ //# sourceMappingURL=deviceId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deviceId.js","sourceRoot":"","sources":["../src/deviceId.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,IAAI,eAAe,GAAG,SAAS,CAAC;AAEhC,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,eAAe,GAAG,MAAM,CAAC;AAC3B,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,GAAG,eAAe,YAAY,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QACxC,wDAAwD;QACxD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,YAAY,EAAE,CAAC;QAC1B,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY;IACnB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED,8BAA8B;IAC9B,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Clear all pending sync operations (used when auth is invalid)
3
+ * SECURITY: Called when offline credentials are found to be invalid
4
+ * to prevent unauthorized data from being synced to the server
5
+ */
6
+ export declare function clearPendingSyncQueue(): Promise<number>;
7
+ export declare function markEntityModified(entityId: string): void;
8
+ export declare function onSyncComplete(callback: () => void): () => void;
9
+ export declare function scheduleSyncPush(): void;
10
+ export declare function runFullSync(quiet?: boolean, skipPull?: boolean): Promise<void>;
11
+ export declare function startSyncEngine(): Promise<void>;
12
+ export declare function stopSyncEngine(): Promise<void>;
13
+ export declare function clearLocalCache(): Promise<void>;
14
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAkGA;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAW7D;AAkND,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEzD;AAwFD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAS/D;AAkBD,wBAAgB,gBAAgB,IAAI,IAAI,CAavC;AA0wBD,wBAAsB,WAAW,CAAC,KAAK,GAAE,OAAe,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoMlG;AA0YD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA8WrD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDpD;AAGD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BrD"}