@swoff/cli 0.3.8 → 0.3.10

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 (228) hide show
  1. package/README.md +47 -33
  2. package/dist/__tests__/assemble-sw.test.js +14 -53
  3. package/dist/__tests__/assemble-sw.test.js.map +1 -1
  4. package/dist/__tests__/cli-integration.test.js +119 -11
  5. package/dist/__tests__/cli-integration.test.js.map +1 -1
  6. package/dist/__tests__/config-types.test.js +44 -17
  7. package/dist/__tests__/config-types.test.js.map +1 -1
  8. package/dist/__tests__/file-generators.test.js +3 -3
  9. package/dist/__tests__/file-generators.test.js.map +1 -1
  10. package/dist/__tests__/glob-matcher.test.js +86 -0
  11. package/dist/__tests__/glob-matcher.test.js.map +1 -0
  12. package/dist/__tests__/invalidation-tags.test.js +207 -23
  13. package/dist/__tests__/invalidation-tags.test.js.map +1 -1
  14. package/dist/__tests__/loader.test.js +16 -12
  15. package/dist/__tests__/loader.test.js.map +1 -1
  16. package/dist/__tests__/validator.test.js +140 -100
  17. package/dist/__tests__/validator.test.js.map +1 -1
  18. package/dist/index.js +39 -34
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/cli/help.js +12 -12
  21. package/dist/lib/cli/help.js.map +1 -1
  22. package/dist/lib/commands/add.js +84 -36
  23. package/dist/lib/commands/add.js.map +1 -1
  24. package/dist/lib/commands/assets.js +37 -0
  25. package/dist/lib/commands/assets.js.map +1 -0
  26. package/dist/lib/commands/clean.js +32 -30
  27. package/dist/lib/commands/clean.js.map +1 -1
  28. package/dist/lib/commands/generate-assets.js +44 -0
  29. package/dist/lib/commands/generate-assets.js.map +1 -0
  30. package/dist/lib/commands/generate-guide.js +22 -29
  31. package/dist/lib/commands/generate-guide.js.map +1 -1
  32. package/dist/lib/commands/generate.js +17 -24
  33. package/dist/lib/commands/generate.js.map +1 -1
  34. package/dist/lib/commands/info.js +41 -48
  35. package/dist/lib/commands/info.js.map +1 -1
  36. package/dist/lib/commands/init.js +27 -13
  37. package/dist/lib/commands/init.js.map +1 -1
  38. package/dist/lib/commands/validate.js +4 -4
  39. package/dist/lib/commands/validate.js.map +1 -1
  40. package/dist/lib/config/loader.js +25 -23
  41. package/dist/lib/config/loader.js.map +1 -1
  42. package/dist/lib/config/validator.js +169 -91
  43. package/dist/lib/config/validator.js.map +1 -1
  44. package/dist/lib/generators/asset-generator/dependency-resolver.js +76 -0
  45. package/dist/lib/generators/asset-generator/dependency-resolver.js.map +1 -0
  46. package/dist/lib/generators/asset-generator/generate.js +111 -0
  47. package/dist/lib/generators/asset-generator/generate.js.map +1 -0
  48. package/dist/lib/generators/asset-generator/guide.js +43 -0
  49. package/dist/lib/generators/asset-generator/guide.js.map +1 -0
  50. package/dist/lib/generators/asset-generator/html-patcher.js +65 -0
  51. package/dist/lib/generators/asset-generator/html-patcher.js.map +1 -0
  52. package/dist/lib/generators/asset-generator/ico-encoder.js +29 -0
  53. package/dist/lib/generators/asset-generator/ico-encoder.js.map +1 -0
  54. package/dist/lib/generators/asset-generator/manifest-patcher.js +23 -0
  55. package/dist/lib/generators/asset-generator/manifest-patcher.js.map +1 -0
  56. package/dist/lib/generators/asset-generator/maskable.js +15 -0
  57. package/dist/lib/generators/asset-generator/maskable.js.map +1 -0
  58. package/dist/lib/generators/asset-generator/rasterize.js +32 -0
  59. package/dist/lib/generators/asset-generator/rasterize.js.map +1 -0
  60. package/dist/lib/generators/asset-generator/sizes.js +25 -0
  61. package/dist/lib/generators/asset-generator/sizes.js.map +1 -0
  62. package/dist/lib/generators/file-generators/api-config.js +6 -0
  63. package/dist/lib/generators/file-generators/api-config.js.map +1 -0
  64. package/dist/lib/generators/file-generators/auth-state.js +2 -34
  65. package/dist/lib/generators/file-generators/auth-state.js.map +1 -1
  66. package/dist/lib/generators/file-generators/auth-store.js +2 -250
  67. package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
  68. package/dist/lib/generators/file-generators/auth-user.js +3 -81
  69. package/dist/lib/generators/file-generators/auth-user.js.map +1 -1
  70. package/dist/lib/generators/file-generators/background-sync.js +2 -57
  71. package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
  72. package/dist/lib/generators/file-generators/cache.js +2 -38
  73. package/dist/lib/generators/file-generators/cache.js.map +1 -1
  74. package/dist/lib/generators/file-generators/client-injector.js +2 -91
  75. package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
  76. package/dist/lib/generators/file-generators/fetch-state.js +6 -0
  77. package/dist/lib/generators/file-generators/fetch-state.js.map +1 -0
  78. package/dist/lib/generators/file-generators/fetch-wrapper.js +3 -267
  79. package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
  80. package/dist/lib/generators/file-generators/generate-framework-adapters.js +56 -0
  81. package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -0
  82. package/dist/lib/generators/file-generators/generate-hooks.js +4 -3
  83. package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
  84. package/dist/lib/generators/file-generators/gql-wrapper.js +3 -145
  85. package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
  86. package/dist/lib/generators/file-generators/guide-generator.js +24 -630
  87. package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
  88. package/dist/lib/generators/file-generators/invalidation-tags.js +18 -86
  89. package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
  90. package/dist/lib/generators/file-generators/manifest.js +15 -5
  91. package/dist/lib/generators/file-generators/manifest.js.map +1 -1
  92. package/dist/lib/generators/file-generators/mutation-queue.js +3 -285
  93. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
  94. package/dist/lib/generators/file-generators/mutation-state.js +2 -117
  95. package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
  96. package/dist/lib/generators/file-generators/push.js +6 -139
  97. package/dist/lib/generators/file-generators/push.js.map +1 -1
  98. package/dist/lib/generators/file-generators/pwa-install.js +11 -84
  99. package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
  100. package/dist/lib/generators/file-generators/quick-readme.js +8 -125
  101. package/dist/lib/generators/file-generators/quick-readme.js.map +1 -1
  102. package/dist/lib/generators/file-generators/reset.js +6 -0
  103. package/dist/lib/generators/file-generators/reset.js.map +1 -0
  104. package/dist/lib/generators/file-generators/server-push.js +3 -124
  105. package/dist/lib/generators/file-generators/server-push.js.map +1 -1
  106. package/dist/lib/generators/file-generators/sw-generator-build.js +8 -9
  107. package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
  108. package/dist/lib/generators/file-generators/sw-injector.js +10 -230
  109. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
  110. package/dist/lib/generators/file-generators/type-definitions.js +2 -114
  111. package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
  112. package/dist/lib/generators/sw-generator.js +10 -20
  113. package/dist/lib/generators/sw-generator.js.map +1 -1
  114. package/dist/lib/generators/sw-sections/activate-handler.js +25 -3
  115. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
  116. package/dist/lib/generators/sw-sections/assemble-sw.js +20 -16
  117. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
  118. package/dist/lib/generators/sw-sections/background-sync-handler.js +68 -19
  119. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
  120. package/dist/lib/generators/sw-sections/config-header.js +2 -2
  121. package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
  122. package/dist/lib/generators/sw-sections/fetch-handler.js +506 -144
  123. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
  124. package/dist/lib/generators/sw-sections/glob-matcher-code.js.map +1 -0
  125. package/dist/lib/generators/sw-sections/message-handler.js +55 -15
  126. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
  127. package/dist/lib/generators/sw-sections/server-push-handler.js +12 -0
  128. package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
  129. package/dist/lib/generators/sw-sections/sw-push.js +67 -0
  130. package/dist/lib/generators/sw-sections/sw-push.js.map +1 -0
  131. package/dist/lib/generators/sw-sections/tag-management.js +65 -23
  132. package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
  133. package/dist/lib/generators/swoff-files-generator.js +66 -45
  134. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  135. package/dist/lib/shared/config-types.js +182 -71
  136. package/dist/lib/shared/config-types.js.map +1 -1
  137. package/dist/lib/shared/glob-matcher.js +77 -0
  138. package/dist/lib/shared/glob-matcher.js.map +1 -0
  139. package/dist/lib/utils/tty-status.js +21 -0
  140. package/dist/lib/utils/tty-status.js.map +1 -0
  141. package/dist/runtime/api-config.js +18 -0
  142. package/dist/runtime/api-config.js.map +1 -0
  143. package/dist/runtime/auth-state.js +35 -0
  144. package/dist/runtime/auth-state.js.map +1 -0
  145. package/dist/runtime/auth-store.js +273 -0
  146. package/dist/runtime/auth-store.js.map +1 -0
  147. package/dist/runtime/auth-user.js +168 -0
  148. package/dist/runtime/auth-user.js.map +1 -0
  149. package/dist/runtime/background-sync.js +59 -0
  150. package/dist/runtime/background-sync.js.map +1 -0
  151. package/dist/runtime/cache.js +30 -0
  152. package/dist/runtime/cache.js.map +1 -0
  153. package/dist/runtime/client-injector.js +136 -0
  154. package/dist/runtime/client-injector.js.map +1 -0
  155. package/dist/runtime/fetch-state.js +42 -0
  156. package/dist/runtime/fetch-state.js.map +1 -0
  157. package/dist/runtime/fetch-wrapper.js +355 -0
  158. package/dist/runtime/fetch-wrapper.js.map +1 -0
  159. package/dist/runtime/gql-wrapper.js +135 -0
  160. package/dist/runtime/gql-wrapper.js.map +1 -0
  161. package/dist/runtime/invalidation-tags.js +260 -0
  162. package/dist/runtime/invalidation-tags.js.map +1 -0
  163. package/dist/runtime/mutation-queue.js +304 -0
  164. package/dist/runtime/mutation-queue.js.map +1 -0
  165. package/dist/runtime/mutation-state.js +117 -0
  166. package/dist/runtime/mutation-state.js.map +1 -0
  167. package/dist/runtime/push.js +138 -0
  168. package/dist/runtime/push.js.map +1 -0
  169. package/dist/runtime/pwa-index.js +11 -0
  170. package/dist/runtime/pwa-index.js.map +1 -0
  171. package/dist/runtime/pwa-injector.js +44 -0
  172. package/dist/runtime/pwa-injector.js.map +1 -0
  173. package/dist/runtime/pwa-install.js +83 -0
  174. package/dist/runtime/pwa-install.js.map +1 -0
  175. package/dist/runtime/pwa-prompt.js +54 -0
  176. package/dist/runtime/pwa-prompt.js.map +1 -0
  177. package/dist/runtime/reset.js +148 -0
  178. package/dist/runtime/reset.js.map +1 -0
  179. package/dist/runtime/server-push.js +148 -0
  180. package/dist/runtime/server-push.js.map +1 -0
  181. package/dist/runtime/sw-injector.js +236 -0
  182. package/dist/runtime/sw-injector.js.map +1 -0
  183. package/dist/runtime/type-definitions.js +138 -0
  184. package/dist/runtime/type-definitions.js.map +1 -0
  185. package/dist/runtime/utils.js +27 -0
  186. package/dist/runtime/utils.js.map +1 -0
  187. package/package.json +3 -1
  188. package/templates/react/useAuth.jsx +106 -0
  189. package/templates/react/useAuth.tsx +118 -0
  190. package/templates/{hooks → react}/useBackgroundSync.jsx +6 -4
  191. package/templates/{hooks → react}/useBackgroundSync.tsx +6 -4
  192. package/templates/{hooks → react}/useCacheInvalidation.jsx +2 -2
  193. package/templates/react/useCacheInvalidation.tsx +52 -0
  194. package/templates/react/useCachedFetch.jsx +140 -0
  195. package/templates/react/useCachedFetch.tsx +160 -0
  196. package/templates/react/useIsFetching.jsx +32 -0
  197. package/templates/react/useIsFetching.tsx +32 -0
  198. package/templates/react/useMutation.jsx +141 -0
  199. package/templates/react/useMutation.tsx +180 -0
  200. package/templates/react/useMutationQueue.jsx +69 -0
  201. package/templates/react/useMutationQueue.tsx +83 -0
  202. package/templates/react/useMutationState.jsx +13 -0
  203. package/templates/react/useMutationState.tsx +25 -0
  204. package/templates/react/useNetworkStatus.jsx +61 -0
  205. package/templates/react/useNetworkStatus.tsx +76 -0
  206. package/templates/react/usePrefetch.jsx +32 -0
  207. package/templates/react/usePrefetch.tsx +42 -0
  208. package/templates/{hooks → react}/usePushSubscription.jsx +7 -7
  209. package/templates/{hooks → react}/usePushSubscription.tsx +7 -7
  210. package/templates/{hooks → react}/useSWUpdate.jsx +3 -3
  211. package/templates/{hooks → react}/useSWUpdate.tsx +4 -4
  212. package/templates/react/useSwoffReset.jsx +32 -0
  213. package/templates/react/useSwoffReset.tsx +39 -0
  214. package/templates/hooks/useAuth.jsx +0 -30
  215. package/templates/hooks/useAuth.tsx +0 -30
  216. package/templates/hooks/useCacheInvalidation.tsx +0 -19
  217. package/templates/hooks/useCachedFetch.jsx +0 -94
  218. package/templates/hooks/useCachedFetch.tsx +0 -112
  219. package/templates/hooks/useMutation.jsx +0 -76
  220. package/templates/hooks/useMutation.tsx +0 -97
  221. package/templates/hooks/useMutationQueue.jsx +0 -42
  222. package/templates/hooks/useMutationQueue.tsx +0 -49
  223. package/templates/hooks/useMutationState.jsx +0 -27
  224. package/templates/hooks/useMutationState.tsx +0 -41
  225. package/templates/hooks/useNetworkStatus.jsx +0 -19
  226. package/templates/hooks/useNetworkStatus.tsx +0 -19
  227. package/templates/hooks/usePrefetch.jsx +0 -10
  228. package/templates/hooks/usePrefetch.tsx +0 -25
