@prabhask5/stellar-engine 1.2.0 → 1.2.2

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 (49) hide show
  1. package/README.md +454 -386
  2. package/dist/auth/resolveAuthState.js +3 -16
  3. package/dist/auth/resolveAuthState.js.map +1 -1
  4. package/dist/auth/singleUser.d.ts.map +1 -1
  5. package/dist/auth/singleUser.js +2 -3
  6. package/dist/auth/singleUser.js.map +1 -1
  7. package/dist/bin/commands.d.ts +14 -0
  8. package/dist/bin/commands.d.ts.map +1 -0
  9. package/dist/bin/commands.js +68 -0
  10. package/dist/bin/commands.js.map +1 -0
  11. package/dist/bin/install-pwa.d.ts +20 -6
  12. package/dist/bin/install-pwa.d.ts.map +1 -1
  13. package/dist/bin/install-pwa.js +111 -234
  14. package/dist/bin/install-pwa.js.map +1 -1
  15. package/dist/config.d.ts +63 -29
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +265 -37
  18. package/dist/config.js.map +1 -1
  19. package/dist/database.d.ts +64 -14
  20. package/dist/database.d.ts.map +1 -1
  21. package/dist/database.js +104 -16
  22. package/dist/database.js.map +1 -1
  23. package/dist/engine.d.ts.map +1 -1
  24. package/dist/engine.js +8 -11
  25. package/dist/engine.js.map +1 -1
  26. package/dist/entries/types.d.ts +4 -3
  27. package/dist/entries/types.d.ts.map +1 -1
  28. package/dist/entries/utils.d.ts +1 -0
  29. package/dist/entries/utils.d.ts.map +1 -1
  30. package/dist/entries/utils.js +8 -0
  31. package/dist/entries/utils.js.map +1 -1
  32. package/dist/entries/vite.d.ts +1 -1
  33. package/dist/entries/vite.d.ts.map +1 -1
  34. package/dist/index.d.ts +6 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +7 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/schema.d.ts +150 -0
  39. package/dist/schema.d.ts.map +1 -0
  40. package/dist/schema.js +891 -0
  41. package/dist/schema.js.map +1 -0
  42. package/dist/sw/build/vite-plugin.d.ts +93 -18
  43. package/dist/sw/build/vite-plugin.d.ts.map +1 -1
  44. package/dist/sw/build/vite-plugin.js +356 -22
  45. package/dist/sw/build/vite-plugin.js.map +1 -1
  46. package/dist/sw/sw.js +0 -5
  47. package/dist/types.d.ts +139 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +3 -2
package/dist/config.d.ts CHANGED
@@ -2,20 +2,19 @@
2
2
  * @fileoverview Engine Configuration and Initialization
3
3
  *
4
4
  * Central configuration hub for the sync engine. {@link initEngine} is the
5
- * first function consumers call — it accepts a {@link SyncEngineConfig} object
6
- * that describes:
5
+ * first function consumers call — it accepts a configuration object that
6
+ * describes:
7
7
  * - Which Supabase tables to sync and their IndexedDB schemas
8
8
  * - Authentication configuration (single-user gate, offline auth, etc.)
9
9
  * - Sync timing parameters (debounce, polling interval, tombstone TTL)
10
10
  * - Optional callbacks for auth state changes
11
11
  *
12
12
  * The config is stored as a module-level singleton and accessed by every other
13
- * module via {@link getEngineConfig}. The database creation flow supports two
14
- * modes:
15
- * 1. **Managed** Engine creates and owns the Dexie instance from a
16
- * {@link DatabaseConfig} (recommended).
17
- * 2. **Provided** Consumer passes a pre-created `Dexie` instance for
18
- * backward compatibility.
13
+ * module via {@link getEngineConfig}. Supports two configuration modes:
14
+ * 1. **Schema-driven** (recommended) — Provide a `schema` object. The engine
15
+ * auto-generates tables, Dexie stores, versioning, and database naming.
16
+ * 2. **Manual** — Provide explicit `tables` and `database` for full control
17
+ * over IndexedDB versioning and migration history.
19
18
  *
