@swoff/cli 0.3.9 → 0.3.11

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 (216) hide show
  1. package/dist/__tests__/assemble-sw.test.js +8 -17
  2. package/dist/__tests__/assemble-sw.test.js.map +1 -1
  3. package/dist/__tests__/cli-integration.test.js +2 -2
  4. package/dist/__tests__/cli-integration.test.js.map +1 -1
  5. package/dist/__tests__/config-types.test.js +18 -8
  6. package/dist/__tests__/config-types.test.js.map +1 -1
  7. package/dist/__tests__/file-generators.test.js +3 -3
  8. package/dist/__tests__/file-generators.test.js.map +1 -1
  9. package/dist/__tests__/loader.test.js +5 -1
  10. package/dist/__tests__/loader.test.js.map +1 -1
  11. package/dist/__tests__/validator.test.js +6 -13
  12. package/dist/__tests__/validator.test.js.map +1 -1
  13. package/dist/index.js +41 -35
  14. package/dist/index.js.map +1 -1
  15. package/dist/lib/cli/help.js +13 -8
  16. package/dist/lib/cli/help.js.map +1 -1
  17. package/dist/lib/commands/add.js +38 -8
  18. package/dist/lib/commands/add.js.map +1 -1
  19. package/dist/lib/commands/assets.js +38 -0
  20. package/dist/lib/commands/assets.js.map +1 -0
  21. package/dist/lib/commands/clean.js +33 -17
  22. package/dist/lib/commands/clean.js.map +1 -1
  23. package/dist/lib/commands/generate-assets.js +44 -0
  24. package/dist/lib/commands/generate-assets.js.map +1 -0
  25. package/dist/lib/commands/generate-guide.js +22 -29
  26. package/dist/lib/commands/generate-guide.js.map +1 -1
  27. package/dist/lib/commands/generate.js +16 -9
  28. package/dist/lib/commands/generate.js.map +1 -1
  29. package/dist/lib/commands/info.js +36 -45
  30. package/dist/lib/commands/info.js.map +1 -1
  31. package/dist/lib/commands/init.js +25 -3
  32. package/dist/lib/commands/init.js.map +1 -1
  33. package/dist/lib/commands/validate.js +1 -1
  34. package/dist/lib/commands/validate.js.map +1 -1
  35. package/dist/lib/config/loader.js +25 -20
  36. package/dist/lib/config/loader.js.map +1 -1
  37. package/dist/lib/config/validator.js +20 -11
  38. package/dist/lib/config/validator.js.map +1 -1
  39. package/dist/lib/generators/asset-generator/dependency-resolver.js +76 -0
  40. package/dist/lib/generators/asset-generator/dependency-resolver.js.map +1 -0
  41. package/dist/lib/generators/asset-generator/generate.js +111 -0
  42. package/dist/lib/generators/asset-generator/generate.js.map +1 -0
  43. package/dist/lib/generators/asset-generator/guide.js +43 -0
  44. package/dist/lib/generators/asset-generator/guide.js.map +1 -0
  45. package/dist/lib/generators/asset-generator/html-patcher.js +65 -0
  46. package/dist/lib/generators/asset-generator/html-patcher.js.map +1 -0
  47. package/dist/lib/generators/asset-generator/ico-encoder.js +29 -0
  48. package/dist/lib/generators/asset-generator/ico-encoder.js.map +1 -0
  49. package/dist/lib/generators/asset-generator/manifest-patcher.js +23 -0
  50. package/dist/lib/generators/asset-generator/manifest-patcher.js.map +1 -0
  51. package/dist/lib/generators/asset-generator/maskable.js +15 -0
  52. package/dist/lib/generators/asset-generator/maskable.js.map +1 -0
  53. package/dist/lib/generators/asset-generator/rasterize.js +32 -0
  54. package/dist/lib/generators/asset-generator/rasterize.js.map +1 -0
  55. package/dist/lib/generators/asset-generator/sizes.js +25 -0
  56. package/dist/lib/generators/asset-generator/sizes.js.map +1 -0
  57. package/dist/lib/generators/file-generators/api-config.js +6 -0
  58. package/dist/lib/generators/file-generators/api-config.js.map +1 -0
  59. package/dist/lib/generators/file-generators/auth-state.js +2 -34
  60. package/dist/lib/generators/file-generators/auth-state.js.map +1 -1
  61. package/dist/lib/generators/file-generators/auth-store.js +2 -250
  62. package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
  63. package/dist/lib/generators/file-generators/auth-user.js +3 -81
  64. package/dist/lib/generators/file-generators/auth-user.js.map +1 -1
  65. package/dist/lib/generators/file-generators/background-sync.js +2 -57
  66. package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
  67. package/dist/lib/generators/file-generators/cache.js +2 -30
  68. package/dist/lib/generators/file-generators/cache.js.map +1 -1
  69. package/dist/lib/generators/file-generators/client-injector.js +2 -130
  70. package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
  71. package/dist/lib/generators/file-generators/fetch-state.js +6 -0
  72. package/dist/lib/generators/file-generators/fetch-state.js.map +1 -0
  73. package/dist/lib/generators/file-generators/fetch-wrapper.js +3 -295
  74. package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
  75. package/dist/lib/generators/file-generators/generate-framework-adapters.js +56 -0
  76. package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -0
  77. package/dist/lib/generators/file-generators/generate-hooks.js +4 -3
  78. package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
  79. package/dist/lib/generators/file-generators/gql-wrapper.js +3 -132
  80. package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
  81. package/dist/lib/generators/file-generators/guide-generator.js +29 -1
  82. package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
  83. package/dist/lib/generators/file-generators/invalidation-tags.js +3 -258
  84. package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
  85. package/dist/lib/generators/file-generators/manifest.js +13 -3
  86. package/dist/lib/generators/file-generators/manifest.js.map +1 -1
  87. package/dist/lib/generators/file-generators/mutation-queue.js +3 -305
  88. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
  89. package/dist/lib/generators/file-generators/mutation-state.js +2 -117
  90. package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
  91. package/dist/lib/generators/file-generators/push.js +6 -138
  92. package/dist/lib/generators/file-generators/push.js.map +1 -1
  93. package/dist/lib/generators/file-generators/pwa-install.js +11 -84
  94. package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
  95. package/dist/lib/generators/file-generators/reset.js +6 -0
  96. package/dist/lib/generators/file-generators/reset.js.map +1 -0
  97. package/dist/lib/generators/file-generators/server-push.js +3 -134
  98. package/dist/lib/generators/file-generators/server-push.js.map +1 -1
  99. package/dist/lib/generators/file-generators/sw-generator-build.js +4 -4
  100. package/dist/lib/generators/file-generators/sw-injector.js +9 -230
  101. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
  102. package/dist/lib/generators/file-generators/type-definitions.js +2 -111
  103. package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
  104. package/dist/lib/generators/sw-generator.js +5 -5
  105. package/dist/lib/generators/sw-generator.js.map +1 -1
  106. package/dist/lib/generators/sw-sections/activate-handler.js +25 -3
  107. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
  108. package/dist/lib/generators/sw-sections/assemble-sw.js +13 -12
  109. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
  110. package/dist/lib/generators/sw-sections/background-sync-handler.js +14 -7
  111. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
  112. package/dist/lib/generators/sw-sections/config-header.js +1 -1
  113. package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
  114. package/dist/lib/generators/sw-sections/fetch-handler.js +165 -104
  115. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
  116. package/dist/lib/generators/sw-sections/glob-matcher-code.js.map +1 -0
  117. package/dist/lib/generators/sw-sections/server-push-handler.js +12 -0
  118. package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
  119. package/dist/lib/generators/sw-sections/tag-management.js +6 -4
  120. package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
  121. package/dist/lib/generators/swoff-files-generator.js +66 -35
  122. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  123. package/dist/lib/shared/config-types.js +89 -28
  124. package/dist/lib/shared/config-types.js.map +1 -1
  125. package/dist/runtime/api-config.js +18 -0
  126. package/dist/runtime/api-config.js.map +1 -0
  127. package/dist/runtime/auth-state.js +35 -0
  128. package/dist/runtime/auth-state.js.map +1 -0
  129. package/dist/runtime/auth-store.js +273 -0
  130. package/dist/runtime/auth-store.js.map +1 -0
  131. package/dist/runtime/auth-user.js +168 -0
  132. package/dist/runtime/auth-user.js.map +1 -0
  133. package/dist/runtime/background-sync.js +59 -0
  134. package/dist/runtime/background-sync.js.map +1 -0
  135. package/dist/runtime/cache.js +30 -0
  136. package/dist/runtime/cache.js.map +1 -0
  137. package/dist/runtime/client-injector.js +136 -0
  138. package/dist/runtime/client-injector.js.map +1 -0
  139. package/dist/runtime/fetch-state.js +42 -0
  140. package/dist/runtime/fetch-state.js.map +1 -0
  141. package/dist/runtime/fetch-wrapper.js +355 -0
  142. package/dist/runtime/fetch-wrapper.js.map +1 -0
  143. package/dist/runtime/gql-wrapper.js +135 -0
  144. package/dist/runtime/gql-wrapper.js.map +1 -0
  145. package/dist/runtime/invalidation-tags.js +260 -0
  146. package/dist/runtime/invalidation-tags.js.map +1 -0
  147. package/dist/runtime/mutation-queue.js +304 -0
  148. package/dist/runtime/mutation-queue.js.map +1 -0
  149. package/dist/runtime/mutation-state.js +117 -0
  150. package/dist/runtime/mutation-state.js.map +1 -0
  151. package/dist/runtime/push.js +138 -0
  152. package/dist/runtime/push.js.map +1 -0
  153. package/dist/runtime/pwa-index.js +11 -0
  154. package/dist/runtime/pwa-index.js.map +1 -0
  155. package/dist/runtime/pwa-injector.js +44 -0
  156. package/dist/runtime/pwa-injector.js.map +1 -0
  157. package/dist/runtime/pwa-install.js +83 -0
  158. package/dist/runtime/pwa-install.js.map +1 -0
  159. package/dist/runtime/pwa-prompt.js +54 -0
  160. package/dist/runtime/pwa-prompt.js.map +1 -0
  161. package/dist/runtime/reset.js +148 -0
  162. package/dist/runtime/reset.js.map +1 -0
  163. package/dist/runtime/server-push.js +148 -0
  164. package/dist/runtime/server-push.js.map +1 -0
  165. package/dist/runtime/sw-injector.js +236 -0
  166. package/dist/runtime/sw-injector.js.map +1 -0
  167. package/dist/runtime/type-definitions.js +138 -0
  168. package/dist/runtime/type-definitions.js.map +1 -0
  169. package/dist/runtime/utils.js +27 -0
  170. package/dist/runtime/utils.js.map +1 -0
  171. package/package.json +3 -2
  172. package/templates/react/useAuth.jsx +106 -0
  173. package/templates/react/useAuth.tsx +118 -0
  174. package/templates/{hooks → react}/useBackgroundSync.jsx +6 -4
  175. package/templates/{hooks → react}/useBackgroundSync.tsx +6 -4
  176. package/templates/{hooks → react}/useCacheInvalidation.jsx +2 -2
  177. package/templates/react/useCacheInvalidation.tsx +52 -0
  178. package/templates/react/useCachedFetch.jsx +140 -0
  179. package/templates/react/useCachedFetch.tsx +160 -0
  180. package/templates/react/useIsFetching.jsx +32 -0
  181. package/templates/react/useIsFetching.tsx +32 -0
  182. package/templates/react/useMutation.jsx +141 -0
  183. package/templates/react/useMutation.tsx +180 -0
  184. package/templates/react/useMutationQueue.jsx +69 -0
  185. package/templates/react/useMutationQueue.tsx +83 -0
  186. package/templates/react/useNetworkStatus.jsx +61 -0
  187. package/templates/react/useNetworkStatus.tsx +76 -0
  188. package/templates/react/usePrefetch.jsx +32 -0
  189. package/templates/react/usePrefetch.tsx +42 -0
  190. package/templates/{hooks → react}/usePushSubscription.jsx +4 -4
  191. package/templates/{hooks → react}/usePushSubscription.tsx +4 -4
  192. package/templates/{hooks → react}/useSWUpdate.jsx +3 -3
  193. package/templates/{hooks → react}/useSWUpdate.tsx +4 -4
  194. package/templates/react/useSwoffReset.jsx +32 -0
  195. package/templates/react/useSwoffReset.tsx +39 -0
  196. package/docs/API.md +0 -565
  197. package/docs/ARCHITECTURE.md +0 -374
  198. package/docs/CLI.md +0 -148
  199. package/docs/COMPARISON.md +0 -192
  200. package/docs/CONFIG.md +0 -277
  201. package/docs/ECOSYSTEM.md +0 -33
  202. package/templates/hooks/useAuth.jsx +0 -30
  203. package/templates/hooks/useAuth.tsx +0 -30
  204. package/templates/hooks/useCacheInvalidation.tsx +0 -19
  205. package/templates/hooks/useCachedFetch.jsx +0 -69
  206. package/templates/hooks/useCachedFetch.tsx +0 -81
  207. package/templates/hooks/useMutation.jsx +0 -76
  208. package/templates/hooks/useMutation.tsx +0 -109
  209. package/templates/hooks/useMutationQueue.jsx +0 -43
  210. package/templates/hooks/useMutationQueue.tsx +0 -50
  211. package/templates/hooks/useNetworkStatus.jsx +0 -19
  212. package/templates/hooks/useNetworkStatus.tsx +0 -19
  213. package/templates/hooks/usePrefetch.jsx +0 -10
  214. package/templates/hooks/usePrefetch.tsx +0 -25
  215. /package/templates/{hooks → react}/useMutationState.jsx +0 -0
  216. /package/templates/{hooks → react}/useMutationState.tsx +0 -0