@@ -4,133 +4,12 @@
4
4
  * This client-side helper provides a fallback and status events for the UI.
5
5
  */
6
6
  import { writeFile } from "./context.js";
7
+ import { generateServerPushCode } from "../../../runtime/server-push.js";
7
8
  export function generateServerPush(ctx) {
8
9
  const ext = ctx.ext;
9
10
  const ts = ext === "ts";
10
- const T = (type) => (ts ? `: ${type}` : "");
11
- const R = (type) => (ts ? `: ${type}` : " ");
12
11
  const sp = ctx.config.features.serverPush;
13
- const endpoint = sp.endpoint;
14
- const reconnectDelayMs = sp.reconnectDelayMs;
15
- const invalidate = `
16
- // Forward to SW for cache invalidation
17
- if (navigator.serviceWorker.controller) {
18
- for (const tag of tags) {
19
- navigator.serviceWorker.controller.postMessage({ type: "INVALIDATE_TAG", tag });
20
- }
21
- }`;
22
- const sseConnect = `
23
- return new Promise((resolve) => {
24
- fetch("${endpoint}", {
25
- headers: { Accept: "text/event-stream" },
26
- signal: options.signal,
27
- }).then(async (response) => {
28
- if (!response.ok || !response.body) { resolve(); return; }
29
- notifyStatus(true);
30
- const reader = response.body.getReader();
31
- const decoder = new TextDecoder();
32
- let buffer = "";
33
- let eventType = "";
34
- let dataStr = "";
35
-
36
- while (true) {
37
- const { done, value } = await reader.read();
38
- if (done) break;
39
- buffer += decoder.decode(value, { stream: true });
40
- const lines = buffer.split("\\n");
41
- buffer = lines.pop() || "";
42
- for (const line of lines) {
43
- if (line.startsWith("event: ")) eventType = line.slice(7).trim();
44
- else if (line.startsWith("data: ")) dataStr = line.slice(6);
45
- else if (line === "" && eventType === "invalidate" && dataStr) {
46
- try {
47
- const p = JSON.parse(dataStr); if (p.tags) handleInvalidation(p.tags);
48
- } catch {
49
- // Handle invalidation data
50
- }
51
- eventType = ""; dataStr = "";
52
- }
53
- }
54
- }
55
- }).catch(() => {}).finally(() => {
56
- notifyStatus(false);
57
- resolve();
58
- });
59
- });`;
60
- const wsConnect = `
61
- return new Promise((resolve) => {
62
- try {
63
- const ws = new WebSocket("${endpoint}");
64
- ws.onopen = () => notifyStatus(true);
65
- ws.onmessage = (event) => {
66
- try { const d = JSON.parse(event.data); if (d.type === "invalidate" && d.tags) handleInvalidation(d.tags); } catch {}
67
- };
68
- ws.onclose = () => { notifyStatus(false); resolve(); };
69
- ws.onerror = () => { ws.close(); resolve(); };
70
- if (options.signal) {
71
- options.signal.addEventListener("abort", () => ws.close());
72
- }
73
- } catch { resolve(); }
74
- });`;
75
- const code = `/**
76
- * Swoff Server Push Events
77
- *
78
- * The service worker connects to ${endpoint} and invalidates cache tags
79
- * when the server sends "invalidate" events — no polling needed.
80
- * This client-side helper provides status tracking and a manual start/stop API.
81
- *
82
- * Usage:
83
- * import { startPushEvents, stopPushEvents, isPushConnected } from "./server-push.${ext}";
84
- * startPushEvents();
85
- *
86
- * Server sends:
87
- * event: invalidate
88
- * data: {"tags": ["todos", "todo:42"]}
89
- */
90
-
91
- type PushEventOptions= {
92
- signal${T("AbortSignal")};
93
- };
94
-
95
- let active${T("boolean")} = false;
96
- let reconnectTimer${T("ReturnType<typeof setTimeout> | null")} = null;
97
-
98
- function handleInvalidation(tags${T("string[]")})${R("void")}{${invalidate}
99
- window.dispatchEvent(new CustomEvent("cache-invalidated", { detail: { tags } }));
100
- }
101
-
102
- function notifyStatus(connected${T("boolean")})${R("void")}{
103
- window.dispatchEvent(new CustomEvent("push-events-status", { detail: { connected } }));
104
- }
105
-
106
- async function connect(options${T("PushEventOptions")} = {} as PushEventOptions)${R("Promise<void>")}{
107
- ${sp.type === "sse" ? sseConnect : wsConnect}
108
- }
109
-
110
- /** Start listening for server push events. Retries on connection loss with exponential backoff. */
111
- export async function startPushEvents(){
112
- if (active) return;
113
- active = true;
114
- let delay = ${reconnectDelayMs};
115
- while (active) {
116
- await connect();
117
- if (!active) break;
118
- await new Promise((r) => { reconnectTimer = setTimeout(r, delay); });
119
- delay = Math.min(delay * 1.5, 30000); // cap at 30s
120
- }
121
- }
122
-
123
- /** Stop listening for push events. */
124
- export function stopPushEvents(){
125
- active = false;
126
- if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; }
127
- }
128
-
129
- /** Check if the push connection is currently established. */
130
- export function isPushConnected(){
131
- return active;
132
- }
133
- `;
134
- writeFile(ctx, `server-push.${ext}`, code);
12
+ const code = generateServerPushCode({ ts, ext }, sp.type, sp.endpoint, sp.reconnectDelayMs);
13
+ writeFile(ctx, `realtime/server-push.${ext}`, code);
135
14
  }
