@swoff/cli 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +49 -0
  2. package/dist/__tests__/assemble-sw.test.js +145 -0
  3. package/dist/__tests__/assemble-sw.test.js.map +1 -0
  4. package/dist/__tests__/cli-integration.test.js +128 -0
  5. package/dist/__tests__/cli-integration.test.js.map +1 -0
  6. package/dist/__tests__/config-types.test.js +82 -0
  7. package/dist/__tests__/config-types.test.js.map +1 -0
  8. package/dist/__tests__/detect-language.test.js +51 -0
  9. package/dist/__tests__/detect-language.test.js.map +1 -0
  10. package/dist/__tests__/file-generators.test.js +271 -0
  11. package/dist/__tests__/file-generators.test.js.map +1 -0
  12. package/dist/__tests__/invalidation-tags.test.js +99 -0
  13. package/dist/__tests__/invalidation-tags.test.js.map +1 -0
  14. package/dist/__tests__/loader.test.js +77 -0
  15. package/dist/__tests__/loader.test.js.map +1 -0
  16. package/dist/__tests__/validator.test.js +232 -0
  17. package/dist/__tests__/validator.test.js.map +1 -0
  18. package/dist/index.js +22 -585
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/cli/colors.js +14 -0
  21. package/dist/lib/cli/colors.js.map +1 -0
  22. package/dist/lib/cli/help.js +63 -0
  23. package/dist/lib/cli/help.js.map +1 -0
  24. package/dist/lib/cli/logger.js +13 -0
  25. package/dist/lib/cli/logger.js.map +1 -0
  26. package/dist/lib/commands/add.js +58 -0
  27. package/dist/lib/commands/add.js.map +1 -0
  28. package/dist/lib/commands/clean.js +39 -0
  29. package/dist/lib/commands/clean.js.map +1 -0
  30. package/dist/lib/commands/generate.js +84 -0
  31. package/dist/lib/commands/generate.js.map +1 -0
  32. package/dist/lib/commands/info.js +44 -0
  33. package/dist/lib/commands/info.js.map +1 -0
  34. package/dist/lib/commands/init.js +46 -0
  35. package/dist/lib/commands/init.js.map +1 -0
  36. package/dist/lib/commands/validate.js +30 -0
  37. package/dist/lib/commands/validate.js.map +1 -0
  38. package/dist/lib/config/loader.js +80 -0
  39. package/dist/lib/config/loader.js.map +1 -0
  40. package/dist/lib/config/validator.js +102 -0
  41. package/dist/lib/config/validator.js.map +1 -0
  42. package/dist/lib/generators/file-generators/background-sync.js +59 -0
  43. package/dist/lib/generators/file-generators/background-sync.js.map +1 -0
  44. package/dist/lib/generators/file-generators/cache.js +55 -0
  45. package/dist/lib/generators/file-generators/cache.js.map +1 -0
  46. package/dist/lib/generators/file-generators/context.js +16 -0
  47. package/dist/lib/generators/file-generators/context.js.map +1 -0
  48. package/dist/lib/generators/file-generators/fetch-wrapper.js +80 -0
  49. package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -0
  50. package/dist/lib/generators/file-generators/indexeddb.js +73 -0
  51. package/dist/lib/generators/file-generators/indexeddb.js.map +1 -0
  52. package/dist/lib/generators/file-generators/invalidation-tags.js +91 -0
  53. package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -0
  54. package/dist/lib/generators/file-generators/manifest.js +26 -0
  55. package/dist/lib/generators/file-generators/manifest.js.map +1 -0
  56. package/dist/lib/generators/file-generators/mutation-queue.js +226 -0
  57. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -0
  58. package/dist/lib/generators/file-generators/pwa-install.js +102 -0
  59. package/dist/lib/generators/file-generators/pwa-install.js.map +1 -0
  60. package/dist/lib/generators/file-generators/reconcile.js +54 -0
  61. package/dist/lib/generators/file-generators/reconcile.js.map +1 -0
  62. package/dist/lib/generators/file-generators/store.js +75 -0
  63. package/dist/lib/generators/file-generators/store.js.map +1 -0
  64. package/dist/lib/generators/file-generators/sw-generator-build.js +70 -0
  65. package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -0
  66. package/dist/lib/generators/file-generators/sw-injector.js +195 -0
  67. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -0
  68. package/dist/lib/generators/file-generators/sw-template.js +143 -0
  69. package/dist/lib/generators/file-generators/sw-template.js.map +1 -0
  70. package/dist/lib/generators/file-generators/type-definitions.js +69 -0
  71. package/dist/lib/generators/file-generators/type-definitions.js.map +1 -0
  72. package/dist/lib/generators/sw-generator.js +33 -569
  73. package/dist/lib/generators/sw-generator.js.map +1 -1
  74. package/dist/lib/generators/sw-sections/activate-handler.js +16 -0
  75. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -0
  76. package/dist/lib/generators/sw-sections/assemble-sw.js +38 -0
  77. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -0
  78. package/dist/lib/generators/sw-sections/background-sync-handler.js +106 -0
  79. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -0
  80. package/dist/lib/generators/sw-sections/config-header.js +15 -0
  81. package/dist/lib/generators/sw-sections/config-header.js.map +1 -0
  82. package/dist/lib/generators/sw-sections/default-template.js +51 -0
  83. package/dist/lib/generators/sw-sections/default-template.js.map +1 -0
  84. package/dist/lib/generators/sw-sections/fetch-handler.js +210 -0
  85. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -0
  86. package/dist/lib/generators/sw-sections/install-handler.js +35 -0
  87. package/dist/lib/generators/sw-sections/install-handler.js.map +1 -0
  88. package/dist/lib/generators/sw-sections/message-handler.js +20 -0
  89. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -0
  90. package/dist/lib/generators/sw-sections/tag-management.js +69 -0
  91. package/dist/lib/generators/sw-sections/tag-management.js.map +1 -0
  92. package/dist/lib/generators/swoff-files-generator.js +78 -1368
  93. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  94. package/dist/lib/shared/config-types.js +87 -0
  95. package/dist/lib/shared/config-types.js.map +1 -0
  96. package/dist/lib/utils/detect-language.js +33 -0
  97. package/dist/lib/utils/detect-language.js.map +1 -0
  98. package/package.json +5 -2
