@prabhask5/stellar-engine 1.1.7 → 1.1.9

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 (191) hide show
  1. package/README.md +12 -18
  2. package/dist/actions/remoteChange.d.ts +143 -18
  3. package/dist/actions/remoteChange.d.ts.map +1 -1
  4. package/dist/actions/remoteChange.js +182 -58
  5. package/dist/actions/remoteChange.js.map +1 -1
  6. package/dist/actions/truncateTooltip.d.ts +26 -12
  7. package/dist/actions/truncateTooltip.d.ts.map +1 -1
  8. package/dist/actions/truncateTooltip.js +89 -34
  9. package/dist/actions/truncateTooltip.js.map +1 -1
  10. package/dist/auth/crypto.d.ts +35 -8
  11. package/dist/auth/crypto.d.ts.map +1 -1
  12. package/dist/auth/crypto.js +38 -10
  13. package/dist/auth/crypto.js.map +1 -1
  14. package/dist/auth/deviceVerification.d.ts +236 -20
  15. package/dist/auth/deviceVerification.d.ts.map +1 -1
  16. package/dist/auth/deviceVerification.js +293 -40
  17. package/dist/auth/deviceVerification.js.map +1 -1
  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 +133 -0
  21. package/dist/auth/displayUtils.js.map +1 -0
  22. package/dist/auth/loginGuard.d.ts +103 -16
  23. package/dist/auth/loginGuard.d.ts.map +1 -1
  24. package/dist/auth/loginGuard.js +163 -76
  25. package/dist/auth/loginGuard.js.map +1 -1
  26. package/dist/auth/offlineCredentials.d.ts +88 -24
  27. package/dist/auth/offlineCredentials.d.ts.map +1 -1
  28. package/dist/auth/offlineCredentials.js +114 -73
  29. package/dist/auth/offlineCredentials.js.map +1 -1
  30. package/dist/auth/offlineSession.d.ts +83 -9
  31. package/dist/auth/offlineSession.d.ts.map +1 -1
  32. package/dist/auth/offlineSession.js +104 -13
  33. package/dist/auth/offlineSession.js.map +1 -1
  34. package/dist/auth/resolveAuthState.d.ts +67 -9
  35. package/dist/auth/resolveAuthState.d.ts.map +1 -1
  36. package/dist/auth/resolveAuthState.js +125 -71
  37. package/dist/auth/resolveAuthState.js.map +1 -1
  38. package/dist/auth/singleUser.d.ts +390 -37
  39. package/dist/auth/singleUser.d.ts.map +1 -1
  40. package/dist/auth/singleUser.js +504 -103
  41. package/dist/auth/singleUser.js.map +1 -1
  42. package/dist/bin/install-pwa.d.ts +18 -2
  43. package/dist/bin/install-pwa.d.ts.map +1 -1
  44. package/dist/bin/install-pwa.js +2624 -77
  45. package/dist/bin/install-pwa.js.map +1 -1
  46. package/dist/config.d.ts +131 -15
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +87 -9
  49. package/dist/config.js.map +1 -1
  50. package/dist/conflicts.d.ts +246 -23
  51. package/dist/conflicts.d.ts.map +1 -1
  52. package/dist/conflicts.js +495 -46
  53. package/dist/conflicts.js.map +1 -1
  54. package/dist/data.d.ts +338 -18
  55. package/dist/data.d.ts.map +1 -1
  56. package/dist/data.js +385 -34
  57. package/dist/data.js.map +1 -1
  58. package/dist/database.d.ts +72 -14
  59. package/dist/database.d.ts.map +1 -1
  60. package/dist/database.js +120 -29
  61. package/dist/database.js.map +1 -1
  62. package/dist/debug.d.ts +77 -1
  63. package/dist/debug.d.ts.map +1 -1
  64. package/dist/debug.js +88 -1
  65. package/dist/debug.js.map +1 -1
  66. package/dist/deviceId.d.ts +38 -7
  67. package/dist/deviceId.d.ts.map +1 -1
  68. package/dist/deviceId.js +68 -10
  69. package/dist/deviceId.js.map +1 -1
  70. package/dist/engine.d.ts +175 -3
  71. package/dist/engine.d.ts.map +1 -1
  72. package/dist/engine.js +756 -109
  73. package/dist/engine.js.map +1 -1
  74. package/dist/entries/actions.d.ts +13 -0
  75. package/dist/entries/actions.d.ts.map +1 -1
  76. package/dist/entries/actions.js +26 -1
  77. package/dist/entries/actions.js.map +1 -1
  78. package/dist/entries/auth.d.ts +15 -4
  79. package/dist/entries/auth.d.ts.map +1 -1
  80. package/dist/entries/auth.js +47 -4
  81. package/dist/entries/auth.js.map +1 -1
  82. package/dist/entries/config.d.ts +12 -0
  83. package/dist/entries/config.d.ts.map +1 -1
  84. package/dist/entries/config.js +18 -1
  85. package/dist/entries/config.js.map +1 -1
  86. package/dist/entries/kit.d.ts +11 -0
  87. package/dist/entries/kit.d.ts.map +1 -1
  88. package/dist/entries/kit.js +52 -2
  89. package/dist/entries/kit.js.map +1 -1
  90. package/dist/entries/stores.d.ts +11 -0
  91. package/dist/entries/stores.d.ts.map +1 -1
  92. package/dist/entries/stores.js +43 -2
  93. package/dist/entries/stores.js.map +1 -1
  94. package/dist/entries/types.d.ts +10 -1
  95. package/dist/entries/types.d.ts.map +1 -1
  96. package/dist/entries/types.js +10 -0
  97. package/dist/entries/types.js.map +1 -1
  98. package/dist/entries/utils.d.ts +6 -0
  99. package/dist/entries/utils.d.ts.map +1 -1
  100. package/dist/entries/utils.js +22 -1
  101. package/dist/entries/utils.js.map +1 -1
  102. package/dist/entries/vite.d.ts +17 -0
  103. package/dist/entries/vite.d.ts.map +1 -1
  104. package/dist/entries/vite.js +24 -1
  105. package/dist/entries/vite.js.map +1 -1
  106. package/dist/index.d.ts +32 -4
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +166 -23
  109. package/dist/index.js.map +1 -1
  110. package/dist/kit/auth.d.ts +60 -5
  111. package/dist/kit/auth.d.ts.map +1 -1
  112. package/dist/kit/auth.js +45 -4
  113. package/dist/kit/auth.js.map +1 -1
  114. package/dist/kit/confirm.d.ts +93 -12
  115. package/dist/kit/confirm.d.ts.map +1 -1
  116. package/dist/kit/confirm.js +103 -16
  117. package/dist/kit/confirm.js.map +1 -1
  118. package/dist/kit/loads.d.ts +148 -23
  119. package/dist/kit/loads.d.ts.map +1 -1
  120. package/dist/kit/loads.js +136 -28
  121. package/dist/kit/loads.js.map +1 -1
  122. package/dist/kit/server.d.ts +142 -10
  123. package/dist/kit/server.d.ts.map +1 -1
  124. package/dist/kit/server.js +158 -15
  125. package/dist/kit/server.js.map +1 -1
  126. package/dist/kit/sw.d.ts +152 -23
  127. package/dist/kit/sw.d.ts.map +1 -1
  128. package/dist/kit/sw.js +182 -26
  129. package/dist/kit/sw.js.map +1 -1
  130. package/dist/queue.d.ts +274 -0
  131. package/dist/queue.d.ts.map +1 -1
  132. package/dist/queue.js +556 -38
  133. package/dist/queue.js.map +1 -1
  134. package/dist/realtime.d.ts +241 -27
  135. package/dist/realtime.d.ts.map +1 -1
  136. package/dist/realtime.js +633 -109
  137. package/dist/realtime.js.map +1 -1
  138. package/dist/runtime/runtimeConfig.d.ts +91 -8
  139. package/dist/runtime/runtimeConfig.d.ts.map +1 -1
  140. package/dist/runtime/runtimeConfig.js +146 -19
  141. package/dist/runtime/runtimeConfig.js.map +1 -1
  142. package/dist/stores/authState.d.ts +150 -11
  143. package/dist/stores/authState.d.ts.map +1 -1
  144. package/dist/stores/authState.js +169 -17
  145. package/dist/stores/authState.js.map +1 -1
  146. package/dist/stores/network.d.ts +39 -0
  147. package/dist/stores/network.d.ts.map +1 -1
  148. package/dist/stores/network.js +169 -16
  149. package/dist/stores/network.js.map +1 -1
  150. package/dist/stores/remoteChanges.d.ts +327 -52
  151. package/dist/stores/remoteChanges.d.ts.map +1 -1
  152. package/dist/stores/remoteChanges.js +337 -75
  153. package/dist/stores/remoteChanges.js.map +1 -1
  154. package/dist/stores/sync.d.ts +130 -0
  155. package/dist/stores/sync.d.ts.map +1 -1
  156. package/dist/stores/sync.js +167 -7
  157. package/dist/stores/sync.js.map +1 -1
  158. package/dist/supabase/auth.d.ts +186 -46
  159. package/dist/supabase/auth.d.ts.map +1 -1
  160. package/dist/supabase/auth.js +238 -190
  161. package/dist/supabase/auth.js.map +1 -1
  162. package/dist/supabase/client.d.ts +79 -6
  163. package/dist/supabase/client.d.ts.map +1 -1
  164. package/dist/supabase/client.js +158 -15
  165. package/dist/supabase/client.js.map +1 -1
  166. package/dist/supabase/validate.d.ts +101 -7
  167. package/dist/supabase/validate.d.ts.map +1 -1
  168. package/dist/supabase/validate.js +117 -8
  169. package/dist/supabase/validate.js.map +1 -1
  170. package/dist/sw/build/vite-plugin.d.ts +55 -10
  171. package/dist/sw/build/vite-plugin.d.ts.map +1 -1
  172. package/dist/sw/build/vite-plugin.js +77 -18
  173. package/dist/sw/build/vite-plugin.js.map +1 -1
  174. package/dist/sw/sw.js +99 -44
  175. package/dist/types.d.ts +150 -26
  176. package/dist/types.d.ts.map +1 -1
  177. package/dist/types.js +12 -10
  178. package/dist/types.js.map +1 -1
  179. package/dist/utils.d.ts +55 -13
  180. package/dist/utils.d.ts.map +1 -1
  181. package/dist/utils.js +83 -22
  182. package/dist/utils.js.map +1 -1
  183. package/package.json +1 -1
  184. package/dist/auth/admin.d.ts +0 -12
  185. package/dist/auth/admin.d.ts.map +0 -1
  186. package/dist/auth/admin.js +0 -26
  187. package/dist/auth/admin.js.map +0 -1
  188. package/dist/auth/offlineLogin.d.ts +0 -34
  189. package/dist/auth/offlineLogin.d.ts.map +0 -1
  190. package/dist/auth/offlineLogin.js +0 -75
  191. package/dist/auth/offlineLogin.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../../src/sw/build/vite-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AA8CD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ;;;;EAqE1C"}
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../../src/sw/build/vite-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAWH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAmED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ;;;;EAyE1C"}
@@ -2,9 +2,30 @@
2
2
  * @fileoverview Vite plugin that generates the service worker and asset manifest
