@swoff/cli 0.0.1 → 0.0.2

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.
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Swoff Service Worker Generator
3
+ *
4
+ * Generates a service worker based on swoff.config.json configuration.
5
+ * Can be run as CLI or imported as a module.
6
+ *
7
+ * CLI Usage:
8
+ * node sw-generator.js [--project-root <path>] [--package-dir <path>]
9
+ *
10
+ * Module Usage:
11
+ * import { generate } from './sw-generator.js';
12
+ * generate({ projectRoot: '/path/to/project' });
13
+ */
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
15
+ import { fileURLToPath } from "url";
16
+ import { join, dirname } from "path";
17
+ const args = process.argv.slice(2);
18
+ const projectRootArg = args.findIndex((arg) => arg === "--project-root");
19
+ const packageDirArg = args.findIndex((arg) => arg === "--package-dir");
20
+ const passedProjectRoot = projectRootArg !== -1 ? args[projectRootArg + 1] : null;
21
+ const passedPackageDir = packageDirArg !== -1 ? args[packageDirArg + 1] : null;
22
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
23
+ const packageDir = passedPackageDir || join(scriptDir, "..");
24
+ const projectRoot = passedProjectRoot || process.cwd();
25
+ const defaultConfig = {
26
+ enabled: true,
27
+ version: "from-package",
28
+ minSupportedVersion: "0.0.0",
29
+ serviceWorker: {
30
+ autoUpdate: false,
31
+ defaultStrategy: "cache-first",
32
+ strategies: {},
33
+ },
34
+ features: {
35
+ versionedSw: true,
36
+ offlineReads: true,
37
+ mutationQueue: false,
38
+ backgroundSync: false,
39
+ pwa: true,
40
+ auth: false,
41
+ crossTabSync: true,
42
+ tagInvalidation: true,
43
+ },
44
+ build: {
45
+ outputDir: "dist",
46
+ swFilename: "sw",
47
+ },
48
+ };
49
+ export async function generate(options = {}) {
50
+ const optProjectRoot = options.projectRoot || projectRoot;
51
+ const optPackageDir = options.packageDir || packageDir;
52
+ const pkgPath = join(optProjectRoot, "package.json");
53
+ let pkg = { version: "1.0.0" };
54
+ if (existsSync(pkgPath)) {
55
+ try {
56
+ pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
57
+ }
58
+ catch {
59
+ console.warn("Could not read package.json, using default version");
60
+ }
61
+ }
62
+ const templatePath = join(optPackageDir, "src/lib/templates/sw-template.js");
63
+ let template;
64
+ if (existsSync(templatePath)) {
65
+ template = readFileSync(templatePath, "utf8");
66
+ }
67
+ else {
68
+ template = getDefaultTemplate();
69
+ }
70
+ let userConfig = {};
71
+ let configSource = "defaults";
72
+ const configPath = join(optProjectRoot, "swoff.config.json");
73
+ if (existsSync(configPath)) {
74
+ try {
75
+ userConfig = JSON.parse(readFileSync(configPath, "utf8"));
76
+ configSource = "JSON";
77
+ }
78
+ catch {
79
+ console.warn("Could not parse swoff.config.json, using defaults");
80
+ }
81
+ }
82
+ else {
83
+ const jsConfigPath = join(optProjectRoot, "swoff.config.js");
84
+ if (existsSync(jsConfigPath)) {
85
+ try {
86
+ const mod = await import(jsConfigPath);
87
+ userConfig = (mod.default || mod);
88
+ configSource = "JavaScript";
89
+ }
90
+ catch {
91
+ console.warn("Could not load swoff.config.js, using defaults");
92
+ }
93
+ }
94
+ }
95
+ const config = { ...defaultConfig, ...userConfig };
96
+ if (!config.enabled) {
97
+ console.log("Swoff config generation disabled. Using custom code mode.");
98
+ return;
99
+ }
100
+ const version = config.version === "from-package" ? pkg.version || "1.0.0" : config.version;
101
+ const sw = generateServiceWorker(config, version);
102
+ const outputDir = join(optProjectRoot, config.build.outputDir);
103
+ const swFilename = config.build.swFilename;
104
+ if (!existsSync(outputDir)) {
105
+ mkdirSync(outputDir, { recursive: true });
106
+ }
107
+ try {
108
+ writeFileSync(join(outputDir, `${swFilename}-v${version}.js`), sw);
109
+ writeFileSync(join(outputDir, "version.json"), JSON.stringify({
110
+ version: version,
111
+ minSupportedVersion: config.minSupportedVersion,
112
+ generatedAt: new Date().toISOString(),
113
+ configEnabled: config.enabled,
114
+ configSource: configSource,
115
+ }, null, 2));
116
+ console.log(`✅ Swoff service worker generated successfully!`);
117
+ console.log(`📁 Output: ${outputDir}/${swFilename}-v${version}.js`);
118
+ console.log(`📄 Version info: ${outputDir}/version.json`);
119
+ console.log(`â„šī¸ Configuration source: ${configSource}`);
120
+ }
121
+ catch (err) {
122
+ console.error(`Error writing files: ${err instanceof Error ? err.message : String(err)}`);
123
+ console.log("Make sure the output directory exists:");
124
+ console.log(` mkdir -p ${outputDir}`);
125
+ }
126
+ }
127
+ function generateServiceWorker(config, version) {
128
+ const { serviceWorker, features } = config;
129
+ const baseAssets = ["/", "/index.html"];
130
+ const pwaAssets = features.pwa ? ["/manifest.json"] : [];
131
+ const assetsToCache = [...baseAssets, ...pwaAssets];
132
+ let sw = getDefaultTemplate();
133
+ sw = sw.replace("// [[CACHE_NAME]]", `CACHE_NAME = 'sw-v${version}'`);
134
+ sw = sw.replace("// [[ASSETS_LIST]]", `ASSETS_TO_CACHE = ${JSON.stringify(assetsToCache, null, 2)}`);
135
+ sw = sw.replace("// [[FETCH_HANDLER]]", generateFetchHandler(serviceWorker, features));
136
+ sw = sw.replace("// [[ACTIVATE_HANDLER]]", generateActivateHandler(features.versionedSw));
137
+ sw = sw.replace("// [[INSTALL_HANDLER]]", generateInstallHandler(features));
138
+ sw = `// [[CONFIG_HEADER]]\n\n${sw}`;
139
+ sw = sw.replace("// [[CONFIG_HEADER]]", generateConfigHeader(config));
140
+ return sw;
141
+ }
142
+ function generateFetchHandler(swConfig, features) {
143
+ const { defaultStrategy, strategies } = swConfig;
144
+ return `
145
+ self.addEventListener("fetch", (event) => {
146
+ if (event.request.method !== "GET") return;
147
+
148
+ const strategy = determineCacheStrategy(event.request.url, ${JSON.stringify(strategies || {})}, "${defaultStrategy}");
149
+
150
+ event.respondWith(handleRequestWithStrategy(event.request, strategy));
151
+ });
152
+
153
+ function determineCacheStrategy(url, customStrategies, defaultStrategy) {
154
+ for (const [pattern, strategy] of Object.entries(customStrategies)) {
155
+ if (url.includes(pattern)) return strategy;
156
+ }
157
+ return defaultStrategy;
158
+ }
159
+
160
+ async function handleRequestWithStrategy(request, strategy) {
161
+ const cache = await caches.open(CACHE_NAME);
162
+
163
+ switch (strategy) {
164
+ case "cache-first": return cacheFirstStrategy(request, cache);
165
+ case "network-first": return networkFirstStrategy(request, cache);
166
+ case "stale-while-revalidate": return staleWhileRevalidateStrategy(request, cache);
167
+ case "cache-only": return cacheOnlyStrategy(request, cache);
168
+ case "network-only": return networkOnlyStrategy(request, cache);
169
+ default: return cacheFirstStrategy(request, cache);
170
+ }
171
+ }
172
+
173
+ async function cacheFirstStrategy(request, cache) {
174
+ const cached = await cache.match(request);
175
+ if (cached) return cached;
176
+ try {
177
+ const response = await fetch(request);
178
+ if (response.ok) await cache.put(request, response.clone());
179
+ return response;
180
+ } catch {
181
+ return new Response("Offline", { status: 503 });
182
+ }
183
+ }
184
+
185
+ async function networkFirstStrategy(request, cache) {
186
+ try {
187
+ const response = await fetch(request);
188
+ if (response.ok) await cache.put(request, response.clone());
189
+ return response;
190
+ } catch {
191
+ const cached = await cache.match(request);
192
+ return cached || new Response("Offline", { status: 503 });
193
+ }
194
+ }
195
+
196
+ async function staleWhileRevalidateStrategy(request, cache) {
197
+ const cached = await cache.match(request);
198
+ fetch(request).then((response) => {
199
+ if (response.ok) cache.put(request, response.clone());
200
+ });
201
+ return cached || fetch(request);
202
+ }
203
+
204
+ async function cacheOnlyStrategy(request, cache) {
205
+ return (await cache.match(request)) || new Response("Not in cache", { status: 404 });
206
+ }
207
+
208
+ async function networkOnlyStrategy(request, _cache) {
209
+ try {
210
+ return await fetch(request);
211
+ } catch {
212
+ return new Response("Network error", { status: 503 });
213
+ }
214
+ }`;
215
+ }
216
+ function generateActivateHandler(versionedSw) {
217
+ if (versionedSw) {
218
+ return `
219
+ self.addEventListener("activate", (event) => {
220
+ event.waitUntil(
221
+ caches.keys().then((keys) =>
222
+ Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k)))
223
+ )
224
+ );
225
+ });`;
226
+ }
227
+ return `
228
+ self.addEventListener("activate", (event) => {
229
+ event.waitUntil(Promise.resolve());
230
+ });`;
231
+ }
232
+ function generateInstallHandler(features) {
233
+ let code = `
234
+ self.addEventListener("install", (event) => {
235
+ event.waitUntil(
236
+ caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS_TO_CACHE))
237
+ );
238
+ }`;
239
+ if (features.offlineReads || features.mutationQueue) {
240
+ code += `\n event.waitUntil(initializeOfflineSupport());`;
241
+ }
242
+ return code;
243
+ }
244
+ function generateConfigHeader(config) {
245
+ return `/**
246
+ * Swoff Service Worker - Auto-Generated
247
+ * Generated from swoff.config.json
248
+ * DO NOT EDIT MANUALLY
249
+ * Version: ${config.version}
250
+ * Features: versionedSw=${config.features.versionedSw}, offlineReads=${config.features.offlineReads}, mutationQueue=${config.features.mutationQueue}
251
+ * Default Strategy: ${config.serviceWorker.defaultStrategy}
252
+ * See: https://swoff.netlify.app/docs
253
+ */`;
254
+ }
255
+ function getDefaultTemplate() {
256
+ return `let CACHE_NAME = "";
257
+ let ASSETS_TO_CACHE = [];
258
+
259
+ // [[INSTALL_HANDLER]]
260
+ // [[ACTIVATE_HANDLER]]
261
+ // [[FETCH_HANDLER]]
262
+
263
+ const SWOFF = {
264
+ cache: {
265
+ async get(key) {
266
+ const cache = await caches.open(CACHE_NAME);
267
+ return cache.match(key);
268
+ },
269
+ async put(request, response) {
270
+ const cache = await caches.open(CACHE_NAME);
271
+ await cache.put(request, response);
272
+ }
273
+ }
274
+ };
275
+
276
+ if (typeof self !== 'undefined') {
277
+ self.SWOFF = SWOFF;
278
+ }`;
279
+ }
280
+ if (import.meta.url === `file://${process.argv[1]}`) {
281
+ generate().catch((err) => {
282
+ console.error(err);
283
+ process.exit(1);
284
+ });
285
+ }
286
+ export default { generate };
287
+ //# sourceMappingURL=sw-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"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"}