stellar-drive 1.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.
- package/README.md +607 -0
- package/dist/actions/remoteChange.d.ts +204 -0
- package/dist/actions/remoteChange.d.ts.map +1 -0
- package/dist/actions/remoteChange.js +424 -0
- package/dist/actions/remoteChange.js.map +1 -0
- package/dist/actions/truncateTooltip.d.ts +56 -0
- package/dist/actions/truncateTooltip.d.ts.map +1 -0
- package/dist/actions/truncateTooltip.js +312 -0
- package/dist/actions/truncateTooltip.js.map +1 -0
- package/dist/auth/crypto.d.ts +41 -0
- package/dist/auth/crypto.d.ts.map +1 -0
- package/dist/auth/crypto.js +50 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/deviceVerification.d.ts +283 -0
- package/dist/auth/deviceVerification.d.ts.map +1 -0
- package/dist/auth/deviceVerification.js +575 -0
- package/dist/auth/deviceVerification.js.map +1 -0
- package/dist/auth/displayUtils.d.ts +98 -0
- package/dist/auth/displayUtils.d.ts.map +1 -0
- package/dist/auth/displayUtils.js +145 -0
- package/dist/auth/displayUtils.js.map +1 -0
- package/dist/auth/loginGuard.d.ts +134 -0
- package/dist/auth/loginGuard.d.ts.map +1 -0
- package/dist/auth/loginGuard.js +276 -0
- package/dist/auth/loginGuard.js.map +1 -0
- package/dist/auth/offlineCredentials.d.ts +105 -0
- package/dist/auth/offlineCredentials.d.ts.map +1 -0
- package/dist/auth/offlineCredentials.js +176 -0
- package/dist/auth/offlineCredentials.js.map +1 -0
- package/dist/auth/offlineSession.d.ts +96 -0
- package/dist/auth/offlineSession.d.ts.map +1 -0
- package/dist/auth/offlineSession.js +145 -0
- package/dist/auth/offlineSession.js.map +1 -0
- package/dist/auth/resolveAuthState.d.ts +85 -0
- package/dist/auth/resolveAuthState.d.ts.map +1 -0
- package/dist/auth/resolveAuthState.js +249 -0
- package/dist/auth/resolveAuthState.js.map +1 -0
- package/dist/auth/singleUser.d.ts +498 -0
- package/dist/auth/singleUser.d.ts.map +1 -0
- package/dist/auth/singleUser.js +1282 -0
- package/dist/auth/singleUser.js.map +1 -0
- package/dist/bin/commands.d.ts +14 -0
- package/dist/bin/commands.d.ts.map +1 -0
- package/dist/bin/commands.js +68 -0
- package/dist/bin/commands.js.map +1 -0
- package/dist/bin/install-pwa.d.ts +41 -0
- package/dist/bin/install-pwa.d.ts.map +1 -0
- package/dist/bin/install-pwa.js +4594 -0
- package/dist/bin/install-pwa.js.map +1 -0
- package/dist/config.d.ts +249 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +395 -0
- package/dist/config.js.map +1 -0
- package/dist/conflicts.d.ts +306 -0
- package/dist/conflicts.d.ts.map +1 -0
- package/dist/conflicts.js +807 -0
- package/dist/conflicts.js.map +1 -0
- package/dist/crdt/awareness.d.ts +128 -0
- package/dist/crdt/awareness.d.ts.map +1 -0
- package/dist/crdt/awareness.js +284 -0
- package/dist/crdt/awareness.js.map +1 -0
- package/dist/crdt/channel.d.ts +165 -0
- package/dist/crdt/channel.d.ts.map +1 -0
- package/dist/crdt/channel.js +522 -0
- package/dist/crdt/channel.js.map +1 -0
- package/dist/crdt/config.d.ts +58 -0
- package/dist/crdt/config.d.ts.map +1 -0
- package/dist/crdt/config.js +123 -0
- package/dist/crdt/config.js.map +1 -0
- package/dist/crdt/helpers.d.ts +104 -0
- package/dist/crdt/helpers.d.ts.map +1 -0
- package/dist/crdt/helpers.js +116 -0
- package/dist/crdt/helpers.js.map +1 -0
- package/dist/crdt/offline.d.ts +58 -0
- package/dist/crdt/offline.d.ts.map +1 -0
- package/dist/crdt/offline.js +130 -0
- package/dist/crdt/offline.js.map +1 -0
- package/dist/crdt/persistence.d.ts +65 -0
- package/dist/crdt/persistence.d.ts.map +1 -0
- package/dist/crdt/persistence.js +171 -0
- package/dist/crdt/persistence.js.map +1 -0
- package/dist/crdt/provider.d.ts +109 -0
- package/dist/crdt/provider.d.ts.map +1 -0
- package/dist/crdt/provider.js +543 -0
- package/dist/crdt/provider.js.map +1 -0
- package/dist/crdt/store.d.ts +111 -0
- package/dist/crdt/store.d.ts.map +1 -0
- package/dist/crdt/store.js +158 -0
- package/dist/crdt/store.js.map +1 -0
- package/dist/crdt/types.d.ts +281 -0
- package/dist/crdt/types.d.ts.map +1 -0
- package/dist/crdt/types.js +26 -0
- package/dist/crdt/types.js.map +1 -0
- package/dist/data.d.ts +502 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +862 -0
- package/dist/data.js.map +1 -0
- package/dist/database.d.ts +153 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +325 -0
- package/dist/database.js.map +1 -0
- package/dist/debug.d.ts +87 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +135 -0
- package/dist/debug.js.map +1 -0
- package/dist/demo.d.ts +131 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +168 -0
- package/dist/demo.js.map +1 -0
- package/dist/deviceId.d.ts +47 -0
- package/dist/deviceId.d.ts.map +1 -0
- package/dist/deviceId.js +106 -0
- package/dist/deviceId.js.map +1 -0
- package/dist/diagnostics.d.ts +292 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +378 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/engine.d.ts +230 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +2636 -0
- package/dist/engine.js.map +1 -0
- package/dist/entries/actions.d.ts +16 -0
- package/dist/entries/actions.d.ts.map +1 -0
- package/dist/entries/actions.js +29 -0
- package/dist/entries/actions.js.map +1 -0
- package/dist/entries/auth.d.ts +19 -0
- package/dist/entries/auth.d.ts.map +1 -0
- package/dist/entries/auth.js +50 -0
- package/dist/entries/auth.js.map +1 -0
- package/dist/entries/config.d.ts +15 -0
- package/dist/entries/config.d.ts.map +1 -0
- package/dist/entries/config.js +20 -0
- package/dist/entries/config.js.map +1 -0
- package/dist/entries/crdt.d.ts +32 -0
- package/dist/entries/crdt.d.ts.map +1 -0
- package/dist/entries/crdt.js +52 -0
- package/dist/entries/crdt.js.map +1 -0
- package/dist/entries/kit.d.ts +22 -0
- package/dist/entries/kit.d.ts.map +1 -0
- package/dist/entries/kit.js +58 -0
- package/dist/entries/kit.js.map +1 -0
- package/dist/entries/stores.d.ts +22 -0
- package/dist/entries/stores.d.ts.map +1 -0
- package/dist/entries/stores.js +57 -0
- package/dist/entries/stores.js.map +1 -0
- package/dist/entries/types.d.ts +23 -0
- package/dist/entries/types.d.ts.map +1 -0
- package/dist/entries/types.js +12 -0
- package/dist/entries/types.js.map +1 -0
- package/dist/entries/utils.d.ts +12 -0
- package/dist/entries/utils.d.ts.map +1 -0
- package/dist/entries/utils.js +42 -0
- package/dist/entries/utils.js.map +1 -0
- package/dist/entries/vite.d.ts +20 -0
- package/dist/entries/vite.d.ts.map +1 -0
- package/dist/entries/vite.js +26 -0
- package/dist/entries/vite.js.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +234 -0
- package/dist/index.js.map +1 -0
- package/dist/kit/auth.d.ts +80 -0
- package/dist/kit/auth.d.ts.map +1 -0
- package/dist/kit/auth.js +75 -0
- package/dist/kit/auth.js.map +1 -0
- package/dist/kit/confirm.d.ts +111 -0
- package/dist/kit/confirm.d.ts.map +1 -0
- package/dist/kit/confirm.js +169 -0
- package/dist/kit/confirm.js.map +1 -0
- package/dist/kit/loads.d.ts +187 -0
- package/dist/kit/loads.d.ts.map +1 -0
- package/dist/kit/loads.js +208 -0
- package/dist/kit/loads.js.map +1 -0
- package/dist/kit/server.d.ts +175 -0
- package/dist/kit/server.d.ts.map +1 -0
- package/dist/kit/server.js +297 -0
- package/dist/kit/server.js.map +1 -0
- package/dist/kit/sw.d.ts +176 -0
- package/dist/kit/sw.d.ts.map +1 -0
- package/dist/kit/sw.js +320 -0
- package/dist/kit/sw.js.map +1 -0
- package/dist/queue.d.ts +306 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +925 -0
- package/dist/queue.js.map +1 -0
- package/dist/realtime.d.ts +280 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +1031 -0
- package/dist/realtime.js.map +1 -0
- package/dist/runtime/runtimeConfig.d.ts +110 -0
- package/dist/runtime/runtimeConfig.d.ts.map +1 -0
- package/dist/runtime/runtimeConfig.js +260 -0
- package/dist/runtime/runtimeConfig.js.map +1 -0
- package/dist/schema.d.ts +150 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +891 -0
- package/dist/schema.js.map +1 -0
- package/dist/stores/authState.d.ts +204 -0
- package/dist/stores/authState.d.ts.map +1 -0
- package/dist/stores/authState.js +336 -0
- package/dist/stores/authState.js.map +1 -0
- package/dist/stores/factories.d.ts +140 -0
- package/dist/stores/factories.d.ts.map +1 -0
- package/dist/stores/factories.js +157 -0
- package/dist/stores/factories.js.map +1 -0
- package/dist/stores/network.d.ts +48 -0
- package/dist/stores/network.d.ts.map +1 -0
- package/dist/stores/network.js +261 -0
- package/dist/stores/network.js.map +1 -0
- package/dist/stores/remoteChanges.d.ts +417 -0
- package/dist/stores/remoteChanges.d.ts.map +1 -0
- package/dist/stores/remoteChanges.js +626 -0
- package/dist/stores/remoteChanges.js.map +1 -0
- package/dist/stores/sync.d.ts +165 -0
- package/dist/stores/sync.d.ts.map +1 -0
- package/dist/stores/sync.js +275 -0
- package/dist/stores/sync.js.map +1 -0
- package/dist/supabase/auth.d.ts +219 -0
- package/dist/supabase/auth.d.ts.map +1 -0
- package/dist/supabase/auth.js +459 -0
- package/dist/supabase/auth.js.map +1 -0
- package/dist/supabase/client.d.ts +88 -0
- package/dist/supabase/client.d.ts.map +1 -0
- package/dist/supabase/client.js +313 -0
- package/dist/supabase/client.js.map +1 -0
- package/dist/supabase/validate.d.ts +118 -0
- package/dist/supabase/validate.d.ts.map +1 -0
- package/dist/supabase/validate.js +208 -0
- package/dist/supabase/validate.js.map +1 -0
- package/dist/sw/build/vite-plugin.d.ts +149 -0
- package/dist/sw/build/vite-plugin.d.ts.map +1 -0
- package/dist/sw/build/vite-plugin.js +517 -0
- package/dist/sw/build/vite-plugin.js.map +1 -0
- package/dist/sw/sw.js +664 -0
- package/dist/types.d.ts +363 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +85 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +156 -0
- package/dist/utils.js.map +1 -0
- package/package.json +117 -0
- package/src/components/DeferredChangesBanner.svelte +477 -0
- package/src/components/DemoBanner.svelte +110 -0
- package/src/components/SyncStatus.svelte +1732 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Engine Configuration and Initialization
|
|
3
|
+
*
|
|
4
|
+
* Central configuration hub for the sync engine. {@link initEngine} is the
|
|
5
|
+
* first function consumers call — it accepts a configuration object that
|
|
6
|
+
* describes:
|
|
7
|
+
* - Which Supabase tables to sync and their IndexedDB schemas
|
|
8
|
+
* - Authentication configuration (single-user gate, offline auth, etc.)
|
|
9
|
+
* - Sync timing parameters (debounce, polling interval, tombstone TTL)
|
|
10
|
+
* - Optional callbacks for auth state changes
|
|
11
|
+
*
|
|
12
|
+
* The config is stored as a module-level singleton and accessed by every other
|
|
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.
|
|
18
|
+
*
|
|
19
|
+
* @see {@link database.ts} for Dexie instance creation
|
|
20
|
+
* @see {@link engine.ts} for the sync lifecycle that consumes this config
|
|
21
|
+
*/
|
|
22
|
+
import { _setDebugPrefix } from './debug';
|
|
23
|
+
import { _setDeviceIdPrefix } from './deviceId';
|
|
24
|
+
import { _setClientPrefix } from './supabase/client';
|
|
25
|
+
import { _setConfigPrefix } from './runtime/runtimeConfig';
|
|
26
|
+
import { registerDemoConfig, _setDemoPrefix, isDemoMode } from './demo';
|
|
27
|
+
import { createDatabase, SYSTEM_INDEXES, computeSchemaVersion } from './database';
|
|
28
|
+
import { _initCRDT } from './crdt/config';
|
|
29
|
+
import { snakeToCamel } from './utils';
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Module State
|
|
32
|
+
// =============================================================================
|
|
33
|
+
/** Singleton engine configuration (set by {@link initEngine}). */
|
|
34
|
+
let engineConfig = null;
|
|
35
|
+
/** Promise that resolves when the database is fully opened and upgraded. */
|
|
36
|
+
let _dbReady = null;
|
|
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. */
|
|
63
|
+
engineConfig = config;
|
|
64
|
+
/* Propagate prefix to all internal modules that use localStorage keys. */
|
|
65
|
+
if (config.prefix) {
|
|
66
|
+
_setDebugPrefix(config.prefix);
|
|
67
|
+
_setDeviceIdPrefix(config.prefix);
|
|
68
|
+
_setClientPrefix(config.prefix);
|
|
69
|
+
_setConfigPrefix(config.prefix);
|
|
70
|
+
_setDemoPrefix(config.prefix);
|
|
71
|
+
}
|
|
72
|
+
/* Register demo config if provided. */
|
|
73
|
+
if (config.demo) {
|
|
74
|
+
registerDemoConfig(config.demo);
|
|
75
|
+
}
|
|
76
|
+
/* Initialize CRDT subsystem if configured. */
|
|
77
|
+
if (config.crdt) {
|
|
78
|
+
_initCRDT(config.crdt, config.prefix);
|
|
79
|
+
}
|
|
80
|
+
/* If demo mode is active, switch to a separate sandboxed database. */
|
|
81
|
+
if (isDemoMode() && config.database) {
|
|
82
|
+
config.database = { ...config.database, name: config.database.name + '_demo' };
|
|
83
|
+
}
|
|
84
|
+
/* Create the Dexie database and store the instance on config for engine.ts access.
|
|
85
|
+
* Pass crdtEnabled flag so CRDT IndexedDB tables are conditionally included. */
|
|
86
|
+
if (config.database) {
|
|
87
|
+
_dbReady = createDatabase(config.database, !!config.crdt).then((db) => {
|
|
88
|
+
config.db = db;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// Accessors
|
|
94
|
+
// =============================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Wait for the database to be fully opened and upgraded.
|
|
97
|
+
*
|
|
98
|
+
* Must be awaited before any IndexedDB access. Returns immediately if
|
|
99
|
+
* the database was provided directly (no async creation needed).
|
|
100
|
+
*
|
|
101
|
+
* @returns A promise that resolves when the DB is ready.
|
|
102
|
+
*/
|
|
103
|
+
export function waitForDb() {
|
|
104
|
+
return _dbReady || Promise.resolve();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the current engine configuration.
|
|
108
|
+
*
|
|
109
|
+
* @throws {Error} If {@link initEngine} has not been called yet.
|
|
110
|
+
* @returns The singleton {@link SyncEngineConfig} object.
|
|
111
|
+
*/
|
|
112
|
+
export function getEngineConfig() {
|
|
113
|
+
if (!engineConfig) {
|
|
114
|
+
throw new Error('Sync engine not initialized. Call initEngine() first.');
|
|
115
|
+
}
|
|
116
|
+
return engineConfig;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the Dexie (IndexedDB) table name for a given table config entry.
|
|
120
|
+
*
|
|
121
|
+
* Derives the name from `supabaseName` via snake_case → camelCase conversion.
|
|
122
|
+
*
|
|
123
|
+
* @param table - A table configuration entry.
|
|
124
|
+
* @returns The camelCase Dexie table name (e.g., `'goalLists'` for `'goal_lists'`).
|
|
125
|
+
*/
|
|
126
|
+
export function getDexieTableFor(table) {
|
|
127
|
+
return snakeToCamel(table.supabaseName);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build a lookup map from Supabase table names to Dexie table names.
|
|
131
|
+
*
|
|
132
|
+
* Used by {@link data.ts} to resolve table names at runtime.
|
|
133
|
+
*
|
|
134
|
+
* @returns An object mapping Supabase names → Dexie names.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* getTableMap(); // { goal_lists: 'goalLists', goals: 'goals' }
|
|
138
|
+
*/
|
|
139
|
+
export function getTableMap() {
|
|
140
|
+
const config = getEngineConfig();
|
|
141
|
+
const map = {};
|
|
142
|
+
for (const table of config.tables) {
|
|
143
|
+
map[table.supabaseName] = getDexieTableFor(table);
|
|
144
|
+
}
|
|
145
|
+
return map;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get the SELECT column list for a specific Supabase table.
|
|
149
|
+
*
|
|
150
|
+
* Used to build egress-optimized queries that only fetch needed columns.
|
|
151
|
+
*
|
|
152
|
+
* @param supabaseName - The Supabase table name (e.g., `'goals'`).
|
|
153
|
+
* @throws {Error} If the table is not found in the engine config.
|
|
154
|
+
* @returns The comma-separated column string.
|
|
155
|
+
*/
|
|
156
|
+
export function getTableColumns(supabaseName) {
|
|
157
|
+
const config = getEngineConfig();
|
|
158
|
+
const table = config.tables.find((t) => t.supabaseName === supabaseName);
|
|
159
|
+
if (!table) {
|
|
160
|
+
throw new Error(`Table ${supabaseName} not found in engine config`);
|
|
161
|
+
}
|
|
162
|
+
return table.columns;
|
|
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
|
+
}
|
|
395
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|