@@ -2,237 +2,16 @@
2
2
  * Generates sw/injector.{js|ts} - core SW registration logic only.
3
3
  */
4
4
  import { writeFile } from "./context.js";
5
+ import { generateSwInjectorCode } from "../../../runtime/sw-injector.js";
5
6
  export function generateSwInjector(ctx) {
6
- const autoUpdate = ctx.config.features.serviceWorker.autoUpdate;
7
- const autoActivate = ctx.config.features.serviceWorker.autoActivate;
8
7
  const v = ctx.config.features.serviceWorker.version;
9
- const versionEnabled = v !== false && v !== "hash";
10
- const ext = ctx.ext;
11
- const ts = ext === "ts";
12
- const T = (type) => (ts ? `: ${type}` : "");
13
- const R = (type) => (ts ? `: ${type} ` : " ");
14
- const versionedCode = `/**
15
- * Swoff SW Injector
16
- * Framework-agnostic SW registration with versioned URLs and update flow.
17
- *
18
- * Usage:
19
- * import { initServiceWorker } from './swoff/sw/injector.${ext}';
20
- * initServiceWorker();
21
- *
22
- * Window events:
23
- * sw-version-detected - Version info available on window
24
- * sw-update-available - New version ready for user consent (detail: { version })
25
- * sw-progress - Download progress (detail: { percent, downloaded, total })
26
- * sw-ready - SW active and controlling page
27
- * sw-error - SW registration failed
28
- *
29
- * Window properties:
30
- * window.latestSWVersion - Latest version from version.json
31
- * window.currentSWVersion - Active SW version
32
- * window.swAvailableVersion - Pending update version
33
- * window.swUpdateRequired - Forced update needed (version < minSupportedVersion)
34
- * window.swMinSupportedVersion - Minimum supported version
35
- * window.swReady - SW is active
36
- * window.swError - Registration failed
37
- */
38
- const AUTO_UPDATE = ${autoUpdate};
39
- const AUTO_ACTIVATE = ${autoActivate};
40
-
41
- function semverCompare(a${T("string")}, b${T("string")})${R("number")}{
42
- const pa = a.split('.').map(Number);
43
- const pb = b.split('.').map(Number);
44
- for (let i = 0; i < 3; i++) {
45
- if (pa[i] > pb[i]) return 1;
46
- if (pa[i] < pb[i]) return -1;
47
- }
48
- return 0;
49
- }
50
-
51
- async function checkForUpdate() {
52
- const response = await fetch("/version.json?t=" + Date.now());
53
- if (!response.ok) {
54
- throw new Error("Failed to fetch version.json");
55
- }
56
- return response.json();
57
- }
58
-
59
- async function waitForController()${R("Promise<void>")}{
60
- return new Promise<void>((resolve) => {
61
- if (navigator.serviceWorker.controller) {
62
- resolve();
63
- } else {
64
- navigator.serviceWorker.addEventListener("controllerchange", () => resolve(), { once: true });
65
- }
66
- });
67
- }
68
-
69
- async function doRegisterServiceWorker(version${T("string")})${R("Promise<ServiceWorkerRegistration>")}{
70
- const swUrl = \`/sw-v\${version}.js\`;
71
- const registration = await navigator.serviceWorker.register(swUrl);
72
- localStorage.setItem("swRegisteredVersion", version);
73
- window.currentSWVersion = version;
74
- window.swRegisteredVersion = version;
75
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
76
- await waitForController();
77
- window.dispatchEvent(new CustomEvent("sw-ready"));
78
- return registration;
79
- }
80
-
81
- /** Register the SW with version checking and update flow. Checks version.json, handles updates, and dispatches sw-ready/sw-error events. */
82
- export async function initServiceWorker()${R("Promise<void>")}{
83
- if (!("serviceWorker" in navigator)) {
84
- console.warn("Service Workers not supported");
85
- return;
86
- }
87
-
88
- try {
89
- const manifest = await checkForUpdate();
90
- const currentVersion = localStorage.getItem("swRegisteredVersion");
91
- window.latestSWVersion = manifest.version;
92
- window.swMinSupportedVersion = manifest.minSupportedVersion || "0.0.0";
93
-
94
- if (currentVersion === manifest.version) {
95
- const registration = await navigator.serviceWorker.getRegistration();
96
- if (registration && registration.active) {
97
- window.currentSWVersion = currentVersion ?? undefined;
98
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
99
- await waitForController();
100
- if (!window.swReady) {
101
- window.dispatchEvent(new CustomEvent("sw-ready"));
102
- }
103
- }
104
- } else if (currentVersion && currentVersion !== manifest.version) {
105
- window.swAvailableVersion = manifest.version;
106
- window.swUpdateRequired =
107
- semverCompare(currentVersion, manifest.minSupportedVersion || "0.0.0") < 0;
108
-
109
- if (AUTO_UPDATE) {
110
- const registration = await navigator.serviceWorker.getRegistration();
111
- if (registration && registration.waiting) {
112
- if (AUTO_ACTIVATE) {
113
- registration.waiting.postMessage({ type: "SKIP_WAITING" });
114
- } else {
115
- window.dispatchEvent(
116
- new CustomEvent("sw-update-available", {
117
- detail: { version: manifest.version },
118
- })
119
- );
120
- }
121
- } else {
122
- const newReg = await doRegisterServiceWorker(manifest.version);
123
- if (AUTO_ACTIVATE && newReg.waiting) {
124
- newReg.waiting.postMessage({ type: "SKIP_WAITING" });
125
- } else {
126
- window.dispatchEvent(
127
- new CustomEvent("sw-update-available", {
128
- detail: { version: manifest.version },
129
- })
130
- );
131
- }
132
- }
133
- } else {
134
- window.dispatchEvent(
135
- new CustomEvent("sw-update-available", {
136
- detail: { version: manifest.version },
137
- })
138
- );
139
- }
140
- } else {
141
- await doRegisterServiceWorker(manifest.version);
142
- }
143
- } catch (error) {
144
- try {
145
- const existing = await navigator.serviceWorker.getRegistration();
146
- if (existing && existing.active) {
147
- window.currentSWVersion = localStorage.getItem("swRegisteredVersion") || "unknown";
148
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
149
- await waitForController();
150
- if (!window.swReady) {
151
- window.dispatchEvent(new CustomEvent("sw-ready"));
152
- }
153
- return;
154
- }
155
- } catch {
156
- // Handle the case where no existing active registration is found
157
- }
158
-
159
- console.error("Service Worker initialization failed:", error);
160
- window.swError = true;
161
- window.dispatchEvent(new CustomEvent("sw-error"));
162
- }
163
- }
164
-
165
- /** Accept a pending SW update. Reloads the page once the new SW takes control. */
166
- export async function handleUpdateApproved(newVersion${T("string")})${R("Promise<void>")}{
167
- const registration = await navigator.serviceWorker.getRegistration();
168
- if (registration && registration.waiting) {
169
- registration.waiting.postMessage({ type: "SKIP_WAITING" });
170
- registration.addEventListener("controllerchange", () => {
171
- window.location.reload();
172
- });
173
- } else {
174
- await doRegisterServiceWorker(newVersion);
175
- navigator.serviceWorker.addEventListener("controllerchange", () => {
176
- window.location.reload();
177
- });
178
- }
179
- }
180
-
181
- /** Activate a waiting SW without reloading. Useful when you handle the transition yourself. */
182
- export async function skipWaiting()${R("Promise<void>")}{
183
- const registration = await navigator.serviceWorker.ready;
184
- if (registration.waiting) {
185
- registration.waiting.postMessage({ type: "SKIP_WAITING" });
186
- }
187
- }
188
- `;
189
- const simpleCode = `/**
190
- * Swoff SW Injector (Simple Mode)
191
- * Fixed SW URL with hash-based cache name — no versioned URLs or update events.
192
- *
193
- * Usage:
194
- * import { initServiceWorker } from './swoff/sw/injector.${ext}';
195
- * initServiceWorker();
196
- *
197
- * Window events:
198
- * sw-ready - SW active and controlling page
199
- * sw-error - SW registration failed
200
- *
201
- * Window properties:
202
- * window.currentSWVersion - "simple"
203
- * window.swReady - SW is active
204
- * window.swError - Registration failed
205
- */
206
- async function waitForController()${R("Promise<void>")}{
207
- return new Promise<void>((resolve) => {
208
- if (navigator.serviceWorker.controller) {
209
- resolve();
210
- } else {
211
- navigator.serviceWorker.addEventListener("controllerchange", () => resolve(), { once: true });
212
- }
213
- });
214
- }
215
-
216
- /** Register the SW with a fixed URL (non-versioned mode). Dispatches sw-ready/sw-error. */
217
- export async function initServiceWorker()${R("Promise<void>")}{
218
- if (!("serviceWorker" in navigator)) {
219
- console.warn("Service Workers not supported");
220
- return;
221
- }
222
- try {
223
- const registration = await navigator.serviceWorker.register("/sw.js");
224
- window.currentSWVersion = "simple";
225
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
226
- await waitForController();
227
- window.dispatchEvent(new CustomEvent("sw-ready"));
228
- } catch (error) {
229
- console.error("Service Worker registration failed:", error);
230
- window.swError = true;
231
- window.dispatchEvent(new CustomEvent("sw-error"));
232
- }
233
- }
234
- `;
235
- const code = versionEnabled ? versionedCode : simpleCode;
236
- writeFile(ctx, `sw/injector.${ext}`, code);
8
+ const versionEnabled = v !== "hash";
9
+ writeFile(ctx, `sw/injector.${ctx.ext}`, generateSwInjectorCode({
10
+ ts: ctx.ext === "ts",
11
+ ext: ctx.ext,
12
+ autoUpdate: ctx.config.features.serviceWorker.autoUpdate,
13
+ autoActivate: ctx.config.features.serviceWorker.autoActivate,
14
+ versionEnabled,
15
+ }));
237
16
  }
