@swoff/cli 0.3.7 → 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 +53 -606
- 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 +38 -18
- 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 +170 -74
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +12 -11
- 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 +52 -33
- 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 +5 -5
- 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 +37 -12
- 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 +192 -42
- 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 +51 -12
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +127 -58
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +6 -2
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +139 -0
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -0
- package/dist/lib/generators/file-generators/guide-generator.js +6 -436
- 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 +140 -52
- 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 +6 -7
- package/dist/lib/generators/file-generators/push.js.map +1 -1
- package/dist/lib/generators/file-generators/quick-readme.js +8 -75
- package/dist/lib/generators/file-generators/quick-readme.js.map +1 -1
- package/dist/lib/generators/file-generators/server-push.js +146 -0
- package/dist/lib/generators/file-generators/server-push.js.map +1 -0
- 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 +26 -1
- 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 +19 -11
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +80 -24
- 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/default-template.js +2 -1
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +461 -121
- 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/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/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 +62 -21
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +12 -16
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +133 -45
- 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 +21 -7
- package/templates/hooks/useCachedFetch.tsx +23 -11
- package/templates/hooks/useMutation.jsx +76 -0
- package/templates/hooks/useMutation.tsx +109 -0
- package/templates/hooks/useMutationQueue.jsx +20 -11
- package/templates/hooks/useMutationQueue.tsx +31 -15
- package/templates/hooks/useMutationState.jsx +13 -0
- package/templates/hooks/useMutationState.tsx +25 -0
- package/templates/hooks/usePrefetch.jsx +10 -0
- package/templates/hooks/usePrefetch.tsx +25 -0
- package/templates/hooks/usePushSubscription.jsx +3 -3
- package/templates/hooks/usePushSubscription.tsx +3 -3
|
@@ -1,450 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generates GUIDE.md —
|
|
2
|
+
* Generates GUIDE.md — points user to online documentation.
|
|
3
3
|
*/
|
|
4
4
|
import { writeFile } from "./context.js";
|
|
5
5
|
export function generateGuide(ctx) {
|
|
6
|
-
const { config } = ctx;
|
|
7
|
-
const ext = ctx.ext;
|
|
8
6
|
const lines = [];
|
|
9
7
|
const w = (s) => lines.push(s);
|
|
10
|
-
|
|
11
|
-
w("# Swoff Integration Guide");
|
|
8
|
+
w("# Swoff — Generated Files");
|
|
12
9
|
w("");
|
|
13
|
-
w("
|
|
14
|
-
w("Each section answers: **What is it?**, **What files were created?**, **How to use it?**, **Where to edit?**");
|
|
10
|
+
w("Your project was generated with Swoff. All generated files live in `swoff/`.");
|
|
15
11
|
w("");
|
|
16
|
-
|
|
17
|
-
wb("## 📦 Service Worker Registration");
|
|
18
|
-
w("The service worker handles caching, offline support, background sync, and PWA installability.");
|
|
12
|
+
w("For the full documentation, visit:");
|
|
19
13
|
w("");
|
|
20
|
-
w("
|
|
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.");
|
|
14
|
+
w("- **Documentation** — https://swoff.dev/docs");
|
|
27
15
|
w("");
|
|
28
|
-
w("
|
|
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.");
|
|
16
|
+
w("- **CLI Reference** — `swoff generate`, `swoff validate`, etc. See [CLI.md](./CLI.md)");
|
|
31
17
|
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
|
-
// ── Fetch Wrapper ──
|
|
38
|
-
wb("## 🌐 fetchWithCache — API calls with caching");
|
|
39
|
-
w("A drop-in replacement for `fetch()` that communicates with the service worker about caching strategy.");
|
|
40
|
-
w("GET requests are cached by the SW for offline access; POST/PUT/DELETE pass through.");
|
|
41
|
-
w("");
|
|
42
|
-
w("**Important:** Use `fetchWithCache` for all API calls — it sets the `X-SW-Cache-Strategy` header that");
|
|
43
|
-
w("the SW uses to determine whether to apply a caching strategy. Plain `fetch()` works for uncached requests,");
|
|
44
|
-
w("but if `cacheStrategy` is set to `\"explicit-only\"`, the SW will skip plain `fetch()` calls entirely.");
|
|
45
|
-
w("");
|
|
46
|
-
w("### `fetch-wrapper.ts`");
|
|
47
|
-
w("```ts");
|
|
48
|
-
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
49
|
-
w("");
|
|
50
|
-
w("// GET — cached for offline");
|
|
51
|
-
w('const todos = await fetchWithCache("/api/todos").then(r => r.json());');
|
|
52
|
-
w("");
|
|
53
|
-
w("// POST — passes through to server");
|
|
54
|
-
w("await fetchWithCache(\"/api/todos\", {");
|
|
55
|
-
w(' method: "POST",');
|
|
56
|
-
w(' body: JSON.stringify({ title: "New task" }),');
|
|
57
|
-
w("});");
|
|
58
|
-
w("```");
|
|
59
|
-
w("");
|
|
60
|
-
w("**Functions:**");
|
|
61
|
-
w("- `fetchWithCache(input, options?)` — main fetch wrapper. Use for all API calls.");
|
|
62
|
-
w("- `fetchWithCache(input, options?)` — unified fetch wrapper. Auto-queues writes when offline (disable with `queueOffline: false`).");
|
|
63
|
-
w("");
|
|
64
|
-
w("**Returns** `{ response: Response, fromCache: boolean }` — `fromCache` lets the UI show stale indicators when a stale-while-revalidate fallback is served.");
|
|
65
|
-
w("");
|
|
66
|
-
w("**Note:** For authenticated requests, pass `{ auth: true }` — there is no separate auth fetch wrapper.");
|
|
67
|
-
w("");
|
|
68
|
-
if (ctx.frameworkName === "react") {
|
|
69
|
-
w("### React Hook: `useCachedFetch`");
|
|
70
|
-
w("Re-fetches automatically when the SW invalidates related cache tags.");
|
|
71
|
-
w("```tsx");
|
|
72
|
-
w(`import { useCachedFetch } from "./swoff/hooks/useCachedFetch.${ext}x";`);
|
|
73
|
-
w("");
|
|
74
|
-
w('const { data, error, loading, refetch } = useCachedFetch<Todo[]>("/api/todos");');
|
|
75
|
-
w("```");
|
|
76
|
-
w("");
|
|
77
|
-
w("**Returns** `{ data: T | null, error, loading, refetch }` — `data` is the parsed JSON response.");
|
|
78
|
-
w("");
|
|
79
|
-
w("The hook listens for `cache-invalidated` events (when tag invalidation is enabled) and automatically");
|
|
80
|
-
w("re-fetches if the event's tags match the URL. Call `refetch()` to manually refresh.");
|
|
81
|
-
w("");
|
|
82
|
-
w("### React Hook: `useNetworkStatus`");
|
|
83
|
-
w("Tracks online/offline state reactively.");
|
|
84
|
-
w("```tsx");
|
|
85
|
-
w(`import { useNetworkStatus } from "./swoff/hooks/useNetworkStatus.${ext}x";`);
|
|
86
|
-
w("");
|
|
87
|
-
w("const online = useNetworkStatus();");
|
|
88
|
-
w("```");
|
|
89
|
-
w("");
|
|
90
|
-
w("**Returns** `boolean` — `true` when online, `false` when offline.");
|
|
91
|
-
w("");
|
|
92
|
-
}
|
|
93
|
-
// ── Cache Strategy Resolution ──
|
|
94
|
-
wb("## 🎯 Cache Strategy Resolution");
|
|
95
|
-
w("The SW uses a 3-tier priority system to determine which caching strategy applies to each request:");
|
|
96
|
-
w("");
|
|
97
|
-
w("1. **Per-request override (highest)** — set `strategy` or `staleWhileRevalidate` on `fetchWithCache()`.");
|
|
98
|
-
w(" Sent as `X-SW-Strategy` header to the SW.");
|
|
99
|
-
w("2. **URL pattern match** — configured in `swoff.config.json` under `features.serviceWorker.strategies`.");
|
|
100
|
-
w(" e.g. `\"/api/*\": \"network-first\"` matches all paths starting with `/api/`.");
|
|
101
|
-
w("3. **Default (lowest)** — `features.serviceWorker.defaultStrategy` (default: `\"cache-first\"`).");
|
|
102
|
-
w("");
|
|
103
|
-
w("### Cache strategy mode");
|
|
104
|
-
w("The `features.serviceWorker.cacheStrategy` option controls when strategies are invoked:");
|
|
105
|
-
w("");
|
|
106
|
-
w("- `\"all\"` (default): every GET/HEAD request goes through strategy dispatch, including plain `fetch()` calls.");
|
|
107
|
-
w("- `\"explicit-only\"`: only requests with an `X-SW-Cache-Strategy` header (set automatically by `fetchWithCache()`)");
|
|
108
|
-
w(" are processed by the SW strategy system. Plain `fetch()` calls pass through unmodified.");
|
|
109
|
-
w("");
|
|
110
|
-
w("### Request dispatch flow");
|
|
111
|
-
w("Each GET/HEAD request follows this path through the SW:");
|
|
112
|
-
w("");
|
|
113
|
-
w("```");
|
|
114
|
-
w("navigation (SPA fallback) → precache check → strategy dispatch → network pass-through");
|
|
115
|
-
w("```");
|
|
116
|
-
w("");
|
|
117
|
-
w("### Available strategies");
|
|
118
|
-
w("");
|
|
119
|
-
w("| Strategy | Behavior | Best for |");
|
|
120
|
-
w("|----------|----------|----------|");
|
|
121
|
-
w("| `cache-first` | Return cached if available, else fetch + cache. Default | Static assets, images, fonts |");
|
|
122
|
-
w("| `network-first` | Try network, cache on success, fall back to cache | API endpoints, dynamic content |");
|
|
123
|
-
w("| `stale-while-revalidate` | Return cached immediately, refresh in background | Fast UI, non-critical data |");
|
|
124
|
-
w("| `cache-only` | Serve from cache only (404 if missing) | Offline-critical assets |");
|
|
125
|
-
w("| `network-only` | Always fetch, never cache | Sensitive or real-time data |");
|
|
126
|
-
w("");
|
|
127
|
-
// ── Mutation Queue ──
|
|
128
|
-
if (config.features.mutationQueue) {
|
|
129
|
-
wb("## 📝 Mutation Queue — offline writes that sync when back online");
|
|
130
|
-
w("When the user is offline and performs a write (POST/PUT/PATCH/DELETE), `queueMutation` stores it");
|
|
131
|
-
w("in IndexedDB. When the connection returns, `processMutationQueue` replays them in order.");
|
|
132
|
-
w("");
|
|
133
|
-
w("### `mutation-queue.ts`");
|
|
134
|
-
w("```ts");
|
|
135
|
-
w(`import { queueMutation, processMutationQueue, flushMutations, getPendingCount } from "./swoff/mutation-queue.${ext}";`);
|
|
136
|
-
w("");
|
|
137
|
-
w("// Queue an offline write");
|
|
138
|
-
w("await queueMutation({");
|
|
139
|
-
w(' method: "POST",');
|
|
140
|
-
w(' url: "/api/todos",');
|
|
141
|
-
w(' body: { title: "Grocery" },');
|
|
142
|
-
w(' tags: ["todos"],');
|
|
143
|
-
w("});");
|
|
144
|
-
w("");
|
|
145
|
-
w("// Flush after re-login (mutations queued while offline may fail with 401)");
|
|
146
|
-
w("await flushMutations();");
|
|
147
|
-
w("```");
|
|
148
|
-
w("");
|
|
149
|
-
w("**Functions:**");
|
|
150
|
-
w("- `queueMutation(mutation)` — store a write for later sync");
|
|
151
|
-
w("- `processMutationQueue()` — replay all queued writes. Runs automatically on `online` event.");
|
|
152
|
-
w("- `flushMutations()` — same as processMutationQueue. Call after re-login.");
|
|
153
|
-
w("- `getPendingCount()` — number of mutations waiting to sync.");
|
|
154
|
-
w("");
|
|
155
|
-
if (config.features.backgroundSync) {
|
|
156
|
-
w("### `background-sync.ts` — Sync even after tab close");
|
|
157
|
-
w("Uses the Background Sync API to register a sync event so mutations are processed even if the user");
|
|
158
|
-
w("closes the tab. Falls back to the `online` event listener in unsupported browsers (Firefox, Safari).");
|
|
159
|
-
w("```ts");
|
|
160
|
-
w(`import { syncWhenPossible } from "./swoff/background-sync.${ext}";`);
|
|
161
|
-
w("await syncWhenPossible({ method: \"POST\", url: \"/api/todos\", body: { ... } });");
|
|
162
|
-
w("```");
|
|
163
|
-
w("");
|
|
164
|
-
w("**Functions:**");
|
|
165
|
-
w("- `syncWhenPossible(mutation)` — queue and register background sync");
|
|
166
|
-
w("- `retrySync()` — re-register sync if mutations are still pending (called automatically)");
|
|
167
|
-
w("");
|
|
168
|
-
w("> ⚠️ Background Sync is Chrome/Edge only. Not supported in Firefox or Safari.");
|
|
169
|
-
w("");
|
|
170
|
-
if (ctx.frameworkName === "react") {
|
|
171
|
-
w("### React Hook: `useBackgroundSync`");
|
|
172
|
-
w("Reactive background sync state and trigger.");
|
|
173
|
-
w("```tsx");
|
|
174
|
-
w(`import { useBackgroundSync } from "./swoff/hooks/useBackgroundSync.${ext}x";`);
|
|
175
|
-
w("");
|
|
176
|
-
w('const { supported, registered, lastSync, triggerSync } = useBackgroundSync();');
|
|
177
|
-
w("```");
|
|
178
|
-
w("");
|
|
179
|
-
w("**Returns** `{ supported, registered, lastSync, triggerSync }` — `triggerSync()` calls `syncWhenPossible()`.");
|
|
180
|
-
w("");
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
// ── Auth ──
|
|
185
|
-
if (config.features.auth.enabled) {
|
|
186
|
-
wb("## 🔐 Auth — token management and authenticated requests");
|
|
187
|
-
w("Swoff's auth module manages authentication state with a **memory-only token** (never persisted to");
|
|
188
|
-
w("IndexedDB) and optional offline user info caching.");
|
|
189
|
-
w("");
|
|
190
|
-
const authType = config.features.auth.type;
|
|
191
|
-
w(`Auth type: **${authType}**`);
|
|
192
|
-
w("");
|
|
193
|
-
if (authType === "bearer") {
|
|
194
|
-
w("> ⚠️ The Bearer token lives **in memory only** and is cleared on page refresh.");
|
|
195
|
-
w("> Only `{ user, expiresAt }` is persisted to IndexedDB for offline user display.");
|
|
196
|
-
w("> After a page refresh, re-login is required. Use the `refreshPath` for token refresh.");
|
|
197
|
-
w("");
|
|
198
|
-
}
|
|
199
|
-
w("### `auth/store.ts` — Token and user persistence");
|
|
200
|
-
w("```ts");
|
|
201
|
-
w(`import { setAuth, getAuth, clearAuth, isAuthValid, createAuthFromResponse } from "./swoff/auth/store.${ext}";`);
|
|
202
|
-
w("");
|
|
203
|
-
w("// After successful login, store auth data");
|
|
204
|
-
w("await setAuth({ token, user, expiresAt });");
|
|
205
|
-
w("");
|
|
206
|
-
w("// Check if still authenticated");
|
|
207
|
-
w("const auth = await getAuth();");
|
|
208
|
-
w("if (!isAuthValid(auth)) { /* redirect to login */ }");
|
|
209
|
-
w("```");
|
|
210
|
-
w("");
|
|
211
|
-
w("**Where to edit:**");
|
|
212
|
-
w("- `createAuthFromResponse(response)` — **edit this** to match your backend's login response shape.");
|
|
213
|
-
w("");
|
|
214
|
-
w("**Functions:**");
|
|
215
|
-
w("- `setAuth(authData)` — store in memory + persist user to IndexedDB");
|
|
216
|
-
w("- `getAuth()` — get from memory (or IndexedDB after refresh)");
|
|
217
|
-
w("- `clearAuth()` — clear everything (call on logout/401)");
|
|
218
|
-
w("- `isAuthValid(auth)` — check expiry");
|
|
219
|
-
w("- `createAuthFromResponse(response)` — extract AuthData from login response. **Edit this.**");
|
|
220
|
-
w("");
|
|
221
|
-
w("### Authenticated API calls with fetchWithCache");
|
|
222
|
-
w("Use `fetchWithCache` with `auth: true` for all authenticated requests — no separate auth fetch needed.");
|
|
223
|
-
w("```ts");
|
|
224
|
-
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
225
|
-
w(`import { ensureValidAuth } from "./swoff/auth/store.${ext}";`);
|
|
226
|
-
w("");
|
|
227
|
-
w("// Authenticated GET");
|
|
228
|
-
w('const { response } = await fetchWithCache("/api/me", { auth: true });');
|
|
229
|
-
w('const user = await response.json();');
|
|
230
|
-
w("");
|
|
231
|
-
w("// Authenticated POST (mutation)");
|
|
232
|
-
w('await fetchWithCache("/api/todos", {');
|
|
233
|
-
w(' method: "POST",');
|
|
234
|
-
w(' body: JSON.stringify({ title: "New" }),');
|
|
235
|
-
w(' auth: true,');
|
|
236
|
-
w("});");
|
|
237
|
-
w("```");
|
|
238
|
-
w("");
|
|
239
|
-
w("**Functions:**");
|
|
240
|
-
w("- `fetchWithCache(input, options)` — pass `{ auth: true }` for auth headers, cache bypass for auth endpoints, and 401 handling.");
|
|
241
|
-
w("- `ensureValidAuth()` — check expiry and refresh token if needed (uses refreshPath from config).");
|
|
242
|
-
w("");
|
|
243
|
-
w("**Where to edit:**");
|
|
244
|
-
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.");
|
|
245
|
-
w("- If your auth type is `custom`, edit the `withAuthHeaders` function in `auth/store.ts`.");
|
|
246
|
-
w("");
|
|
247
|
-
w("### `auth/user.ts` — User data caching");
|
|
248
|
-
w("```ts");
|
|
249
|
-
w(`import { fetchCurrentUser, getCachedUser, cacheUser, clearCachedUser } from "./swoff/auth/user.${ext}";`);
|
|
250
|
-
w("");
|
|
251
|
-
w("// Fetch and cache the current user");
|
|
252
|
-
w("const user = await fetchCurrentUser();");
|
|
253
|
-
w("```");
|
|
254
|
-
w("");
|
|
255
|
-
w("**Functions:**");
|
|
256
|
-
w("- `fetchCurrentUser()` — fetch from user endpoint and cache in IndexedDB");
|
|
257
|
-
w("- `getCachedUser()` — load user from IndexedDB (available offline)");
|
|
258
|
-
w("- `cacheUser(user)` — persist user object manually");
|
|
259
|
-
w("- `clearCachedUser()` — remove user from cache (call on logout)");
|
|
260
|
-
w("");
|
|
261
|
-
w("### `auth/state.ts` — Auth state detection");
|
|
262
|
-
w("Detects which of the 4 states the app is in: online+authenticated, online+unauthenticated, offline+authenticated, offline+unauthenticated.");
|
|
263
|
-
w("```ts");
|
|
264
|
-
w(`import { getAuthState } from "./swoff/auth/state.${ext}";`);
|
|
265
|
-
w('const { authenticated, user, online } = await getAuthState();');
|
|
266
|
-
w("```");
|
|
267
|
-
w("");
|
|
268
|
-
if (ctx.frameworkName === "react") {
|
|
269
|
-
w("### React Hooks");
|
|
270
|
-
w("- `useAuth()` — returns `{ authenticated, user, online }`, listens to online/offline/auth changes");
|
|
271
|
-
w("- `useCachedFetch(url, options?)` — fetches with auto-refetch on tag invalidation, see Fetch Wrapper section");
|
|
272
|
-
w("- `useNetworkStatus()` — returns `boolean`, standalone online/offline tracker, see Fetch Wrapper section");
|
|
273
|
-
w("");
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
// ── Tag Invalidation ──
|
|
277
|
-
if (config.features.tagInvalidation) {
|
|
278
|
-
wb("## 🏷️ Tag Invalidation — keep cached data fresh");
|
|
279
|
-
w("When data changes on the server, cached responses in the SW become stale. Tag invalidation");
|
|
280
|
-
w("lets you mark related cache entries as stale so they're re-fetched on next request.");
|
|
281
|
-
w("");
|
|
282
|
-
w("### How it works");
|
|
283
|
-
w("1. When fetching, attach tags: `fetchWithCache(url, { tags: generateTags(url) })`");
|
|
284
|
-
w("2. After a mutation, invalidate: `await invalidateUrl(url)`");
|
|
285
|
-
w("3. The SW removes all cached responses that were tagged with the related tags");
|
|
286
|
-
w("");
|
|
287
|
-
w("### `invalidation-tags.ts` — Tag generation helpers");
|
|
288
|
-
w("```ts");
|
|
289
|
-
w(`import { generateTags, invalidateUrl } from "./swoff/invalidation-tags.${ext}";`);
|
|
290
|
-
w("");
|
|
291
|
-
w('// Tag reads');
|
|
292
|
-
w('const data = await fetchWithCache("/api/todos", { tags: generateTags("/api/todos") });');
|
|
293
|
-
w("");
|
|
294
|
-
w('// Invalidate after writing');
|
|
295
|
-
w('await invalidateUrl("/api/todos/42");');
|
|
296
|
-
w("```");
|
|
297
|
-
w("");
|
|
298
|
-
w("**Functions:**");
|
|
299
|
-
w("- `generateTags(url)` — extract tags from a URL path. e.g. `/api/todos/42` → `[\"todos\", \"todo:42\"]`");
|
|
300
|
-
w("- `generateTagsFromMethod(method, url)` — method-prefixed tags. e.g. `post-todos`");
|
|
301
|
-
w("- `invalidateUrl(url)` — extract tags and invalidate all matching cache entries");
|
|
302
|
-
w("- `invalidateByMethod(method, url)` — invalidate using method-prefixed tags");
|
|
303
|
-
w("");
|
|
304
|
-
w("### `cache.ts` — Low-level invalidation");
|
|
305
|
-
w("```ts");
|
|
306
|
-
w(`import { invalidateByTag, invalidateByTags } from "./swoff/cache.${ext}";`);
|
|
307
|
-
w("");
|
|
308
|
-
w('await invalidateByTag("todos");');
|
|
309
|
-
w('await invalidateByTags(["todos", "categories"]);');
|
|
310
|
-
w("```");
|
|
311
|
-
w("");
|
|
312
|
-
w("**Functions:**");
|
|
313
|
-
w("- `invalidateByTag(tag)` — invalidate a single tag. Dispatches `cache-invalidated` event.");
|
|
314
|
-
w("- `invalidateByTags(tags)` — invalidate multiple tags.");
|
|
315
|
-
w("");
|
|
316
|
-
if (ctx.frameworkName === "react") {
|
|
317
|
-
w("### React Hook: `useCacheInvalidation`");
|
|
318
|
-
w("Reactive wrapper around cache invalidation functions.");
|
|
319
|
-
w("```tsx");
|
|
320
|
-
w(`import { useCacheInvalidation } from "./swoff/hooks/useCacheInvalidation.${ext}x";`);
|
|
321
|
-
w("");
|
|
322
|
-
w('const { invalidateByTag, invalidateByTags, invalidateUrl } = useCacheInvalidation();');
|
|
323
|
-
w("```");
|
|
324
|
-
w("");
|
|
325
|
-
w("Returns stable `useCallback`-wrapped versions of each invalidation function.");
|
|
326
|
-
w("");
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
// ── Cross-tab Sync ──
|
|
330
|
-
if (config.features.crossTabSync) {
|
|
331
|
-
wb("## 🔄 Cross-tab Sync — keep tabs in sync");
|
|
332
|
-
w("When the user opens your app in multiple browser tabs, changes in one tab (logout, mutation sync)");
|
|
333
|
-
w("are broadcast to all other tabs via the service worker.");
|
|
334
|
-
w("");
|
|
335
|
-
w("No separate imports needed — this is handled automatically by `client-injector.ts`.");
|
|
336
|
-
w("The service worker listens for invalidation events and forwards them to all clients.");
|
|
337
|
-
w("");
|
|
338
|
-
if (!config.features.tagInvalidation) {
|
|
339
|
-
w("> ⚠️ Cross-tab sync requires tag invalidation to be enabled for full functionality.");
|
|
340
|
-
w("");
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
// ── Push Notifications ──
|
|
344
|
-
if (config.features.pushNotifications?.enabled) {
|
|
345
|
-
wb("## 🔔 Push Notifications — subscription management");
|
|
346
|
-
w("Swoff generates a push notification subscription client with IndexedDB persistence");
|
|
347
|
-
w("and the service worker push event handlers.");
|
|
348
|
-
w("");
|
|
349
|
-
w("### `push.ts` — Client-side subscription management");
|
|
350
|
-
w("```ts");
|
|
351
|
-
w(`import { subscribeToPush, unsubscribeFromPush, isSubscribed } from "./swoff/push.${ext}";`);
|
|
352
|
-
w("");
|
|
353
|
-
w("// Subscribe (triggers permission prompt)");
|
|
354
|
-
w('const sub = await subscribeToPush("YOUR_VAPID_PUBLIC_KEY");');
|
|
355
|
-
w("if (sub) {");
|
|
356
|
-
w(' await fetch("/api/push/subscribe", {');
|
|
357
|
-
w(' method: "POST",');
|
|
358
|
-
w(" body: JSON.stringify(sub.toJSON()),");
|
|
359
|
-
w(" });");
|
|
360
|
-
w("}");
|
|
361
|
-
w("");
|
|
362
|
-
w("// Unsubscribe");
|
|
363
|
-
w("await unsubscribeFromPush();");
|
|
364
|
-
w("```");
|
|
365
|
-
w("");
|
|
366
|
-
w("**Functions:**");
|
|
367
|
-
w("- `subscribeToPush(vapidPublicKey)` — request permission and subscribe");
|
|
368
|
-
w("- `unsubscribeFromPush()` — unsubscribe and clear stored subscription");
|
|
369
|
-
w("- `isSubscribed()` — check if subscribed");
|
|
370
|
-
w("- `getPushSubscription()` — get current PushSubscription object");
|
|
371
|
-
w("- `requestNotificationPermission()` — request permission only (returns boolean)");
|
|
372
|
-
w("");
|
|
373
|
-
if (ctx.frameworkName === "react") {
|
|
374
|
-
w("### React Hook: `usePushSubscription`");
|
|
375
|
-
w("```tsx");
|
|
376
|
-
w(`import { usePushSubscription } from "./swoff/hooks/usePushSubscription.${ext}x";`);
|
|
377
|
-
w("");
|
|
378
|
-
w('const { subscribed, subscription, permission, loading, subscribe, unsubscribe } =');
|
|
379
|
-
w(' usePushSubscription("YOUR_VAPID_PUBLIC_KEY");');
|
|
380
|
-
w("```");
|
|
381
|
-
w("");
|
|
382
|
-
w("**Returns** `{ subscribed, subscription, permission, loading, subscribe, unsubscribe }`");
|
|
383
|
-
w("The hook listens for push-subscription-changed and push-permission-changed events.");
|
|
384
|
-
w("Use `subscribe()` and `unsubscribe()` to toggle push notifications.");
|
|
385
|
-
w("");
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
// ── PWA ──
|
|
389
|
-
if (config.features.pwa.enabled) {
|
|
390
|
-
wb("## 📱 PWA — installable web app");
|
|
391
|
-
w("Swoff adds a beforeinstallprompt handler and install flow so users can install your app");
|
|
392
|
-
w("on their home screen.");
|
|
393
|
-
w("");
|
|
394
|
-
w("### `pwa/install.ts`");
|
|
395
|
-
w("```ts");
|
|
396
|
-
w(`import { setupPwaInstall, isInstallable, promptInstall } from "./swoff/pwa/install.${ext}";`);
|
|
397
|
-
w("");
|
|
398
|
-
w("setupPwaInstall(); // called automatically by client-injector.ts");
|
|
399
|
-
w("");
|
|
400
|
-
w("// Show install button when available");
|
|
401
|
-
w("if (isInstallable()) {");
|
|
402
|
-
w(' const { outcome } = await promptInstall();');
|
|
403
|
-
w("}");
|
|
404
|
-
w("```");
|
|
405
|
-
w("");
|
|
406
|
-
w("**Functions:**");
|
|
407
|
-
w("- `setupPwaInstall()` — listen for beforeinstallprompt/appinstalled events (called by client-injector)");
|
|
408
|
-
w("- `isInstallable()` — check if install prompt is available");
|
|
409
|
-
w("- `promptInstall()` — show the native install prompt");
|
|
410
|
-
w("");
|
|
411
|
-
w("### `manifest.json`");
|
|
412
|
-
w("Generated in `swoff/manifest.json`. If you want it exposed at the root, copy it to your `public/` directory.");
|
|
413
|
-
w("");
|
|
414
|
-
if (ctx.frameworkName === "react") {
|
|
415
|
-
w("### React Hooks");
|
|
416
|
-
w("- `useSWUpdate()` — returns `{ updateStatus, currentVersion, availableVersion, forceUpdate, error, acceptUpdate, dismissUpdate }`");
|
|
417
|
-
w("- `useSWProgress()` — returns `{ status, progress }` for download progress during SW update");
|
|
418
|
-
w("- `useCachedFetch(url, options?)` — fetches with auto-refetch on tag invalidation, see Fetch Wrapper section");
|
|
419
|
-
w("");
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
// ── Build Script ──
|
|
423
|
-
wb("## 🏗️ Build script");
|
|
424
|
-
w("The SW generator must run after every build to produce the final service worker file.");
|
|
425
|
-
w("Swoff has already added this to your `package.json` build script for you:");
|
|
426
|
-
w("```");
|
|
427
|
-
w('"build": "<your-build> && node swoff/sw/generator.js"');
|
|
428
|
-
w("```");
|
|
429
|
-
w("If you run `swoff clean`, this script suffix will be removed automatically.");
|
|
430
|
-
w("");
|
|
431
|
-
// ── Config file ──
|
|
432
|
-
wb("## ⚙️ swoff.config.json");
|
|
433
|
-
w("This is the configuration file that controls which features are enabled and how they behave.");
|
|
434
|
-
w("Re-run `npx @swoff/cli generate` after changing it.");
|
|
435
|
-
w("");
|
|
436
|
-
w("### Features you can toggle:");
|
|
437
|
-
w("- `mutationQueue` — offline write queue with IndexedDB");
|
|
438
|
-
w("- `backgroundSync` — Background Sync API (Chrome/Edge only)");
|
|
439
|
-
w("- `auth.enabled` — auth module (bearer/cookie/custom)");
|
|
440
|
-
w("- `crossTabSync` — broadcast changes across tabs");
|
|
441
|
-
w("- `tagInvalidation` — cache invalidation by tags");
|
|
442
|
-
w("- `pwa.enabled` — PWA install prompt and manifest");
|
|
443
|
-
w("- `serviceWorker.cacheStrategy` — caching strategy mode (`\"all\"` or `\"explicit-only\"`)");
|
|
444
|
-
w("- `serviceWorker.defaultStrategy` — default caching strategy");
|
|
445
|
-
w("- `serviceWorker.strategies` — per-route strategy overrides");
|
|
446
|
-
w("");
|
|
447
|
-
w("---");
|
|
448
18
|
writeFile(ctx, "GUIDE.md", lines.join("\n"));
|
|
449
19
|
}
|
|
450
20
|
//# sourceMappingURL=guide-generator.js.map
|
|
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,aAAa,CAAC,GAAqB;IACjD,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,CACC,8EAA8E,CAC/E,CAAC;IACF,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,oCAAoC,CAAC,CAAC;IACxC,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,8CAA8C,CAAC,CAAC;IAClD,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,uFAAuF,CAAC,CAAC;IAC3F,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|