136
15
  //# sourceMappingURL=server-push.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/server-push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,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,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;IAC7B,MAAM,gBAAgB,GAAG,EAAE,CAAC,gBAAgB,CAAC;IAE7C,MAAM,UAAU,GAAG;;;;;;IAMjB,CAAC;IAEH,MAAM,UAAU,GAAG;;aAER,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmCf,CAAC;IAEL,MAAM,SAAS,GAAG;;;kCAGc,QAAQ;;;;;;;;;;;MAWpC,CAAC;IAEL,MAAM,IAAI,GAAG;;;oCAGqB,QAAQ;;;;;uFAK2C,GAAG;;;;;;;;;UAShF,CAAC,CAAC,aAAa,CAAC;;;YAGd,CAAC,CAAC,SAAS,CAAC;oBACJ,CAAC,CAAC,sCAAsC,CAAC;;kCAE3B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU;;;;iCAIzC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;;;;gCAI1B,CAAC,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC,eAAe,CAAC;IAChG,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;;;;;;;gBAO9B,gBAAgB;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"server-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/server-push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;IAE1C,MAAM,IAAI,GAAG,sBAAsB,CACjC,EAAE,EAAE,EAAE,GAAG,EAAE,EACX,EAAE,CAAC,IAAI,EACP,EAAE,CAAC,QAAQ,EACX,EAAE,CAAC,gBAAgB,CACpB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE,wBAAwB,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC"}