238
17
  //# sourceMappingURL=sw-injector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sw-injector.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-injector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;IAChE,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC;IACpE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IACpD,MAAM,cAAc,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEtD,MAAM,aAAa,GAAG;;;;;8DAKsC,GAAG;;;;;;;;;;;;;;;;;;;sBAmB3C,UAAU;wBACR,YAAY;;0BAEV,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;oCAkBjC,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;gDAUN,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,oCAAoC,CAAC;;;;;;;;;;;;;2CAa3D,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAoFN,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;qCAgBnD,CAAC,CAAC,eAAe,CAAC;;;;;;CAMtD,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;8DAKyC,GAAG;;;;;;;;;;;;oCAY7B,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;2CAWX,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;CAiB5D,CAAC;IAEA,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"sw-injector.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-injector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IACpD,MAAM,cAAc,GAAG,CAAC,KAAK,MAAM,CAAC;IAEpC,SAAS,CACP,GAAG,EACH,eAAe,GAAG,CAAC,GAAG,EAAE,EACxB,sBAAsB,CAAC;QACrB,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU;QACxD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY;QAC5D,cAAc;KACf,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -2,119 +2,10 @@
2
2
  * Generates swoff.d.ts - TypeScript type declarations.
3
3
  */
4
4
  import { writeFile } from "./context.js";
