@swoff/cli 0.3.6 → 0.3.8
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 +43 -326
- package/bin/swoff +8 -14
- package/dist/__tests__/assemble-sw.test.js +6 -6
- package/dist/__tests__/assemble-sw.test.js.map +1 -1
- package/dist/__tests__/cli-integration.test.js +0 -1
- package/dist/__tests__/cli-integration.test.js.map +1 -1
- package/dist/__tests__/config-types.test.js +9 -5
- package/dist/__tests__/config-types.test.js.map +1 -1
- package/dist/__tests__/file-generators.test.js +12 -23
- package/dist/__tests__/file-generators.test.js.map +1 -1
- package/dist/__tests__/loader.test.js +0 -1
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/validator.test.js +50 -2
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/commands/add.js +7 -6
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +36 -9
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/info.js +45 -8
- package/dist/lib/commands/info.js.map +1 -1
- package/dist/lib/commands/init.js +6 -2
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/config/validator.js +85 -4
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-fetch.js +3 -3
- package/dist/lib/generators/file-generators/auth-fetch.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-store.js +114 -5
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-user.js +2 -2
- package/dist/lib/generators/file-generators/auth-user.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +1 -3
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +5 -17
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +86 -20
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +28 -210
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +152 -0
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -0
- package/dist/lib/generators/file-generators/guide-generator.js +357 -36
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +130 -34
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js +126 -0
- package/dist/lib/generators/file-generators/mutation-state.js.map +1 -0
- package/dist/lib/generators/file-generators/push.js +143 -0
- package/dist/lib/generators/file-generators/push.js.map +1 -0
- package/dist/lib/generators/file-generators/quick-readme.js +71 -11
- package/dist/lib/generators/file-generators/quick-readme.js.map +1 -1
- package/dist/lib/generators/file-generators/server-push.js +136 -0
- package/dist/lib/generators/file-generators/server-push.js.map +1 -0
- package/dist/lib/generators/file-generators/sw-generator-build.js +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +1 -1
- package/dist/lib/generators/file-generators/sw-push.js +67 -0
- package/dist/lib/generators/file-generators/sw-push.js.map +1 -0
- package/dist/lib/generators/file-generators/sw-template.js +2 -0
- package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
- package/dist/lib/generators/file-generators/type-definitions.js +39 -11
- package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
- package/dist/lib/generators/sw-generator.js +8 -9
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js +6 -2
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +11 -2
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +22 -8
- package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/config-header.js +1 -1
- package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
- package/dist/lib/generators/sw-sections/default-template.js +2 -30
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +230 -120
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/install-handler.js +12 -10
- package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/server-push-handler.js +114 -0
- package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -0
- package/dist/lib/generators/sw-sections/tag-management.js +17 -5
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +16 -10
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +44 -4
- package/dist/lib/shared/config-types.js.map +1 -1
- package/package.json +3 -2
- package/templates/hooks/useAuth.jsx +30 -0
- package/templates/hooks/useAuth.tsx +30 -0
- package/templates/hooks/useBackgroundSync.jsx +31 -0
- package/templates/hooks/useBackgroundSync.tsx +31 -0
- package/templates/hooks/useCacheInvalidation.jsx +19 -0
- package/templates/hooks/useCacheInvalidation.tsx +19 -0
- package/templates/hooks/useCachedFetch.jsx +94 -0
- package/templates/hooks/useCachedFetch.tsx +112 -0
- package/templates/hooks/useMutation.jsx +76 -0
- package/templates/hooks/useMutation.tsx +97 -0
- package/templates/hooks/useMutationQueue.jsx +42 -0
- package/templates/hooks/useMutationQueue.tsx +49 -0
- package/templates/hooks/useMutationState.jsx +27 -0
- package/templates/hooks/useMutationState.tsx +41 -0
- package/templates/hooks/useNetworkStatus.jsx +19 -0
- package/templates/hooks/useNetworkStatus.tsx +19 -0
- package/templates/hooks/usePrefetch.jsx +10 -0
- package/templates/hooks/usePrefetch.tsx +25 -0
- package/templates/hooks/usePushSubscription.jsx +67 -0
- package/templates/hooks/usePushSubscription.tsx +67 -0
- package/templates/hooks/useSWUpdate.jsx +76 -0
- package/templates/hooks/useSWUpdate.tsx +76 -0
|
@@ -17,33 +17,93 @@ export function generateGuide(ctx) {
|
|
|
17
17
|
wb("## 📦 Service Worker Registration");
|
|
18
18
|
w("The service worker handles caching, offline support, background sync, and PWA installability.");
|
|
19
19
|
w("");
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
w("### `client-injector.ts` — Single entry point");
|
|
21
|
+
w("This is the **only file you need to import** at app startup to enable all Swoff features.");
|
|
22
|
+
w("```ts");
|
|
23
|
+
w(`import { initServiceWorker } from "./swoff/client-injector.${ext}";`);
|
|
24
|
+
w("initServiceWorker();");
|
|
25
|
+
w("```");
|
|
26
|
+
w("It wires together: SW registration, PWA install prompt, mutation queue online listener, and cross-tab sync.");
|
|
27
|
+
w("");
|
|
28
|
+
w("### `sw/injector.ts` — SW registration logic");
|
|
29
|
+
w("Handles registering the service worker, checking for updates via version.json, and dispatching");
|
|
30
|
+
w("update-available / ready / error events on the window.");
|
|
31
|
+
w("");
|
|
32
|
+
w("**Functions:**");
|
|
33
|
+
w("- `initServiceWorker()` — registers the SW and checks for updates");
|
|
34
|
+
w("- `handleUpdateApproved(version)` — accepts a pending update and reloads on activation");
|
|
35
|
+
w("- `skipWaiting()` — activates a waiting SW without reloading");
|
|
36
|
+
w("");
|
|
37
|
+
// ── Stale Time & Auto-Refresh ──
|
|
38
|
+
wb("## ⏱️ Stale Time — fresh vs stale data");
|
|
39
|
+
w("`staleTime` controls how long cached data is considered **fresh** before it becomes **stale**.");
|
|
40
|
+
w("When data is fresh, the SW serves it immediately from cache — no network request.");
|
|
41
|
+
w("When data is stale, the SW serves the cached copy but triggers a **background refresh**,");
|
|
42
|
+
w("so the next read returns fresh data.");
|
|
43
|
+
w("");
|
|
44
|
+
w("This is different from `maxCacheAge` (which **evicts** old entries entirely). StaleTime keeps the");
|
|
45
|
+
w("entry usable while silently refreshing it — the user never sees a loading spinner.");
|
|
46
|
+
w("");
|
|
47
|
+
w("**3-tier staleTime resolution (like strategies):**");
|
|
48
|
+
w("1. **Per-request** — `fetchWithCache(url, { staleTime: 30 })` overrides everything");
|
|
49
|
+
w("2. **Route pattern** — `\"/api/*\": { staleTime: 60 }` in `swoff.config.json`");
|
|
50
|
+
w("3. **Global default** — `features.serviceWorker.staleTime`");
|
|
51
|
+
w("");
|
|
52
|
+
w("**How staleTime changes each strategy:**");
|
|
53
|
+
w("| Strategy | Fresh data (within staleTime) | Stale data (past staleTime) |");
|
|
54
|
+
w("|----------|------------------------------|----------------------------|");
|
|
55
|
+
w("| `cache-first` | Serve from cache, no network | Serve from cache + background refresh |");
|
|
56
|
+
w("| `network-first` | Serve from cache, skip network | Try network first, fall back to cache |");
|
|
57
|
+
w("| `stale-while-revalidate` | Serve from cache, no refresh | Serve + background refresh (was always-refresh) |");
|
|
58
|
+
w("| `cache-only` | Serve from cache | Serve from cache + best-effort refresh |");
|
|
59
|
+
w("| `network-only` | No effect | No effect |");
|
|
60
|
+
w("");
|
|
61
|
+
// ── Auto-refetch (Window Focus / Reconnect / Interval) ──
|
|
62
|
+
wb("## 🔄 Auto-refetch — keep data fresh automatically");
|
|
63
|
+
w("Three events can trigger an automatic refetch at the hook level:");
|
|
64
|
+
w("");
|
|
65
|
+
w("- **refetchOnWindowFocus**: When the user returns to the tab, re-fetch stale data");
|
|
66
|
+
w("- **refetchOnReconnect**: When the browser comes back online, re-fetch stale data");
|
|
67
|
+
w("- **refetchInterval**: Poll the server every N seconds for fresh data");
|
|
68
|
+
w("");
|
|
69
|
+
w("These are configured at 3 tiers too:");
|
|
70
|
+
w("- Global: `features.serviceWorker.refetchOnWindowFocus: true`");
|
|
71
|
+
w("- Per-route: `\"/api/*\": { refetchOnWindowFocus: false }`");
|
|
72
|
+
w("- Per-request: `useCachedFetch(url, { refetchOnWindowFocus: true })`");
|
|
73
|
+
w("");
|
|
74
|
+
if (ctx.frameworkName === "react") {
|
|
75
|
+
w("### React Hook: `useMutation`");
|
|
76
|
+
w("Track mutation state (loading, error, success) per-operation.");
|
|
77
|
+
w("```tsx");
|
|
78
|
+
w(`import { useMutation } from "./swoff/hooks/useMutation.${ext}x";`);
|
|
79
|
+
w("");
|
|
80
|
+
w('const { mutate, isLoading, isError, isSuccess, data, error, reset } = useMutation({');
|
|
81
|
+
w(" onSuccess: (data) => console.log('done', data),");
|
|
82
|
+
w(" onError: (err) => console.error('failed', err),");
|
|
83
|
+
w("});");
|
|
84
|
+
w("");
|
|
85
|
+
w('mutate("/api/todos", { method: "POST", body: JSON.stringify({ title: "New" }) });');
|
|
86
|
+
w("```");
|
|
87
|
+
w("");
|
|
88
|
+
w("### React Hook: `usePrefetch`");
|
|
89
|
+
w("Warm the cache proactively, e.g., on link hover.");
|
|
90
|
+
w("```tsx");
|
|
91
|
+
w(`import { usePrefetch } from "./swoff/hooks/usePrefetch.${ext}x";`);
|
|
92
|
+
w("");
|
|
93
|
+
w("const prefetch = usePrefetch();");
|
|
94
|
+
w('return <a onMouseEnter={() => prefetch("/api/todos")} href="/todos">Todos</a>;');
|
|
27
95
|
w("```");
|
|
28
|
-
w("It wires together: SW registration, PWA install prompt, mutation queue online listener, and cross-tab sync.");
|
|
29
96
|
w("");
|
|
30
|
-
if (config.features.clientRegistration) {
|
|
31
|
-
w("### `sw/injector.ts` — SW registration logic");
|
|
32
|
-
w("Handles registering the service worker, checking for updates via version.json, and dispatching");
|
|
33
|
-
w("update-available / ready / error events on the window.");
|
|
34
|
-
w("");
|
|
35
|
-
w("**Functions:**");
|
|
36
|
-
w("- `initServiceWorker()` — registers the SW and checks for updates");
|
|
37
|
-
w("- `handleUpdateApproved(version)` — accepts a pending update and reloads on activation");
|
|
38
|
-
w("- `skipWaiting()` — activates a waiting SW without reloading");
|
|
39
|
-
w("");
|
|
40
|
-
}
|
|
41
97
|
}
|
|
42
98
|
// ── Fetch Wrapper ──
|
|
43
99
|
wb("## 🌐 fetchWithCache — API calls with caching");
|
|
44
100
|
w("A drop-in replacement for `fetch()` that communicates with the service worker about caching strategy.");
|
|
45
101
|
w("GET requests are cached by the SW for offline access; POST/PUT/DELETE pass through.");
|
|
46
102
|
w("");
|
|
103
|
+
w("**Important:** Use `fetchWithCache` for all API calls — it sets the `X-SW-Cache-Strategy` header that");
|
|
104
|
+
w("the SW uses to determine whether to apply a caching strategy. Plain `fetch()` works for uncached requests,");
|
|
105
|
+
w("but if `cacheStrategy` is set to `\"explicit-only\"`, the SW will skip plain `fetch()` calls entirely.");
|
|
106
|
+
w("");
|
|
47
107
|
w("### `fetch-wrapper.ts`");
|
|
48
108
|
w("```ts");
|
|
49
109
|
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
@@ -64,7 +124,7 @@ export function generateGuide(ctx) {
|
|
|
64
124
|
w("");
|
|
65
125
|
w("**Returns** `{ response: Response, fromCache: boolean }` — `fromCache` lets the UI show stale indicators when a stale-while-revalidate fallback is served.");
|
|
66
126
|
w("");
|
|
67
|
-
w("**Note:**
|
|
127
|
+
w("**Note:** For authenticated requests, pass `{ auth: true }` — there is no separate auth fetch wrapper.");
|
|
68
128
|
w("");
|
|
69
129
|
if (ctx.frameworkName === "react") {
|
|
70
130
|
w("### React Hook: `useCachedFetch`");
|
|
@@ -72,21 +132,144 @@ export function generateGuide(ctx) {
|
|
|
72
132
|
w("```tsx");
|
|
73
133
|
w(`import { useCachedFetch } from "./swoff/hooks/useCachedFetch.${ext}x";`);
|
|
74
134
|
w("");
|
|
75
|
-
w('const { data, error, loading, refetch } = useCachedFetch("/api/todos");');
|
|
135
|
+
w('const { data, error, loading, refetch } = useCachedFetch<Todo[]>("/api/todos");');
|
|
76
136
|
w("```");
|
|
77
137
|
w("");
|
|
78
|
-
w("**Returns** `{ data:
|
|
138
|
+
w("**Returns** `{ data: T | null, error, loading, refetch }` — `data` is the parsed JSON response.");
|
|
79
139
|
w("");
|
|
80
140
|
w("The hook listens for `cache-invalidated` events (when tag invalidation is enabled) and automatically");
|
|
81
141
|
w("re-fetches if the event's tags match the URL. Call `refetch()` to manually refresh.");
|
|
82
142
|
w("");
|
|
143
|
+
w("### Dependent queries");
|
|
144
|
+
w("Use `enabled: false` or pass a nullable URL to skip fetching until a condition is met.");
|
|
145
|
+
w("When `enabled` becomes `true` or the URL becomes non-null, the query automatically starts fetching.");
|
|
146
|
+
w("```tsx");
|
|
147
|
+
w('const { data: user } = useCachedFetch<User>("/api/me");');
|
|
148
|
+
w('const { data: posts } = useCachedFetch<Post[]>(user ? "/api/posts" : null);');
|
|
149
|
+
w("// or");
|
|
150
|
+
w('const { data: posts2 } = useCachedFetch<Post[]>("/api/posts", { enabled: !!user });');
|
|
151
|
+
w("```");
|
|
152
|
+
w("");
|
|
153
|
+
w("### Query cancellation (AbortController)");
|
|
154
|
+
w("`fetchWithCache` integrates with the dedup map so duplicate requests are automatically deduplicated.");
|
|
155
|
+
w("Pass an AbortSignal to cancel an in-flight request:");
|
|
156
|
+
w("```tsx");
|
|
157
|
+
w("useEffect(() => {");
|
|
158
|
+
w(" const ctrl = new AbortController();");
|
|
159
|
+
w(' fetchWithCache("/api/search", { signal: ctrl.signal });');
|
|
160
|
+
w(" return () => ctrl.abort();");
|
|
161
|
+
w("}, [query]);");
|
|
162
|
+
w("```");
|
|
163
|
+
w("");
|
|
164
|
+
w("### React Hook: `useNetworkStatus`");
|
|
165
|
+
w("Tracks online/offline state reactively.");
|
|
166
|
+
w("```tsx");
|
|
167
|
+
w(`import { useNetworkStatus } from "./swoff/hooks/useNetworkStatus.${ext}x";`);
|
|
168
|
+
w("");
|
|
169
|
+
w("const online = useNetworkStatus();");
|
|
170
|
+
w("```");
|
|
171
|
+
w("");
|
|
172
|
+
w("**Returns** `boolean` — `true` when online, `false` when offline.");
|
|
173
|
+
w("");
|
|
174
|
+
}
|
|
175
|
+
// ── Cache Strategy Resolution ──
|
|
176
|
+
wb("## 🎯 Cache Strategy Resolution");
|
|
177
|
+
w("The SW uses a 3-tier priority system to determine which caching strategy applies to each request:");
|
|
178
|
+
w("");
|
|
179
|
+
w("1. **Per-request override (highest)** — set `strategy` or `staleWhileRevalidate` on `fetchWithCache()`.");
|
|
180
|
+
w(" Sent as `X-SW-Strategy` header to the SW.");
|
|
181
|
+
w("2. **URL pattern match** — configured in `swoff.config.json` under `features.serviceWorker.strategies`.");
|
|
182
|
+
w(" e.g. `\"/api/*\": \"network-first\"` matches all paths starting with `/api/`.");
|
|
183
|
+
w("3. **Default (lowest)** — `features.serviceWorker.defaultStrategy` (default: `\"cache-first\"`).");
|
|
184
|
+
w("");
|
|
185
|
+
w("### Cache strategy mode");
|
|
186
|
+
w("The `features.serviceWorker.cacheStrategy` option controls when strategies are invoked:");
|
|
187
|
+
w("");
|
|
188
|
+
w("- `\"all\"` (default): every GET/HEAD request goes through strategy dispatch, including plain `fetch()` calls.");
|
|
189
|
+
w("- `\"explicit-only\"`: only requests with an `X-SW-Cache-Strategy` header (set automatically by `fetchWithCache()`)");
|
|
190
|
+
w(" are processed by the SW strategy system. Plain `fetch()` calls pass through unmodified.");
|
|
191
|
+
w("");
|
|
192
|
+
w("### Request dispatch flow");
|
|
193
|
+
w("Each GET/HEAD request follows this path through the SW:");
|
|
194
|
+
w("");
|
|
195
|
+
w("```");
|
|
196
|
+
w("navigation (SPA fallback) → precache check → strategy dispatch → network pass-through");
|
|
197
|
+
w("```");
|
|
198
|
+
w("");
|
|
199
|
+
w("### Available strategies");
|
|
200
|
+
w("");
|
|
201
|
+
w("| Strategy | Behavior (without staleTime) | Behavior (with staleTime) | Best for |");
|
|
202
|
+
w("|----------|------------------------------|---------------------------|----------|");
|
|
203
|
+
w("| `cache-first` | Return cached if available, else fetch + cache. Default | Fresh: pure cache. Stale: cache + bg refresh | Static assets, images, fonts |");
|
|
204
|
+
w("| `network-first` | Try network, cache on success, fall back to cache | Fresh: pure cache (skip network!). Stale: try network | API endpoints, dynamic content |");
|
|
205
|
+
w("| `stale-while-revalidate` | Return cached immediately, refresh in background | Fresh: pure cache (no refresh). Stale: cache + bg refresh | Fast UI, non-critical data |");
|
|
206
|
+
w("| `cache-only` | Serve from cache only (404 if missing) | Fresh: pure cache. Stale: cache + best-effort refresh | Offline-critical assets |");
|
|
207
|
+
w("| `network-only` | Always fetch, never cache | No effect | Sensitive or real-time data |");
|
|
208
|
+
w("");
|
|
209
|
+
// ── GraphQL ──
|
|
210
|
+
if (config.features.graphql.enabled) {
|
|
211
|
+
wb("## ⚡ GraphQL");
|
|
212
|
+
w("Swoff brings caching, offline queue, auth, and tag-based invalidation to GraphQL APIs via `fetchWithGql`. It hashes");
|
|
213
|
+
w("the query + variables into a deterministic cache key (`X-SW-Cache-Key`) for SW-level caching, and auto-generates");
|
|
214
|
+
w("tags from operation names for automatic cache invalidation after mutations.");
|
|
215
|
+
w("");
|
|
216
|
+
w("### `gql-wrapper.ts`");
|
|
217
|
+
w("```ts");
|
|
218
|
+
w(`import { queryGql, mutateGql } from "./swoff/gql-wrapper.${ext}";`);
|
|
219
|
+
w("");
|
|
220
|
+
w("// Query — cached with body-hash key");
|
|
221
|
+
w('const { data } = await queryGql("{ todos { id title } }");');
|
|
222
|
+
w("");
|
|
223
|
+
w("// Query with variables");
|
|
224
|
+
w('const { data: todo } = await queryGql(');
|
|
225
|
+
w(' "query GetTodo($id: ID!) { todo(id: $id) { id title } }",');
|
|
226
|
+
w(' { id: "42" },');
|
|
227
|
+
w(");");
|
|
228
|
+
w("");
|
|
229
|
+
w("// Mutation — auto-invalidates 'todos' cache");
|
|
230
|
+
w('const { data: created } = await mutateGql(');
|
|
231
|
+
w(' "mutation CreateTodo($title: String!) { createTodo(title: $title) { id } }",');
|
|
232
|
+
w(' { title: "New task" },');
|
|
233
|
+
w(");");
|
|
234
|
+
w("");
|
|
235
|
+
w("// With auth, stale-while-revalidate, and custom tags");
|
|
236
|
+
w('const { data, fromCache } = await queryGql(');
|
|
237
|
+
w(' "query Me { me { name } }",');
|
|
238
|
+
w(" {},");
|
|
239
|
+
w(' { auth: true, staleWhileRevalidate: true, tags: ["users"] },');
|
|
240
|
+
w(");");
|
|
241
|
+
w("```");
|
|
242
|
+
w("");
|
|
243
|
+
w("**How it works:**");
|
|
244
|
+
w("- Queries are POSTed as `type: \"read\"` with `X-SW-Cache-Key: gql:<sha256-hash>`");
|
|
245
|
+
w("- The SW caches responses under a virtual URL (`/__swc/gql:<hash>`) so different queries never collide");
|
|
246
|
+
w("- Mutations are POSTed as `type: \"mutation\"` — auto-invalidate tags from operation name");
|
|
247
|
+
w("- Offline mutations are queued via the mutation queue (if enabled)");
|
|
248
|
+
w("- Auth, strategy override, and custom tags work the same as `fetchWithCache`");
|
|
249
|
+
w("");
|
|
250
|
+
w("**Functions:**");
|
|
251
|
+
w("- `fetchWithGql<T>(query, options?)` — core GQL fetch with all Swoff features");
|
|
252
|
+
w("- `queryGql<T>(query, variables?, options?)` — shorthand for queries");
|
|
253
|
+
w("- `mutateGql<T>(mutation, variables?, options?)` — shorthand for mutations");
|
|
254
|
+
w("");
|
|
255
|
+
w("**Config:**");
|
|
256
|
+
w("```json");
|
|
257
|
+
w('"graphql": { "enabled": true, "endpoint": "/graphql" }');
|
|
258
|
+
w("```");
|
|
259
|
+
w("");
|
|
83
260
|
}
|
|
84
261
|
// ── Mutation Queue ──
|
|
85
|
-
if (config.features.mutationQueue) {
|
|
262
|
+
if (config.features.mutationQueue.enabled) {
|
|
86
263
|
wb("## 📝 Mutation Queue — offline writes that sync when back online");
|
|
87
264
|
w("When the user is offline and performs a write (POST/PUT/PATCH/DELETE), `queueMutation` stores it");
|
|
88
265
|
w("in IndexedDB. When the connection returns, `processMutationQueue` replays them in order.");
|
|
89
266
|
w("");
|
|
267
|
+
w("**Configurable batching:** set `batchSize`, `batchDelayMs`, `maxRetries`, and `retryBackoffMs` in `swoff.config.json` under `features.mutationQueue`.");
|
|
268
|
+
w("- `batchSize` (default 1) — mutations per progress event");
|
|
269
|
+
w("- `batchDelayMs` (default 0) — delay between mutations (rate limiting)");
|
|
270
|
+
w("- `maxRetries` (default 5) — max attempts before dropping");
|
|
271
|
+
w("- `retryBackoffMs` (default 1000) — exponential backoff base (nextRetry = backoff × 2^retryCount)");
|
|
272
|
+
w("");
|
|
90
273
|
w("### `mutation-queue.ts`");
|
|
91
274
|
w("```ts");
|
|
92
275
|
w(`import { queueMutation, processMutationQueue, flushMutations, getPendingCount } from "./swoff/mutation-queue.${ext}";`);
|
|
@@ -105,7 +288,7 @@ export function generateGuide(ctx) {
|
|
|
105
288
|
w("");
|
|
106
289
|
w("**Functions:**");
|
|
107
290
|
w("- `queueMutation(mutation)` — store a write for later sync");
|
|
108
|
-
w("- `processMutationQueue()` — replay all queued writes.
|
|
291
|
+
w("- `processMutationQueue()` — replay all queued writes. Respects batchDelayMs, maxRetries, retryBackoffMs.");
|
|
109
292
|
w("- `flushMutations()` — same as processMutationQueue. Call after re-login.");
|
|
110
293
|
w("- `getPendingCount()` — number of mutations waiting to sync.");
|
|
111
294
|
w("");
|
|
@@ -124,6 +307,18 @@ export function generateGuide(ctx) {
|
|
|
124
307
|
w("");
|
|
125
308
|
w("> ⚠️ Background Sync is Chrome/Edge only. Not supported in Firefox or Safari.");
|
|
126
309
|
w("");
|
|
310
|
+
if (ctx.frameworkName === "react") {
|
|
311
|
+
w("### React Hook: `useBackgroundSync`");
|
|
312
|
+
w("Reactive background sync state and trigger.");
|
|
313
|
+
w("```tsx");
|
|
314
|
+
w(`import { useBackgroundSync } from "./swoff/hooks/useBackgroundSync.${ext}x";`);
|
|
315
|
+
w("");
|
|
316
|
+
w('const { supported, registered, lastSync, triggerSync } = useBackgroundSync();');
|
|
317
|
+
w("```");
|
|
318
|
+
w("");
|
|
319
|
+
w("**Returns** `{ supported, registered, lastSync, triggerSync }` — `triggerSync()` calls `syncWhenPossible()`.");
|
|
320
|
+
w("");
|
|
321
|
+
}
|
|
127
322
|
}
|
|
128
323
|
}
|
|
129
324
|
// ── Auth ──
|
|
@@ -163,29 +358,31 @@ export function generateGuide(ctx) {
|
|
|
163
358
|
w("- `isAuthValid(auth)` — check expiry");
|
|
164
359
|
w("- `createAuthFromResponse(response)` — extract AuthData from login response. **Edit this.**");
|
|
165
360
|
w("");
|
|
166
|
-
w("###
|
|
167
|
-
w("
|
|
168
|
-
w("No separate `authenticatedMutation` needed — just use `authenticatedFetch` for both reads and writes.");
|
|
361
|
+
w("### Authenticated API calls with fetchWithCache");
|
|
362
|
+
w("Use `fetchWithCache` with `auth: true` for all authenticated requests — no separate auth fetch needed.");
|
|
169
363
|
w("```ts");
|
|
170
|
-
w(`import {
|
|
364
|
+
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
365
|
+
w(`import { ensureValidAuth } from "./swoff/auth/store.${ext}";`);
|
|
171
366
|
w("");
|
|
172
367
|
w("// Authenticated GET");
|
|
173
|
-
w('const
|
|
368
|
+
w('const { response } = await fetchWithCache("/api/me", { auth: true });');
|
|
369
|
+
w('const user = await response.json();');
|
|
174
370
|
w("");
|
|
175
371
|
w("// Authenticated POST (mutation)");
|
|
176
|
-
w(
|
|
372
|
+
w('await fetchWithCache("/api/todos", {');
|
|
177
373
|
w(' method: "POST",');
|
|
178
374
|
w(' body: JSON.stringify({ title: "New" }),');
|
|
375
|
+
w(' auth: true,');
|
|
179
376
|
w("});");
|
|
180
377
|
w("```");
|
|
181
378
|
w("");
|
|
182
379
|
w("**Functions:**");
|
|
183
|
-
w("- `
|
|
380
|
+
w("- `fetchWithCache(input, options)` — pass `{ auth: true }` for auth headers, cache bypass for auth endpoints, and 401 handling.");
|
|
184
381
|
w("- `ensureValidAuth()` — check expiry and refresh token if needed (uses refreshPath from config).");
|
|
185
382
|
w("");
|
|
186
383
|
w("**Where to edit:**");
|
|
187
|
-
w("- The `isAuthUrl` function in `auth/
|
|
188
|
-
w("- If your auth type is `custom`, edit the `withAuthHeaders` function.");
|
|
384
|
+
w("- The `isAuthUrl` function in `auth/store.ts` lists auth endpoints that bypass the SW cache. Edit this list if your backend uses different paths.");
|
|
385
|
+
w("- If your auth type is `custom`, edit the `withAuthHeaders` function in `auth/store.ts`.");
|
|
189
386
|
w("");
|
|
190
387
|
w("### `auth/user.ts` — User data caching");
|
|
191
388
|
w("```ts");
|
|
@@ -212,6 +409,7 @@ export function generateGuide(ctx) {
|
|
|
212
409
|
w("### React Hooks");
|
|
213
410
|
w("- `useAuth()` — returns `{ authenticated, user, online }`, listens to online/offline/auth changes");
|
|
214
411
|
w("- `useCachedFetch(url, options?)` — fetches with auto-refetch on tag invalidation, see Fetch Wrapper section");
|
|
412
|
+
w("- `useNetworkStatus()` — returns `boolean`, standalone online/offline tracker, see Fetch Wrapper section");
|
|
215
413
|
w("");
|
|
216
414
|
}
|
|
217
415
|
}
|
|
@@ -255,6 +453,18 @@ export function generateGuide(ctx) {
|
|
|
255
453
|
w("- `invalidateByTag(tag)` — invalidate a single tag. Dispatches `cache-invalidated` event.");
|
|
256
454
|
w("- `invalidateByTags(tags)` — invalidate multiple tags.");
|
|
257
455
|
w("");
|
|
456
|
+
if (ctx.frameworkName === "react") {
|
|
457
|
+
w("### React Hook: `useCacheInvalidation`");
|
|
458
|
+
w("Reactive wrapper around cache invalidation functions.");
|
|
459
|
+
w("```tsx");
|
|
460
|
+
w(`import { useCacheInvalidation } from "./swoff/hooks/useCacheInvalidation.${ext}x";`);
|
|
461
|
+
w("");
|
|
462
|
+
w('const { invalidateByTag, invalidateByTags, invalidateUrl } = useCacheInvalidation();');
|
|
463
|
+
w("```");
|
|
464
|
+
w("");
|
|
465
|
+
w("Returns stable `useCallback`-wrapped versions of each invalidation function.");
|
|
466
|
+
w("");
|
|
467
|
+
}
|
|
258
468
|
}
|
|
259
469
|
// ── Cross-tab Sync ──
|
|
260
470
|
if (config.features.crossTabSync) {
|
|
@@ -270,6 +480,107 @@ export function generateGuide(ctx) {
|
|
|
270
480
|
w("");
|
|
271
481
|
}
|
|
272
482
|
}
|
|
483
|
+
// ── Server Push ──
|
|
484
|
+
if (config.features.serverPush.enabled) {
|
|
485
|
+
wb("## 📡 Server Push Events — real-time cache invalidation");
|
|
486
|
+
w("Instead of polling, the service worker maintains an SSE or WebSocket connection to your push endpoint.");
|
|
487
|
+
w("When the server signals that data has changed (via an `invalidate` event), the SW automatically");
|
|
488
|
+
w("calls `invalidateByTag()` so the next read gets fresh data.");
|
|
489
|
+
w("");
|
|
490
|
+
const pushType = config.features.serverPush.type;
|
|
491
|
+
w(`### Transport: **${pushType.toUpperCase()}**`);
|
|
492
|
+
if (pushType === "sse") {
|
|
493
|
+
w("The SW establishes an `EventSource` connection. The server sends events with event name `invalidate`");
|
|
494
|
+
w("and a JSON payload: `{ tags: string[] }`. On receiving it, the SW calls `invalidateByTags(tags)`.");
|
|
495
|
+
w("");
|
|
496
|
+
w("**Server format (SSE):**");
|
|
497
|
+
w("```");
|
|
498
|
+
w("event: invalidate");
|
|
499
|
+
w("data: {\"tags\":[\"todos\",\"categories\"]}");
|
|
500
|
+
w("");
|
|
501
|
+
w("```");
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
w("The SW establishes a WebSocket connection. The server sends text frames with JSON payload:");
|
|
505
|
+
w('`{ "event": "invalidate", "tags": string[] }`. On receiving it, the SW calls `invalidateByTags(tags)`.');
|
|
506
|
+
w("");
|
|
507
|
+
w("**Server format (WebSocket):**");
|
|
508
|
+
w("```json");
|
|
509
|
+
w('{ "event": "invalidate", "tags": ["todos", "categories"] }');
|
|
510
|
+
w("```");
|
|
511
|
+
}
|
|
512
|
+
w("");
|
|
513
|
+
w("### `server-push.ts` — Client-side connection manager");
|
|
514
|
+
w("```ts");
|
|
515
|
+
w(`import { startPushEvents, stopPushEvents, isPushConnected } from "./swoff/server-push.${ext}";`);
|
|
516
|
+
w("");
|
|
517
|
+
w("// Start listening for push events");
|
|
518
|
+
w("startPushEvents();");
|
|
519
|
+
w("");
|
|
520
|
+
w("// Check connection");
|
|
521
|
+
w('if (isPushConnected()) {');
|
|
522
|
+
w(' console.log("Connected to push endpoint");');
|
|
523
|
+
w("}");
|
|
524
|
+
w("```");
|
|
525
|
+
w("");
|
|
526
|
+
w("**Functions:**");
|
|
527
|
+
w("- `startPushEvents()` — connect to the push endpoint and begin listening for invalidation events");
|
|
528
|
+
w("- `stopPushEvents()` — disconnect from the push endpoint");
|
|
529
|
+
w("- `isPushConnected()` — check if the connection is active");
|
|
530
|
+
w("");
|
|
531
|
+
w("> ⚠️ The service worker directly manages the SSE/WS connection for reliability across page navigations.");
|
|
532
|
+
w("> The client-side `server-push.ts` is a fallback that starts the connection when the SW is not yet active.");
|
|
533
|
+
w("");
|
|
534
|
+
if (ctx.frameworkName === "react") {
|
|
535
|
+
w("### React Hook: `useServerPush()` (coming in a future release)");
|
|
536
|
+
w("");
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
// ── Push Notifications ──
|
|
540
|
+
if (config.features.pushNotifications?.enabled) {
|
|
541
|
+
wb("## 🔔 Push Notifications — subscription management");
|
|
542
|
+
w("Swoff generates a push notification subscription client with IndexedDB persistence");
|
|
543
|
+
w("and the service worker push event handlers.");
|
|
544
|
+
w("");
|
|
545
|
+
w("### `push.ts` — Client-side subscription management");
|
|
546
|
+
w("```ts");
|
|
547
|
+
w(`import { subscribeToPush, unsubscribeFromPush, isSubscribed } from "./swoff/push.${ext}";`);
|
|
548
|
+
w("");
|
|
549
|
+
w("// Subscribe (triggers permission prompt)");
|
|
550
|
+
w('const sub = await subscribeToPush("YOUR_VAPID_PUBLIC_KEY");');
|
|
551
|
+
w("if (sub) {");
|
|
552
|
+
w(' await fetch("/api/push/subscribe", {');
|
|
553
|
+
w(' method: "POST",');
|
|
554
|
+
w(" body: JSON.stringify(sub.toJSON()),");
|
|
555
|
+
w(" });");
|
|
556
|
+
w("}");
|
|
557
|
+
w("");
|
|
558
|
+
w("// Unsubscribe");
|
|
559
|
+
w("await unsubscribeFromPush();");
|
|
560
|
+
w("```");
|
|
561
|
+
w("");
|
|
562
|
+
w("**Functions:**");
|
|
563
|
+
w("- `subscribeToPush(vapidPublicKey)` — request permission and subscribe");
|
|
564
|
+
w("- `unsubscribeFromPush()` — unsubscribe and clear stored subscription");
|
|
565
|
+
w("- `isSubscribed()` — check if subscribed");
|
|
566
|
+
w("- `getPushSubscription()` — get current PushSubscription object");
|
|
567
|
+
w("- `requestNotificationPermission()` — request permission only (returns boolean)");
|
|
568
|
+
w("");
|
|
569
|
+
if (ctx.frameworkName === "react") {
|
|
570
|
+
w("### React Hook: `usePushSubscription`");
|
|
571
|
+
w("```tsx");
|
|
572
|
+
w(`import { usePushSubscription } from "./swoff/hooks/usePushSubscription.${ext}x";`);
|
|
573
|
+
w("");
|
|
574
|
+
w('const { subscribed, subscription, permission, loading, subscribe, unsubscribe } =');
|
|
575
|
+
w(' usePushSubscription("YOUR_VAPID_PUBLIC_KEY");');
|
|
576
|
+
w("```");
|
|
577
|
+
w("");
|
|
578
|
+
w("**Returns** `{ subscribed, subscription, permission, loading, subscribe, unsubscribe }`");
|
|
579
|
+
w("The hook listens for push-subscription-changed and push-permission-changed events.");
|
|
580
|
+
w("Use `subscribe()` and `unsubscribe()` to toggle push notifications.");
|
|
581
|
+
w("");
|
|
582
|
+
}
|
|
583
|
+
}
|
|
273
584
|
// ── PWA ──
|
|
274
585
|
if (config.features.pwa.enabled) {
|
|
275
586
|
wb("## 📱 PWA — installable web app");
|
|
@@ -298,7 +609,7 @@ export function generateGuide(ctx) {
|
|
|
298
609
|
w("");
|
|
299
610
|
if (ctx.frameworkName === "react") {
|
|
300
611
|
w("### React Hooks");
|
|
301
|
-
w("- `
|
|
612
|
+
w("- `useSWUpdate()` — returns `{ updateStatus, currentVersion, availableVersion, forceUpdate, error, acceptUpdate, dismissUpdate }`");
|
|
302
613
|
w("- `useSWProgress()` — returns `{ status, progress }` for download progress during SW update");
|
|
303
614
|
w("- `useCachedFetch(url, options?)` — fetches with auto-refetch on tag invalidation, see Fetch Wrapper section");
|
|
304
615
|
w("");
|
|
@@ -319,13 +630,23 @@ export function generateGuide(ctx) {
|
|
|
319
630
|
w("Re-run `npx @swoff/cli generate` after changing it.");
|
|
320
631
|
w("");
|
|
321
632
|
w("### Features you can toggle:");
|
|
322
|
-
w("- `mutationQueue` — offline write queue with IndexedDB");
|
|
633
|
+
w("- `mutationQueue.enabled` — offline write queue with IndexedDB. Object: `{ enabled, batchSize, batchDelayMs, maxRetries, retryBackoffMs }`");
|
|
323
634
|
w("- `backgroundSync` — Background Sync API (Chrome/Edge only)");
|
|
324
635
|
w("- `auth.enabled` — auth module (bearer/cookie/custom)");
|
|
325
636
|
w("- `crossTabSync` — broadcast changes across tabs");
|
|
326
637
|
w("- `tagInvalidation` — cache invalidation by tags");
|
|
327
|
-
w("- `
|
|
638
|
+
w("- `graphql.enabled` — GraphQL wrapper with body-hash caching. Object: `{ enabled, endpoint }`");
|
|
328
639
|
w("- `pwa.enabled` — PWA install prompt and manifest");
|
|
640
|
+
w("- `serverPush.enabled` — real-time cache invalidation via SSE/WebSocket. Object: `{ enabled, type, endpoint, reconnectDelayMs }`");
|
|
641
|
+
w("- `serviceWorker.cacheStrategy` — caching strategy mode (`\"all\"` or `\"explicit-only\"`)");
|
|
642
|
+
w("- `serviceWorker.defaultStrategy` — default caching strategy");
|
|
643
|
+
w("- `serviceWorker.strategies` — per-route strategy overrides");
|
|
644
|
+
w("- `serviceWorker.staleTime` — global stale time in seconds (data considered fresh for N seconds)");
|
|
645
|
+
w("- `serviceWorker.refetchOnWindowFocus` — auto-refetch on tab focus (hook-level)");
|
|
646
|
+
w("- `serviceWorker.refetchOnReconnect` — auto-refetch on reconnect");
|
|
647
|
+
w("- `serviceWorker.refetchInterval` — auto-refetch every N seconds");
|
|
648
|
+
w("- `serviceWorker.maxCacheEntries` — max entries in runtime cache (oldest evicted)");
|
|
649
|
+
w("- `serviceWorker.maxCacheAge` — max age of cache entries in ms");
|
|
329
650
|
w("");
|
|
330
651
|
w("---");
|
|
331
652
|
writeFile(ctx, "GUIDE.md", lines.join("\n"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide-generator.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/guide-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"guide-generator.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/guide-generator.ts"],"names":[],"mappings":"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"}
|