3
3
  * at build time. Projects import this instead of maintaining their own SW logic.
4
4
  *
5
- * Usage in vite.config.ts:
6
- * import { stellarPWA } from '@prabhask5/stellar-engine/vite';
7
- * export default defineConfig({ plugins: [sveltekit(), stellarPWA({ prefix: 'myapp', name: 'My App' })] });
5
+ * The plugin hooks into two Vite/Rollup lifecycle events:
6
+ * - **`buildStart`** reads the compiled SW template from the stellar-engine
7
+ * package, patches in app-specific tokens, and writes `static/sw.js`.
8
+ * - **`closeBundle`** — after Rollup finishes writing chunks, scans the
9
+ * immutable output directory and writes `asset-manifest.json` listing
10
+ * all JS/CSS files for the service worker to precache.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // vite.config.ts
15
+ * import { sveltekit } from '@sveltejs/kit/vite';
16
+ * import { stellarPWA } from '@prabhask5/stellar-engine/vite';
17
+ * import { defineConfig } from 'vite';
18
+ *
19
+ * export default defineConfig({
20
+ * plugins: [
21
+ * sveltekit(),
22
+ * stellarPWA({ prefix: 'myapp', name: 'My App' })
23
+ * ]
24
+ * });
25
+ * ```
26
+ *
27
+ * @see {@link stellarPWA} for the main plugin factory
28
+ * @see {@link SWConfig} for configuration options
8
29
  */
9
30
  import { readFileSync, writeFileSync, readdirSync, statSync, existsSync, mkdirSync } from 'fs';
10
31
  import { resolve, join, dirname } from 'path';
@@ -18,6 +39,16 @@ import { createRequire } from 'module';
18
39
  *
19
40
  * Used after the build to enumerate all immutable assets so they can be written
20
41
  * into the asset manifest consumed by the service worker.
42
+ *
43
+ * @param dir - The root directory to scan.
44
+ * @param files - Accumulator array (used internally for recursion).
45
+ * @returns A flat array of absolute file paths found under `dir`.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const allFiles = getAllFiles('/path/to/_app/immutable');
50
+ * // => ['/path/to/_app/immutable/chunks/foo.abc123.js', ...]
51
+ * ```
21
52
  */