5
+ import { generateTypeDefinitionsCode } from "../../../runtime/type-definitions.js";
5
6
  export function generateTypeDefinitions(ctx) {
6
7
  if (ctx.ext !== "ts")
7
8
  return;
8
- const code = `
9
- // Background Sync API types
10
- interface SyncManager {
11
- register(tag: string): Promise<void>;
12
- getTags(): Promise<string[]>;
13
- }
14
-
15
- interface SyncEvent extends Event {
16
- readonly tag: string;
17
- readonly lastChance: boolean;
18
- }
19
-
20
- interface ServiceWorkerGlobalScope {
21
- onsync: ((this: ServiceWorkerGlobalScope, ev: SyncEvent) => unknown) | null;
22
- }
23
-
24
- declare global {
25
- interface BeforeInstallPromptEvent extends Event {
26
- prompt(): Promise<void>;
27
- userChoice: Promise<{ outcome: "accepted" | "dismissed" }>;
28
- }
29
-
30
- interface WindowEventMap {
31
- beforeinstallprompt: BeforeInstallPromptEvent;
32
- "sw-update-available": CustomEvent<{ version: string }>;
33
- "sw-progress": CustomEvent<{ percent: number; downloaded: number; total: number }>;
34
- "sw-ready": CustomEvent;
35
- "sw-error": CustomEvent;
36
- "sw-version-detected": CustomEvent;
37
- "sw-auth-state-change": CustomEvent;
38
- "mutation-sync-complete": CustomEvent<{ succeeded: number; failed: number }>;
39
- "mutation-queue-changed": CustomEvent;
40
- "cache-invalidated": CustomEvent<{ tags?: string[] }>;
41
- "mutation-state-changed": CustomEvent<{ id: string; status: string; error?: Error; data?: unknown }>;
42
- "background-sync-complete": CustomEvent<{ succeeded: number; failed: number }>;
43
- "push-subscription-changed": CustomEvent<{ subscribed: boolean }>;
44
- "push-permission-changed": CustomEvent<{ permission: NotificationPermission }>;
45
- }
46
-
47
- interface Window {
48
- deferredInstallPrompt: BeforeInstallPromptEvent | null;
49
- pwaInstallable?: boolean;
50
- latestSWVersion?: string;
51
- currentSWVersion?: string;
52
- swRegisteredVersion?: string;
53
- swAvailableVersion?: string;
54
- swUpdateRequired?: boolean;
55
- swMinSupportedVersion?: string;
56
- swReady?: boolean;
57
- swError?: boolean;
58
- swAuthState?: "authenticated" | "unauthenticated" | "loading";
59
- swCurrentUser?: Record<string, unknown> | null;
60
- SyncManager?: { new(): SyncManager };
61
- }
62
-
63
- // Extend ServiceWorkerRegistration in the global scope for TS
64
- interface ServiceWorkerRegistration {
65
- readonly sync: SyncManager;
66
- }
67
- }
68
-
69
- export interface FetchWithCacheOptions extends RequestInit {
70
- strategy?: "read" | "mutation";
71
- tags?: string[];
72
- }
73
-
74
- export type MutationStatus = "idle" | "pending" | "success" | "error";
75
-
76
- export interface MutationState {
77
- id: string;
78
- status: MutationStatus;
79
- error: Error | null;
80
- data: unknown;
81
- timestamp: number;
82
- }
83
-
84
- export interface GqlOptions {
85
- variables?: Record<string, unknown>;
86
- tags?: string[];
87
- auth?: boolean;
88
- queueOffline?: boolean;
89
- invalidate?: 'auto' | string[] | false;
90
- }
91
-
92
- export interface GqlResult${"<T>"} {
93
- data: T;
94
- fromCache: boolean;
95
- }
96
-
97
- export interface MutationQueueItem {
98
- id: string;
99
- method: string;
100
- url: string;
101
- body: unknown;
102
- bodyType?: "json" | "formdata" | "blob" | "buffer";
103
- headers: Record<string, string>;
104
- timestamp: number;
105
- retryCount: number;
106
- nextRetryAt?: number;
107
- tags: string[];
108
- }
109
-
110
- export interface MutationQueueResult {
111
- succeeded: number;
112
- failed: number;
113
- total?: number;
114
- }
115
-
116
- export {};
117
- `;
118
- writeFile(ctx, "swoff.d.ts", code);
9
+ writeFile(ctx, "swoff.d.ts", generateTypeDefinitionsCode());
119
10
  }