20
19
  * @see {@link database.ts} for Dexie instance creation
21
20
  * @see {@link engine.ts} for the sync lifecycle that consumes this config
@@ -23,38 +22,62 @@
23
22
  import type { SupabaseClient } from '@supabase/supabase-js';
24
23
  import type { Session } from '@supabase/supabase-js';
25
24
  import type Dexie from 'dexie';
26
- import type { SingleUserGateType } from './types';
25
+ import type { SingleUserGateType, SchemaDefinition, AuthConfig } from './types';
27
26
  import type { CRDTConfig } from './crdt/types';
28
27
  import type { DemoConfig } from './demo';
29
28
  import { type DatabaseConfig } from './database';
30
29
  /**
31
30
  * Top-level configuration for the sync engine.
32
31
  *
33
- * Passed to {@link initEngine} at app startup. All fields except `tables`
34
- * and `prefix` have sensible defaults.
32
+ * Passed to {@link initEngine} at app startup. Supports two configuration modes:
33
+ *
34
+ * 1. **Schema-driven** (recommended) — Provide a `schema` object. The engine
35
+ * auto-generates `tables`, Dexie stores, versioning, and database naming.
36
+ * 2. **Manual** — Provide explicit `tables` and `database` for full control
37
+ * over IndexedDB versioning and migration history.
38
+ *
39
+ * The two modes are mutually exclusive (`schema` vs `tables` + `database`).
35
40
  *
36
41
  * @example
42
+ * // Schema-driven (recommended):
37
43
  * initEngine({
38
44
  * prefix: 'myapp',
39
- * tables: [
40
- * { supabaseName: 'goals', columns: 'id,title,target,current_value,...' },
41
- * ],
42
- * database: { name: 'myapp-db', versions: [{ version: 1, stores: { goals: 'id,user_id' } }] },
43
- * syncDebounceMs: 1000,
45
+ * schema: {
46
+ * goals: 'goal_list_id, order',
47
+ * focus_settings: { singleton: true },
48
+ * },
49
+ * auth: { gateType: 'code', codeLength: 6 },
44
50
  * });
45
51
  */