@@ -1,6 +1,3 @@
1
- /**
2
- * Generates sw-generator.js - build script that processes sw-template.js.
3
- */
4
1
  import { writeFile } from "./context.js";
5
2
  export function generateSwGeneratorBuild(ctx) {
6
3
  const code = `#!/usr/bin/env node
@@ -40,11 +37,13 @@ const config = JSON.parse(readFileSync(configPath, 'utf8'));
40
37
  const template = readFileSync(templatePath, 'utf8');
41
38
 
42
39
  const swConfig = config.features?.serviceWorker || {};
43
- const versionConfig = swConfig.version || {};
44
- const versionEnabled = versionConfig.enabled !== false;
45
- const version = versionConfig.source === 'manual' && versionConfig.value
46
- ? versionConfig.value
47
- : pkg.version || '1.0.0';
40
+ const versionField = swConfig.version;
41
+ const versionEnabled = versionField !== "hash";
42
+ const version = versionField === "package"
43
+ ? (pkg.version || '1.0.0')
44
+ : versionField === "hash"
45
+ ? "0.0.0"
46
+ : versionField || (pkg.version || '1.0.0');
48
47
  const outputDir = config.build?.outputDir || 'dist';
49
48
  const swFilename = config.build?.swFilename || 'sw';
50
49
 
@@ -98,7 +97,7 @@ if (!versionEnabled) {
98
97
  writeFileSync(join(outDir, swFile), sw);
99
98
  writeFileSync(join(outDir, 'version.json'), JSON.stringify({
100
99
  version,
101
- minSupportedVersion: versionConfig.minSupportedVersion || '0.0.0',
100
+ minSupportedVersion: swConfig.minSupportedVersion || '0.0.0',
102
101
  generatedAt: new Date().toISOString(),
103
102
  }, null, 2));
104
103
  console.log(\`Service worker built: \${outputDir}/\${swFile}\`);
@@ -1 +1 @@
1
- {"version":3,"file":"sw-generator-build.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-generator-build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,wBAAwB,CAAC,GAAqB;IAC5D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoGd,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"sw-generator-build.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-generator-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,wBAAwB,CAAC,GAAqB;IAC5D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGd,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -2,236 +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
- const versionEnabled = ctx.config.features.serviceWorker.version.enabled;
9
- const ext = ctx.ext;
10
- const ts = ext === "ts";
11
- const T = (type) => (ts ? `: ${type}` : "");
12
- const R = (type) => (ts ? `: ${type} ` : " ");
13
- const versionedCode = `/**
14
- * Swoff SW Injector
15
- * Framework-agnostic SW registration with versioned URLs and update flow.
16
- *
17
- * Usage:
18
- * import { initServiceWorker } from './swoff/sw/injector.${ext}';
19
- * initServiceWorker();
20
- *
21
- * Window events:
22
- * sw-version-detected - Version info available on window
23
- * sw-update-available - New version ready for user consent (detail: { version })
24
- * sw-progress - Download progress (detail: { percent, downloaded, total })
25
- * sw-ready - SW active and controlling page
26
- * sw-error - SW registration failed
27
- *
28
- * Window properties:
29
- * window.latestSWVersion - Latest version from version.json
30
- * window.currentSWVersion - Active SW version
31
- * window.swAvailableVersion - Pending update version
32
- * window.swUpdateRequired - Forced update needed (version < minSupportedVersion)
33
- * window.swMinSupportedVersion - Minimum supported version
34
- * window.swReady - SW is active
35
- * window.swError - Registration failed
36
- */
37
- const AUTO_UPDATE = ${autoUpdate};
38
- const AUTO_ACTIVATE = ${autoActivate};
39
-
40
- function semverCompare(a${T("string")}, b${T("string")})${R("number")}{
41
- const pa = a.split('.').map(Number);
42
- const pb = b.split('.').map(Number);
43
- for (let i = 0; i < 3; i++) {
44
- if (pa[i] > pb[i]) return 1;
45
- if (pa[i] < pb[i]) return -1;
46
- }
47
- return 0;
48
- }
49
-
50
- async function checkForUpdate() {
51
- const response = await fetch("/version.json?t=" + Date.now());
52
- if (!response.ok) {
53
- throw new Error("Failed to fetch version.json");
54
- }
55
- return response.json();
56
- }
57
-
58
- async function waitForController()${R("Promise<void>")}{
59
- return new Promise<void>((resolve) => {
60
- if (navigator.serviceWorker.controller) {
61
- resolve();
62
- } else {
63
- navigator.serviceWorker.addEventListener("controllerchange", () => resolve(), { once: true });
64
- }
65
- });
66
- }
67
-
68
- async function doRegisterServiceWorker(version${T("string")})${R("Promise<ServiceWorkerRegistration>")}{
69
- const swUrl = \`/sw-v\${version}.js\`;
70
- const registration = await navigator.serviceWorker.register(swUrl);
71
- localStorage.setItem("swRegisteredVersion", version);
72
- window.currentSWVersion = version;
73
- window.swRegisteredVersion = version;
74
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
75
- await waitForController();
76
- window.dispatchEvent(new CustomEvent("sw-ready"));
77
- return registration;
78
- }
79
-
80
- /** Register the SW with version checking and update flow. Checks version.json, handles updates, and dispatches sw-ready/sw-error events. */
81
- export async function initServiceWorker()${R("Promise<void>")}{
82
- if (!("serviceWorker" in navigator)) {
83
- console.warn("Service Workers not supported");
84
- return;
85
- }
86
-
87
- try {
88
- const manifest = await checkForUpdate();
89
- const currentVersion = localStorage.getItem("swRegisteredVersion");
90
- window.latestSWVersion = manifest.version;
91
- window.swMinSupportedVersion = manifest.minSupportedVersion || "0.0.0";
92
-
93
- if (currentVersion === manifest.version) {
94
- const registration = await navigator.serviceWorker.getRegistration();
95
- if (registration && registration.active) {
96
- window.currentSWVersion = currentVersion ?? undefined;
97
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
98
- await waitForController();
99
- if (!window.swReady) {
100
- window.dispatchEvent(new CustomEvent("sw-ready"));
101
- }
102
- }
103
- } else if (currentVersion && currentVersion !== manifest.version) {
104
- window.swAvailableVersion = manifest.version;
105
- window.swUpdateRequired =
106
- semverCompare(currentVersion, manifest.minSupportedVersion || "0.0.0") < 0;
107
-
108
- if (AUTO_UPDATE) {
109
- const registration = await navigator.serviceWorker.getRegistration();
110
- if (registration && registration.waiting) {
111
- if (AUTO_ACTIVATE) {
112
- registration.waiting.postMessage({ type: "SKIP_WAITING" });
113
- } else {
114
- window.dispatchEvent(
115
- new CustomEvent("sw-update-available", {
116
- detail: { version: manifest.version },
117
- })
118
- );
119
- }
120
- } else {
121
- const newReg = await doRegisterServiceWorker(manifest.version);
122
- if (AUTO_ACTIVATE && newReg.waiting) {
123
- newReg.waiting.postMessage({ type: "SKIP_WAITING" });
124
- } else {
125
- window.dispatchEvent(
126
- new CustomEvent("sw-update-available", {
127
- detail: { version: manifest.version },
128
- })
129
- );
130
- }
131
- }
132
- } else {
133
- window.dispatchEvent(
134
- new CustomEvent("sw-update-available", {
135
- detail: { version: manifest.version },
136
- })
137
- );
138
- }
139
- } else {
140
- await doRegisterServiceWorker(manifest.version);
141
- }
142
- } catch (error) {
143
- try {
144
- const existing = await navigator.serviceWorker.getRegistration();
145
- if (existing && existing.active) {
146
- window.currentSWVersion = localStorage.getItem("swRegisteredVersion") || "unknown";
147
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
148
- await waitForController();
149
- if (!window.swReady) {
150
- window.dispatchEvent(new CustomEvent("sw-ready"));
151
- }
152
- return;
153
- }
154
- } catch {
155
- // Handle the case where no existing active registration is found
156
- }
157
-
158
- console.error("Service Worker initialization failed:", error);
159
- window.swError = true;
160
- window.dispatchEvent(new CustomEvent("sw-error"));
161
- }
162
- }
163
-
164
- /** Accept a pending SW update. Reloads the page once the new SW takes control. */
165
- export async function handleUpdateApproved(newVersion${T("string")})${R("Promise<void>")}{
166
- const registration = await navigator.serviceWorker.getRegistration();
167
- if (registration && registration.waiting) {
168
- registration.waiting.postMessage({ type: "SKIP_WAITING" });
169
- registration.addEventListener("controllerchange", () => {
170
- window.location.reload();
171
- });
172
- } else {
173
- await doRegisterServiceWorker(newVersion);
174
- navigator.serviceWorker.addEventListener("controllerchange", () => {
175
- window.location.reload();
176
- });
177
- }
178
- }
179
-
180
- /** Activate a waiting SW without reloading. Useful when you handle the transition yourself. */
181
- export async function skipWaiting()${R("Promise<void>")}{
182
- const registration = await navigator.serviceWorker.ready;
183
- if (registration.waiting) {
184
- registration.waiting.postMessage({ type: "SKIP_WAITING" });
185
- }
186
- }
187
- `;
188
- const simpleCode = `/**
189
- * Swoff SW Injector (Simple Mode)
190
- * Fixed SW URL with hash-based cache name — no versioned URLs or update events.
191
- *
192
- * Usage:
193
- * import { initServiceWorker } from './swoff/sw/injector.${ext}';
194
- * initServiceWorker();
195
- *
196
- * Window events:
197
- * sw-ready - SW active and controlling page
198
- * sw-error - SW registration failed
199
- *
200
- * Window properties:
201
- * window.currentSWVersion - "simple"
202
- * window.swReady - SW is active
203
- * window.swError - Registration failed
204
- */
205
- async function waitForController()${R("Promise<void>")}{
206
- return new Promise<void>((resolve) => {
207
- if (navigator.serviceWorker.controller) {
208
- resolve();
209
- } else {
210
- navigator.serviceWorker.addEventListener("controllerchange", () => resolve(), { once: true });
211
- }
212
- });
213
- }
214
-
215
- /** Register the SW with a fixed URL (non-versioned mode). Dispatches sw-ready/sw-error. */
216
- export async function initServiceWorker()${R("Promise<void>")}{
217
- if (!("serviceWorker" in navigator)) {
218
- console.warn("Service Workers not supported");
219
- return;
220
- }
221
- try {
222
- const registration = await navigator.serviceWorker.register("/sw.js");
223
- window.currentSWVersion = "simple";
224
- window.dispatchEvent(new CustomEvent("sw-version-detected"));
225
- await waitForController();
226
- window.dispatchEvent(new CustomEvent("sw-ready"));
227
- } catch (error) {
228
- console.error("Service Worker registration failed:", error);
229
- window.swError = true;
230
- window.dispatchEvent(new CustomEvent("sw-error"));
231
- }
232
- }
233
- `;
234
- const code = versionEnabled ? versionedCode : simpleCode;
235
- writeFile(ctx, `sw/injector.${ext}`, code);
7
+ const v = ctx.config.features.serviceWorker.version;
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
+ }));
236
16
  }