22
53
  function getAllFiles(dir, files = []) {
23
54
  if (!existsSync(dir))
@@ -36,15 +67,26 @@ function getAllFiles(dir, files = []) {
36
67
  }
37
68
  /**
38
69
  * Locates the compiled SW source (`dist/sw/sw.js`) within the installed package.
39
- * Works whether the package is installed in node_modules or linked locally.
70
+ *
71
+ * Uses two resolution strategies:
72
+ * 1. **Relative resolution** — resolves relative to this file's compiled
73
+ * location in `dist/sw/build/vite-plugin.js`, navigating up to `dist/sw/sw.js`.
74
+ * Works for both installed packages and locally-linked development.
75
+ * 2. **`createRequire` fallback** — uses Node's module resolution to find
76
+ * the package root via `package.json`, then appends the known dist path.
77
+ *
78
+ * @returns The absolute path to the compiled `sw.js` source file.
79
+ *
80
+ * @throws {Error} If the SW source cannot be found via either strategy
81
+ * (will throw from the `readFileSync` call in the consumer).
40
82
  */
41
83
  function findSwSource() {
42
- // Resolve relative to this file's location in dist/sw/build/vite-plugin.js
84
+ /* Resolve relative to this file's location in dist/sw/build/vite-plugin.js */
43
85
  const thisDir = dirname(fileURLToPath(import.meta.url));
44
86
  const swPath = join(thisDir, '..', 'sw.js');
45
87
  if (existsSync(swPath))
46
88
  return swPath;
47
- // Fallback: use createRequire to resolve from the package
89
+ /* Fallback: use createRequire to resolve from the package */
48
90
  const require = createRequire(import.meta.url);
49
91
  const pkgDir = dirname(require.resolve('@prabhask5/stellar-engine/package.json'));
50
92
  return join(pkgDir, 'dist', 'sw', 'sw.js');
@@ -53,32 +95,46 @@ function findSwSource() {
53
95
  // VITE PLUGIN
54
96
  // =============================================================================
55
97
  /**
56
- * Vite plugin that generates `static/sw.js` and `asset-manifest.json` at build time.
98
+ * Vite plugin factory that generates `static/sw.js` and `asset-manifest.json`
99
+ * at build time.
100
+ *
101
+ * **`buildStart` hook:**
102
+ * - Reads the compiled SW source from stellar-engine's `dist/sw/sw.js`.
103
+ * - Replaces placeholder tokens (`__SW_VERSION__`, `__SW_PREFIX__`, `__SW_NAME__`)
104
+ * with app-specific values and a unique version stamp (base-36 timestamp).
105
+ * - Strips the `export {};` that TypeScript adds (SW runs as a classic script).
106
+ * - Writes the final `static/sw.js`.
107
+ *
108
+ * **`closeBundle` hook:**
109
+ * - Scans SvelteKit's immutable output directory for JS and CSS files.
110
+ * - Writes `asset-manifest.json` to both `static/` and the build output
111
+ * directory so the service worker can precache all app chunks.
57
112
  *
58
- * - **`buildStart` hook**: Reads the compiled SW source from stellar-engine,
59
- * replaces placeholder tokens with app-specific values and a unique version
60
- * stamp, then writes the final `static/sw.js`.
113
+ * @param config - The {@link SWConfig} with `prefix` and `name` values.
114
+ * @returns A Vite plugin object with `name`, `buildStart`, and `closeBundle` hooks.
61
115
  *
62
- * - **`closeBundle` hook**: After Rollup finishes writing chunks, scans the immutable
63
- * output directory and writes `asset-manifest.json` listing all JS/CSS files for
64
- * the service worker to precache.
116
+ * @example
117
+ * ```ts
118
+ * stellarPWA({ prefix: 'myapp', name: 'My App' })
119
+ * ```
65
120
  */
66
121
  export function stellarPWA(config) {
67
122
  return {
68
123
  name: 'stellar-pwa',
69
124
  /* ── buildStart — generate sw.js from compiled source ────────── */
70
125
  buildStart() {
126
+ /* Generate a unique version stamp using base-36 timestamp */
71
127
  const version = Date.now().toString(36);
72
128
  const swSourcePath = findSwSource();
73
129
  let swContent = readFileSync(swSourcePath, 'utf-8');
74
- // Replace placeholder tokens with app-specific values
130
+ /* Replace placeholder tokens with app-specific values */
75
131
  swContent = swContent
76
132
  .replace(/__SW_VERSION__/g, version)
77
133
  .replace(/__SW_PREFIX__/g, config.prefix)
78
134
  .replace(/__SW_NAME__/g, config.name);
79
- // Strip the `export {};` that tsc adds (SW runs as a script, not a module)
135
+ /* Strip the `export {};` that tsc adds (SW runs as a script, not a module) */
80
136
  swContent = swContent.replace(/^export\s*\{\s*\}\s*;\s*$/m, '');
81
- // Ensure static/ directory exists
137
+ /* Ensure static/ directory exists */
82
138
  const staticDir = resolve('static');
83
139
  if (!existsSync(staticDir)) {
84
140
  mkdirSync(staticDir, { recursive: true });
@@ -98,7 +154,8 @@ export function stellarPWA(config) {
98
154
  const allFiles = getAllFiles(buildDir);
99
155
  /**
100
156
  * Only JS and CSS are worth precaching — images/fonts are better
101
- * served on-demand via the SW's cache-first strategy.
157
+ * served on-demand via the SW's cache-first strategy, keeping the
158
+ * manifest small and the initial precache fast.
102
159
  */
103
160
  const assets = allFiles
104
161
  .map((f) => f.replace(resolve('.svelte-kit/output/client'), ''))
@@ -110,7 +167,9 @@ export function stellarPWA(config) {
110
167
  const manifestContent = JSON.stringify(manifest, null, 2);
111
168
  /* Write to `static/` — available to the dev server and future builds */
112
169
  writeFileSync(resolve('static/asset-manifest.json'), manifestContent);
113
- /* Write to build output — static files are already copied before `closeBundle` runs */
170
+ /* Write to build output — static files are already copied before
171
+ * `closeBundle` runs, so the manifest must also land in the output
172
+ * directory for it to be served from the production build. */
114
173
  const buildOutputPath = resolve('.svelte-kit/output/client/asset-manifest.json');
115
174
  writeFileSync(buildOutputPath, manifestContent);
116
175
  console.log(`[stellar-pwa] Generated asset manifest with ${assets.length} files`);
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../../src/sw/build/vite-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../../src/sw/build/vite-plugin.ts"],"names":[],"mappings":"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"}
package/dist/sw/sw.js CHANGED
@@ -24,25 +24,36 @@
24
24
  *
25
25
  * The `APP_VERSION` constant is patched automatically by the stellarPWA
26
26
  * Vite plugin on every production build.
27
+ *
28
+ * @see {@link handleNavigationRequest} for HTML page caching (network-first)
29
+ * @see {@link handleImmutableAsset} for content-hashed asset caching (cache-first)
30
+ * @see {@link handleStaticAsset} for general static asset caching (cache-first)
31
+ * @see {@link backgroundPrecache} for offline-readiness precaching
32
+ * @see {@link cleanupOldAssets} for stale immutable asset removal
27
33
  */
28
34
  // =============================================================================
29
35
  // VERSIONING
30
36
  // =============================================================================
31
- /** Build-stamped version — updated automatically by the stellarPWA Vite plugin on each build */
37
+ /**
38
+ * Build-stamped version string — updated automatically by the stellarPWA
39
+ * Vite plugin on each build. Used to key the shell cache and reported
40
+ * back to clients via the `GET_VERSION` message handler.
41
+ */
32
42
  const APP_VERSION = '__SW_VERSION__';
33
43
  // =============================================================================
34
44
  // CACHE NAMING
35
45
  // =============================================================================
36
46
  /**
37
47
  * Persistent cache for immutable assets (`/_app/immutable/*`).
38
- * These files contain content hashes safe to cache indefinitely.
39
- * NOT cleared on deploy — assets accumulate and are cleaned by `cleanupOldAssets()`.
48
+ * These files contain content hashes in their filenames, making them safe
49
+ * to cache indefinitely. NOT cleared on deploy — assets accumulate across
50
+ * builds and are pruned by {@link cleanupOldAssets} when triggered.
40
51
  */
41
52
  const ASSET_CACHE = '__SW_PREFIX__-assets-v1';
42
53
  /**
43
54
  * Versioned cache for the app shell (HTML, manifest, icons) and other
44
55
  * static assets. Re-created on each deploy; old versions are deleted
45
- * during the `activate` event.
56
+ * during the `activate` event so only one shell cache exists at a time.
46
57
  */
47
58
  const SHELL_CACHE = '__SW_PREFIX__-shell-' + APP_VERSION;
48
59
  // =============================================================================
@@ -51,6 +62,9 @@ const SHELL_CACHE = '__SW_PREFIX__-shell-' + APP_VERSION;
51
62
  /**
52
63
  * Core app shell resources to precache during the `install` event.
53
64
  * These are the minimum files needed for the app to render offline.
65
+ *
66
+ * Note: The root HTML (`/`) is cached separately in the install handler
67
+ * because its failure should abort the installation entirely.
54
68
  */
55
69
  const PRECACHE_ASSETS = [
56
70
  '/manifest.json',
@@ -65,7 +79,7 @@ const PRECACHE_ASSETS = [
65
79
  /**
66
80
  * Install handler — precaches the minimal app shell.
67
81
  *
68
- * Strategy:
82
+ * **Strategy:**
69
83
  * 1. The root HTML (`/`) is **required** — if it fails, install fails.
70
84
  * Better to stay on the working old SW than activate with no cached HTML.
71
85
  * 2. Other shell assets (icons, manifest) are **optional** — failures
@@ -74,6 +88,8 @@ const PRECACHE_ASSETS = [
74
88
  * "update available" prompt.
75
89
  * 4. Auto-promotes via `skipWaiting()` after 5 minutes as a fallback for
76
90
  * iOS PWA where the update prompt may never be interacted with.
91
+ *
92
+ * @param event - The `install` {@link ExtendableEvent}.
77
93
  */
78
94
  self.addEventListener('install', (event) => {
79
95
  console.log(`[SW] Installing version: ${APP_VERSION}`);
@@ -106,14 +122,16 @@ self.addEventListener('install', (event) => {
106
122
  /**
107
123
  * Activate handler — cleans up stale caches and claims all clients.
108
124
  *
109
- * Deletes:
125
+ * **Deletes:**
110
126
  * - Old versioned shell caches (e.g., `__SW_PREFIX__-shell-<old-version>`)
111
127
  * - The legacy `__SW_PREFIX__-cache-v1` cache (one-time migration from the
112
128
  * original single-cache strategy)
113
129
  *
114
- * Keeps:
130
+ * **Keeps:**
115
131
  * - `ASSET_CACHE` — immutable assets persist across versions
116
132
  * - `SHELL_CACHE` — the current deploy's shell cache
133
+ *
134
+ * @param event - The `activate` {@link ExtendableEvent}.
117
135
  */
118
136
  self.addEventListener('activate', (event) => {
119
137
  console.log(`[SW] Activating version: ${APP_VERSION}`);
@@ -144,14 +162,16 @@ self.addEventListener('activate', (event) => {
144
162
  /**
145
163
  * Fetch handler — routes requests to the appropriate caching strategy.
146
164
  *
147
- * Routing logic (in priority order):
165
+ * **Routing logic** (in priority order):
148
166
  * 1. Skip non-GET requests (mutations should always hit the network)
149
167
  * 2. Skip external origins (only cache same-origin resources)
150
168
  * 3. Skip `/api/*` routes (backend data — never cache)
151
- * 4. Navigation requests `handleNavigationRequest()` (network-first)
152
- * 5. Immutable assets `handleImmutableAsset()` (cache-first, permanent)
153
- * 6. Static assets `handleStaticAsset()` (cache-first)
154
- * 7. Everything else `handleOtherRequest()` (network-first)
169
+ * 4. Navigation requests --> {@link handleNavigationRequest} (network-first)
170
+ * 5. Immutable assets --> {@link handleImmutableAsset} (cache-first, permanent)
171
+ * 6. Static assets --> {@link handleStaticAsset} (cache-first)
172
+ * 7. Everything else --> {@link handleOtherRequest} (network-first)
173
+ *
174
+ * @param event - The {@link FetchEvent} to handle.
155
175
  */
156
176
  self.addEventListener('fetch', (event) => {
157
177
  /* Only intercept GET requests — let POST/PUT/DELETE go straight to network */
@@ -190,8 +210,17 @@ self.addEventListener('fetch', (event) => {
190
210
  * Determines whether a given pathname looks like a static asset
191
211
  * (scripts, styles, images, fonts, data files).
192
212
  *
193
- * @param pathname The URL pathname to test (e.g., `/_app/version.json`)
194
- * @returns `true` if the path matches a known static-asset extension
213
+ * Matches by file extension or by the `/_app/` prefix (SvelteKit's
214
+ * client-side output directory).
215
+ *
216
+ * @param pathname - The URL pathname to test (e.g., `/_app/version.json`).
217
+ * @returns `true` if the path matches a known static-asset extension.
218
+ *
219
+ * @example
220
+ * ```ts
221
+ * isStaticAsset('/icon-192.png'); // true
222
+ * isStaticAsset('/api/config'); // false
223
+ * ```
195
224
  */
196
225
  function isStaticAsset(pathname) {
197
226
  return (pathname.startsWith('/_app/') ||
@@ -214,13 +243,17 @@ function isStaticAsset(pathname) {
214
243
  /**
215
244
  * Handles HTML navigation requests with a **network-first** strategy.
216
245
  *
217
- * 1. Attempt a network fetch with a 3-second timeout (abort via `AbortController`)
218
- * 2. If successful cache the response as `/` and return it
219
- * 3. If failed serve the cached root HTML for offline use
220
- * 4. If nothing cached return a minimal offline fallback page
246
+ * **Flow:**
247
+ * 1. Attempt a network fetch with a 3-second timeout (abort via `AbortController`)
248
+ * 2. If successful --> cache the response as `/` and return it
249
+ * 3. If failed --> serve the cached root HTML for offline use
250
+ * 4. If nothing cached --> return a minimal offline fallback page
221
251
  *
222
- * @param request The navigation `Request` object
223
- * @returns A `Response` (from network, cache, or inline fallback)
252
+ * The 3-second timeout prevents the user from staring at a blank screen
253
+ * on flaky connections while still preferring fresh content.
254
+ *
255
+ * @param request - The navigation `Request` object.
256
+ * @returns A `Response` (from network, cache, or inline fallback).
224
257
  */
225
258
  async function handleNavigationRequest(request) {
226
259
  const cache = await caches.open(SHELL_CACHE);
@@ -260,12 +293,15 @@ async function handleNavigationRequest(request) {
260
293
  /**
261
294
  * Handles requests for immutable assets (`/_app/immutable/*`).
262
295
  *
263
- * Strategy: **cache-first, NEVER revalidate**. These files have content
296
+ * **Strategy:** cache-first, NEVER revalidate. These files have content
264
297
  * hashes baked into their filenames — if the content changes, the filename
265
298
  * changes, so a cached version is always correct.
266
299
  *
267
- * @param request The `Request` for an immutable asset
268
- * @returns The cached `Response`, or a freshly-fetched one (then cached)
300
+ * Uses `ASSET_CACHE` which persists across SW versions (not cleared on
301
+ * deploy). Old entries are pruned by {@link cleanupOldAssets}.
302
+ *
303
+ * @param request - The `Request` for an immutable asset.
304
+ * @returns The cached `Response`, or a freshly-fetched one (then cached).
269
305
  */
270
306
  async function handleImmutableAsset(request) {
271
307
  const cache = await caches.open(ASSET_CACHE);
@@ -294,12 +330,12 @@ async function handleImmutableAsset(request) {
294
330
  * Handles requests for general static assets (non-immutable JS, CSS, images,
295
331
  * fonts, JSON files).
296
332
  *
297
- * Strategy: **cache-first, NO background revalidation**. This saves
333
+ * **Strategy:** cache-first, NO background revalidation. This saves
298
334
  * bandwidth — the shell cache is versioned per deploy, so stale assets
299
335
  * are cleaned up automatically when the new SW activates.
300
336
  *
301
- * @param request The `Request` for a static asset
302
- * @returns The cached `Response`, or a freshly-fetched one (then cached)
337
+ * @param request - The `Request` for a static asset.
338
+ * @returns The cached `Response`, or a freshly-fetched one (then cached).
303
339
  */
304
340
  async function handleStaticAsset(request) {
305
341
  const cache = await caches.open(SHELL_CACHE);
@@ -327,13 +363,14 @@ async function handleStaticAsset(request) {
327
363
  /**
328
364
  * Handles all other same-origin GET requests with a **network-first** strategy.
329
365
  *
330
- * 1. Try the network
331
- * 2. If successful → cache and return
332
- * 3. If failed return cached version
333
- * 4. If nothing cached return a 503 "Offline" response
366
+ * **Flow:**
367
+ * 1. Try the network
368
+ * 2. If successful --> cache and return
369
+ * 3. If failed --> return cached version
370
+ * 4. If nothing cached --> return a 503 "Offline" response
334
371
  *
335
- * @param request The `Request` object
336
- * @returns A `Response` from network or cache
372
+ * @param request - The `Request` object.
373
+ * @returns A `Response` from network or cache.
337
374
  */
338
375
  async function handleOtherRequest(request) {
339
376
  const cache = await caches.open(SHELL_CACHE);
@@ -359,7 +396,7 @@ async function handleOtherRequest(request) {
359
396
  * cached. This makes the entire app available offline without blocking the
360
397
  * install event.
361
398
  *
362
- * Key behaviors:
399
+ * **Key behaviours:**
363
400
  * - Fetches the manifest with a cache-busting query param (`?_=<timestamp>`)
364
401
  * - Checks both `ASSET_CACHE` and `SHELL_CACHE` to avoid redundant downloads
365
402
  * - Downloads in batches of 5 with a 50 ms pause between batches to avoid
@@ -367,6 +404,10 @@ async function handleOtherRequest(request) {
367
404
  * - Notifies all open windows with `PRECACHE_COMPLETE` when done
368
405
  *
369
406
  * Triggered by sending `{ type: 'PRECACHE_ALL' }` to the service worker.
407
+ *
408
+ * @returns A promise that resolves when precaching is complete (or fails).
409
+ *
410
+ * @see {@link cleanupOldAssets} for removing assets no longer in the manifest
370
411
  */
371
412
  async function backgroundPrecache() {
372
413
  try {
@@ -389,6 +430,7 @@ async function backgroundPrecache() {
389
430
  /* ── Determine which assets still need caching ────────────────── */
390
431
  const uncached = [];
391
432
  for (const url of assets) {
433
+ /* Route to the correct cache based on whether the asset is immutable */
392
434
  const isImmutable = url.includes('/_app/immutable/');
393
435
  const cache = isImmutable ? assetCache : shellCache;
394
436
  const cached = await cache.match(url);
@@ -442,6 +484,8 @@ async function backgroundPrecache() {
442
484
  * versioned and cleaned during the `activate` event.
443
485
  *
444
486
  * Triggered by sending `{ type: 'CLEANUP_OLD' }` to the service worker.
487
+ *
488
+ * @returns A promise that resolves when cleanup is complete.
445
489
  */
446
490
  async function cleanupOldAssets() {
447
491
  try {
@@ -478,7 +522,12 @@ async function cleanupOldAssets() {
478
522
  /**
479
523
  * Broadcasts a message to all open windows/tabs.
480
524
  *
481
- * @param message The message object to send (e.g., `{ type: 'PRECACHE_COMPLETE', ... }`)
525
+ * @param message - The message object to send (e.g., `{ type: 'PRECACHE_COMPLETE', ... }`).
526
+ *
527
+ * @example
528
+ * ```ts
529
+ * notifyClients({ type: 'PRECACHE_COMPLETE', cached: 42, total: 50 });
530
+ * ```
482
531
  */
483
532
  function notifyClients(message) {
484
533
  self.clients.matchAll({ type: 'window' }).then((clients) => {
@@ -496,7 +545,7 @@ function notifyClients(message) {
496
545
  * styling — it will be precached and served automatically instead of
497
546
  * this bare-bones fallback.
498
547
  *
499
- * @returns An unstyled HTML string for the offline fallback
548
+ * @returns An unstyled HTML string for the offline fallback.
500
549
  */
501
550
  function getOfflineHTML() {
502
551
  return `<!DOCTYPE html>
@@ -519,13 +568,15 @@ function getOfflineHTML() {
519
568
  /**
520
569
  * Listens for messages from the app's client-side code.
521
570
  *
522
- * Supported message types:
523
- * - `SKIP_WAITING` Immediately activate the waiting SW (user accepted update)
524
- * - `GET_VERSION` Responds with the current `APP_VERSION` via `MessagePort`
525
- * - `PRECACHE_ALL` Triggers `backgroundPrecache()` to download all assets
526
- * - `CLEANUP_OLD` Triggers `cleanupOldAssets()` to remove stale cache entries
527
- * - `CACHE_URLS` Caches a specific list of URLs (used for route prefetching)
528
- * - `GET_CACHE_STATUS` Responds with cache completeness info via `MessagePort`
571
+ * **Supported message types:**
572
+ * - `SKIP_WAITING` --> Immediately activate the waiting SW (user accepted update)
573
+ * - `GET_VERSION` --> Responds with the current `APP_VERSION` via `MessagePort`
574
+ * - `PRECACHE_ALL` --> Triggers {@link backgroundPrecache} to download all assets
575
+ * - `CLEANUP_OLD` --> Triggers {@link cleanupOldAssets} to remove stale cache entries
576
+ * - `CACHE_URLS` --> Caches a specific list of URLs (used for route prefetching)
577
+ * - `GET_CACHE_STATUS` --> Responds with cache completeness info via `MessagePort`
578
+ *
579
+ * @param event - The {@link ExtendableMessageEvent} from a client.
529
580
  */
530
581
  self.addEventListener('message', (event) => {
531
582
  const { type } = event.data || {};
@@ -552,6 +603,7 @@ self.addEventListener('message', (event) => {
552
603
  const shellCachePromise = caches.open(SHELL_CACHE);
553
604
  Promise.all([assetCachePromise, shellCachePromise]).then(([ac, sc]) => {
554
605
  urls.forEach((url) => {
606
+ /* Route each URL to the correct cache based on immutability */
555
607
  const isImmutable = url.includes('/_app/immutable/');
556
608
  const cache = isImmutable ? ac : sc;
557
609
  cache.add(url).catch(() => { });
@@ -572,11 +624,14 @@ self.addEventListener('message', (event) => {
572
624
  * Computes the current cache completeness by comparing cached entries
573
625
  * against the asset manifest.
574
626
  *
575
- * @returns An object with:
627
+ * Attempts to find the manifest in cache first (for offline use), then
628
+ * falls back to a network fetch.
629
+ *
630
+ * @returns An object describing cache readiness:
576
631
  * - `cached` — Number of manifest assets currently in cache
577
632
  * - `total` — Total number of assets in the manifest
578
633
  * - `ready` — `true` if every asset is cached (full offline support)
579
- * - `version` — The manifest version string
634
+ * - `version` — The manifest version string (if available)
580
635
  * - `error` — Error message string (only present if something went wrong)
581
636
  */
582
637
  async function getCacheStatus() {