@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.
- package/README.md +47 -33
- package/dist/__tests__/assemble-sw.test.js +14 -53
- package/dist/__tests__/assemble-sw.test.js.map +1 -1
- package/dist/__tests__/cli-integration.test.js +119 -11
- package/dist/__tests__/cli-integration.test.js.map +1 -1
- package/dist/__tests__/config-types.test.js +44 -17
- package/dist/__tests__/config-types.test.js.map +1 -1
- package/dist/__tests__/file-generators.test.js +3 -3
- package/dist/__tests__/file-generators.test.js.map +1 -1
- package/dist/__tests__/glob-matcher.test.js +86 -0
- package/dist/__tests__/glob-matcher.test.js.map +1 -0
- package/dist/__tests__/invalidation-tags.test.js +207 -23
- package/dist/__tests__/invalidation-tags.test.js.map +1 -1
- package/dist/__tests__/loader.test.js +16 -12
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/validator.test.js +140 -100
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +39 -34
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +12 -12
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/add.js +84 -36
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/assets.js +37 -0
- package/dist/lib/commands/assets.js.map +1 -0
- package/dist/lib/commands/clean.js +32 -30
- package/dist/lib/commands/clean.js.map +1 -1
- package/dist/lib/commands/generate-assets.js +44 -0
- package/dist/lib/commands/generate-assets.js.map +1 -0
- package/dist/lib/commands/generate-guide.js +22 -29
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/generate.js +17 -24
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/info.js +41 -48
- package/dist/lib/commands/info.js.map +1 -1
- package/dist/lib/commands/init.js +27 -13
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js +4 -4
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/loader.js +25 -23
- package/dist/lib/config/loader.js.map +1 -1
- package/dist/lib/config/validator.js +169 -91
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/asset-generator/dependency-resolver.js +76 -0
- package/dist/lib/generators/asset-generator/dependency-resolver.js.map +1 -0
- package/dist/lib/generators/asset-generator/generate.js +111 -0
- package/dist/lib/generators/asset-generator/generate.js.map +1 -0
- package/dist/lib/generators/asset-generator/guide.js +43 -0
- package/dist/lib/generators/asset-generator/guide.js.map +1 -0
- package/dist/lib/generators/asset-generator/html-patcher.js +65 -0
- package/dist/lib/generators/asset-generator/html-patcher.js.map +1 -0
- package/dist/lib/generators/asset-generator/ico-encoder.js +29 -0
- package/dist/lib/generators/asset-generator/ico-encoder.js.map +1 -0
- package/dist/lib/generators/asset-generator/manifest-patcher.js +23 -0
- package/dist/lib/generators/asset-generator/manifest-patcher.js.map +1 -0
- package/dist/lib/generators/asset-generator/maskable.js +15 -0
- package/dist/lib/generators/asset-generator/maskable.js.map +1 -0
- package/dist/lib/generators/asset-generator/rasterize.js +32 -0
- package/dist/lib/generators/asset-generator/rasterize.js.map +1 -0
- package/dist/lib/generators/asset-generator/sizes.js +25 -0
- package/dist/lib/generators/asset-generator/sizes.js.map +1 -0
- package/dist/lib/generators/file-generators/api-config.js +6 -0
- package/dist/lib/generators/file-generators/api-config.js.map +1 -0
- package/dist/lib/generators/file-generators/auth-state.js +2 -34
- package/dist/lib/generators/file-generators/auth-state.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-store.js +2 -250
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-user.js +3 -81
- package/dist/lib/generators/file-generators/auth-user.js.map +1 -1
- package/dist/lib/generators/file-generators/background-sync.js +2 -57
- package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +2 -38
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +2 -91
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-state.js +6 -0
- package/dist/lib/generators/file-generators/fetch-state.js.map +1 -0
- package/dist/lib/generators/file-generators/fetch-wrapper.js +3 -267
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-framework-adapters.js +56 -0
- package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -0
- package/dist/lib/generators/file-generators/generate-hooks.js +4 -3
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +3 -145
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +24 -630
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/invalidation-tags.js +18 -86
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/manifest.js +15 -5
- package/dist/lib/generators/file-generators/manifest.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +3 -285
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js +2 -117
- package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
- package/dist/lib/generators/file-generators/push.js +6 -139
- package/dist/lib/generators/file-generators/push.js.map +1 -1
- package/dist/lib/generators/file-generators/pwa-install.js +11 -84
- package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
- package/dist/lib/generators/file-generators/quick-readme.js +8 -125
- package/dist/lib/generators/file-generators/quick-readme.js.map +1 -1
- package/dist/lib/generators/file-generators/reset.js +6 -0
- package/dist/lib/generators/file-generators/reset.js.map +1 -0
- package/dist/lib/generators/file-generators/server-push.js +3 -124
- package/dist/lib/generators/file-generators/server-push.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-generator-build.js +8 -9
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +10 -230
- package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/type-definitions.js +2 -114
- package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
- package/dist/lib/generators/sw-generator.js +10 -20
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js +25 -3
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +20 -16
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +68 -19
- package/dist/lib/generators/sw-sections/background-sync-handler.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 +506 -144
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/glob-matcher-code.js.map +1 -0
- package/dist/lib/generators/sw-sections/message-handler.js +55 -15
- package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/server-push-handler.js +12 -0
- package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/sw-push.js +67 -0
- package/dist/lib/generators/sw-sections/sw-push.js.map +1 -0
- package/dist/lib/generators/sw-sections/tag-management.js +65 -23
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +66 -45
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +182 -71
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/shared/glob-matcher.js +77 -0
- package/dist/lib/shared/glob-matcher.js.map +1 -0
- package/dist/lib/utils/tty-status.js +21 -0
- package/dist/lib/utils/tty-status.js.map +1 -0
- package/dist/runtime/api-config.js +18 -0
- package/dist/runtime/api-config.js.map +1 -0
- package/dist/runtime/auth-state.js +35 -0
- package/dist/runtime/auth-state.js.map +1 -0
- package/dist/runtime/auth-store.js +273 -0
- package/dist/runtime/auth-store.js.map +1 -0
- package/dist/runtime/auth-user.js +168 -0
- package/dist/runtime/auth-user.js.map +1 -0
- package/dist/runtime/background-sync.js +59 -0
- package/dist/runtime/background-sync.js.map +1 -0
- package/dist/runtime/cache.js +30 -0
- package/dist/runtime/cache.js.map +1 -0
- package/dist/runtime/client-injector.js +136 -0
- package/dist/runtime/client-injector.js.map +1 -0
- package/dist/runtime/fetch-state.js +42 -0
- package/dist/runtime/fetch-state.js.map +1 -0
- package/dist/runtime/fetch-wrapper.js +355 -0
- package/dist/runtime/fetch-wrapper.js.map +1 -0
- package/dist/runtime/gql-wrapper.js +135 -0
- package/dist/runtime/gql-wrapper.js.map +1 -0
- package/dist/runtime/invalidation-tags.js +260 -0
- package/dist/runtime/invalidation-tags.js.map +1 -0
- package/dist/runtime/mutation-queue.js +304 -0
- package/dist/runtime/mutation-queue.js.map +1 -0
- package/dist/runtime/mutation-state.js +117 -0
- package/dist/runtime/mutation-state.js.map +1 -0
- package/dist/runtime/push.js +138 -0
- package/dist/runtime/push.js.map +1 -0
- package/dist/runtime/pwa-index.js +11 -0
- package/dist/runtime/pwa-index.js.map +1 -0
- package/dist/runtime/pwa-injector.js +44 -0
- package/dist/runtime/pwa-injector.js.map +1 -0
- package/dist/runtime/pwa-install.js +83 -0
- package/dist/runtime/pwa-install.js.map +1 -0
- package/dist/runtime/pwa-prompt.js +54 -0
- package/dist/runtime/pwa-prompt.js.map +1 -0
- package/dist/runtime/reset.js +148 -0
- package/dist/runtime/reset.js.map +1 -0
- package/dist/runtime/server-push.js +148 -0
- package/dist/runtime/server-push.js.map +1 -0
- package/dist/runtime/sw-injector.js +236 -0
- package/dist/runtime/sw-injector.js.map +1 -0
- package/dist/runtime/type-definitions.js +138 -0
- package/dist/runtime/type-definitions.js.map +1 -0
- package/dist/runtime/utils.js +27 -0
- package/dist/runtime/utils.js.map +1 -0
- package/package.json +3 -1
- package/templates/react/useAuth.jsx +106 -0
- package/templates/react/useAuth.tsx +118 -0
- package/templates/{hooks → react}/useBackgroundSync.jsx +6 -4
- package/templates/{hooks → react}/useBackgroundSync.tsx +6 -4
- package/templates/{hooks → react}/useCacheInvalidation.jsx +2 -2
- package/templates/react/useCacheInvalidation.tsx +52 -0
- package/templates/react/useCachedFetch.jsx +140 -0
- package/templates/react/useCachedFetch.tsx +160 -0
- package/templates/react/useIsFetching.jsx +32 -0
- package/templates/react/useIsFetching.tsx +32 -0
- package/templates/react/useMutation.jsx +141 -0
- package/templates/react/useMutation.tsx +180 -0
- package/templates/react/useMutationQueue.jsx +69 -0
- package/templates/react/useMutationQueue.tsx +83 -0
- package/templates/react/useMutationState.jsx +13 -0
- package/templates/react/useMutationState.tsx +25 -0
- package/templates/react/useNetworkStatus.jsx +61 -0
- package/templates/react/useNetworkStatus.tsx +76 -0
- package/templates/react/usePrefetch.jsx +32 -0
- package/templates/react/usePrefetch.tsx +42 -0
- package/templates/{hooks → react}/usePushSubscription.jsx +7 -7
- package/templates/{hooks → react}/usePushSubscription.tsx +7 -7
- package/templates/{hooks → react}/useSWUpdate.jsx +3 -3
- package/templates/{hooks → react}/useSWUpdate.tsx +4 -4
- package/templates/react/useSwoffReset.jsx +32 -0
- package/templates/react/useSwoffReset.tsx +39 -0
- package/templates/hooks/useAuth.jsx +0 -30
- package/templates/hooks/useAuth.tsx +0 -30
- package/templates/hooks/useCacheInvalidation.tsx +0 -19
- package/templates/hooks/useCachedFetch.jsx +0 -94
- package/templates/hooks/useCachedFetch.tsx +0 -112
- package/templates/hooks/useMutation.jsx +0 -76
- package/templates/hooks/useMutation.tsx +0 -97
- package/templates/hooks/useMutationQueue.jsx +0 -42
- package/templates/hooks/useMutationQueue.tsx +0 -49
- package/templates/hooks/useMutationState.jsx +0 -27
- package/templates/hooks/useMutationState.tsx +0 -41
- package/templates/hooks/useNetworkStatus.jsx +0 -19
- package/templates/hooks/useNetworkStatus.tsx +0 -19
- package/templates/hooks/usePrefetch.jsx +0 -10
- 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
|
|
14
|
-
|
|
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;
|
|
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
|
|
44
|
-
const versionEnabled =
|
|
45
|
-
const version =
|
|
46
|
-
?
|
|
47
|
-
:
|
|
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:
|
|
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
|
|
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
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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;
|
|
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
|
-
|
|
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;
|
|
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 {
|
|
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
|
|
22
|
-
return
|
|
23
|
-
|
|
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 } =
|
|
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
|
|
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.
|
|
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
|
|
1
|
+
{"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"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"}
|