@swoff/cli 0.3.8 → 0.3.9
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 +8 -38
- 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 +32 -15
- package/dist/__tests__/config-types.test.js.map +1 -1
- package/dist/__tests__/file-generators.test.js +2 -2
- 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 +12 -12
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/validator.test.js +144 -97
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +0 -5
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/add.js +50 -32
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/clean.js +1 -15
- package/dist/lib/commands/clean.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +2 -2
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/generate.js +7 -21
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/info.js +8 -6
- package/dist/lib/commands/info.js.map +1 -1
- package/dist/lib/commands/init.js +2 -10
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js +3 -3
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/loader.js +3 -6
- package/dist/lib/config/loader.js.map +1 -1
- package/dist/lib/config/validator.js +157 -88
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +2 -10
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +50 -11
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +92 -64
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +1 -14
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +6 -640
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/invalidation-tags.js +206 -19
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/manifest.js +2 -2
- package/dist/lib/generators/file-generators/manifest.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +29 -9
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/push.js +6 -7
- package/dist/lib/generators/file-generators/push.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/server-push.js +11 -1
- 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 +2 -1
- package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/type-definitions.js +0 -3
- package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
- package/dist/lib/generators/sw-generator.js +8 -18
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +14 -11
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +59 -17
- 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 +437 -136
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- 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/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 +60 -20
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +5 -15
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +121 -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/docs/API.md +565 -0
- package/docs/ARCHITECTURE.md +374 -0
- package/docs/CLI.md +148 -0
- package/docs/COMPARISON.md +192 -0
- package/docs/CONFIG.md +277 -0
- package/docs/ECOSYSTEM.md +33 -0
- package/package.json +2 -1
- package/templates/hooks/useAuth.jsx +2 -2
- package/templates/hooks/useAuth.tsx +2 -2
- package/templates/hooks/useCachedFetch.jsx +3 -28
- package/templates/hooks/useCachedFetch.tsx +2 -33
- package/templates/hooks/useMutation.tsx +13 -1
- package/templates/hooks/useMutationQueue.jsx +2 -1
- package/templates/hooks/useMutationQueue.tsx +2 -1
- package/templates/hooks/useMutationState.jsx +8 -22
- package/templates/hooks/useMutationState.tsx +8 -24
- package/templates/hooks/usePushSubscription.jsx +3 -3
- package/templates/hooks/usePushSubscription.tsx +3 -3
|
@@ -1,138 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generates README.md — quick reference
|
|
2
|
+
* Generates README.md — quick reference that points to the static docs.
|
|
3
3
|
*/
|
|
4
4
|
import { writeFile } from "./context.js";
|
|
5
5
|
export function generateReadme(ctx) {
|
|
6
|
-
const { config } = ctx;
|
|
7
|
-
const ext = ctx.ext;
|
|
8
6
|
const lines = [];
|
|
9
7
|
const w = (s) => lines.push(s);
|
|
10
8
|
w("# Swoff — Quick Reference");
|
|
11
9
|
w("");
|
|
12
|
-
w("For the
|
|
10
|
+
w("For the complete API reference, see:");
|
|
13
11
|
w("");
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
w("initServiceWorker();");
|
|
20
|
-
w("```");
|
|
21
|
-
w("");
|
|
22
|
-
}
|
|
23
|
-
w("## API calls (use for all fetch requests)");
|
|
24
|
-
w("Use `fetchWithCache` instead of `fetch()` — it sets caching headers the SW needs.");
|
|
25
|
-
w("Plain `fetch()` skips SW caching when `cacheStrategy` is `\"explicit-only\"`.");
|
|
26
|
-
w("```ts");
|
|
27
|
-
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
28
|
-
w('const data = await fetchWithCache("/api/data").then(r => r.json());');
|
|
29
|
-
w("```");
|
|
12
|
+
w("- `node_modules/@swoff/cli/docs/API.md` — every generated function");
|
|
13
|
+
w("- `node_modules/@swoff/cli/docs/ARCHITECTURE.md` — design & rationale");
|
|
14
|
+
w("- `node_modules/@swoff/cli/docs/CLI.md` — CLI commands");
|
|
15
|
+
w("- `node_modules/@swoff/cli/docs/CONFIG.md` — config schema");
|
|
16
|
+
w("- `node_modules/@swoff/cli/docs/COMPARISON.md` — library comparison");
|
|
30
17
|
w("");
|
|
31
|
-
|
|
32
|
-
w("## Authenticated API calls");
|
|
33
|
-
w("```ts");
|
|
34
|
-
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
35
|
-
w('const data = await fetchWithCache("/api/me", { auth: true }).then(r => r.json());');
|
|
36
|
-
w("```");
|
|
37
|
-
w("");
|
|
38
|
-
}
|
|
39
|
-
if (config.features.mutationQueue.enabled) {
|
|
40
|
-
w("## Offline mutations (queue writes when offline)");
|
|
41
|
-
w("```ts");
|
|
42
|
-
w(`import { queueMutation, getPendingCount } from "./swoff/mutation-queue.${ext}";`);
|
|
43
|
-
w("await queueMutation({ method: \"POST\", url: \"/api/todos\", body: {...} });");
|
|
44
|
-
w("```");
|
|
45
|
-
w("");
|
|
46
|
-
if (config.features.auth.enabled) {
|
|
47
|
-
w("## After re-login (flush queued mutations)");
|
|
48
|
-
w("```ts");
|
|
49
|
-
w(`import { flushMutations } from "./swoff/mutation-queue.${ext}";`);
|
|
50
|
-
w("await flushMutations();");
|
|
51
|
-
w("```");
|
|
52
|
-
w("");
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
if (config.features.graphql.enabled) {
|
|
56
|
-
w("## GraphQL (cached queries with body-hash)");
|
|
57
|
-
w("```ts");
|
|
58
|
-
w(`import { queryGql, mutateGql } from "./swoff/gql-wrapper.${ext}";`);
|
|
59
|
-
w('const { data } = await queryGql("{ todos { id title } }");');
|
|
60
|
-
w('const { data: created } = await mutateGql(');
|
|
61
|
-
w(' "mutation CreateTodo($t: String!) { createTodo(title: $t) { id } }",');
|
|
62
|
-
w(' { t: "New task" },');
|
|
63
|
-
w(");");
|
|
64
|
-
w("```");
|
|
65
|
-
w("");
|
|
66
|
-
}
|
|
67
|
-
if (config.features.serverPush.enabled) {
|
|
68
|
-
w("## Server push events (real-time cache invalidation)");
|
|
69
|
-
w("```ts");
|
|
70
|
-
w(`import { startPushEvents } from "./swoff/server-push.${ext}";`);
|
|
71
|
-
w("startPushEvents();");
|
|
72
|
-
w("```");
|
|
73
|
-
w("");
|
|
74
|
-
}
|
|
75
|
-
if (config.features.pushNotifications?.enabled) {
|
|
76
|
-
w("## Push notifications");
|
|
77
|
-
w("```ts");
|
|
78
|
-
w(`import { subscribeToPush, unsubscribeFromPush, isSubscribed } from "./swoff/push.${ext}";`);
|
|
79
|
-
w('const sub = await subscribeToPush("YOUR_VAPID_PUBLIC_KEY");');
|
|
80
|
-
w("```");
|
|
81
|
-
w("");
|
|
82
|
-
}
|
|
83
|
-
if (ctx.frameworkName === "react") {
|
|
84
|
-
w("## React hooks");
|
|
85
|
-
w("```tsx");
|
|
86
|
-
w(`import { useCachedFetch } from "./swoff/hooks/useCachedFetch.${ext}x";`);
|
|
87
|
-
w(`import { useMutation } from "./swoff/hooks/useMutation.${ext}x";`);
|
|
88
|
-
w(`import { usePrefetch } from "./swoff/hooks/usePrefetch.${ext}x";`);
|
|
89
|
-
w(`import { useMutationState } from "./swoff/hooks/useMutationState.${ext}x";`);
|
|
90
|
-
w("");
|
|
91
|
-
w('const { data, error, loading, refetch } = useCachedFetch("/api/todos", {');
|
|
92
|
-
w(' refetchOnWindowFocus: true,');
|
|
93
|
-
w('});');
|
|
94
|
-
w("");
|
|
95
|
-
w('// Dependent query — skip until user is loaded');
|
|
96
|
-
w('const { data: posts } = useCachedFetch("/api/posts", { enabled: !!user });');
|
|
97
|
-
w("");
|
|
98
|
-
w('const { mutate } = useMutation({ onSuccess: (data) => console.log(data) });');
|
|
99
|
-
w('mutate("/api/todos", { method: "POST", body: JSON.stringify({ title: "New" }) });');
|
|
100
|
-
w("");
|
|
101
|
-
w('const prefetch = usePrefetch();');
|
|
102
|
-
w('prefetch("/api/todos");');
|
|
103
|
-
w("");
|
|
104
|
-
w('// Track a specific mutation by its returned id');
|
|
105
|
-
w('const mutation = useMutationState(mutationId);');
|
|
106
|
-
w("```");
|
|
107
|
-
w("");
|
|
108
|
-
if (config.features.mutationQueue.enabled) {
|
|
109
|
-
w("## Mutation queue hooks");
|
|
110
|
-
w("```tsx");
|
|
111
|
-
w(`import { useMutationQueue } from "./swoff/hooks/useMutationQueue.${ext}x";`);
|
|
112
|
-
w(`import { useMutationState } from "./swoff/hooks/useMutationState.${ext}x";`);
|
|
113
|
-
w("");
|
|
114
|
-
w('const { pending, items, lastSync } = useMutationQueue();');
|
|
115
|
-
w("// items: MutationQueueItem[] — each with id, url, method, status, retryCount");
|
|
116
|
-
w("// lastSync: { succeeded, failed } | null — result of the last sync attempt");
|
|
117
|
-
w("```");
|
|
118
|
-
w("");
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
if (config.features.tagInvalidation) {
|
|
122
|
-
w("## Cache invalidation");
|
|
123
|
-
w("```ts");
|
|
124
|
-
w(`import { generateTags, invalidateUrl } from "./swoff/invalidation-tags.${ext}";`);
|
|
125
|
-
w('const data = await fetchWithCache("/api/todos", { tags: generateTags("/api/todos") });');
|
|
126
|
-
w('await invalidateUrl("/api/todos/42"); // after mutation');
|
|
127
|
-
w("```");
|
|
128
|
-
w("");
|
|
129
|
-
}
|
|
130
|
-
w("## Build script");
|
|
131
|
-
w("The SW generator learns your build output to precache assets.");
|
|
132
|
-
w("Swoff has already added this to your `package.json`:");
|
|
133
|
-
w("```json");
|
|
134
|
-
w('"build": "<your-build> && node swoff/sw/generator.js"');
|
|
135
|
-
w("```");
|
|
18
|
+
w("Or run `swoff info <feature>` for targeted help.");
|
|
136
19
|
writeFile(ctx, "README.md", lines.join("\n"));
|
|
137
20
|
}
|
|
138
21
|
//# sourceMappingURL=quick-readme.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quick-readme.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/quick-readme.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,cAAc,CAAC,GAAqB;IAClD,MAAM,
|
|
1
|
+
{"version":3,"file":"quick-readme.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/quick-readme.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,cAAc,CAAC,GAAqB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvC,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC/B,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,sCAAsC,CAAC,CAAC;IAC1C,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,oEAAoE,CAAC,CAAC;IACxE,CAAC,CAAC,uEAAuE,CAAC,CAAC;IAC3E,CAAC,CAAC,wDAAwD,CAAC,CAAC;IAC5D,CAAC,CAAC,4DAA4D,CAAC,CAAC;IAChE,CAAC,CAAC,qEAAqE,CAAC,CAAC;IACzE,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,kDAAkD,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -107,9 +107,17 @@ async function connect(options${T("PushEventOptions")} = {} as PushEventOptions)
|
|
|
107
107
|
${sp.type === "sse" ? sseConnect : wsConnect}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
/** Start listening for server push events. Retries on connection loss with exponential backoff. */
|
|
110
|
+
/** Start listening for server push events. Only connects when the SW is not active — the SW is the primary connection manager. Retries on connection loss with exponential backoff. */
|
|
111
111
|
export async function startPushEvents(){
|
|
112
112
|
if (active) return;
|
|
113
|
+
|
|
114
|
+
// If SW is already controlling the page, skip client-side connection — the SW handles push events.
|
|
115
|
+
if (navigator.serviceWorker.controller) return;
|
|
116
|
+
|
|
117
|
+
// Listen for SW activation — if SW takes over, disconnect the client fallback.
|
|
118
|
+
const onControllerChange = () => { stopPushEvents(); };
|
|
119
|
+
navigator.serviceWorker.addEventListener("controllerchange", onControllerChange);
|
|
120
|
+
|
|
113
121
|
active = true;
|
|
114
122
|
let delay = ${reconnectDelayMs};
|
|
115
123
|
while (active) {
|
|
@@ -118,6 +126,8 @@ export async function startPushEvents(){
|
|
|
118
126
|
await new Promise((r) => { reconnectTimer = setTimeout(r, delay); });
|
|
119
127
|
delay = Math.min(delay * 1.5, 30000); // cap at 30s
|
|
120
128
|
}
|
|
129
|
+
|
|
130
|
+
navigator.serviceWorker.removeEventListener("controllerchange", onControllerChange);
|
|
121
131
|
}
|
|
122
132
|
|
|
123
133
|
/** Stop listening for push events. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/server-push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;IAC7B,MAAM,gBAAgB,GAAG,EAAE,CAAC,gBAAgB,CAAC;IAE7C,MAAM,UAAU,GAAG;;;;;;IAMjB,CAAC;IAEH,MAAM,UAAU,GAAG;;aAER,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmCf,CAAC;IAEL,MAAM,SAAS,GAAG;;;kCAGc,QAAQ;;;;;;;;;;;MAWpC,CAAC;IAEL,MAAM,IAAI,GAAG;;;oCAGqB,QAAQ;;;;;uFAK2C,GAAG;;;;;;;;;UAShF,CAAC,CAAC,aAAa,CAAC;;;YAGd,CAAC,CAAC,SAAS,CAAC;oBACJ,CAAC,CAAC,sCAAsC,CAAC;;kCAE3B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU;;;;iCAIzC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;;;;gCAI1B,CAAC,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC,eAAe,CAAC;IAChG,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS
|
|
1
|
+
{"version":3,"file":"server-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/server-push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;IAC7B,MAAM,gBAAgB,GAAG,EAAE,CAAC,gBAAgB,CAAC;IAE7C,MAAM,UAAU,GAAG;;;;;;IAMjB,CAAC;IAEH,MAAM,UAAU,GAAG;;aAER,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmCf,CAAC;IAEL,MAAM,SAAS,GAAG;;;kCAGc,QAAQ;;;;;;;;;;;MAWpC,CAAC;IAEL,MAAM,IAAI,GAAG;;;oCAGqB,QAAQ;;;;;uFAK2C,GAAG;;;;;;;;;UAShF,CAAC,CAAC,aAAa,CAAC;;;YAGd,CAAC,CAAC,SAAS,CAAC;oBACJ,CAAC,CAAC,sCAAsC,CAAC;;kCAE3B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU;;;;iCAIzC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;;;;gCAI1B,CAAC,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC,eAAe,CAAC;IAChG,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;;;;;;;;;;;;;;;gBAe9B,gBAAgB;;;;;;;;;;;;;;;;;;;;;CAqB/B,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7C,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 !== false && versionField !== "hash";
|
|
42
|
+
const version = versionField === "package"
|
|
43
|
+
? (pkg.version || '1.0.0')
|
|
44
|
+
: versionField && versionField !== "hash"
|
|
45
|
+
? versionField
|
|
46
|
+
: (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"}
|
|
@@ -5,7 +5,8 @@ import { writeFile } from "./context.js";
|
|
|
5
5
|
export function generateSwInjector(ctx) {
|
|
6
6
|
const autoUpdate = ctx.config.features.serviceWorker.autoUpdate;
|
|
7
7
|
const autoActivate = ctx.config.features.serviceWorker.autoActivate;
|
|
8
|
-
const
|
|
8
|
+
const v = ctx.config.features.serviceWorker.version;
|
|
9
|
+
const versionEnabled = v !== false && v !== "hash";
|
|
9
10
|
const ext = ctx.ext;
|
|
10
11
|
const ts = ext === "ts";
|
|
11
12
|
const T = (type) => (ts ? `: ${type}` : "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw-injector.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-injector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;IAChE,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC;IACpE,MAAM,
|
|
1
|
+
{"version":3,"file":"sw-injector.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-injector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;IAChE,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC;IACpE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IACpD,MAAM,cAAc,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEtD,MAAM,aAAa,GAAG;;;;;8DAKsC,GAAG;;;;;;;;;;;;;;;;;;;sBAmB3C,UAAU;wBACR,YAAY;;0BAEV,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;oCAkBjC,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;gDAUN,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,oCAAoC,CAAC;;;;;;;;;;;;;2CAa3D,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAoFN,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;qCAgBnD,CAAC,CAAC,eAAe,CAAC;;;;;;CAMtD,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;8DAKyC,GAAG;;;;;;;;;;;;oCAY7B,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;2CAWX,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;CAiB5D,CAAC;IAEA,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -69,8 +69,6 @@ declare global {
|
|
|
69
69
|
export interface FetchWithCacheOptions extends RequestInit {
|
|
70
70
|
strategy?: "read" | "mutation";
|
|
71
71
|
tags?: string[];
|
|
72
|
-
staleWhileRevalidate?: boolean;
|
|
73
|
-
staleTime?: number;
|
|
74
72
|
}
|
|
75
73
|
|
|
76
74
|
export type MutationStatus = "idle" | "pending" | "success" | "error";
|
|
@@ -86,7 +84,6 @@ export interface MutationState {
|
|
|
86
84
|
export interface GqlOptions {
|
|
87
85
|
variables?: Record<string, unknown>;
|
|
88
86
|
tags?: string[];
|
|
89
|
-
staleWhileRevalidate?: boolean;
|
|
90
87
|
auth?: boolean;
|
|
91
88
|
queueOffline?: boolean;
|
|
92
89
|
invalidate?: 'auto' | string[] | false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-definitions.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/type-definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI;QAAE,OAAO;IAE7B,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"type-definitions.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/type-definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI;QAAE,OAAO;IAE7B,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAoFa,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAyBhC,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -1,16 +1,3 @@
|
|
|
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";
|
|
@@ -18,9 +5,11 @@ import { loadConfig } 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 === false || v === "hash")
|
|
9
|
+
return pkgVersion || "1.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();
|
|
@@ -41,7 +30,8 @@ export async function generateSW(options = {}) {
|
|
|
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 !== false && 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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/activate-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"activate-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/activate-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,oBAA6B,EAAE,iBAA2B;IAChG,MAAM,YAAY,GAAG,oBAAoB;QACvC,CAAC,CAAC,0CAA0C;QAC5C,CAAC,CAAC,wEAAwE,CAAC;IAE7E,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC;;;QAGrC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEZ,OAAO;;;;mCAI0B,cAAc;;;UAGvC,YAAY;;;;IAIlB,CAAC;AACL,CAAC"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Assembles the complete service worker string from config and version.
|
|
3
|
-
* Calls individual section generators and performs placeholder replacement.
|
|
4
|
-
*/
|
|
5
1
|
import { readdirSync, existsSync } from "fs";
|
|
6
2
|
import { join, relative } from "path";
|
|
7
3
|
import { createHash } from "crypto";
|
|
@@ -13,7 +9,7 @@ import { generateMessageHandler } from "./message-handler.js";
|
|
|
13
9
|
import { generateFetchHandler } from "./fetch-handler.js";
|
|
14
10
|
import { generateTagManagement } from "./tag-management.js";
|
|
15
11
|
import { generateBackgroundSyncHandler } from "./background-sync-handler.js";
|
|
16
|
-
import { generateSwPushHandlers } from "
|
|
12
|
+
import { generateSwPushHandlers } from "./sw-push.js";
|
|
17
13
|
import { generateServerPushHandler } from "./server-push-handler.js";
|
|
18
14
|
function collectAssets(dir, baseDir) {
|
|
19
15
|
if (!existsSync(dir))
|
|
@@ -40,11 +36,18 @@ function applyReplacements(sw, config, assetsToCache) {
|
|
|
40
36
|
const { features } = config;
|
|
41
37
|
sw = sw.replace("// [[ASSETS_LIST]]", `ASSETS_TO_CACHE = ${JSON.stringify(assetsToCache, null, 2)}`);
|
|
42
38
|
sw = sw.replace("// [[AUTO_SKIP_WAITING]]", `const AUTO_SKIP_WAITING = ${serviceWorker.autoActivate};`);
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
const { strategy, navigation } = serviceWorker;
|
|
40
|
+
const { refetchQueue } = features;
|
|
41
|
+
const tagInvalidationEnabled = features.tagInvalidation.enabled;
|
|
42
|
+
sw = sw.replace("// [[FETCH_HANDLER]]", generateFetchHandler({
|
|
43
|
+
strategy,
|
|
44
|
+
navigation,
|
|
45
|
+
refetchQueue,
|
|
46
|
+
}, tagInvalidationEnabled, features.mutationQueue.enabled));
|
|
47
|
+
sw = sw.replace("// [[ACTIVATE_HANDLER]]", generateActivateHandler(strategy.clearRuntimeOnUpdate, navigation.preload));
|
|
45
48
|
sw = sw.replace("// [[INSTALL_HANDLER]]", generateInstallHandler());
|
|
46
|
-
sw = sw.replace("// [[MESSAGE_HANDLER]]", generateMessageHandler(
|
|
47
|
-
sw =
|
|
49
|
+
sw = sw.replace("// [[MESSAGE_HANDLER]]", generateMessageHandler(tagInvalidationEnabled, features.tagInvalidation.debounceMs ?? 0));
|
|
50
|
+
sw = tagInvalidationEnabled
|
|
48
51
|
? sw.replace("// [[TAG_MANAGEMENT]]", generateTagManagement())
|
|
49
52
|
: sw.replace("// [[TAG_MANAGEMENT]]", "");
|
|
50
53
|
sw = features.pushNotifications?.enabled
|
|
@@ -60,7 +63,7 @@ export function assembleSW(config, version, projectRoot) {
|
|
|
60
63
|
const { features } = config;
|
|
61
64
|
const outputDir = config.build?.outputDir || "dist";
|
|
62
65
|
const swFilename = config.build?.swFilename || "sw";
|
|
63
|
-
const versionEnabled = serviceWorker.version.
|
|
66
|
+
const versionEnabled = serviceWorker.version !== false && serviceWorker.version !== "hash";
|
|
64
67
|
const fallback = ["/index.html"];
|
|
65
68
|
if (features.pwa.enabled)
|
|
66
69
|
fallback.push("/manifest.json");
|
|
@@ -93,7 +96,7 @@ export function assembleSW(config, version, projectRoot) {
|
|
|
93
96
|
if (features.backgroundSync) {
|
|
94
97
|
const authType = features.auth.enabled ? features.auth.type : undefined;
|
|
95
98
|
const mq = features.mutationQueue;
|
|
96
|
-
sw += `\n\n${generateBackgroundSyncHandler(authType, mq.batchSize, mq.batchDelayMs, mq.maxRetries, mq.retryBackoffMs)}`;
|
|
99
|
+
sw += `\n\n${generateBackgroundSyncHandler(authType, mq.batchSize, mq.batchDelayMs, mq.maxRetries, mq.retryBackoffMs, config.features.tagInvalidation.enabled)}`;
|
|
97
100
|
}
|
|
98
101
|
return sw;
|
|
99
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assemble-sw.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/assemble-sw.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"assemble-sw.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/assemble-sw.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export function generateBackgroundSyncHandler(authType, batchSize, batchDelayMs, maxRetries, retryBackoffMs) {
|
|
1
|
+
export function generateBackgroundSyncHandler(authType, batchSize, batchDelayMs, maxRetries, retryBackoffMs, tagInvalidationEnabled) {
|
|
2
|
+
const DB_NAME = "swoff-queue";
|
|
3
|
+
const STORE_NAME = "mutations";
|
|
2
4
|
const credentialsLine = authType === "cookie"
|
|
3
5
|
? ` credentials: "same-origin",`
|
|
4
6
|
: "";
|
|
@@ -19,17 +21,22 @@ function swSleep(ms) {
|
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
async function processMutationQueueInSW() {
|
|
24
|
+
// If any client pages are open, skip entirely — the client always wins when open.
|
|
25
|
+
// Only the SW processes the queue when all tabs are closed (background sync event).
|
|
26
|
+
const activeClients = await self.clients.matchAll();
|
|
27
|
+
if (activeClients.length > 0) return;
|
|
28
|
+
|
|
22
29
|
let succeeded = 0;
|
|
23
30
|
let failed = 0;
|
|
24
31
|
const tagsToInvalidate = new Set();
|
|
25
32
|
|
|
26
33
|
try {
|
|
27
34
|
const db = await new Promise((resolve, reject) => {
|
|
28
|
-
const request = indexedDB.open(
|
|
35
|
+
const request = indexedDB.open("${DB_NAME}", 1);
|
|
29
36
|
request.onupgradeneeded = (e) => {
|
|
30
37
|
const db = e.target.result;
|
|
31
|
-
if (!db.objectStoreNames.contains(
|
|
32
|
-
const store = db.createObjectStore(
|
|
38
|
+
if (!db.objectStoreNames.contains("${STORE_NAME}")) {
|
|
39
|
+
const store = db.createObjectStore("${STORE_NAME}", { keyPath: "id" });
|
|
33
40
|
store.createIndex("by-timestamp", "timestamp");
|
|
34
41
|
}
|
|
35
42
|
};
|
|
@@ -37,8 +44,8 @@ async function processMutationQueueInSW() {
|
|
|
37
44
|
request.onerror = (e) => reject(e.target.error);
|
|
38
45
|
});
|
|
39
46
|
|
|
40
|
-
const tx = db.transaction(
|
|
41
|
-
const store = tx.objectStore(
|
|
47
|
+
const tx = db.transaction("${STORE_NAME}", "readonly");
|
|
48
|
+
const store = tx.objectStore("${STORE_NAME}");
|
|
42
49
|
const index = store.index("by-timestamp");
|
|
43
50
|
const queue = await new Promise((resolve, reject) => {
|
|
44
51
|
const request = index.getAll();
|
|
@@ -59,16 +66,44 @@ async function processMutationQueueInSW() {
|
|
|
59
66
|
continue;
|
|
60
67
|
}
|
|
61
68
|
|
|
69
|
+
// Stop processing if browser went offline during sync
|
|
70
|
+
if (!self.navigator.onLine) break;
|
|
71
|
+
|
|
72
|
+
// Reconstruct request body based on stored bodyType
|
|
73
|
+
let replayBody = null;
|
|
74
|
+
let contentType;
|
|
75
|
+
const bt = item.bodyType || "json";
|
|
76
|
+
if (bt === "formdata") {
|
|
77
|
+
replayBody = new FormData();
|
|
78
|
+
const entries = item.body || [];
|
|
79
|
+
for (let i = 0; i < entries.length; i++) {
|
|
80
|
+
replayBody.append(entries[i][0], entries[i][1]);
|
|
81
|
+
}
|
|
82
|
+
} else if (bt === "blob") {
|
|
83
|
+
replayBody = item.body;
|
|
84
|
+
} else if (bt === "buffer") {
|
|
85
|
+
replayBody = item.body instanceof ArrayBuffer ? new Uint8Array(item.body) : item.body;
|
|
86
|
+
} else {
|
|
87
|
+
replayBody = JSON.stringify(item.body);
|
|
88
|
+
contentType = "application/json";
|
|
89
|
+
}
|
|
90
|
+
|
|
62
91
|
try {
|
|
63
92
|
const response = await fetch(item.url, {
|
|
64
93
|
method: item.method,
|
|
65
|
-
headers: {
|
|
66
|
-
|
|
94
|
+
headers: {
|
|
95
|
+
...(contentType ? { "Content-Type": contentType } : {}),
|
|
96
|
+
...item.headers,
|
|
97
|
+
},
|
|
98
|
+
body: replayBody,
|
|
67
99
|
${credentialsLine} });
|
|
68
100
|
if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
|
|
69
101
|
|
|
70
102
|
if (item.tags) {
|
|
71
|
-
item.tags.forEach((tag) =>
|
|
103
|
+
item.tags.forEach((tag) => {
|
|
104
|
+
tagsToInvalidate.add(tag);
|
|
105
|
+
if (typeof invalidateByTag !== "undefined") invalidateByTag(tag);
|
|
106
|
+
});
|
|
72
107
|
}
|
|
73
108
|
|
|
74
109
|
await removeFromSWQueue(db, item.id);
|
|
@@ -84,15 +119,22 @@ ${credentialsLine} });
|
|
|
84
119
|
if (SW_BATCH_DELAY_MS > 0 && succeeded + failed < total) {
|
|
85
120
|
await swSleep(SW_BATCH_DELAY_MS);
|
|
86
121
|
}
|
|
122
|
+
|
|
123
|
+
// Emit progress after every SW_BATCH_SIZE mutations
|
|
124
|
+
if ((succeeded + failed) % SW_BATCH_SIZE === 0 || succeeded + failed === total) {
|
|
125
|
+
const clients = await self.clients.matchAll();
|
|
126
|
+
for (const client of clients) {
|
|
127
|
+
client.postMessage({
|
|
128
|
+
type: "BACKGROUND_SYNC_PROGRESS",
|
|
129
|
+
detail: { succeeded, failed, total, current: succeeded + failed },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
87
133
|
}
|
|
88
134
|
} catch (err) {
|
|
89
135
|
console.error("Background sync failed:", err);
|
|
90
136
|
}
|
|
91
137
|
|
|
92
|
-
for (const tag of tagsToInvalidate) {
|
|
93
|
-
await invalidateByTag(tag);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
138
|
const clients = await self.clients.matchAll();
|
|
97
139
|
for (const client of clients) {
|
|
98
140
|
client.postMessage({
|
|
@@ -103,8 +145,8 @@ ${credentialsLine} });
|
|
|
103
145
|
}
|
|
104
146
|
|
|
105
147
|
async function removeFromSWQueue(db, id) {
|
|
106
|
-
const tx = db.transaction(
|
|
107
|
-
tx.objectStore(
|
|
148
|
+
const tx = db.transaction("${STORE_NAME}", "readwrite");
|
|
149
|
+
tx.objectStore("${STORE_NAME}").delete(id);
|
|
108
150
|
await new Promise((resolve, reject) => {
|
|
109
151
|
tx.oncomplete = () => resolve();
|
|
110
152
|
tx.onerror = () => reject(tx.error);
|
|
@@ -112,8 +154,8 @@ async function removeFromSWQueue(db, id) {
|
|
|
112
154
|
}
|
|
113
155
|
|
|
114
156
|
async function updateInSWQueue(db, item) {
|
|
115
|
-
const tx = db.transaction(
|
|
116
|
-
tx.objectStore(
|
|
157
|
+
const tx = db.transaction("${STORE_NAME}", "readwrite");
|
|
158
|
+
tx.objectStore("${STORE_NAME}").put(item);
|
|
117
159
|
await new Promise((resolve, reject) => {
|
|
118
160
|
tx.oncomplete = () => resolve();
|
|
119
161
|
tx.onerror = () => reject(tx.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-sync-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/background-sync-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,6BAA6B,CAAC,QAA4B,EAAE,SAAiB,EAAE,YAAoB,EAAE,UAAkB,EAAE,cAAsB;
|
|
1
|
+
{"version":3,"file":"background-sync-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/background-sync-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,6BAA6B,CAAC,QAA4B,EAAE,SAAiB,EAAE,YAAoB,EAAE,UAAkB,EAAE,cAAsB,EAAE,sBAA+B;IAC9L,MAAM,OAAO,GAAG,aAAa,CAAC;IAC9B,MAAM,UAAU,GAAG,WAAW,CAAC;IAE/B,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ;QAC3C,CAAC,CAAC,uCAAuC;QACzC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;wBAOe,SAAS;4BACL,YAAY;yBACf,UAAU;8BACL,cAAc;;;;;;;;;;;;;;;;;;wCAkBJ,OAAO;;;6CAGF,UAAU;gDACP,UAAU;;;;;;;;iCAQzB,UAAU;oCACP,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmD5C,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAiDc,UAAU;oBACrB,UAAU;;;;;;;;+BAQC,UAAU;oBACrB,UAAU;;;;;EAK5B,CAAC;AACH,CAAC"}
|
|
@@ -7,8 +7,8 @@ export function generateConfigHeader(config, resolvedVersion) {
|
|
|
7
7
|
* Generated from swoff.config.json
|
|
8
8
|
* DO NOT EDIT MANUALLY
|
|
9
9
|
* Version: ${resolvedVersion}
|
|
10
|
-
* Features: version
|
|
11
|
-
* Default Strategy: ${config.features.serviceWorker.
|
|
10
|
+
* Features: version=${config.features.serviceWorker.version}, mutationQueue=${config.features.mutationQueue.enabled}, backgroundSync=${config.features.backgroundSync}, tagInvalidation=${config.features.tagInvalidation.enabled}
|
|
11
|
+
* Default Strategy: ${config.features.serviceWorker.strategy.default}
|
|
12
12
|
* See: https://swoff.netlify.app/docs
|
|
13
13
|
*/`;
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-header.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/config-header.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,eAAuB;IAC/E,OAAO;;;;cAIK,eAAe
|
|
1
|
+
{"version":3,"file":"config-header.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/config-header.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,eAAuB;IAC/E,OAAO;;;;cAIK,eAAe;uBACN,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,mBAAmB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,oBAAoB,MAAM,CAAC,QAAQ,CAAC,cAAc,qBAAqB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO;uBAC3M,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO;;IAEjE,CAAC;AACL,CAAC"}
|