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.
Files changed (246) hide show
  1. package/README.md +607 -0
  2. package/dist/actions/remoteChange.d.ts +204 -0
  3. package/dist/actions/remoteChange.d.ts.map +1 -0
  4. package/dist/actions/remoteChange.js +424 -0
  5. package/dist/actions/remoteChange.js.map +1 -0
  6. package/dist/actions/truncateTooltip.d.ts +56 -0
  7. package/dist/actions/truncateTooltip.d.ts.map +1 -0
  8. package/dist/actions/truncateTooltip.js +312 -0
  9. package/dist/actions/truncateTooltip.js.map +1 -0
  10. package/dist/auth/crypto.d.ts +41 -0
  11. package/dist/auth/crypto.d.ts.map +1 -0
  12. package/dist/auth/crypto.js +50 -0
  13. package/dist/auth/crypto.js.map +1 -0
  14. package/dist/auth/deviceVerification.d.ts +283 -0
  15. package/dist/auth/deviceVerification.d.ts.map +1 -0
  16. package/dist/auth/deviceVerification.js +575 -0
  17. package/dist/auth/deviceVerification.js.map +1 -0
  18. package/dist/auth/displayUtils.d.ts +98 -0
  19. package/dist/auth/displayUtils.d.ts.map +1 -0
  20. package/dist/auth/displayUtils.js +145 -0
  21. package/dist/auth/displayUtils.js.map +1 -0
  22. package/dist/auth/loginGuard.d.ts +134 -0
  23. package/dist/auth/loginGuard.d.ts.map +1 -0
  24. package/dist/auth/loginGuard.js +276 -0
  25. package/dist/auth/loginGuard.js.map +1 -0
  26. package/dist/auth/offlineCredentials.d.ts +105 -0
  27. package/dist/auth/offlineCredentials.d.ts.map +1 -0
  28. package/dist/auth/offlineCredentials.js +176 -0
  29. package/dist/auth/offlineCredentials.js.map +1 -0
  30. package/dist/auth/offlineSession.d.ts +96 -0
  31. package/dist/auth/offlineSession.d.ts.map +1 -0
  32. package/dist/auth/offlineSession.js +145 -0
  33. package/dist/auth/offlineSession.js.map +1 -0
  34. package/dist/auth/resolveAuthState.d.ts +85 -0
  35. package/dist/auth/resolveAuthState.d.ts.map +1 -0
  36. package/dist/auth/resolveAuthState.js +249 -0
  37. package/dist/auth/resolveAuthState.js.map +1 -0
  38. package/dist/auth/singleUser.d.ts +498 -0
  39. package/dist/auth/singleUser.d.ts.map +1 -0
  40. package/dist/auth/singleUser.js +1282 -0
  41. package/dist/auth/singleUser.js.map +1 -0
  42. package/dist/bin/commands.d.ts +14 -0
  43. package/dist/bin/commands.d.ts.map +1 -0
  44. package/dist/bin/commands.js +68 -0
  45. package/dist/bin/commands.js.map +1 -0
  46. package/dist/bin/install-pwa.d.ts +41 -0
  47. package/dist/bin/install-pwa.d.ts.map +1 -0
  48. package/dist/bin/install-pwa.js +4594 -0
  49. package/dist/bin/install-pwa.js.map +1 -0
  50. package/dist/config.d.ts +249 -0
  51. package/dist/config.d.ts.map +1 -0
  52. package/dist/config.js +395 -0
  53. package/dist/config.js.map +1 -0
  54. package/dist/conflicts.d.ts +306 -0
  55. package/dist/conflicts.d.ts.map +1 -0
  56. package/dist/conflicts.js +807 -0
  57. package/dist/conflicts.js.map +1 -0
  58. package/dist/crdt/awareness.d.ts +128 -0
  59. package/dist/crdt/awareness.d.ts.map +1 -0
  60. package/dist/crdt/awareness.js +284 -0
  61. package/dist/crdt/awareness.js.map +1 -0
  62. package/dist/crdt/channel.d.ts +165 -0
  63. package/dist/crdt/channel.d.ts.map +1 -0
  64. package/dist/crdt/channel.js +522 -0
  65. package/dist/crdt/channel.js.map +1 -0
  66. package/dist/crdt/config.d.ts +58 -0
  67. package/dist/crdt/config.d.ts.map +1 -0
  68. package/dist/crdt/config.js +123 -0
  69. package/dist/crdt/config.js.map +1 -0
  70. package/dist/crdt/helpers.d.ts +104 -0
  71. package/dist/crdt/helpers.d.ts.map +1 -0
  72. package/dist/crdt/helpers.js +116 -0
  73. package/dist/crdt/helpers.js.map +1 -0
  74. package/dist/crdt/offline.d.ts +58 -0
  75. package/dist/crdt/offline.d.ts.map +1 -0
  76. package/dist/crdt/offline.js +130 -0
  77. package/dist/crdt/offline.js.map +1 -0
  78. package/dist/crdt/persistence.d.ts +65 -0
  79. package/dist/crdt/persistence.d.ts.map +1 -0
  80. package/dist/crdt/persistence.js +171 -0
  81. package/dist/crdt/persistence.js.map +1 -0
  82. package/dist/crdt/provider.d.ts +109 -0
  83. package/dist/crdt/provider.d.ts.map +1 -0
  84. package/dist/crdt/provider.js +543 -0
  85. package/dist/crdt/provider.js.map +1 -0
  86. package/dist/crdt/store.d.ts +111 -0
  87. package/dist/crdt/store.d.ts.map +1 -0
  88. package/dist/crdt/store.js +158 -0
  89. package/dist/crdt/store.js.map +1 -0
  90. package/dist/crdt/types.d.ts +281 -0
  91. package/dist/crdt/types.d.ts.map +1 -0
  92. package/dist/crdt/types.js +26 -0
  93. package/dist/crdt/types.js.map +1 -0
  94. package/dist/data.d.ts +502 -0
  95. package/dist/data.d.ts.map +1 -0
  96. package/dist/data.js +862 -0
  97. package/dist/data.js.map +1 -0
  98. package/dist/database.d.ts +153 -0
  99. package/dist/database.d.ts.map +1 -0
  100. package/dist/database.js +325 -0
  101. package/dist/database.js.map +1 -0
  102. package/dist/debug.d.ts +87 -0
  103. package/dist/debug.d.ts.map +1 -0
  104. package/dist/debug.js +135 -0
  105. package/dist/debug.js.map +1 -0
  106. package/dist/demo.d.ts +131 -0
  107. package/dist/demo.d.ts.map +1 -0
  108. package/dist/demo.js +168 -0
  109. package/dist/demo.js.map +1 -0
  110. package/dist/deviceId.d.ts +47 -0
  111. package/dist/deviceId.d.ts.map +1 -0
  112. package/dist/deviceId.js +106 -0
  113. package/dist/deviceId.js.map +1 -0
  114. package/dist/diagnostics.d.ts +292 -0
  115. package/dist/diagnostics.d.ts.map +1 -0
  116. package/dist/diagnostics.js +378 -0
  117. package/dist/diagnostics.js.map +1 -0
  118. package/dist/engine.d.ts +230 -0
  119. package/dist/engine.d.ts.map +1 -0
  120. package/dist/engine.js +2636 -0
  121. package/dist/engine.js.map +1 -0
  122. package/dist/entries/actions.d.ts +16 -0
  123. package/dist/entries/actions.d.ts.map +1 -0
  124. package/dist/entries/actions.js +29 -0
  125. package/dist/entries/actions.js.map +1 -0
  126. package/dist/entries/auth.d.ts +19 -0
  127. package/dist/entries/auth.d.ts.map +1 -0
  128. package/dist/entries/auth.js +50 -0
  129. package/dist/entries/auth.js.map +1 -0
  130. package/dist/entries/config.d.ts +15 -0
  131. package/dist/entries/config.d.ts.map +1 -0
  132. package/dist/entries/config.js +20 -0
  133. package/dist/entries/config.js.map +1 -0
  134. package/dist/entries/crdt.d.ts +32 -0
  135. package/dist/entries/crdt.d.ts.map +1 -0
  136. package/dist/entries/crdt.js +52 -0
  137. package/dist/entries/crdt.js.map +1 -0
  138. package/dist/entries/kit.d.ts +22 -0
  139. package/dist/entries/kit.d.ts.map +1 -0
  140. package/dist/entries/kit.js +58 -0
  141. package/dist/entries/kit.js.map +1 -0
  142. package/dist/entries/stores.d.ts +22 -0
  143. package/dist/entries/stores.d.ts.map +1 -0
  144. package/dist/entries/stores.js +57 -0
  145. package/dist/entries/stores.js.map +1 -0
  146. package/dist/entries/types.d.ts +23 -0
  147. package/dist/entries/types.d.ts.map +1 -0
  148. package/dist/entries/types.js +12 -0
  149. package/dist/entries/types.js.map +1 -0
  150. package/dist/entries/utils.d.ts +12 -0
  151. package/dist/entries/utils.d.ts.map +1 -0
  152. package/dist/entries/utils.js +42 -0
  153. package/dist/entries/utils.js.map +1 -0
  154. package/dist/entries/vite.d.ts +20 -0
  155. package/dist/entries/vite.d.ts.map +1 -0
  156. package/dist/entries/vite.js +26 -0
  157. package/dist/entries/vite.js.map +1 -0
  158. package/dist/index.d.ts +77 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +234 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/kit/auth.d.ts +80 -0
  163. package/dist/kit/auth.d.ts.map +1 -0
  164. package/dist/kit/auth.js +75 -0
  165. package/dist/kit/auth.js.map +1 -0
  166. package/dist/kit/confirm.d.ts +111 -0
  167. package/dist/kit/confirm.d.ts.map +1 -0
  168. package/dist/kit/confirm.js +169 -0
  169. package/dist/kit/confirm.js.map +1 -0
  170. package/dist/kit/loads.d.ts +187 -0
  171. package/dist/kit/loads.d.ts.map +1 -0
  172. package/dist/kit/loads.js +208 -0
  173. package/dist/kit/loads.js.map +1 -0
  174. package/dist/kit/server.d.ts +175 -0
  175. package/dist/kit/server.d.ts.map +1 -0
  176. package/dist/kit/server.js +297 -0
  177. package/dist/kit/server.js.map +1 -0
  178. package/dist/kit/sw.d.ts +176 -0
  179. package/dist/kit/sw.d.ts.map +1 -0
  180. package/dist/kit/sw.js +320 -0
  181. package/dist/kit/sw.js.map +1 -0
  182. package/dist/queue.d.ts +306 -0
  183. package/dist/queue.d.ts.map +1 -0
  184. package/dist/queue.js +925 -0
  185. package/dist/queue.js.map +1 -0
  186. package/dist/realtime.d.ts +280 -0
  187. package/dist/realtime.d.ts.map +1 -0
  188. package/dist/realtime.js +1031 -0
  189. package/dist/realtime.js.map +1 -0
  190. package/dist/runtime/runtimeConfig.d.ts +110 -0
  191. package/dist/runtime/runtimeConfig.d.ts.map +1 -0
  192. package/dist/runtime/runtimeConfig.js +260 -0
  193. package/dist/runtime/runtimeConfig.js.map +1 -0
  194. package/dist/schema.d.ts +150 -0
  195. package/dist/schema.d.ts.map +1 -0
  196. package/dist/schema.js +891 -0
  197. package/dist/schema.js.map +1 -0
  198. package/dist/stores/authState.d.ts +204 -0
  199. package/dist/stores/authState.d.ts.map +1 -0
  200. package/dist/stores/authState.js +336 -0
  201. package/dist/stores/authState.js.map +1 -0
  202. package/dist/stores/factories.d.ts +140 -0
  203. package/dist/stores/factories.d.ts.map +1 -0
  204. package/dist/stores/factories.js +157 -0
  205. package/dist/stores/factories.js.map +1 -0
  206. package/dist/stores/network.d.ts +48 -0
  207. package/dist/stores/network.d.ts.map +1 -0
  208. package/dist/stores/network.js +261 -0
  209. package/dist/stores/network.js.map +1 -0
  210. package/dist/stores/remoteChanges.d.ts +417 -0
  211. package/dist/stores/remoteChanges.d.ts.map +1 -0
  212. package/dist/stores/remoteChanges.js +626 -0
  213. package/dist/stores/remoteChanges.js.map +1 -0
  214. package/dist/stores/sync.d.ts +165 -0
  215. package/dist/stores/sync.d.ts.map +1 -0
  216. package/dist/stores/sync.js +275 -0
  217. package/dist/stores/sync.js.map +1 -0
  218. package/dist/supabase/auth.d.ts +219 -0
  219. package/dist/supabase/auth.d.ts.map +1 -0
  220. package/dist/supabase/auth.js +459 -0
  221. package/dist/supabase/auth.js.map +1 -0
  222. package/dist/supabase/client.d.ts +88 -0
  223. package/dist/supabase/client.d.ts.map +1 -0
  224. package/dist/supabase/client.js +313 -0
  225. package/dist/supabase/client.js.map +1 -0
  226. package/dist/supabase/validate.d.ts +118 -0
  227. package/dist/supabase/validate.d.ts.map +1 -0
  228. package/dist/supabase/validate.js +208 -0
  229. package/dist/supabase/validate.js.map +1 -0
  230. package/dist/sw/build/vite-plugin.d.ts +149 -0
  231. package/dist/sw/build/vite-plugin.d.ts.map +1 -0
  232. package/dist/sw/build/vite-plugin.js +517 -0
  233. package/dist/sw/build/vite-plugin.js.map +1 -0
  234. package/dist/sw/sw.js +664 -0
  235. package/dist/types.d.ts +363 -0
  236. package/dist/types.d.ts.map +1 -0
  237. package/dist/types.js +18 -0
  238. package/dist/types.js.map +1 -0
  239. package/dist/utils.d.ts +85 -0
  240. package/dist/utils.d.ts.map +1 -0
  241. package/dist/utils.js +156 -0
  242. package/dist/utils.js.map +1 -0
  243. package/package.json +117 -0
  244. package/src/components/DeferredChangesBanner.svelte +477 -0
  245. package/src/components/DemoBanner.svelte +110 -0
  246. 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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"}