@@ -2,59 +2,30 @@
2
2
  * Swoff Service Worker Generator
3
3
  *
4
4
  * Generates a service worker based on swoff.config.json configuration.
5
- * Can be run as CLI or imported as a module.
5
+ * Thin orchestrator - delegates to sw-sections for code generation.
6
6
  *
7
7
  * CLI Usage:
8
8
  * node sw-generator.js [--project-root <path>] [--package-dir <path>] [--config-path <path>]
9
9
  *
10
10
  * Module Usage:
11
- * import { generate } from './sw-generator.js';
12
- * generate({ projectRoot: '/path/to/project' });
11
+ * import { generateSW } from './sw-generator.js';
12
+ * await generateSW({ projectRoot: '/path/to/project', onStatus: (msg) => {...} });
13
13
  */
14
14
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
15
+ import { join } from "path";
15
16
  import { fileURLToPath } from "url";
16
- import { join, dirname } from "path";
17
+ import { loadConfig } from "../config/loader.js";
18
+ import { assembleSW } from "./sw-sections/assemble-sw.js";
17
19
  const args = process.argv.slice(2);
18
20
  const projectRootArg = args.findIndex((arg) => arg === "--project-root");
19
- const packageDirArg = args.findIndex((arg) => arg === "--package-dir");
20
21
  const configPathArg = args.findIndex((arg) => arg === "--config-path");
21
22
  const passedProjectRoot = projectRootArg !== -1 ? args[projectRootArg + 1] : null;
22
- const passedPackageDir = packageDirArg !== -1 ? args[packageDirArg + 1] : null;
23
23
  const passedConfigPath = configPathArg !== -1 ? args[configPathArg + 1] : null;
24
- const scriptDir = dirname(fileURLToPath(import.meta.url));
25
- const packageDir = passedPackageDir || join(scriptDir, "..");
26
24
  const projectRoot = passedProjectRoot || process.cwd();