237
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,OAAO,CAAC;IACzE,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,122 +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
- staleWhileRevalidate?: boolean;
73
- staleTime?: number;
74
- }
75
-
76
- export type MutationStatus = "idle" | "pending" | "success" | "error";
77
-
78
- export interface MutationState {
79
- id: string;
80
- status: MutationStatus;
81
- error: Error | null;
82
- data: unknown;
83
- timestamp: number;
84
- }
85
-
86
- export interface GqlOptions {
87
- variables?: Record<string, unknown>;
88
- tags?: string[];
89
- staleWhileRevalidate?: boolean;
90
- auth?: boolean;
91
- queueOffline?: boolean;
92
- invalidate?: 'auto' | string[] | false;
93
- }
94
-
95
- export interface GqlResult${"<T>"} {
96
- data: T;
97
- fromCache: boolean;
98
- }
99
-
100
- export interface MutationQueueItem {
101
- id: string;
102
- method: string;
103
- url: string;
104
- body: unknown;
105
- bodyType?: "json" | "formdata" | "blob" | "buffer";
106
- headers: Record<string, string>;
107
- timestamp: number;
108
- retryCount: number;
109
- nextRetryAt?: number;
110
- tags: string[];
111
- }
112
-
113
- export interface MutationQueueResult {
114
- succeeded: number;
115
- failed: number;
116
- total?: number;
117
- }
118
-
119
- export {};
120
- `;
121
- writeFile(ctx, "swoff.d.ts", code);
9
+ writeFile(ctx, "swoff.d.ts", generateTypeDefinitionsCode());
122
10
  }
123
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAuFa,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,26 +1,15 @@
1
- /**
2
- * Swoff Service Worker Generator
3
- *
4
- * Generates a service worker based on swoff.config.json configuration.
5
- * Thin orchestrator - delegates to sw-sections for code generation.
6
- *
7
- * CLI Usage:
8
- * node sw-generator.js [--project-root <path>] [--package-dir <path>] [--config-path <path>]
9
- *
10
- * Module Usage:
11
- * import { generateSW } from './sw-generator.js';
12
- * await generateSW({ projectRoot: '/path/to/project', onStatus: (msg) => {...} });
13
- */
14
1
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
15
2
  import { join } from "path";
16
3
  import { fileURLToPath } from "url";
17
- import { loadConfig } from "../config/loader.js";
4
+ import { loadConfigAsync } from "../config/loader.js";
18
5
  import { assembleSW } from "./sw-sections/assemble-sw.js";
19
6
  function resolveVersion(config, pkgVersion) {
20
7
  const v = config.features.serviceWorker.version;
21
- if (v.source === "manual" && v.value)
22
- return v.value;
23
- return pkgVersion || "1.0.0";
8
+ if (v === "hash")
9
+ return "0.0.0";
10
+ if (v === "package")
11
+ return pkgVersion || "1.0.0";
12
+ return v;
24
13
  }
25
14
  export async function generateSW(options = {}) {
26
15
  const optProjectRoot = options.projectRoot || process.cwd();
@@ -36,12 +25,13 @@ export async function generateSW(options = {}) {
36
25
  status("Could not read package.json, using default version");
37
26
  }
38
27
  }
39
- const { config, configSource } = loadConfig(optProjectRoot, optConfigPath);
28
+ const { config, configSource } = await loadConfigAsync(optProjectRoot, optConfigPath);
40
29
  if (!config.enabled) {
41
30
  status("Swoff config generation disabled. Using custom code mode.");
42
31
  return { version: "", outputFile: "" };
43
32
  }
44
- const versionEnabled = config.features.serviceWorker.version.enabled;
33
+ const v = config.features.serviceWorker.version;
34
+ const versionEnabled = v !== "hash";
45
35
  const version = resolveVersion(config, pkg.version || "1.0.0");
46
36
  const sw = assembleSW(config, version, optProjectRoot);
47
37
  const outputDir = join(optProjectRoot, config.build.outputDir);
@@ -55,7 +45,7 @@ export async function generateSW(options = {}) {
55
45
  if (versionEnabled) {
56
46
  writeFileSync(join(outputDir, "version.json"), JSON.stringify({
57
47
  version,
58
- minSupportedVersion: config.features.serviceWorker.version.minSupportedVersion,
48
+ minSupportedVersion: config.features.serviceWorker.minSupportedVersion,
59
49
  generatedAt: new Date().toISOString(),
60
50
  configEnabled: config.enabled,
61
51
  configSource,
@@ -1 +1 @@
1
- {"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAQ1D,SAAS,cAAc,CAAC,MAAwF,EAAE,UAAkB;IAClI,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IACrD,OAAO,UAAU,IAAI,OAAO,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA4B,EAAE;IAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAE/B,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,oDAAoD,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAE3E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,2DAA2D,CAAC,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC;IACrE,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE/D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IAC3C,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC;IAExF,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,cAAc,EAAE,CAAC;YACnB,aAAa,CACX,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAC/B,IAAI,CAAC,SAAS,CACZ;gBACE,OAAO;gBACP,mBAAmB,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,mBAAmB;gBAC9E,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,YAAY;aACb,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC;AAED,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,MAAM,UAAU,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK;YACpC,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE;gBACd,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;YAC9D,CAAC;YACH,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,MAAM,UAAU,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,eAAe,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"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"}