@swoff/cli 0.3.4 → 0.3.6
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.
- package/README.md +327 -26
- package/dist/__tests__/assemble-sw.test.js +41 -12
- package/dist/__tests__/assemble-sw.test.js.map +1 -1
- package/dist/__tests__/cli-integration.test.js +16 -18
- package/dist/__tests__/cli-integration.test.js.map +1 -1
- package/dist/__tests__/config-types.test.js +17 -26
- package/dist/__tests__/config-types.test.js.map +1 -1
- package/dist/__tests__/file-generators.test.js +71 -150
- package/dist/__tests__/file-generators.test.js.map +1 -1
- package/dist/__tests__/loader.test.js +15 -16
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/validator.test.js +54 -65
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +6 -6
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/add.js +19 -6
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/clean.js +5 -0
- package/dist/lib/commands/clean.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +125 -0
- package/dist/lib/commands/generate-guide.js.map +1 -0
- package/dist/lib/commands/generate.js +11 -10
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/info.js +135 -30
- package/dist/lib/commands/info.js.map +1 -1
- package/dist/lib/commands/init.js +6 -12
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js +7 -3
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/validator.js +55 -65
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-fetch.js +29 -34
- package/dist/lib/generators/file-generators/auth-fetch.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-state.js +8 -5
- package/dist/lib/generators/file-generators/auth-state.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-store.js +71 -40
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-user.js +27 -31
- package/dist/lib/generators/file-generators/auth-user.js.map +1 -1
- package/dist/lib/generators/file-generators/background-sync.js +9 -5
- package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +7 -2
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +113 -0
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -0
- package/dist/lib/generators/file-generators/context.js +7 -6
- package/dist/lib/generators/file-generators/context.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +170 -40
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +225 -0
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -0
- package/dist/lib/generators/file-generators/guide-generator.js +333 -0
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/invalidation-tags.js +12 -10
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +34 -84
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-reconcile.js +57 -0
- package/dist/lib/generators/file-generators/mutation-reconcile.js.map +1 -0
- package/dist/lib/generators/file-generators/pwa-install.js +41 -9
- package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
- package/dist/lib/generators/file-generators/quick-readme.js +78 -0
- package/dist/lib/generators/file-generators/quick-readme.js.map +1 -0
- package/dist/lib/generators/file-generators/reconcile.js +7 -12
- package/dist/lib/generators/file-generators/reconcile.js.map +1 -1
- package/dist/lib/generators/file-generators/store.js +31 -21
- package/dist/lib/generators/file-generators/store.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-generator-build.js +38 -17
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +82 -111
- package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-template.js +1 -1
- package/dist/lib/generators/file-generators/type-definitions.js +33 -10
- package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
- package/dist/lib/generators/sw-generator.js +19 -10
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +34 -13
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/config-header.js +2 -2
- package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +25 -10
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/tag-management.js +25 -5
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +10 -7
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +37 -26
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/utils/build-script.js +35 -0
- package/dist/lib/utils/build-script.js.map +1 -0
- package/dist/lib/utils/detect-framework.js +33 -0
- package/dist/lib/utils/detect-framework.js.map +1 -0
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { log } from "../cli/logger.js";
|
|
6
6
|
import { loadConfig } from "../config/loader.js";
|
|
7
7
|
import { detectProjectLanguage } from "../utils/detect-language.js";
|
|
8
|
+
import { appendGeneratorToBuildScript } from "../utils/build-script.js";
|
|
8
9
|
import { generateSW } from "../generators/sw-generator.js";
|
|
9
10
|
import { generateFiles } from "../generators/swoff-files-generator.js";
|
|
10
11
|
import { join } from "path";
|
|
@@ -32,7 +33,9 @@ export async function generateCommand(projectRoot, options = {}) {
|
|
|
32
33
|
return;
|
|
33
34
|
}
|
|
34
35
|
log.info(`Config: ${configPath}`);
|
|
35
|
-
const
|
|
36
|
+
const frameworkName = config.framework ?? "vanilla";
|
|
37
|
+
log.info(`Framework: ${frameworkName}`);
|
|
38
|
+
const detectedLang = (language ?? detectProjectLanguage(projectRoot));
|
|
36
39
|
log.info(`Language: ${detectedLang}`);
|
|
37
40
|
if (!filesOnly) {
|
|
38
41
|
statusLine("→ Service worker...");
|
|
@@ -58,6 +61,7 @@ export async function generateCommand(projectRoot, options = {}) {
|
|
|
58
61
|
swoffDir,
|
|
59
62
|
ext,
|
|
60
63
|
generatedFiles,
|
|
64
|
+
frameworkName,
|
|
61
65
|
};
|
|
62
66
|
statusLine("→ Files...");
|
|
63
67
|
try {
|
|
@@ -71,14 +75,11 @@ export async function generateCommand(projectRoot, options = {}) {
|
|
|
71
75
|
}
|
|
72
76
|
}
|
|
73
77
|
log.success("Generation complete!");
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
log.
|
|
78
|
-
log.help("
|
|
79
|
-
log.help("
|
|
80
|
-
log.help(" const data = await fetchWithCache('/api/data').then(r => r.json());");
|
|
81
|
-
log.help('3. Add to your build script: "build": "your-build && node swoff/sw-generator.js"');
|
|
82
|
-
log.help("4. Read the docs: https://swoff.netlify.app/docs");
|
|
78
|
+
if (appendGeneratorToBuildScript(projectRoot)) {
|
|
79
|
+
log.info("Added SW generator to package.json build script");
|
|
80
|
+
}
|
|
81
|
+
log.normal("");
|
|
82
|
+
log.help("📖 Read swoff/GUIDE.md for the full integration guide");
|
|
83
|
+
log.help("📖 Read swoff/README.md for quick reference");
|
|
83
84
|
}
|
|
84
85
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/lib/commands/generate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,UAA2B,EAAE;IAE7B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEhE,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAErC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAEvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IAElC,MAAM,YAAY,GAAG,QAAQ,IAAI,qBAAqB,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/lib/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +1,153 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* info command
|
|
2
|
+
* info command — minimal summary or per-feature detail.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* swoff info List enabled features and generated files
|
|
6
|
+
* swoff info <feature> Detailed explanation of a specific feature
|
|
3
7
|
*/
|
|
4
8
|
import { readFileSync, existsSync, readdirSync } from "fs";
|
|
5
9
|
import { join } from "path";
|
|
6
10
|
import { log } from "../cli/logger.js";
|
|
7
11
|
import { loadConfigAsync } from "../config/loader.js";
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
const FEATURES = {
|
|
13
|
+
"mutation-queue": {
|
|
14
|
+
label: "Mutation Queue",
|
|
15
|
+
description: "Queues offline write operations in IndexedDB and replays them when the connection returns. Uses the Background Sync API or the online event listener.",
|
|
16
|
+
files: ["mutation-queue.ts"],
|
|
17
|
+
functions: [
|
|
18
|
+
"queueMutation(mutation) — store a write for later sync",
|
|
19
|
+
"processMutationQueue() — replay all queued writes",
|
|
20
|
+
"flushMutations() — same as processMutationQueue, call after re-login",
|
|
21
|
+
"getPendingCount() — number of mutations waiting to sync",
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
"background-sync": {
|
|
25
|
+
label: "Background Sync",
|
|
26
|
+
description: "Registers Background Sync API events so mutations are processed even after the tab is closed. Falls back to online event listener in unsupported browsers (Firefox, Safari).",
|
|
27
|
+
files: ["background-sync.ts"],
|
|
28
|
+
functions: [
|
|
29
|
+
"syncWhenPossible(mutation) — queue and register background sync",
|
|
30
|
+
"retrySync() — re-register sync if mutations are still pending",
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
auth: {
|
|
34
|
+
label: "Auth",
|
|
35
|
+
description: "Token-based authentication with memory-only tokens, IndexedDB user caching, and auth-aware fetch with automatic 401 handling.",
|
|
36
|
+
files: ["auth/store.ts", "auth/fetch.ts", "auth/user.ts", "auth/state.ts"],
|
|
37
|
+
functions: [
|
|
38
|
+
"setAuth(authData) / getAuth() / clearAuth() — manage auth state",
|
|
39
|
+
"isAuthValid(auth) — check expiry",
|
|
40
|
+
"createAuthFromResponse(response) — extract AuthData from login response (edit this)",
|
|
41
|
+
"authenticatedFetch(input, options) — auth-aware fetch wrapper",
|
|
42
|
+
"ensureValidAuth() — check expiry and refresh token",
|
|
43
|
+
"fetchCurrentUser() / getCachedUser() / cacheUser(user) / clearCachedUser() — user caching",
|
|
44
|
+
"getAuthState() — detect 4-state matrix (online/offline × authenticated/not)",
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
"tag-invalidation": {
|
|
48
|
+
label: "Tag Invalidation",
|
|
49
|
+
description: "Generates cache tags from URL paths and invalidates stale cache entries after mutations. Keeps cached data fresh.",
|
|
50
|
+
files: ["invalidation-tags.ts", "cache.ts"],
|
|
51
|
+
functions: [
|
|
52
|
+
"generateTags(url) — extract tags from URL (e.g. /api/todos/42 → ['todos', 'todo:42'])",
|
|
53
|
+
"generateTagsFromMethod(method, url) — method-prefixed tags",
|
|
54
|
+
"invalidateUrl(url) — invalidate all cache entries matching a URL's tags",
|
|
55
|
+
"invalidateByTag(tag) / invalidateByTags(tags) — low-level invalidation",
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
"cross-tab": {
|
|
59
|
+
label: "Cross-tab Sync",
|
|
60
|
+
description: "Broadcasts cache invalidation and auth state changes across all open tabs via the service worker.",
|
|
61
|
+
files: ["client-injector.ts (internal handling)"],
|
|
62
|
+
functions: ["No separate imports needed — handled automatically by client-injector.ts"],
|
|
63
|
+
},
|
|
64
|
+
pwa: {
|
|
65
|
+
label: "PWA",
|
|
66
|
+
description: "Install prompt handling, manifest generation, and React hooks for update management.",
|
|
67
|
+
files: ["pwa/install.ts", "manifest.json"],
|
|
68
|
+
functions: [
|
|
69
|
+
"setupPwaInstall() — listen for beforeinstallprompt/appinstalled events",
|
|
70
|
+
"isInstallable() — check if install prompt is available",
|
|
71
|
+
"promptInstall() — show native install prompt",
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
export async function infoCommand(projectRoot, feature) {
|
|
76
|
+
if (feature) {
|
|
77
|
+
return showFeatureDetail(feature);
|
|
78
|
+
}
|
|
79
|
+
// Minimal top-level summary
|
|
10
80
|
const { config, configPath } = await loadConfigAsync(projectRoot);
|
|
11
81
|
if (!configPath) {
|
|
12
82
|
log.warn('No swoff.config.json found. Run "swoff init" first.');
|
|
13
83
|
return;
|
|
14
84
|
}
|
|
15
|
-
log.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
85
|
+
log.header("Swoff");
|
|
86
|
+
// Show version
|
|
87
|
+
try {
|
|
88
|
+
const pkg = JSON.parse(readFileSync(join(projectRoot, "node_modules", "@swoff", "cli", "package.json"), "utf8"));
|
|
89
|
+
log.normal(`Version: ${pkg.version}`);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// version not available
|
|
93
|
+
}
|
|
94
|
+
// Show enabled features
|
|
95
|
+
const enabled = [];
|
|
96
|
+
if (config.features.mutationQueue)
|
|
97
|
+
enabled.push("mutation-queue");
|
|
98
|
+
if (config.features.backgroundSync)
|
|
99
|
+
enabled.push("background-sync");
|
|
100
|
+
if (config.features.auth.enabled)
|
|
101
|
+
enabled.push("auth");
|
|
102
|
+
if (config.features.crossTabSync)
|
|
103
|
+
enabled.push("cross-tab");
|
|
104
|
+
if (config.features.tagInvalidation)
|
|
105
|
+
enabled.push("tag-invalidation");
|
|
106
|
+
if (config.features.pwa.enabled)
|
|
107
|
+
enabled.push("pwa");
|
|
108
|
+
if (enabled.length > 0) {
|
|
109
|
+
log.normal(`\nEnabled features: ${enabled.join(", ")}`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
log.normal("\nEnabled features: (none)");
|
|
113
|
+
}
|
|
114
|
+
// Count generated files
|
|
30
115
|
const swoffDir = join(projectRoot, "swoff");
|
|
31
116
|
if (existsSync(swoffDir)) {
|
|
32
|
-
const
|
|
33
|
-
|
|
117
|
+
const count = countFilesRecursive(swoffDir);
|
|
118
|
+
log.normal(`Generated files: ${count} in swoff/`);
|
|
34
119
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
120
|
+
log.help("\n swoff info <feature> — detailed info for a feature");
|
|
121
|
+
log.help(" Features: mutation-queue, background-sync, auth, tag-invalidation, cross-tab, pwa");
|
|
122
|
+
log.help(" Read swoff/GUIDE.md for the full integration guide");
|
|
123
|
+
}
|
|
124
|
+
function showFeatureDetail(feature) {
|
|
125
|
+
const key = feature.toLowerCase().replace(/[_-]/g, "-").replace(/^-+|-+$/g, "");
|
|
126
|
+
const info = FEATURES[key];
|
|
127
|
+
if (!info) {
|
|
128
|
+
log.error(`Unknown feature: ${feature}`);
|
|
129
|
+
log.info("Available: mutation-queue, background-sync, auth, tag-invalidation, cross-tab, pwa");
|
|
130
|
+
return;
|
|
38
131
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
132
|
+
log.header(info.label);
|
|
133
|
+
log.normal(info.description);
|
|
134
|
+
log.normal("\nGenerated files:");
|
|
135
|
+
info.files.forEach((f) => log.help(` swoff/${f}`));
|
|
136
|
+
log.normal("\nFunctions:");
|
|
137
|
+
info.functions.forEach((f) => log.help(` ${f}`));
|
|
138
|
+
log.help("\n Read swoff/GUIDE.md for code examples and usage details.");
|
|
139
|
+
}
|
|
140
|
+
function countFilesRecursive(dir) {
|
|
141
|
+
let count = 0;
|
|
142
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
143
|
+
const full = join(dir, entry.name);
|
|
144
|
+
if (entry.isDirectory()) {
|
|
145
|
+
count += countFilesRecursive(full);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
count++;
|
|
149
|
+
}
|
|
46
150
|
}
|
|
151
|
+
return count;
|
|
47
152
|
}
|
|
48
153
|
//# sourceMappingURL=info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { writeFileSync, existsSync, mkdirSync } from "fs";
|
|
|
5
5
|
import { join } from "path";
|
|
6
6
|
import { log } from "../cli/logger.js";
|
|
7
7
|
import { defaultInitConfig } from "../shared/config-types.js";
|
|
8
|
+
import { detectFramework } from "../utils/detect-framework.js";
|
|
8
9
|
export async function initCommand(projectRoot, framework) {
|
|
9
10
|
log.header("Initializing Swoff");
|
|
10
11
|
const configFiles = ["swoff.config.json", "swoff.config.js"];
|
|
@@ -14,21 +15,14 @@ export async function initCommand(projectRoot, framework) {
|
|
|
14
15
|
log.info("To reinitialize, delete the config file first.");
|
|
15
16
|
return;
|
|
16
17
|
}
|
|
17
|
-
const config = {
|
|
18
|
-
|
|
19
|
-
framework
|
|
20
|
-
|
|
21
|
-
config.features.mutationQueue = true;
|
|
22
|
-
config.serviceWorker.strategies = {
|
|
23
|
-
"/api/*": "network-first",
|
|
24
|
-
"/static/*": "cache-first",
|
|
25
|
-
"/assets/*": "cache-first",
|
|
26
|
-
};
|
|
27
|
-
}
|
|
18
|
+
const config = {
|
|
19
|
+
...defaultInitConfig,
|
|
20
|
+
framework: (framework || detectFramework(projectRoot)),
|
|
21
|
+
};
|
|
28
22
|
const configPath = join(projectRoot, "swoff.config.json");
|
|
29
23
|
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
30
24
|
log.info("Created swoff.config.json");
|
|
31
|
-
const dirs = ["swoff"];
|
|
25
|
+
const dirs = ["swoff", "swoff/hooks"];
|
|
32
26
|
for (const dir of dirs) {
|
|
33
27
|
const dirPath = join(projectRoot, dir);
|
|
34
28
|
if (!existsSync(dirPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/lib/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/lib/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAkB;IACvE,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;IAEF,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,kBAAkB,cAAc,kBAAkB,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAgB;QAC1B,GAAG,iBAAiB;QACpB,SAAS,EAAE,CAAC,SAAS,IAAI,eAAe,CAAC,WAAW,CAAC,CAA6B;KACnF,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC1D,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC/C,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -20,10 +20,14 @@ export async function validateCommand(projectRoot) {
|
|
|
20
20
|
}
|
|
21
21
|
log.success("Configuration is valid!");
|
|
22
22
|
log.info("\nConfig summary:");
|
|
23
|
-
log.help(`Version: ${config.version}`);
|
|
24
|
-
log.help(`
|
|
23
|
+
log.help(`Version source: ${config.features.serviceWorker.version.source}`);
|
|
24
|
+
log.help(`Version enabled: ${config.features.serviceWorker.version.enabled}`);
|
|
25
|
+
log.help(`Default strategy: ${config.features.serviceWorker.defaultStrategy}`);
|
|
26
|
+
log.help(`Auto update: ${config.features.serviceWorker.autoUpdate}`);
|
|
25
27
|
log.help(`Features enabled: ${Object.entries(config.features)
|
|
26
|
-
.filter(([
|
|
28
|
+
.filter(([k, v]) => {
|
|
29
|
+
if (k === "serviceWorker")
|
|
30
|
+
return false;
|
|
27
31
|
if (typeof v === "object" && v !== null)
|
|
28
32
|
return v.enabled === true;
|
|
29
33
|
return v === true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/lib/commands/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,GAAG,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAEhF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,cAAc,CAAC,MAA4C,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/lib/commands/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,GAAG,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAEhF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,cAAc,CAAC,MAA4C,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,GAAG,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;IAC/E,GAAG,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IACrE,GAAG,CAAC,IAAI,CACN,qBAAqB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,KAAK,eAAe;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAQ,CAA6B,CAAC,OAAO,KAAK,IAAI,CAAC;QAChG,OAAO,CAAC,KAAK,IAAI,CAAC;IACpB,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -1,40 +1,11 @@
|
|
|
1
1
|
import { KNOWN_FEATURES, OBJECT_FEATURES, VALID_STRATEGIES } from "../shared/config-types.js";
|
|
2
2
|
export function validateConfig(config) {
|
|
3
3
|
const errors = [];
|
|
4
|
-
const requiredFields = ["enabled", "
|
|
4
|
+
const requiredFields = ["enabled", "features", "build"];
|
|
5
5
|
const missingFields = requiredFields.filter((field) => config[field] === undefined || config[field] === null);
|
|
6
6
|
if (missingFields.length > 0) {
|
|
7
7
|
errors.push(`Missing required fields: ${missingFields.join(", ")}`);
|
|
8
8
|
}
|
|
9
|
-
if (config.serviceWorker) {
|
|
10
|
-
const sw = config.serviceWorker;
|
|
11
|
-
if (sw.autoRegister !== undefined && typeof sw.autoRegister !== "boolean") {
|
|
12
|
-
errors.push("serviceWorker.autoRegister must be a boolean");
|
|
13
|
-
}
|
|
14
|
-
if (sw.autoActivate !== undefined && typeof sw.autoActivate !== "boolean") {
|
|
15
|
-
errors.push("serviceWorker.autoActivate must be a boolean");
|
|
16
|
-
}
|
|
17
|
-
if (sw.defaultStrategy && !VALID_STRATEGIES.includes(sw.defaultStrategy)) {
|
|
18
|
-
errors.push(`Invalid defaultStrategy "${sw.defaultStrategy}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
|
|
19
|
-
}
|
|
20
|
-
if (sw.strategies && typeof sw.strategies === "object") {
|
|
21
|
-
const strategies = sw.strategies;
|
|
22
|
-
for (const [pattern, strategy] of Object.entries(strategies)) {
|
|
23
|
-
if (!VALID_STRATEGIES.includes(strategy)) {
|
|
24
|
-
errors.push(`Invalid strategy "${strategy}" for pattern "${pattern}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
if (sw.clearRuntimeOnUpdate !== undefined && typeof sw.clearRuntimeOnUpdate !== "boolean") {
|
|
29
|
-
errors.push("serviceWorker.clearRuntimeOnUpdate must be a boolean");
|
|
30
|
-
}
|
|
31
|
-
if (sw.navigationMode !== undefined && !["spa", "default"].includes(sw.navigationMode)) {
|
|
32
|
-
errors.push('serviceWorker.navigationMode must be "spa" or "default"');
|
|
33
|
-
}
|
|
34
|
-
if (sw.spaEntry !== undefined && typeof sw.spaEntry !== "string") {
|
|
35
|
-
errors.push("serviceWorker.spaEntry must be a string");
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
9
|
if (config.features) {
|
|
39
10
|
const features = config.features;
|
|
40
11
|
for (const [key, value] of Object.entries(features)) {
|
|
@@ -61,6 +32,57 @@ export function validateConfig(config) {
|
|
|
61
32
|
errors.push("features.pwa.preventDefaultInstall must be a boolean");
|
|
62
33
|
}
|
|
63
34
|
}
|
|
35
|
+
const sw = features.serviceWorker;
|
|
36
|
+
if (sw) {
|
|
37
|
+
if (sw.autoUpdate !== undefined && typeof sw.autoUpdate !== "boolean") {
|
|
38
|
+
errors.push("features.serviceWorker.autoUpdate must be a boolean");
|
|
39
|
+
}
|
|
40
|
+
if (sw.autoActivate !== undefined && typeof sw.autoActivate !== "boolean") {
|
|
41
|
+
errors.push("features.serviceWorker.autoActivate must be a boolean");
|
|
42
|
+
}
|
|
43
|
+
if (sw.defaultStrategy && !VALID_STRATEGIES.includes(sw.defaultStrategy)) {
|
|
44
|
+
errors.push(`Invalid defaultStrategy "${sw.defaultStrategy}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
|
|
45
|
+
}
|
|
46
|
+
if (sw.strategies && typeof sw.strategies === "object") {
|
|
47
|
+
const strategies = sw.strategies;
|
|
48
|
+
for (const [pattern, strategy] of Object.entries(strategies)) {
|
|
49
|
+
if (!VALID_STRATEGIES.includes(strategy)) {
|
|
50
|
+
errors.push(`Invalid strategy "${strategy}" for pattern "${pattern}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (sw.clearRuntimeOnUpdate !== undefined && typeof sw.clearRuntimeOnUpdate !== "boolean") {
|
|
55
|
+
errors.push("features.serviceWorker.clearRuntimeOnUpdate must be a boolean");
|
|
56
|
+
}
|
|
57
|
+
if (sw.navigationMode !== undefined && !["spa", "default"].includes(sw.navigationMode)) {
|
|
58
|
+
errors.push('features.serviceWorker.navigationMode must be "spa" or "default"');
|
|
59
|
+
}
|
|
60
|
+
if (sw.spaEntry !== undefined && typeof sw.spaEntry !== "string") {
|
|
61
|
+
errors.push("features.serviceWorker.spaEntry must be a string");
|
|
62
|
+
}
|
|
63
|
+
const ver = sw.version;
|
|
64
|
+
if (ver) {
|
|
65
|
+
if (ver.enabled !== undefined && typeof ver.enabled !== "boolean") {
|
|
66
|
+
errors.push("features.serviceWorker.version.enabled must be a boolean");
|
|
67
|
+
}
|
|
68
|
+
if (ver.source !== undefined && !["from-package", "manual"].includes(ver.source)) {
|
|
69
|
+
errors.push('features.serviceWorker.version.source must be "from-package" or "manual"');
|
|
70
|
+
}
|
|
71
|
+
if (ver.source === "manual" && !ver.value) {
|
|
72
|
+
errors.push("features.serviceWorker.version.value is required when source is 'manual'");
|
|
73
|
+
}
|
|
74
|
+
if (ver.value !== undefined && typeof ver.value === "string" && ver.value !== "from-package") {
|
|
75
|
+
if (!/^\d+\.\d+\.\d+$/.test(ver.value)) {
|
|
76
|
+
errors.push(`Invalid version value "${ver.value}". Must be semver (e.g., "1.0.0")`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (ver.minSupportedVersion !== undefined && typeof ver.minSupportedVersion === "string") {
|
|
80
|
+
if (!/^\d+\.\d+\.\d+$/.test(ver.minSupportedVersion)) {
|
|
81
|
+
errors.push(`Invalid minSupportedVersion "${ver.minSupportedVersion}". Must be semver (e.g., "1.0.0")`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
64
86
|
const tagInvalidationVal = features.tagInvalidation;
|
|
65
87
|
const crossTabSyncVal = features.crossTabSync;
|
|
66
88
|
if (crossTabSyncVal === true && tagInvalidationVal !== true) {
|
|
@@ -71,32 +93,6 @@ export function validateConfig(config) {
|
|
|
71
93
|
if (backgroundSyncVal === true && mutationQueueVal !== true) {
|
|
72
94
|
errors.push("backgroundSync requires mutationQueue to be enabled");
|
|
73
95
|
}
|
|
74
|
-
const indexeddb = features.indexeddb;
|
|
75
|
-
if (indexeddb && typeof indexeddb === "object") {
|
|
76
|
-
if (indexeddb.enabled !== undefined && typeof indexeddb.enabled !== "boolean") {
|
|
77
|
-
errors.push("features.indexeddb.enabled must be a boolean");
|
|
78
|
-
}
|
|
79
|
-
if (indexeddb.name !== undefined && typeof indexeddb.name !== "string") {
|
|
80
|
-
errors.push("features.indexeddb.name must be a string");
|
|
81
|
-
}
|
|
82
|
-
if (indexeddb.name && typeof indexeddb.name === "string" && !/^[a-zA-Z0-9-_]+$/.test(indexeddb.name)) {
|
|
83
|
-
errors.push(`features.indexeddb.name "${indexeddb.name}" must match pattern ^[a-zA-Z0-9-_]+$`);
|
|
84
|
-
}
|
|
85
|
-
if (indexeddb.stores !== undefined && !Array.isArray(indexeddb.stores)) {
|
|
86
|
-
errors.push("features.indexeddb.stores must be an array");
|
|
87
|
-
}
|
|
88
|
-
if (indexeddb.stores && Array.isArray(indexeddb.stores)) {
|
|
89
|
-
for (const store of indexeddb.stores) {
|
|
90
|
-
if (typeof store !== "string") {
|
|
91
|
-
errors.push("features.indexeddb.stores must contain only strings");
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
if (!/^[a-zA-Z0-9-_]+$/.test(store)) {
|
|
95
|
-
errors.push(`features.indexeddb.store "${store}" must match pattern ^[a-zA-Z0-9-_]+$`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
96
|
const auth = features.auth;
|
|
101
97
|
if (auth && typeof auth === "object") {
|
|
102
98
|
if (auth.enabled !== undefined && typeof auth.enabled !== "boolean") {
|
|
@@ -113,15 +109,9 @@ export function validateConfig(config) {
|
|
|
113
109
|
}
|
|
114
110
|
}
|
|
115
111
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
if (config.minSupportedVersion && typeof config.minSupportedVersion === "string") {
|
|
122
|
-
if (!/^\d+\.\d+\.\d+$/.test(config.minSupportedVersion)) {
|
|
123
|
-
errors.push(`Invalid minSupportedVersion "${config.minSupportedVersion}". Must be semver (e.g., "1.0.0")`);
|
|
124
|
-
}
|
|
112
|
+
const fw = config.framework;
|
|
113
|
+
if (fw !== undefined && typeof fw === "string" && !["react", "vue", "svelte", "vanilla"].includes(fw)) {
|
|
114
|
+
errors.push('framework must be "react", "vue", "svelte", or "vanilla"');
|
|
125
115
|
}
|
|
126
116
|
if (config.build) {
|
|
127
117
|
const build = config.build;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/config/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE9F,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/config/validator.ts"],"names":[],"mappings":"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"}
|