27
- const defaultConfig = {
28
- enabled: true,
29
- version: "from-package",
30
- minSupportedVersion: "0.0.0",
31
- serviceWorker: {
32
- autoRegister: true,
33
- autoUpdate: false,
34
- defaultStrategy: "cache-first",
35
- strategies: {},
36
- },
37
- features: {
38
- versionedSw: true,
39
- offlineReads: true,
40
- mutationQueue: false,
41
- backgroundSync: false,
42
- pwa: true,
43
- auth: false,
44
- crossTabSync: true,
45
- tagInvalidation: true,
46
- clientRegistration: true,
47
- indexeddb: false,
48
- },
49
- build: {
50
- outputDir: "dist",
51
- swFilename: "sw",
52
- },
53
- };
54
- export async function generate(options = {}) {
25
+ export async function generateSW(options = {}) {
55
26
  const optProjectRoot = options.projectRoot || projectRoot;
56
- const optPackageDir = options.packageDir || packageDir;
57
- const optConfigPath = options.configPath || passedConfigPath;
27
+ const optConfigPath = options.configPath || passedConfigPath || undefined;
28
+ const status = options.onStatus || console.log;
58
29
  const pkgPath = join(optProjectRoot, "package.json");
59
30
  let pkg = { version: "1.0.0" };
60
31
  if (existsSync(pkgPath)) {
@@ -62,560 +33,53 @@ export async function generate(options = {}) {
62
33
  pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
63
34
  }
64
35
  catch {
65
- console.warn("Could not read package.json, using default version");
36
+ status("Could not read package.json, using default version");
66
37
  }
67
38
  }
68
- const templatePath = join(optPackageDir, "src/lib/templates/sw-template.js");
69
- let template;
70
- if (existsSync(templatePath)) {
71
- template = readFileSync(templatePath, "utf8");
72
- }
73
- else {
74
- template = getDefaultTemplate();
75
- }
76
- let userConfig = {};
77
- let configSource = "defaults";
78
- const resolvedConfigPath = optConfigPath || join(optProjectRoot, "swoff.config.json");
79
- if (existsSync(resolvedConfigPath)) {
80
- try {
81
- userConfig = JSON.parse(readFileSync(resolvedConfigPath, "utf8"));
82
- configSource = "JSON";
83
- }
84
- catch {
85
- console.warn("Could not parse swoff.config.json, using defaults");
86
- }
87
- }
88
- else {
89
- const jsConfigPath = join(optProjectRoot, "swoff.config.js");
90
- if (existsSync(jsConfigPath)) {
91
- try {
92
- const mod = await import(jsConfigPath);
93
- userConfig = (mod.default || mod);
94
- configSource = "JavaScript";
95
- }
96
- catch {
97
- console.warn("Could not load swoff.config.js, using defaults");
98
- }
99
- }
100
- }
101
- const config = { ...defaultConfig, ...userConfig };
39
+ const { config, configSource } = loadConfig(optProjectRoot, optConfigPath);
102
40
  if (!config.enabled) {
103
- console.log("Swoff config generation disabled. Using custom code mode.");
104
- return;
41
+ status("Swoff config generation disabled. Using custom code mode.");
42
+ return { version: "", outputFile: "" };
105
43
  }
106
44
  const version = config.version === "from-package" ? pkg.version || "1.0.0" : config.version;
107
- const sw = generateServiceWorker(config, version);
45
+ const sw = assembleSW(config, version);
108
46
  const outputDir = join(optProjectRoot, config.build.outputDir);
109
47
  const swFilename = config.build.swFilename;
110
48
  if (!existsSync(outputDir)) {
111
49
  mkdirSync(outputDir, { recursive: true });
112
50
  }
51
+ const outputFile = `${swFilename}-v${version}.js`;
113
52
  try {
114
- writeFileSync(join(outputDir, `${swFilename}-v${version}.js`), sw);
53
+ writeFileSync(join(outputDir, outputFile), sw);
115
54
  writeFileSync(join(outputDir, "version.json"), JSON.stringify({
116
- version: version,
55
+ version,
117
56
  minSupportedVersion: config.minSupportedVersion,
118
57
  generatedAt: new Date().toISOString(),
119
58
  configEnabled: config.enabled,
120
- configSource: configSource,
59
+ configSource,
121
60
  }, null, 2));
122
- console.log(`Service worker generated successfully.`);
123
- console.log(`Output: ${outputDir}/${swFilename}-v${version}.js`);
124
- console.log(`Version info: ${outputDir}/version.json`);
125
- console.log(`Configuration source: ${configSource}`);
61
+ status(`✓ ${outputDir}/${outputFile}`);
126
62
  }
127
63
  catch (err) {
128
- console.error(`Error writing files: ${err instanceof Error ? err.message : String(err)}`);
129
- console.log("Make sure the output directory exists:");
130
- console.log(` mkdir -p ${outputDir}`);
131
- }
132
- }
133
- function generateServiceWorker(config, version) {
134
- const { serviceWorker, features } = config;
135
- const baseAssets = ["/", "/index.html"];
136
- const pwaAssets = features.pwa ? ["/manifest.json"] : [];
137
- const assetsToCache = [...baseAssets, ...pwaAssets];
138
- let sw = getDefaultTemplate();
139
- sw = sw.replace("// [[CACHE_NAME]]", `CACHE_NAME = 'sw-v${version}'`);
140
- sw = sw.replace("// [[ASSETS_LIST]]", `ASSETS_TO_CACHE = ${JSON.stringify(assetsToCache.map((url) => ({ url, options: {} })), null, 2)}`);
141
- sw = sw.replace("// [[AUTO_SKIP_WAITING]]", `const AUTO_SKIP_WAITING = ${config.serviceWorker.autoUpdate};`);
142
- sw = sw.replace("// [[FETCH_HANDLER]]", generateFetchHandler(serviceWorker, features));
143
- sw = sw.replace("// [[ACTIVATE_HANDLER]]", generateActivateHandler(features.versionedSw));
144
- sw = sw.replace("// [[INSTALL_HANDLER]]", generateInstallHandler(features));
145
- sw = sw.replace("// [[MESSAGE_HANDLER]]", generateMessageHandler(features));
146
- if (features.tagInvalidation) {
147
- sw = sw.replace("// [[TAG_MANAGEMENT]]", generateTagManagement());
148
- }
149
- else {
150
- sw = sw.replace("// [[TAG_MANAGEMENT]]", "");
151
- }
152
- sw = `// [[CONFIG_HEADER]]\n\n${sw}`;
153
- sw = sw.replace("// [[CONFIG_HEADER]]", generateConfigHeader(config));
154
- if (features.backgroundSync) {
155
- sw += `\n\n${generateBackgroundSyncHandler()}`;
156
- }
157
- return sw;
158
- }
159
- function generateFetchHandler(swConfig, features) {
160
- const { defaultStrategy, strategies } = swConfig;
161
- const tagInvalidationCode = features.tagInvalidation ? `
162
- const tagsHeader = event.request.headers.get("X-SW-Cache-Tags");
163
- if (tagsHeader) {
164
- const url = new URL(event.request.url).href;
165
- const tags = tagsHeader.split(",").map((t) => t.trim());
166
- await cacheTagUrl(url, tags);
167
- }` : "";
168
- const staleTagCode = features.tagInvalidation ? `
169
- const tagsHeader = request.headers.get("X-SW-Cache-Tags");
170
- if (tagsHeader) {
171
- const url = new URL(request.url).href;
172
- const tags = tagsHeader.split(",").map((t) => t.trim());
173
- await cacheTagUrl(url, tags);
174
- }` : "";
175
- return `
176
- function isReadRequest(request) {
177
- const strategy = request.headers.get("X-SW-Cache-Strategy");
178
- if (strategy === "read") return true;
179
- if (strategy === "mutation") return false;
180
- return request.method === "GET" || request.method === "HEAD";
181
- }
182
-
183
- function determineCacheStrategy(request, customStrategies, defaultStrategy) {
184
- const url = request.url;
185
- for (const [pattern, strategy] of Object.entries(customStrategies)) {
186
- if (url.includes(pattern.replace("*", ""))) return strategy;
187
- }
188
- return defaultStrategy;
189
- }
190
-
191
- self.addEventListener("fetch", (event) => {
192
- if (!isReadRequest(event.request)) return;
193
-
194
- const strategy = determineCacheStrategy(event.request, ${JSON.stringify(strategies)}, "${defaultStrategy}");
195
-
196
- if (strategy === "stale-while-revalidate" || event.request.headers.get("X-SW-Stale") === "true") {
197
- event.respondWith(staleWhileRevalidate(event, event.request));
198
- return;
199
- }
200
-
201
- if (strategy === "network-first") {
202
- event.respondWith(networkFirst(event, event.request));
203
- return;
204
- }
205
-
206
- if (strategy === "cache-only") {
207
- event.respondWith(cacheOnly(event, event.request));
208
- return;
209
- }
210
-
211
- if (strategy === "network-only") {
212
- event.respondWith(networkOnly(event, event.request));
213
- return;
214
- }
215
-
216
- // cache-first (default)
217
- event.respondWith(cacheFirst(event, event.request));
218
- });
219
-
220
- async function cacheFirst(event, request) {
221
- const cache = await caches.open(CACHE_NAME);
222
- const runtimeCache = await caches.open(CACHE_NAME_RUNTIME);
223
- const url = new URL(request.url);
224
-
225
- const byPath = await cache.match(url.pathname);
226
- if (byPath) return byPath;
227
-
228
- const byRequest = await runtimeCache.match(request);
229
- if (byRequest) return byRequest;
230
-
231
- if (request.mode === "navigate") {
232
- const spa = await cache.match("/index.html");
233
- if (spa) return spa;
234
- }
235
-
236
- try {
237
- const response = await fetch(request);
238
- if (response.ok) {
239
- const cloned = response.clone();
240
- event.waitUntil(
241
- (async () => {
242
- await runtimeCache.put(request, cloned);${tagInvalidationCode}
243
- })(),
244
- );
245
- }
246
- return response;
247
- } catch {
248
- return new Response("Offline: content not available", { status: 503 });
249
- }
250
- }
251
-
252
- async function networkFirst(event, request) {
253
- const runtimeCache = await caches.open(CACHE_NAME_RUNTIME);
254
-
255
- try {
256
- const response = await fetch(request);
257
- if (response.ok) {
258
- const cloned = response.clone();
259
- event.waitUntil(
260
- (async () => {
261
- await runtimeCache.put(request, cloned);${tagInvalidationCode}
262
- })(),
263
- );
264
- }
265
- return response;
266
- } catch {
267
- const cached = await runtimeCache.match(request);
268
- if (cached) return cached;
269
-
270
- if (request.mode === "navigate") {
271
- const cache = await caches.open(CACHE_NAME);
272
- const spa = await cache.match("/index.html");
273
- if (spa) return spa;
274
- }
275
-
276
- return new Response("Offline: content not available", { status: 503 });
277
- }
278
- }
279
-
280
- async function staleWhileRevalidate(event, request) {
281
- const runtimeCache = await caches.open(CACHE_NAME_RUNTIME);
282
- const cached = await runtimeCache.match(request);
283
-
284
- if (cached) {
285
- event.waitUntil(refreshCache(runtimeCache, request));
286
- return cached;
287
- }
288
-
289
- try {
290
- const response = await fetch(request);
291
- if (response.ok) {
292
- await runtimeCache.put(request, response.clone());${staleTagCode}
293
- }
294
- return response;
295
- } catch {
296
- return new Response("Offline: content not available", { status: 503 });
297
- }
298
- }
299
-
300
- async function refreshCache(cache, request) {
301
- try {
302
- const response = await fetch(request);
303
- if (response.ok) {
304
- await cache.put(request, response.clone());
64
+ status(`Error writing files: ${err instanceof Error ? err.message : String(err)}`);
305
65
  }
306
- } catch {
307
- // Background refresh failed - stale cache remains usable
308
- }
66
+ return { version, outputFile };
309
67
  }
310
-
311
- async function cacheOnly(event, request) {
312
- const cache = await caches.open(CACHE_NAME);
313
- const runtimeCache = await caches.open(CACHE_NAME_RUNTIME);
314
-
315
- const byPath = await cache.match(new URL(request.url).pathname);
316
- if (byPath) return byPath;
317
-
318
- const byRequest = await runtimeCache.match(request);
319
- if (byRequest) return byRequest;
320
-
321
- return new Response("Not in cache", { status: 404 });
322
- }
323
-
324
- async function networkOnly(event, request) {
325
- try {
326
- return await fetch(request);
327
- } catch {
328
- return new Response("Network error", { status: 503 });
329
- }
330
- }`;
331
- }
332
- function generateActivateHandler(versionedSw) {
333
- return `
334
- self.addEventListener("activate", (event) => {
335
- event.waitUntil(
336
- caches.keys().then((keys) =>
337
- Promise.all(
338
- keys.filter((key) => key !== CACHE_NAME && key !== CACHE_NAME_RUNTIME).map((key) => caches.delete(key))
339
- )
340
- )
341
- );
342
- });`;
343
- }
344
- function generateInstallHandler(features) {
345
- return `
346
- self.addEventListener("install", (event) => {
347
- event.waitUntil(
68
+ if (fileURLToPath(import.meta.url) === fileURLToPath(new URL(process.argv[1], "file:"))) {
348
69
  (async () => {
349
- const cache = await caches.open(CACHE_NAME);
350
- let downloaded = 0;
351
- for (const asset of ASSETS_TO_CACHE) {
352
- try {
353
- const request = new Request(asset.url, asset.options);
354
- await cache.add(request);
355
- downloaded++;
356
- const percent = Math.round((downloaded / ASSETS_TO_CACHE.length) * 100);
357
- const clients = await self.clients.matchAll({ includeUncontrolled: true });
358
- clients.forEach((client) => {
359
- client.postMessage({
360
- type: "SW_PROGRESS",
361
- percent,
362
- downloaded,
363
- total: ASSETS_TO_CACHE.length,
364
- });
365
- });
366
- } catch (err) {
367
- console.error(\`Failed to cache \${asset.url}:\`, err);
368
- }
369
- }
370
- if (AUTO_SKIP_WAITING) self.skipWaiting();
371
- })(),
372
- );
373
- });`;
374
- }
375
- function generateMessageHandler(features) {
376
- let code = `
377
- self.addEventListener("message", (event) => {
378
- if (event.data.type === "SKIP_WAITING") {
379
- self.skipWaiting();
380
- }`;
381
- if (features.tagInvalidation) {
382
- code += `
383
- if (event.data.type === "INVALIDATE_TAG" && event.data.tag) {
384
- event.waitUntil(invalidateByTag(event.data.tag));
385
- }`;
386
- }
387
- code += `
388
- });`;
389
- return code;
390
- }
391
- function generateTagManagement() {
392
- return `
393
- const TAG_DB_NAME = "swoff-cache-tags";
394
- const TAG_STORE_NAME = "tags";
395
-
396
- function openTagDB() {
397
- return new Promise((resolve, reject) => {
398
- const request = indexedDB.open(TAG_DB_NAME, 1);
399
- request.onupgradeneeded = (e) => {
400
- const db = e.target.result;
401
- if (!db.objectStoreNames.contains(TAG_STORE_NAME)) {
402
- const store = db.createObjectStore(TAG_STORE_NAME, { keyPath: "url" });
403
- store.createIndex("by-tag", "tags", { multiEntry: true });
404
- }
405
- };
406
- request.onsuccess = (e) => resolve(e.target.result);
407
- request.onerror = (e) => reject(e.target.error);
408
- });
409
- }
410
-
411
- async function cacheTagUrl(url, tags) {
412
- const db = await openTagDB();
413
- const tx = db.transaction(TAG_STORE_NAME, "readwrite");
414
- const store = tx.objectStore(TAG_STORE_NAME);
415
- store.put({ url, tags });
416
- await new Promise((resolve, reject) => {
417
- tx.oncomplete = () => resolve();
418
- tx.onerror = () => reject(tx.error);
419
- });
420
- }
421
-
422
- async function invalidateByTag(tag) {
423
- const db = await openTagDB();
424
- const tx = db.transaction(TAG_STORE_NAME, "readonly");
425
- const store = tx.objectStore(TAG_STORE_NAME);
426
- const index = store.index("by-tag");
427
- const entries = await new Promise((resolve, reject) => {
428
- const request = index.getAll(tag);
429
- request.onsuccess = () => resolve(request.result);
430
- request.onerror = () => reject(request.error);
431
- });
432
- await db.close();
433
-
434
- const runtimeCache = await caches.open(CACHE_NAME_RUNTIME);
435
- for (const entry of entries) {
436
- await runtimeCache.delete(entry.url);
437
- }
438
-
439
- const writeDb = await openTagDB();
440
- const writeTx = writeDb.transaction(TAG_STORE_NAME, "readwrite");
441
- const writeStore = writeTx.objectStore(TAG_STORE_NAME);
442
- for (const entry of entries) {
443
- writeStore.delete(entry.url);
444
- }
445
- await new Promise((resolve, reject) => {
446
- writeTx.oncomplete = () => resolve();
447
- writeTx.onerror = () => reject(writeTx.error);
448
- });
449
-
450
- const clients = await self.clients.matchAll();
451
- clients.forEach((client) => {
452
- client.postMessage({ type: "TAG_INVALIDATED", tag });
453
- });
454
- }`;
455
- }
456
- function generateBackgroundSyncHandler() {
457
- return `
458
- self.addEventListener("sync", (event) => {
459
- if (event.tag === "sync-mutations") {
460
- event.waitUntil(processMutationQueueInSW());
461
- }
462
- });
463
-
464
- async function processMutationQueueInSW() {
465
- const SW_DB_NAME = "swoff-queue";
466
- const SW_STORE_NAME = "mutations";
467
- const SW_MAX_RETRIES = 5;
468
-
469
- let succeeded = 0;
470
- let failed = 0;
471
- const tagsToInvalidate = new Set();
472
-
473
- try {
474
- const db = await new Promise((resolve, reject) => {
475
- const request = indexedDB.open(SW_DB_NAME, 1);
476
- request.onupgradeneeded = (e) => {
477
- const db = e.target.result;
478
- if (!db.objectStoreNames.contains(SW_STORE_NAME)) {
479
- const store = db.createObjectStore(SW_STORE_NAME, { keyPath: "id" });
480
- store.createIndex("by-timestamp", "timestamp");
481
- }
482
- };
483
- request.onsuccess = (e) => resolve(e.target.result);
484
- request.onerror = (e) => reject(e.target.error);
485
- });
486
-
487
- const tx = db.transaction(SW_STORE_NAME, "readonly");
488
- const store = tx.objectStore(SW_STORE_NAME);
489
- const index = store.index("by-timestamp");
490
- const queue = await new Promise((resolve, reject) => {
491
- const request = index.getAll();
492
- request.onsuccess = () => resolve(request.result);
493
- request.onerror = () => reject(request.error);
494
- });
495
-
496
- for (const item of queue) {
497
- if (item.retryCount >= SW_MAX_RETRIES) {
498
- await removeFromSWQueue(db, item.id);
499
- failed++;
500
- continue;
501
- }
502
- try {
503
- const response = await fetch(item.url, {
504
- method: item.method,
505
- headers: { "Content-Type": "application/json", ...item.headers },
506
- body: JSON.stringify(item.body),
507
- });
508
- if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
509
-
510
- if (item.tags) {
511
- item.tags.forEach((tag) => tagsToInvalidate.add(tag));
512
- }
513
-
514
- await removeFromSWQueue(db, item.id);
515
- succeeded++;
516
- } catch {
517
- item.retryCount++;
518
- await updateInSWQueue(db, item);
519
- failed++;
520
- }
521
- }
522
- } catch (err) {
523
- console.error("Background sync failed:", err);
524
- }
525
-
526
- for (const tag of tagsToInvalidate) {
527
- await invalidateByTag(tag);
528
- }
529
-
530
- const clients = await self.clients.matchAll();
531
- for (const client of clients) {
532
- client.postMessage({
533
- type: "BACKGROUND_SYNC_COMPLETE",
534
- detail: { succeeded, failed, tags: [...tagsToInvalidate] },
535
- });
536
- }
537
- }
538
-
539
- async function removeFromSWQueue(db, id) {
540
- const tx = db.transaction(SW_STORE_NAME, "readwrite");
541
- tx.objectStore(SW_STORE_NAME).delete(id);
542
- await new Promise((resolve, reject) => {
543
- tx.oncomplete = () => resolve();
544
- tx.onerror = () => reject(tx.error);
545
- });
546
- }
547
-
548
- async function updateInSWQueue(db, item) {
549
- const tx = db.transaction(SW_STORE_NAME, "readwrite");
550
- tx.objectStore(SW_STORE_NAME).put(item);
551
- await new Promise((resolve, reject) => {
552
- tx.oncomplete = () => resolve();
553
- tx.onerror = () => reject(tx.error);
554
- });
555
- }`;
556
- }
557
- function generateConfigHeader(config) {
558
- return `/**
559
- * Swoff Service Worker - Auto-Generated
560
- * Generated from swoff.config.json
561
- * DO NOT EDIT MANUALLY
562
- * Version: ${config.version}
563
- * Features: versionedSw=${config.features.versionedSw}, offlineReads=${config.features.offlineReads}, mutationQueue=${config.features.mutationQueue}, backgroundSync=${config.features.backgroundSync}, tagInvalidation=${config.features.tagInvalidation}
564
- * Default Strategy: ${config.serviceWorker.defaultStrategy}
565
- * See: https://swoff.netlify.app/docs
566
- */`;
567
- }
568
- function getDefaultTemplate() {
569
- return `let CACHE_NAME = "";
570
- let ASSETS_TO_CACHE = [];
571
-
572
- // [[CACHE_NAME]]
573
- // [[ASSETS_LIST]]
574
- // [[AUTO_SKIP_WAITING]]
575
-
576
- const CACHE_NAME_RUNTIME = "swoff-runtime";
577
-
578
- // [[INSTALL_HANDLER]]
579
- // [[ACTIVATE_HANDLER]]
580
- // [[MESSAGE_HANDLER]]
581
- // [[FETCH_HANDLER]]
582
- // [[TAG_MANAGEMENT]]
583
-
584
- const SWOFF = {
585
- cache: {
586
- async get(key) {
587
- const cache = await caches.open(CACHE_NAME);
588
- return cache.match(key);
589
- },
590
- async put(request, response) {
591
- const cache = await caches.open(CACHE_NAME);
592
- await cache.put(request, response);
593
- },
594
- async delete(request) {
595
- const cache = await caches.open(CACHE_NAME);
596
- return cache.delete(request);
597
- }
598
- },
599
- network: {
600
- async fetch(request, options = {}) {
601
- try {
602
- return await fetch(request, options);
603
- } catch (error) {
604
- throw new Error(\`Network request failed: \${error.message}\`);
605
- }
606
- }
607
- }
608
- };
609
-
610
- if (typeof self !== 'undefined') {
611
- self.SWOFF = SWOFF;
612
- }`;
613
- }
614
- if (import.meta.url === `file://${process.argv[1]}`) {
615
- generate().catch((err) => {
70
+ const ttyStatus = process.stdout.isTTY
71
+ ? (msg) => {
72
+ const cols = process.stdout.columns || 80;
73
+ process.stdout.write(`\r${" ".repeat(cols - 1)}\r ${msg}`);
74
+ }
75
+ : (msg) => console.log(` ${msg}`);
76
+ console.log("Generating service worker...");
77
+ await generateSW({ onStatus: ttyStatus });
78
+ process.stdout.write("\n");
79
+ })().catch((err) => {
616
80
  console.error(err);
617
81
  process.exit(1);
618
82
  });
619
83
  }
620
- export default { generate };
84
+ export default { generateSW };
621
85
  //# sourceMappingURL=sw-generator.js.map
@@ -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":"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,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC;AACzE,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;AAEvE,MAAM,iBAAiB,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClF,MAAM,gBAAgB,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAE/E,MAAM,WAAW,GAAG,iBAAiB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA4B,EAAE;IAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,IAAI,gBAAgB,IAAI,SAAS,CAAC;IAC1E,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,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IAC5F,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IAE3C,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,GAAG,UAAU,KAAK,OAAO,KAAK,CAAC;IAElD,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,aAAa,CACX,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAC/B,IAAI,CAAC,SAAS,CACZ;YACE,OAAO;YACP,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,YAAY;SACb,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QAEF,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,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,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1C,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"}