120
11
  //# sourceMappingURL=type-definitions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"type-definitions.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/type-definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI;QAAE,OAAO;IAE7B,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAoFa,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAyBhC,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"type-definitions.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/type-definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAEnF,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI;QAAE,OAAO;IAC7B,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAAC,CAAC;AAC9D,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
2
2
  import { join } from "path";
3
3
  import { fileURLToPath } from "url";
4
- import { loadConfig } from "../config/loader.js";
4
+ import { loadConfigAsync } from "../config/loader.js";
5
5
  import { assembleSW } from "./sw-sections/assemble-sw.js";
6
6
  function resolveVersion(config, pkgVersion) {
7
7
  const v = config.features.serviceWorker.version;
8
- if (v === false || v === "hash")
9
- return pkgVersion || "1.0.0";
8
+ if (v === "hash")
9
+ return "0.0.0";
10
10
  if (v === "package")
11
11
  return pkgVersion || "1.0.0";
12
12
  return v;
@@ -25,13 +25,13 @@ export async function generateSW(options = {}) {
25
25
  status("Could not read package.json, using default version");
26
26
  }
27
27
  }
28
- const { config, configSource } = loadConfig(optProjectRoot, optConfigPath);
28
+ const { config, configSource } = await loadConfigAsync(optProjectRoot, optConfigPath);
29
29
  if (!config.enabled) {
30
30
  status("Swoff config generation disabled. Using custom code mode.");
31
31
  return { version: "", outputFile: "" };
32
32
  }