46
52
  export interface SyncEngineConfig {
47
- /** Per-table sync configuration (required). */
53
+ /** Per-table sync configuration. Auto-populated when using `schema`. */
48
54
  tables: TableConfig[];
49
55
  /** Application prefix — used for localStorage keys, debug logging, etc. */
50
56
  prefix: string;
51
- /** Provide a pre-created Dexie instance (backward compat). Mutually exclusive with `database`. */
57
+ /**
58
+ * Declarative schema definition — replaces both `tables` and `database`.
59
+ *
60
+ * Each key is a Supabase table name (snake_case). Values are either a string
61
+ * of Dexie indexes or a {@link SchemaTableConfig} object for full control.
62
+ * Mutually exclusive with `tables` + `database`.
63
+ *
64
+ * @see {@link SchemaDefinition} for the full type definition
65
+ */
66
+ schema?: SchemaDefinition;
67
+ /**
68
+ * Override the auto-generated database name when using `schema`.
69
+ *
70
+ * By default, the database is named `${prefix}DB` (e.g., `stellarDB`).
71
+ * Use this to keep an existing database name for data continuity.
72
+ */
73
+ databaseName?: string;
74
+ /** Dexie instance — set internally by `createDatabase()`. Do not set manually. */
52
75
  db?: Dexie;
53
- /** Provide a pre-created Supabase client (backward compat). Engine creates one internally if not provided. */
76
+ /** Supabase client pass to use a custom client instead of the engine's internal proxy. */
54
77
  supabase?: SupabaseClient;
55
- /** Engine creates and owns the Dexie instance when this is provided. */
78
+ /** Database creation config auto-generated when using `schema`, or provided manually. */
56
79
  database?: DatabaseConfig;
57
- /** Authentication configuration. */
80
+ /** Authentication configuration (nested/internal form). */
58
81
  auth?: {
59
82
  /** Single-user mode gate configuration. */
60
83
  singleUser?: {
@@ -112,9 +135,11 @@ export interface SyncEngineConfig {
112
135
  * CRDT document storage and allows use of the `@prabhask5/stellar-engine/crdt` API.
113
136
  * When omitted, no CRDT tables are created and CRDT imports will throw.
114
137
  *
138
+ * Pass `true` as shorthand for `{}` (all defaults).
139
+ *
115
140
  * @see {@link CRDTConfig} for available configuration options
116
141
  */
117
- crdt?: CRDTConfig;
142
+ crdt?: CRDTConfig | true;
118
143
  }
119
144
  /**
120
145
  * Per-table sync configuration.
@@ -152,20 +177,29 @@ export interface TableConfig {
152
177
  *
153
178
  * Must be called once at app startup, before any other engine function.
154
179
  * Propagates the `prefix` to all internal modules (debug, deviceId,
155
- * Supabase client, runtime config) and creates or registers the Dexie
156
- * database instance.
180
+ * Supabase client, runtime config) and creates the Dexie database instance.
157
181
  *
158
- * @param config - The full engine configuration object.
182
+ * @param config - The engine configuration object.
159
183
  *
160
184
  * @example
161
- * // In your app's root layout or entry point:
162
185
  * initEngine({
163
186
  * prefix: 'myapp',
164
- * tables: [...],
165
- * database: { name: 'myapp-db', versions: [...] },
187
+ * schema: { goals: 'goal_list_id, order' },
188
+ * auth: { gateType: 'code', codeLength: 6 },
166
189
  * });
167
190
  */
168
- export declare function initEngine(config: SyncEngineConfig): void;
191
+ /**
192
+ * Input type for {@link initEngine}.
193
+ *
194
+ * Differs from {@link SyncEngineConfig} in two ways:
195
+ * - `tables` is optional (auto-generated when `schema` is provided)
196
+ * - `auth` accepts either the flat {@link AuthConfig} or the nested internal form
197
+ */
198
+ export type InitEngineInput = Omit<SyncEngineConfig, 'tables' | 'auth'> & {
199
+ tables?: TableConfig[];
200
+ auth?: AuthConfig | SyncEngineConfig['auth'];
201
+ };
202
+ export declare function initEngine(config: InitEngineInput): void;
169
203
  /**
170
204
  * Wait for the database to be fully opened and upgraded.
171
205
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -2,20 +2,19 @@
2
2
  * @fileoverview Engine Configuration and Initialization
3
3
  *
4
4
  * Central configuration hub for the sync engine. {@link initEngine} is the
5
- * first function consumers call — it accepts a {@link SyncEngineConfig} object
6
- * that describes:
5
+ * first function consumers call — it accepts a configuration object that
6
+ * describes:
7
7
  * - Which Supabase tables to sync and their IndexedDB schemas
8
8
  * - Authentication configuration (single-user gate, offline auth, etc.)
9
9
  * - Sync timing parameters (debounce, polling interval, tombstone TTL)
10
10
  * - Optional callbacks for auth state changes
11
11
  *
12
12
  * The config is stored as a module-level singleton and accessed by every other
13
- * module via {@link getEngineConfig}. The database creation flow supports two
14
- * modes:
15
- * 1. **Managed** Engine creates and owns the Dexie instance from a
16
- * {@link DatabaseConfig} (recommended).
17
- * 2. **Provided** Consumer passes a pre-created `Dexie` instance for
18
- * backward compatibility.
13
+ * module via {@link getEngineConfig}. Supports two configuration modes:
14
+ * 1. **Schema-driven** (recommended) — Provide a `schema` object. The engine
15
+ * auto-generates tables, Dexie stores, versioning, and database naming.
16
+ * 2. **Manual** — Provide explicit `tables` and `database` for full control
17
+ * over IndexedDB versioning and migration history.
19
18
  *
20
19
  * @see {@link database.ts} for Dexie instance creation
21
20
  * @see {@link engine.ts} for the sync lifecycle that consumes this config
@@ -25,7 +24,7 @@ import { _setDeviceIdPrefix } from './deviceId';
25
24
  import { _setClientPrefix } from './supabase/client';
26
25
  import { _setConfigPrefix } from './runtime/runtimeConfig';
27
26
  import { registerDemoConfig, _setDemoPrefix, isDemoMode } from './demo';
28
- import { createDatabase, _setManagedDb } from './database';
27
+ import { createDatabase, SYSTEM_INDEXES, computeSchemaVersion } from './database';
29
28
  import { _initCRDT } from './crdt/config';
30
29
  import { snakeToCamel } from './utils';
31
30
  // =============================================================================
@@ -35,28 +34,32 @@ import { snakeToCamel } from './utils';
35
34
  let engineConfig = null;
36
35
  /** Promise that resolves when the database is fully opened and upgraded. */
37
36
  let _dbReady = null;
38
- // =============================================================================
39
- // Initialization
40
- // =============================================================================
41
- /**
42
- * Initialize the sync engine with the provided configuration.
43
- *
44
- * Must be called once at app startup, before any other engine function.
45
- * Propagates the `prefix` to all internal modules (debug, deviceId,
46
- * Supabase client, runtime config) and creates or registers the Dexie
47
- * database instance.
48
- *
49
- * @param config - The full engine configuration object.
50
- *
51
- * @example
52
- * // In your app's root layout or entry point:
53
- * initEngine({
54
- * prefix: 'myapp',
55
- * tables: [...],
56
- * database: { name: 'myapp-db', versions: [...] },
57
- * });
58
- */
59
37
  export function initEngine(config) {
38
+ /* Normalize `crdt: true` shorthand to `crdt: {}`. */
39
+ if (config.crdt === true) {
40
+ config.crdt = {};
41
+ }
42
+ /* Normalize flat auth config to the nested structure used internally. */
43
+ if (config.auth) {
44
+ config.auth = normalizeAuthConfig(config.auth);
45
+ }
46
+ /*
47
+ * Schema-driven mode: auto-generate `tables` and `database` from the
48
+ * declarative schema definition.
49
+ */
50
+ if (config.schema) {
51
+ if (config.tables || config.database) {
52
+ throw new Error('initEngine: `schema` is mutually exclusive with `tables` and `database`. ' +
53
+ 'Use either the schema-driven API or the manual API, not both.');
54
+ }
55
+ config.tables = generateTablesFromSchema(config.schema);
56
+ config.database = generateDatabaseFromSchema(config.schema, config.prefix, config.databaseName, !!config.crdt);
57
+ }
58
+ /* Validate that tables are configured (either manually or via schema). */
59
+ if (!config.tables || config.tables.length === 0) {
60
+ throw new Error('initEngine: No tables configured. Provide `schema` or `tables` + `database`.');
61
+ }
62
+ /* At this point tables is guaranteed to be populated — safe to cast. */
60
63
  engineConfig = config;
61
64
  /* Propagate prefix to all internal modules that use localStorage keys. */
62
65
  if (config.prefix) {
@@ -78,19 +81,13 @@ export function initEngine(config) {
78
81
  if (isDemoMode() && config.database) {
79
82
  config.database = { ...config.database, name: config.database.name + '_demo' };
80
83
  }
81
- /* Handle database creation either managed or provided.
84
+ /* Create the Dexie database and store the instance on config for engine.ts access.
82
85
  * Pass crdtEnabled flag so CRDT IndexedDB tables are conditionally included. */
83
86
  if (config.database) {
84
87
  _dbReady = createDatabase(config.database, !!config.crdt).then((db) => {
85
- /* Store on config for backward compat (engine.ts reads config.db). */
86
88
  config.db = db;
87
89
  });
88
90
  }
89
- else if (config.db) {
90
- /* Backward compat: use the consumer-provided Dexie instance. */
91
- _setManagedDb(config.db);
92
- _dbReady = Promise.resolve();
93
- }
94
91
  }
95
92
  // =============================================================================
96
93
  // Accessors
@@ -164,4 +161,235 @@ export function getTableColumns(supabaseName) {
164
161
  }
165
162
  return table.columns;
166
163
  }
164
+ // =============================================================================
165
+ // Schema → Config Generation
166
+ // =============================================================================
167
+ /**
168
+ * Generate `TableConfig[]` from a declarative {@link SchemaDefinition}.
169
+ *
170
+ * Each schema key becomes a `TableConfig` with:
171
+ * - `supabaseName` = the schema key (snake_case)
172
+ * - `columns` = `'*'` (SELECT all by default — no egress micro-optimization)
173
+ * - `ownershipFilter` = `'user_id'` (default, since RLS always filters by user)
174
+ * - `isSingleton`, `excludeFromConflict`, `numericMergeFields`, `onRemoteChange`
175
+ * from the object form (if provided)
176
+ *
177
+ * @param schema - The declarative schema definition.
178
+ * @returns An array of `TableConfig` objects ready for engine consumption.
179
+ *
180
+ * @example
181
+ * generateTablesFromSchema({
182
+ * goals: 'goal_list_id, order',
183
+ * focus_settings: { singleton: true },
184
+ * });
185
+ * // → [
186
+ * // { supabaseName: 'goals', columns: '*', ownershipFilter: 'user_id' },
187
+ * // { supabaseName: 'focus_settings', columns: '*', ownershipFilter: 'user_id', isSingleton: true },
188
+ * // ]
189
+ */
190
+ function generateTablesFromSchema(schema) {
191
+ const tables = [];
192
+ for (const [tableName, definition] of Object.entries(schema)) {
193
+ /* String form is sugar for { indexes: theString }. */
194
+ const config = typeof definition === 'string' ? { indexes: definition } : definition;
195
+ const tableConfig = {
196
+ supabaseName: tableName,
197
+ columns: config.columns || '*',
198
+ ownershipFilter: config.ownership || 'user_id'
199
+ };
200
+ if (config.singleton)
201
+ tableConfig.isSingleton = true;
202
+ if (config.excludeFromConflict)
203
+ tableConfig.excludeFromConflict = config.excludeFromConflict;
204
+ if (config.numericMergeFields)
205
+ tableConfig.numericMergeFields = config.numericMergeFields;
206
+ if (config.onRemoteChange)
207
+ tableConfig.onRemoteChange = config.onRemoteChange;
208
+ tables.push(tableConfig);
209
+ }
210
+ return tables;
211
+ }
212
+ /**
213
+ * Generate a `DatabaseConfig` from a declarative {@link SchemaDefinition}.
214
+ *
215
+ * Builds the Dexie store schema for each table by combining the app-specific
216
+ * indexes from the schema with the {@link SYSTEM_INDEXES} constant. Uses
217
+ * {@link computeSchemaVersion} for automatic version management.
218
+ *
219
+ * @param schema - The declarative schema definition.
220
+ * @param prefix - Application prefix for database naming and versioning.
221
+ * @param databaseName - Optional override for the database name.
222
+ * @param crdtEnabled - Whether the CRDT subsystem is enabled.
223
+ * @returns A `DatabaseConfig` ready for `createDatabase()`.
224
+ *
225
+ * @example
226
+ * generateDatabaseFromSchema(
227
+ * { goals: 'goal_list_id, order' },
228
+ * 'stellar',
229
+ * undefined,
230
+ * false
231
+ * );
232
+ * // → {
233
+ * // name: 'stellarDB',
234
+ * // versions: [{ version: 1, stores: { goals: 'id, user_id, ..., goal_list_id, order' } }]
235
+ * // }
236
+ */
237
+ function generateDatabaseFromSchema(schema, prefix, databaseName, crdtEnabled = false) {
238
+ const stores = {};
239
+ for (const [tableName, definition] of Object.entries(schema)) {
240
+ const config = typeof definition === 'string' ? { indexes: definition } : definition;
241
+ /* Determine the Dexie table name (camelCase by default, or explicit override). */
242
+ const dexieName = config.dexieName || snakeToCamel(tableName);
243
+ /* Merge system indexes with app-specific indexes. */
244
+ const appIndexes = (config.indexes || '').trim();
245
+ stores[dexieName] = appIndexes ? `${SYSTEM_INDEXES}, ${appIndexes}` : SYSTEM_INDEXES;
246
+ }
247
+ /* Compute auto-version based on the merged store schema.
248
+ * The CRDT flag affects the schema hash because CRDT system tables are merged
249
+ * by buildDexie() — if CRDT is toggled, the version should bump. */
250
+ const hashInput = crdtEnabled ? { ...stores, __crdt: 'enabled' } : stores;
251
+ const result = computeSchemaVersion(prefix, hashInput);
252
+ /*
253
+ * Build the versions array. When an upgrade is detected, declare BOTH
254
+ * the previous version and the current version so Dexie has a proper
255
+ * upgrade path (v(N-1) → vN). This avoids the UpgradeError that occurs
256
+ * when only the new version is declared and the browser already has the
257
+ * old version's IndexedDB schema.
258
+ *
259
+ * Dexie handles additive changes (new tables, new indexes) natively.
260
+ * For the previous version we use its original stores so Dexie can diff
261
+ * and apply the structural changes.
262
+ */
263
+ const versions = [];
264
+ if (result.previousStores && result.previousVersion) {
265
+ versions.push({ version: result.previousVersion, stores: result.previousStores });
266
+ }
267
+ /*
268
+ * Generate an upgrade callback when any table declares `renamedFrom`.
269
+ * The callback copies data from the old Dexie table to the new one,
270
+ * applying any `renamedColumns` transformations along the way.
271
+ */
272
+ const upgradeCallback = buildRenameUpgradeCallback(schema);
273
+ if (upgradeCallback) {
274
+ versions.push({ version: result.version, stores, upgrade: upgradeCallback });
275
+ }
276
+ else {
277
+ versions.push({ version: result.version, stores });
278
+ }
279
+ return {
280
+ name: databaseName || `${prefix}DB`,
281
+ versions
282
+ };
283
+ }
284
+ /**
285
+ * Build a Dexie upgrade callback that handles table renames.
286
+ *
287
+ * When a table declares `renamedFrom`, the callback copies all rows from
288
+ * the old table name to the new one, applying any `renamedColumns` field
289
+ * name transformations. Dexie's schema diff handles creating the new table
290
+ * and removing the old one — this callback only handles data migration.
291
+ *
292
+ * @param schema - The declarative schema definition.
293
+ * @returns An upgrade function, or `null` if no renames are declared.
294
+ * @internal
295
+ */
296
+ function buildRenameUpgradeCallback(schema) {
297
+ /* Collect all rename operations. */
298
+ const renames = [];
299
+ for (const [tableName, definition] of Object.entries(schema)) {
300
+ const config = typeof definition === 'string' ? { indexes: definition } : definition;
301
+ if (!config.renamedFrom)
302
+ continue;
303
+ const oldDexie = config.dexieName ? config.dexieName : snakeToCamel(config.renamedFrom);
304
+ const newDexie = config.dexieName || snakeToCamel(tableName);
305
+ /* Only generate a callback if the Dexie name actually changed. */
306
+ if (oldDexie !== newDexie) {
307
+ renames.push({
308
+ oldDexie,
309
+ newDexie,
310
+ columnMap: config.renamedColumns
311
+ });
312
+ }
313
+ }
314
+ if (renames.length === 0)
315
+ return null;
316
+ return async (tx) => {
317
+ for (const { oldDexie, newDexie, columnMap } of renames) {
318
+ try {
319
+ const oldTable = tx.table(oldDexie);
320
+ const newTable = tx.table(newDexie);
321
+ const rows = await oldTable.toArray();
322
+ for (const row of rows) {
323
+ /* Apply column renames if specified. */
324
+ if (columnMap) {
325
+ for (const [newCol, oldCol] of Object.entries(columnMap)) {
326
+ if (oldCol in row) {
327
+ row[newCol] = row[oldCol];
328
+ delete row[oldCol];
329
+ }
330
+ }
331
+ }
332
+ await newTable.put(row);
333
+ }
334
+ /* Clear the old table — Dexie's schema diff will remove it. */
335
+ await oldTable.clear();
336
+ }
337
+ catch {
338
+ /* Old table may not exist (e.g., fresh install) — skip silently. */
339
+ }
340
+ }
341
+ };
342
+ }
343
+ /**
344
+ * Normalize an auth config to the internal nested structure.
345
+ *
346
+ * Detects whether the config is in the flat form ({@link AuthConfig}) or
347
+ * the nested form (has a `singleUser` key). Flat form is converted to
348
+ * nested; nested form is passed through unchanged.
349
+ *
350
+ * @param auth - The auth config (flat or nested).
351
+ * @returns The normalized nested auth config.
352
+ * @internal
353
+ */
354
+ function normalizeAuthConfig(auth) {
355
+ if (!auth)
356
+ return auth;
357
+ /* Detect nested form by the presence of `singleUser` key. */
358
+ if ('singleUser' in auth) {
359
+ return auth;
360
+ }
361
+ /* Flat form (AuthConfig) → convert to nested structure. */
362
+ const flat = auth;
363
+ const nested = {};
364
+ /* Map flat singleUser fields to nested singleUser object. */
365
+ const gateType = flat.gateType || 'code';
366
+ const codeLength = flat.codeLength || 6;
367
+ nested.singleUser = {
368
+ gateType,
369
+ ...(gateType === 'code' ? { codeLength } : {})
370
+ };
371
+ /* Map flat boolean flags to nested object structures. */
372
+ const emailConfirmation = flat.emailConfirmation !== undefined ? flat.emailConfirmation : true;
373
+ nested.emailConfirmation = { enabled: emailConfirmation };
374
+ const deviceVerification = flat.deviceVerification !== undefined ? flat.deviceVerification : true;
375
+ nested.deviceVerification = {
376
+ enabled: deviceVerification,
377
+ trustDurationDays: flat.trustDurationDays || 90
378
+ };
379
+ /* Pass through remaining fields with defaults. */
380
+ nested.confirmRedirectPath = flat.confirmRedirectPath || '/confirm';
381
+ nested.enableOfflineAuth =
382
+ flat.enableOfflineAuth !== undefined ? flat.enableOfflineAuth : true;
383
+ if (flat.sessionValidationIntervalMs !== undefined) {
384
+ nested.sessionValidationIntervalMs =
385
+ flat.sessionValidationIntervalMs;
386
+ }
387
+ if (flat.profileExtractor) {
388
+ nested.profileExtractor = flat.profileExtractor;
389
+ }
390
+ if (flat.profileToMetadata) {
391
+ nested.profileToMetadata = flat.profileToMetadata;
392
+ }
393
+ return nested;
394
+ }
167
395
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -2,14 +2,9 @@
2
2
  * @fileoverview IndexedDB Database Management via Dexie
3
3
  *
4
4
  * Manages the lifecycle of the Dexie (IndexedDB) database instance used
5
- * by the sync engine. The engine can operate in two modes:
6
- *
7
- * 1. **Managed mode** The engine creates and owns the Dexie instance
8
- * via {@link createDatabase}. System tables (syncQueue, conflictHistory,
9
- * etc.) are automatically merged into every schema version declaration.
10
- *
11
- * 2. **Provided mode** — The consumer passes a pre-created Dexie instance
12
- * via {@link _setManagedDb} (backward compatibility).
5
+ * by the sync engine. The engine creates and owns the Dexie instance
6
+ * via {@link createDatabase}. System tables (syncQueue, conflictHistory,
7
+ * etc.) are automatically merged into every schema version declaration.
13
8
  *
14
9
  * Recovery strategy:
15
10
  * If the database fails to open (e.g., blocked by another tab, corrupted
@@ -44,6 +39,21 @@ export interface DatabaseConfig {
44
39
  /** Ordered list of version declarations (each adds or modifies tables). */
45
40
  versions: DatabaseVersionConfig[];
46
41
  }
42
+ /**
43
+ * Dexie indexes automatically appended to every app table when using the
44
+ * schema-driven API (`initEngine({ schema: {...} })`).
45
+ *
46
+ * These correspond to the system columns that every synced table has:
47
+ * - `id` — UUID primary key
48
+ * - `user_id` — ownership filter for RLS
49
+ * - `created_at` — creation timestamp
50
+ * - `updated_at` — last modification timestamp (sync cursor)
51
+ * - `deleted` — soft-delete flag
52
+ * - `_version` — optimistic concurrency version counter
53
+ *
54
+ * @see {@link config.ts#generateDatabaseFromSchema} for usage
55
+ */
56
+ export declare const SYSTEM_INDEXES = "id, user_id, created_at, updated_at, deleted, _version";
47
57
  /**
48
58
  * Create a Dexie database with system tables auto-merged into every version.
49
59
  *
@@ -71,15 +81,55 @@ export declare function createDatabase(config: DatabaseConfig, crdtEnabled?: boo
71
81
  */
72
82
  export declare function getDb(): Dexie;
73
83
  /**
74
- * Register a consumer-provided Dexie instance as the managed database.
84
+ * Result of schema version computation.
75
85
  *
76
- * Used in backward-compatibility mode when the consumer creates their own
77
- * Dexie instance and passes it via `initEngine({ db: myDexie })`.
86
+ * Contains the resolved version number plus the previous stores schema
87
+ * (if any) so that the caller can declare both versions and give Dexie
88
+ * a proper upgrade path.
89
+ */
90
+ export interface SchemaVersionResult {
91
+ /** The resolved Dexie version number (positive integer, starts at 1). */
92
+ version: number;
93
+ /**
94
+ * The previous version's store schema, or `null` if this is the first
95
+ * run or no change was detected. When non-null, the caller should declare
96
+ * **both** `previousStores` at `version - 1` and the current stores at
97
+ * `version` so Dexie can perform a non-destructive upgrade.
98
+ */
99
+ previousStores: Record<string, string> | null;
100
+ /** The previous version number, or `null` if no upgrade is needed. */
101
+ previousVersion: number | null;
102
+ }
103
+ /**
104
+ * Compute a stable Dexie version number from a merged store schema.
105
+ *
106
+ * Uses a localStorage-backed hash comparison to detect schema changes:
107
+ * 1. Compute a deterministic hash of the stringified stores object.
108
+ * 2. Compare to the previously stored hash in localStorage.
109
+ * 3. If changed → increment the stored version, persist both hash and
110
+ * previous stores schema, and return the upgrade info.
111
+ * 4. If unchanged → return the stored version.
112
+ * 5. If first run → return version 1.
113
+ *
114
+ * When a schema change is detected, the previous stores schema is returned
115
+ * so that the caller can declare both versions. This gives Dexie a proper
116
+ * upgrade path (version N → version N+1) instead of requiring a full
117
+ * database rebuild.
118
+ *
119
+ * @param prefix - Application prefix for namespacing localStorage keys.
120
+ * @param mergedStores - The complete Dexie store schema (app + system tables).
121
+ * @returns Version info including previous stores for upgrade path.
122
+ *
123
+ * @example
124
+ * const result = computeSchemaVersion('stellar', {
125
+ * goals: 'id, user_id, goal_list_id, order',
126
+ * });
127
+ * // First run: { version: 1, previousStores: null, previousVersion: null }
128
+ * // On change: { version: 2, previousStores: { goals: '...' }, previousVersion: 1 }
78
129
  *
79
- * @param db - The consumer-created Dexie instance.
80
- * @internal
130
+ * @see {@link config.ts#generateDatabaseFromSchema} for the caller
81
131
  */
82
- export declare function _setManagedDb(db: Dexie): void;
132
+ export declare function computeSchemaVersion(prefix: string, mergedStores: Record<string, string>): SchemaVersionResult;
83
133
  /**
84
134
  * Delete the IndexedDB database entirely and clear associated state.
85
135
  *
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAoDD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAsDhG;AAoCD;;;;;GAKG;AACH,wBAAgB,KAAK,IAAI,KAAK,CAK7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAE7C;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyB5D"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAMD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,2DAA2D,CAAC;AAoDvF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAsDhG;AAoCD;;;;;GAKG;AACH,wBAAgB,KAAK,IAAI,KAAK,CAO7B;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC9C,sEAAsE;IACtE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,mBAAmB,CA+CrB;AAyBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyB5D"}