33
33
  const v = config.features.serviceWorker.version;
34
- const versionEnabled = v !== false && v !== "hash";
34
+ const versionEnabled = v !== "hash";
35
35
  const version = resolveVersion(config, pkg.version || "1.0.0");
36
36
  const sw = assembleSW(config, version, optProjectRoot);
37
37
  const outputDir = join(optProjectRoot, config.build.outputDir);
@@ -1 +1 @@
1
- {"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export function generateActivateHandler(clearRuntimeOnUpdate, navigationPreload) {
1
+ export function generateActivateHandler(clearRuntimeOnUpdate, navigationPreload, maxRuntimeCacheAge) {
2
2
  const cacheCleanup = clearRuntimeOnUpdate
3
3
  ? `keys.filter((key) => key !== CACHE_NAME)`
4
4
  : `keys.filter((key) => key !== CACHE_NAME && key !== CACHE_NAME_RUNTIME)`;
@@ -6,11 +6,33 @@ export function generateActivateHandler(clearRuntimeOnUpdate, navigationPreload)
6
6
  if (self.registration.navigationPreload) {
7
7
  await self.registration.navigationPreload.enable();
8
8
  }` : "";
9
- return `
9
+ const evictionCode = maxRuntimeCacheAge && maxRuntimeCacheAge > 0 ? `
10
+ await evictStaleRuntimeCache();` : "";
11
+ const evictionHelper = maxRuntimeCacheAge && maxRuntimeCacheAge > 0 ? `
12
+ const MAX_RUNTIME_CACHE_AGE = ${maxRuntimeCacheAge};
13
+
14
+ async function evictStaleRuntimeCache() {
15
+ const cache = await caches.open(CACHE_NAME_RUNTIME);
16
+ const keys = await cache.keys();
17
+ const cutoff = Date.now() - MAX_RUNTIME_CACHE_AGE * 1000;
18
+ const promises = [];
19
+ for (const request of keys) {
20
+ promises.push((async () => {
21
+ const response = await cache.match(request);
22
+ const cachedAt = response?.headers.get("X-SW-Cached-At");
23
+ if (cachedAt && Number(cachedAt) < cutoff) {
24
+ await cache.delete(request);
25
+ }
26
+ })());
27
+ }
28
+ await Promise.all(promises);
29
+ }
30
+ ` : "";
31
+ return `${evictionHelper}
10
32
  self.addEventListener("activate", (event) => {
11
33
  event.waitUntil(
12
34
  (async () => {
13
- await self.clients.claim();${navPreloadCode}
35
+ await self.clients.claim();${navPreloadCode}${evictionCode}
14
36
  const keys = await caches.keys();
15
37
  await Promise.all(
16
38
  ${cacheCleanup}.map((key) => caches.delete(key))
@@ -1 +1 @@
1
- {"version":3,"file":"activate-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/activate-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,oBAA6B,EAAE,iBAA2B;IAChG,MAAM,YAAY,GAAG,oBAAoB;QACvC,CAAC,CAAC,0CAA0C;QAC5C,CAAC,CAAC,wEAAwE,CAAC;IAE7E,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC;;;QAGrC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEZ,OAAO;;;;mCAI0B,cAAc;;;UAGvC,YAAY;;;;IAIlB,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"activate-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/activate-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,oBAA6B,EAAE,iBAA2B,EAAE,kBAA2B;IAC7H,MAAM,YAAY,GAAG,oBAAoB;QACvC,CAAC,CAAC,0CAA0C;QAC5C,CAAC,CAAC,wEAAwE,CAAC;IAE7E,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC;;;QAGrC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEZ,MAAM,YAAY,GAAG,kBAAkB,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC;sCAChC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1C,MAAM,cAAc,GAAG,kBAAkB,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC;gCACxC,kBAAkB;;;;;;;;;;;;;;;;;;CAkBjD,CAAC,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,GAAG,cAAc;;;;mCAIS,cAAc,GAAG,YAAY;;;UAGtD,YAAY;;;;IAIlB,CAAC;AACL,CAAC"}
@@ -38,23 +38,21 @@ function applyReplacements(sw, config, assetsToCache) {
38
38
  sw = sw.replace("// [[AUTO_SKIP_WAITING]]", `const AUTO_SKIP_WAITING = ${serviceWorker.autoActivate};`);
39
39
  const { strategy, navigation } = serviceWorker;
40
40
  const { refetchQueue } = features;
41
- const tagInvalidationEnabled = features.tagInvalidation.enabled;
42
41
  sw = sw.replace("// [[FETCH_HANDLER]]", generateFetchHandler({
43
42
  strategy,
44
43
  navigation,
45
44
  refetchQueue,
46
- }, tagInvalidationEnabled, features.mutationQueue.enabled));
47
- sw = sw.replace("// [[ACTIVATE_HANDLER]]", generateActivateHandler(strategy.clearRuntimeOnUpdate, navigation.preload));
45
+ }, true, features.mutationQueue.enabled));
46
+ sw = sw.replace("// [[ACTIVATE_HANDLER]]", generateActivateHandler(strategy.clearRuntimeOnUpdate, navigation.preload, strategy.maxRuntimeCacheAge));
48
47
  sw = sw.replace("// [[INSTALL_HANDLER]]", generateInstallHandler());
49
- sw = sw.replace("// [[MESSAGE_HANDLER]]", generateMessageHandler(tagInvalidationEnabled, features.tagInvalidation.debounceMs ?? 0));
50
- sw = tagInvalidationEnabled
51
- ? sw.replace("// [[TAG_MANAGEMENT]]", generateTagManagement())
52
- : sw.replace("// [[TAG_MANAGEMENT]]", "");
48
+ sw = sw.replace("// [[MESSAGE_HANDLER]]", generateMessageHandler(true, features.tagInvalidation.debounceMs ?? 0));
49
+ sw = sw.replace("// [[TAG_MANAGEMENT]]", generateTagManagement());
53
50
  sw = features.pushNotifications?.enabled
54
51
  ? sw.replace("// [[PUSH_HANDLERS]]", generateSwPushHandlers())
55
52
  : sw.replace("// [[PUSH_HANDLERS]]", "");
53
+ const baseUrl = config.apiBaseUrl || "";
56
54
  sw = features.serverPush?.enabled
57
- ? sw.replace("// [[SERVER_PUSH_HANDLER]]", generateServerPushHandler(features.serverPush.type, features.serverPush.endpoint, features.serverPush.reconnectDelayMs))
55
+ ? sw.replace("// [[SERVER_PUSH_HANDLER]]", generateServerPushHandler(features.serverPush.type, baseUrl + features.serverPush.endpoint, features.serverPush.reconnectDelayMs))
58
56
  : sw.replace("// [[SERVER_PUSH_HANDLER]]", "");
59
57
  return sw;
60
58
  }
@@ -63,7 +61,7 @@ export function assembleSW(config, version, projectRoot) {
63
61
  const { features } = config;
64
62
  const outputDir = config.build?.outputDir || "dist";
65
63
  const swFilename = config.build?.swFilename || "sw";
66
- const versionEnabled = serviceWorker.version !== false && serviceWorker.version !== "hash";
64
+ const versionEnabled = serviceWorker.version !== "hash";
67
65
  const fallback = ["/index.html"];
68
66
  if (features.pwa.enabled)
69
67
  fallback.push("/manifest.json");
@@ -94,9 +92,12 @@ export function assembleSW(config, version, projectRoot) {
94
92
  sw = `${generateConfigHeader(config, version)}\n\n${sw}`;
95
93
  }
96
94
  if (features.backgroundSync) {
97
- const authType = features.auth.enabled ? features.auth.type : undefined;
98
- const mq = features.mutationQueue;
99
- sw += `\n\n${generateBackgroundSyncHandler(authType, mq.batchSize, mq.batchDelayMs, mq.maxRetries, mq.retryBackoffMs, config.features.tagInvalidation.enabled)}`;
95
+ // Skip background sync for non-cookie auth (tokens must not persist in IndexedDB)
96
+ if (!features.auth.enabled || features.auth.type === "cookie") {
97
+ const authType = features.auth.enabled ? features.auth.type : undefined;
98
+ const mq = features.mutationQueue;
99
+ sw += `\n\n${generateBackgroundSyncHandler(authType, mq.batchSize, mq.batchDelayMs, mq.maxRetries, mq.retryBackoffMs, true)}`;
100
+ }
100
101
  }
101
102
  return sw;
102
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"assemble-sw.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/assemble-sw.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assemble-sw.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/assemble-sw.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ const SW_BATCH_SIZE = ${batchSize};
15
15
  const SW_BATCH_DELAY_MS = ${batchDelayMs};
16
16
  const SW_MAX_RETRIES = ${maxRetries};
17
17
  const SW_RETRY_BACKOFF_MS = ${retryBackoffMs};
18
+ // Bump this when adding new indexes/stores for schema migration
19
+ const SW_DB_VERSION = 1;
18
20
 
19
21
  function swSleep(ms) {
20
22
  return new Promise((r) => setTimeout(r, ms));
@@ -29,14 +31,15 @@ async function processMutationQueueInSW() {
29
31
  let succeeded = 0;
30
32
  let failed = 0;
31
33
  const tagsToInvalidate = new Set();
34
+ let db;
32
35
 
33
36
  try {
34
- const db = await new Promise((resolve, reject) => {
35
- const request = indexedDB.open("${DB_NAME}", 1);
37
+ db = await new Promise((resolve, reject) => {
38
+ const request = indexedDB.open("${DB_NAME}", SW_DB_VERSION);
36
39
  request.onupgradeneeded = (e) => {
37
- const db = e.target.result;
38
- if (!db.objectStoreNames.contains("${STORE_NAME}")) {
39
- const store = db.createObjectStore("${STORE_NAME}", { keyPath: "id" });
40
+ const idb = e.target.result;
41
+ if (!idb.objectStoreNames.contains("${STORE_NAME}")) {
42
+ const store = idb.createObjectStore("${STORE_NAME}", { keyPath: "id" });
40
43
  store.createIndex("by-timestamp", "timestamp");
41
44
  }
42
45
  };
@@ -83,7 +86,9 @@ async function processMutationQueueInSW() {
83
86
  replayBody = item.body;
84
87
  } else if (bt === "buffer") {
85
88
  replayBody = item.body instanceof ArrayBuffer ? new Uint8Array(item.body) : item.body;
86
- } else {
89
+ } else if (bt === "text") {
90
+ replayBody = item.body;
91
+ } else if (item.body != null) {
87
92
  replayBody = JSON.stringify(item.body);
88
93
  contentType = "application/json";
89
94
  }
@@ -95,7 +100,7 @@ async function processMutationQueueInSW() {
95
100
  ...(contentType ? { "Content-Type": contentType } : {}),
96
101
  ...item.headers,
97
102
  },
98
- body: replayBody,
103
+ ...(replayBody != null ? { body: replayBody } : {}),
99
104
  ${credentialsLine} });
100
105
  if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
101
106
 
@@ -133,6 +138,8 @@ ${credentialsLine} });
133
138
  }
134
139
  } catch (err) {
135
140
  console.error("Background sync failed:", err);
141
+ } finally {
142
+ if (db) db.close();
136
143
  }
137
144
 
138
145
  const clients = await self.clients.matchAll();
@@ -1 +1 @@
1
- {"version":3,"file":"background-sync-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/background-sync-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,6BAA6B,CAAC,QAA4B,EAAE,SAAiB,EAAE,YAAoB,EAAE,UAAkB,EAAE,cAAsB,EAAE,sBAA+B;IAC9L,MAAM,OAAO,GAAG,aAAa,CAAC;IAC9B,MAAM,UAAU,GAAG,WAAW,CAAC;IAE/B,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ;QAC3C,CAAC,CAAC,uCAAuC;QACzC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;wBAOe,SAAS;4BACL,YAAY;yBACf,UAAU;8BACL,cAAc;;;;;;;;;;;;;;;;;;wCAkBJ,OAAO;;;6CAGF,UAAU;gDACP,UAAU;;;;;;;;iCAQzB,UAAU;oCACP,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmD5C,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAiDc,UAAU;oBACrB,UAAU;;;;;;;;+BAQC,UAAU;oBACrB,UAAU;;;;;EAK5B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"background-sync-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/background-sync-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,6BAA6B,CAAC,QAA4B,EAAE,SAAiB,EAAE,YAAoB,EAAE,UAAkB,EAAE,cAAsB,EAAE,sBAA+B;IAC9L,MAAM,OAAO,GAAG,aAAa,CAAC;IAC9B,MAAM,UAAU,GAAG,WAAW,CAAC;IAE/B,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ;QAC3C,CAAC,CAAC,uCAAuC;QACzC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;wBAOe,SAAS;4BACL,YAAY;yBACf,UAAU;8BACL,cAAc;;;;;;;;;;;;;;;;;;;;;wCAqBJ,OAAO;;;8CAGD,UAAU;iDACP,UAAU;;;;;;;;iCAQ1B,UAAU;oCACP,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqD5C,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAmDc,UAAU;oBACrB,UAAU;;;;;;;;+BAQC,UAAU;oBACrB,UAAU;;;;;EAK5B,CAAC;AACH,CAAC"}
@@ -7,7 +7,7 @@ export function generateConfigHeader(config, resolvedVersion) {
7
7
  * Generated from swoff.config.json
8
8
  * DO NOT EDIT MANUALLY
9
9
  * Version: ${resolvedVersion}
10
- * Features: version=${config.features.serviceWorker.version}, mutationQueue=${config.features.mutationQueue.enabled}, backgroundSync=${config.features.backgroundSync}, tagInvalidation=${config.features.tagInvalidation.enabled}
10
+ * Features: version=${config.features.serviceWorker.version}, mutationQueue=${config.features.mutationQueue.enabled}, backgroundSync=${config.features.backgroundSync}, tagInvalidation=true
11
11
  * Default Strategy: ${config.features.serviceWorker.strategy.default}
12
12
  * See: https://swoff.netlify.app/docs
13
13
  */`;
@@ -1 +1 @@
1
- {"version":3,"file":"config-header.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/config-header.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,eAAuB;IAC/E,OAAO;;;;cAIK,eAAe;uBACN,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,mBAAmB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,oBAAoB,MAAM,CAAC,QAAQ,CAAC,cAAc,qBAAqB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO;uBAC3M,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO;;IAEjE,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"config-header.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/config-header.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,eAAuB;IAC/E,OAAO;;;;cAIK,eAAe;uBACN,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,mBAAmB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,oBAAoB,MAAM,CAAC,QAAQ,CAAC,cAAc;uBAC/I,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO;;IAEjE,CAAC;AACL,CAAC"}