@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
package/README.md
CHANGED
|
@@ -2,358 +2,75 @@
|
|
|
2
2
|
|
|
3
3
|
CLI for [Swoff](https://swoff.netlify.app) — offline-first web apps made easy.
|
|
4
4
|
|
|
5
|
-
Swoff generates a **service worker** and **client-side utilities** that give your web app
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
- **Mutation queue** — writes performed offline replay when back online
|
|
9
|
-
- **Auth** — token management with automatic 401 handling
|
|
10
|
-
- **Cache invalidation** — tag-based cache busting after mutations
|
|
11
|
-
- **PWA** — install prompt and manifest
|
|
12
|
-
- **Cross-tab sync** — broadcast changes across open tabs
|
|
13
|
-
- **Background Sync API** — process mutations even after tab close
|
|
14
|
-
|
|
15
|
-
It lives in your project as a `swoff/` directory — everything is generated, auditable, and editable.
|
|
16
|
-
|
|
17
|
-
Source: [github.com/iamsuudi/swoff](https://github.com/iamsuudi/swoff)
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Quick Start
|
|
5
|
+
Swoff generates a **service worker** and **client-side utilities** that give your web app
|
|
6
|
+
server-state reactivity (stale-while-revalidate, auto-refetch, mutation tracking, dedup),
|
|
7
|
+
offline support, and PWA features — **zero runtime dependencies**, all generated and auditable.
|
|
22
8
|
|
|
23
9
|
```bash
|
|
24
|
-
|
|
25
|
-
npx @swoff/cli
|
|
26
|
-
|
|
27
|
-
# Generate service worker and supporting files
|
|
28
|
-
npx @swoff/cli generate
|
|
29
|
-
|
|
30
|
-
# Import the generated entry point in your app
|
|
10
|
+
npx @swoff/cli init # create swoff.config.json
|
|
11
|
+
npx @swoff/cli generate # generate service worker + client files
|
|
31
12
|
```
|
|
32
13
|
|
|
14
|
+
Then import the single entry point:
|
|
15
|
+
|
|
33
16
|
```js
|
|
34
17
|
import { initServiceWorker } from "./swoff/client-injector.js";
|
|
35
|
-
|
|
36
18
|
initServiceWorker();
|
|
37
19
|
```
|
|
38
20
|
|
|
39
|
-
Then build your app:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
npm run build
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
The build script auto-appends `node swoff/sw/generator.js` to finalize the service worker with your asset hashes.
|
|
46
|
-
|
|
47
21
|
---
|
|
48
22
|
|
|
49
|
-
##
|
|
50
|
-
|
|
51
|
-
|
|
|
52
|
-
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
-
|
|
66
|
-
- **Language**: TypeScript or JavaScript
|
|
67
|
-
- **Build tool**: Uses existing `package.json` build script
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
swoff init
|
|
71
|
-
swoff init --framework react # override detection
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### `generate`
|
|
75
|
-
|
|
76
|
-
Generates the service worker (`dist/sw-<version>.js`) and all supporting files into `swoff/`. Also auto-appends the SW generator to your `package.json` build script.
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
swoff generate
|
|
80
|
-
swoff generate --sw-only # regenerate only the service worker
|
|
81
|
-
swoff generate --files-only # regenerate only supporting files
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
After generation, read `swoff/GUIDE.md` for the full integration guide for your project.
|
|
85
|
-
|
|
86
|
-
### `add <feature>`
|
|
87
|
-
|
|
88
|
-
Enables a feature in `swoff.config.json` and regenerates.
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
swoff add pwa
|
|
92
|
-
swoff add mutation-queue
|
|
93
|
-
swoff add auth
|
|
94
|
-
swoff add tag-invalidation
|
|
95
|
-
swoff add cross-tab
|
|
96
|
-
swoff add background-sync
|
|
97
|
-
swoff add client-registration
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### `info`
|
|
101
|
-
|
|
102
|
-
Shows enabled features and file count, or detailed docs for a specific feature.
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
swoff info # summary
|
|
106
|
-
swoff info auth # auth details and functions
|
|
107
|
-
swoff info mutation-queue # mutation queue details
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### `clean`
|
|
111
|
-
|
|
112
|
-
Removes every generated file:
|
|
113
|
-
|
|
114
|
-
```bash
|
|
115
|
-
swoff clean
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
This deletes `swoff/`, `swoff.config.json`, `version.json`, and removes the SW generator from your build script.
|
|
23
|
+
## Features
|
|
24
|
+
|
|
25
|
+
| Category | Feature | API | Architecture |
|
|
26
|
+
|----------|---------|-----|--------------|
|
|
27
|
+
| Caching | staleTime, auto-refetch, 5 strategies | [API: fetch-wrapper](./docs/API.md#fetch-wrapperts) | [Arch: staleTime + 3-tier](./docs/ARCHITECTURE.md#staletime-fresh-vs-stale-data) |
|
|
28
|
+
| Mutations | useState-style tracking, offline queue, concurrency | [API: mutation-state + mutation-queue](./docs/API.md#mutation-statets) | [Arch: queue concurrency](./docs/ARCHITECTURE.md#mutation-queue-concurrency) |
|
|
29
|
+
| Prefetching | Cache warming on hover/navigation | [API: usePrefetch](./docs/API.md#useprefetch) | — |
|
|
30
|
+
| Dependent queries | enabled option, nullable URL | [API: useCachedFetch](./docs/API.md#usecachedfetcht-url-options) | — |
|
|
31
|
+
| Query cancellation | AbortController integration | [API: fetch-wrapper options](./docs/API.md#fetchwithcachet-input-options) | [Arch: dedup map](./docs/ARCHITECTURE.md#dedup-map--abortcontroller) |
|
|
32
|
+
| Real-time invalidation | SSE / WebSocket push events | [API: server-push](./docs/API.md#server-pushts) | [Arch: SSE vs WS](./docs/ARCHITECTURE.md#server-push-transport-sse-vs-websocket) |
|
|
33
|
+
| Tag invalidation | URL-derived cache tags | [API: invalidation-tags](./docs/API.md#invalidation-tagsts) | — |
|
|
34
|
+
| Auth | memory-only tokens, bearer/cookie/custom | [API: auth module](./docs/API.md#auth-module) | [Arch: security](./docs/ARCHITECTURE.md#auth-memory-only-tokens) |
|
|
35
|
+
| GraphQL | body-hash caching, auto-tags | [API: gql-wrapper](./docs/API.md#gql-wrapperts) | [Arch: body-hash](./docs/ARCHITECTURE.md#body-hash-graphql-caching) |
|
|
36
|
+
| PWA | install prompt, manifest, SW update hooks | [API: pwa](./docs/API.md#pwainstallts) | — |
|
|
37
|
+
| Push notifications | VAPID subscription management | [API: push](./docs/API.md#pushts) | — |
|
|
38
|
+
| Background Sync | process mutations after tab close | [API: background-sync](./docs/API.md#background-syncts) | — |
|
|
39
|
+
| Cross-tab sync | broadcast invalidation across tabs | handled by client-injector | — |
|
|
119
40
|
|
|
120
41
|
---
|
|
121
42
|
|
|
122
|
-
##
|
|
123
|
-
|
|
124
|
-
```json
|
|
125
|
-
{
|
|
126
|
-
"framework": "react",
|
|
127
|
-
"language": "ts",
|
|
128
|
-
"buildCommand": "vite build",
|
|
129
|
-
"features": {
|
|
130
|
-
"mutationQueue": true,
|
|
131
|
-
"backgroundSync": false,
|
|
132
|
-
"crossTabSync": false,
|
|
133
|
-
"tagInvalidation": true,
|
|
134
|
-
"clientRegistration": true,
|
|
135
|
-
"pwa": {
|
|
136
|
-
"enabled": false
|
|
137
|
-
},
|
|
138
|
-
"auth": {
|
|
139
|
-
"enabled": true,
|
|
140
|
-
"type": "bearer",
|
|
141
|
-
"refreshPath": "/api/refresh",
|
|
142
|
-
"userEndpoint": "/api/me"
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
```
|
|
43
|
+
## CLI Commands
|
|
147
44
|
|
|
148
|
-
|
|
|
149
|
-
|
|
150
|
-
| `
|
|
151
|
-
| `
|
|
152
|
-
| `
|
|
153
|
-
| `
|
|
154
|
-
| `
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
157
|
-
| `features.clientRegistration` | `boolean` | `false` | SW registration lifecycle |
|
|
158
|
-
| `features.pwa.enabled` | `boolean` | `false` | PWA install + manifest |
|
|
159
|
-
| `features.auth.enabled` | `boolean` | `false` | Auth module |
|
|
160
|
-
| `features.auth.type` | `"bearer"` \| `"cookie"` \| `"custom"` | — | Auth strategy |
|
|
161
|
-
| `features.auth.refreshPath` | `string` | `"/api/refresh"` | Token refresh endpoint |
|
|
162
|
-
| `features.auth.userEndpoint` | `string` | `"/api/me"` | Current user endpoint |
|
|
45
|
+
| Command | Description | Details |
|
|
46
|
+
|---------|-------------|---------|
|
|
47
|
+
| `init` | Create `swoff.config.json` with auto-detection | [CLI: init](./docs/CLI.md#init) |
|
|
48
|
+
| `generate` | Generate SW + all supporting files | [CLI: generate](./docs/CLI.md#generate) |
|
|
49
|
+
| `add <feature>` | Enable a feature and regenerate | [CLI: add](./docs/CLI.md#add-feature) |
|
|
50
|
+
| `validate` | Validate `swoff.config.json` | [CLI: validate](./docs/CLI.md#validate) |
|
|
51
|
+
| `info [feature]` | Show summary or per-feature details | [CLI: info](./docs/CLI.md#info-feature) |
|
|
52
|
+
| `clean` | Remove all generated files and config | [CLI: clean](./docs/CLI.md#clean) |
|
|
53
|
+
| `help [command]` | Show help for a specific command | [CLI: help](./docs/CLI.md#help-command) |
|
|
163
54
|
|
|
164
55
|
---
|
|
165
56
|
|
|
166
|
-
##
|
|
57
|
+
## Configuration
|
|
167
58
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
├── client-injector.ts # Single entry point — import and call initServiceWorker()
|
|
171
|
-
├── fetch-wrapper.ts # Unified fetch with caching, auth, offline queue
|
|
172
|
-
├── cache.ts # Low-level cache invalidation (tagInvalidation)
|
|
173
|
-
├── invalidation-tags.ts # Tag generation helpers (tagInvalidation)
|
|
174
|
-
├── mutation-queue.ts # Offline write queue (mutationQueue)
|
|
175
|
-
├── background-sync.ts # Background Sync API (backgroundSync)
|
|
176
|
-
├── swoff.d.ts # TypeScript declarations
|
|
177
|
-
│
|
|
178
|
-
├── auth/
|
|
179
|
-
│ ├── store.ts # Auth token/user persistence
|
|
180
|
-
│ ├── fetch.ts # Authenticated fetch wrapper
|
|
181
|
-
│ ├── user.ts # User data caching
|
|
182
|
-
│ └── state.ts # Online/offline × auth state detection
|
|
183
|
-
│
|
|
184
|
-
├── hooks/ # React hooks (if framework = react)
|
|
185
|
-
│ ├── useAuth.tsx
|
|
186
|
-
│ ├── useCachedFetch.tsx
|
|
187
|
-
│ ├── useMutationQueue.tsx
|
|
188
|
-
│ └── usePWAUpdate.tsx
|
|
189
|
-
│
|
|
190
|
-
├── pwa/
|
|
191
|
-
│ └── install.ts
|
|
192
|
-
│
|
|
193
|
-
├── sw/
|
|
194
|
-
│ ├── template.js # Service worker source
|
|
195
|
-
│ ├── injector.ts # SW registration logic
|
|
196
|
-
│ └── generator.js # Build-time SW generator
|
|
197
|
-
│
|
|
198
|
-
├── manifest.json
|
|
199
|
-
├── GUIDE.md # Full integration walkthrough
|
|
200
|
-
└── README.md # Quick reference
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## Feature Deep-Dive
|
|
206
|
-
|
|
207
|
-
### Mutation Queue
|
|
208
|
-
|
|
209
|
-
When the user is offline, write operations (POST/PUT/DELETE) are stored in IndexedDB. They replay automatically when the connection returns.
|
|
210
|
-
|
|
211
|
-
```js
|
|
212
|
-
import { queueMutation, getPendingCount } from "./swoff/mutation-queue.js";
|
|
213
|
-
|
|
214
|
-
// Offline write — stored and replayed when online
|
|
215
|
-
await queueMutation({
|
|
216
|
-
method: "POST",
|
|
217
|
-
url: "/api/todos",
|
|
218
|
-
body: { title: "Buy milk" },
|
|
219
|
-
tags: ["todos"],
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
// Show sync badge
|
|
223
|
-
const count = await getPendingCount();
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
The queue processes automatically on the `online` event. Call `flushMutations()` after re-login to retry mutations that failed due to auth expiry.
|
|
227
|
-
|
|
228
|
-
### Fetch Wrapper
|
|
229
|
-
|
|
230
|
-
Drop-in replacement for `fetch()` that communicates with the service worker about caching strategy.
|
|
231
|
-
|
|
232
|
-
```js
|
|
233
|
-
import { fetchWithCache } from "./swoff/fetch-wrapper.js";
|
|
234
|
-
|
|
235
|
-
// Reads are cached for offline access
|
|
236
|
-
const { response, fromCache } = await fetchWithCache("/api/todos");
|
|
237
|
-
const data = await response.json();
|
|
238
|
-
|
|
239
|
-
// Writes auto-invalidate related cache tags
|
|
240
|
-
await fetchWithCache("/api/todos", {
|
|
241
|
-
method: "POST",
|
|
242
|
-
body: JSON.stringify({ title: "New task" }),
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
// Auth requests
|
|
246
|
-
const { response: user } = await fetchWithCache("/api/me", { auth: true });
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
Returns `{ response: Response, fromCache: boolean }`.
|
|
250
|
-
|
|
251
|
-
### Auth
|
|
252
|
-
|
|
253
|
-
Token-based authentication with memory-only tokens and automatic 401 handling.
|
|
254
|
-
|
|
255
|
-
```js
|
|
256
|
-
import { authenticatedFetch } from "./swoff/auth/fetch.js";
|
|
257
|
-
|
|
258
|
-
// Attaches Bearer token, handles 401
|
|
259
|
-
const user = await authenticatedFetch("/api/me").then((r) => r.json());
|
|
260
|
-
|
|
261
|
-
// For mutations too — no separate wrapper needed
|
|
262
|
-
await authenticatedFetch("/api/todos", {
|
|
263
|
-
method: "POST",
|
|
264
|
-
body: JSON.stringify({ title: "New" }),
|
|
265
|
-
});
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
Auth endpoints (`/login`, `/logout`, `/register`) automatically bypass the SW cache. On 401, `sw-auth-unauthorized` is dispatched and the token is cleared.
|
|
269
|
-
|
|
270
|
-
### Cache Invalidation
|
|
271
|
-
|
|
272
|
-
Tag-based invalidation keeps the service worker cache fresh after mutations.
|
|
273
|
-
|
|
274
|
-
```js
|
|
275
|
-
import { generateTags, invalidateUrl } from "./swoff/invalidation-tags.js";
|
|
276
|
-
|
|
277
|
-
// Tag reads automatically
|
|
278
|
-
const data = await fetchWithCache("/api/todos", {
|
|
279
|
-
tags: generateTags("/api/todos"),
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
// Invalidate after writing
|
|
283
|
-
await invalidateUrl("/api/todos/42");
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
When the SW receives an invalidation, it removes matching cache entries and attempts to background-refetch them. If the refetch fails (network error), the old cached entry is served with a stale-while-revalidate fallback.
|
|
287
|
-
|
|
288
|
-
### PWA
|
|
289
|
-
|
|
290
|
-
Install prompt handling and manifest generation.
|
|
291
|
-
|
|
292
|
-
```js
|
|
293
|
-
import { isInstallable, promptInstall } from "./swoff/pwa/install.js";
|
|
294
|
-
|
|
295
|
-
// Show install button conditionally
|
|
296
|
-
if (isInstallable()) {
|
|
297
|
-
const { outcome } = await promptInstall();
|
|
298
|
-
}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### React Hooks
|
|
302
|
-
|
|
303
|
-
When `framework` is `"react"`, generated hooks provide reactive state:
|
|
304
|
-
|
|
305
|
-
| Hook | Returns | Description |
|
|
306
|
-
|------|---------|-------------|
|
|
307
|
-
| `useAuth()` | `{ authenticated, user, online }` | Auth + connectivity state |
|
|
308
|
-
| `useCachedFetch(url, options?)` | `{ data, error, loading, refetch }` | Auto-refetches on tag invalidation |
|
|
309
|
-
| `useMutationQueue()` | `{ pending, lastSync }` | Queue status and sync results |
|
|
310
|
-
| `usePWAUpdate()` | `{ updateStatus, progress, forceUpdate, acceptUpdate, dismissUpdate }` | SW update management |
|
|
311
|
-
| `useSWProgress()` | `{ status, progress }` | Download progress during SW update |
|
|
312
|
-
|
|
313
|
-
```tsx
|
|
314
|
-
import { useCachedFetch } from "./swoff/hooks/useCachedFetch.tsx";
|
|
315
|
-
|
|
316
|
-
function TodosList() {
|
|
317
|
-
const { data, loading } = useCachedFetch("/api/todos");
|
|
318
|
-
|
|
319
|
-
if (loading) return <Spinner />;
|
|
320
|
-
return <TodoList data={data} />;
|
|
321
|
-
}
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
### Build Script
|
|
325
|
-
|
|
326
|
-
After `swoff generate`, your `package.json` build script is updated to:
|
|
327
|
-
|
|
328
|
-
```json
|
|
329
|
-
"build": "vite build && node swoff/sw/generator.js"
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
The generator learns your build output and precaches all assets in the service worker. Running `swoff clean` removes this suffix.
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## Service Worker Architecture
|
|
337
|
-
|
|
338
|
-
The generated service worker (`sw/template.js`) implements:
|
|
339
|
-
|
|
340
|
-
- **Cache strategies**: network-first for API routes, cache-first for assets
|
|
341
|
-
- **Tag invalidation**: removes stale cache entries and background-refetches
|
|
342
|
-
- **Stale-while-revalidate**: on refetch failure, serves cached content with a stale indicator
|
|
343
|
-
- **Offline fallback**: returns cached responses when the network is unavailable
|
|
344
|
-
- **Cross-tab sync**: forwards invalidation events to all open clients
|
|
345
|
-
- **PWA lifecycle**: skip-waiting, activate, and install event handling
|
|
346
|
-
|
|
347
|
-
The build-time generator (`sw/generator.js`) collects your built asset files and embeds their hashes into the service worker, so cached assets are versioned and updated when they change.
|
|
59
|
+
Create `swoff.config.json` with `swoff init`, then tweak as needed.
|
|
60
|
+
Full schema reference in [docs/CONFIG.md](./docs/CONFIG.md).
|
|
348
61
|
|
|
349
62
|
---
|
|
350
63
|
|
|
351
64
|
## Requirements
|
|
352
65
|
|
|
353
|
-
- Node.js >= 18
|
|
66
|
+
- **Node.js >= 18**
|
|
354
67
|
- A build tool with a `package.json` build script (Vite, Webpack, etc.)
|
|
355
|
-
- HTTPS or localhost (required for service workers)
|
|
68
|
+
- **HTTPS or localhost** (required for service workers)
|
|
69
|
+
|
|
70
|
+
---
|
|
356
71
|
|
|
357
72
|
## License
|
|
358
73
|
|
|
359
74
|
MIT
|
|
75
|
+
|
|
76
|
+
Source: [github.com/iamsuudi/swoff](https://github.com/iamsuudi/swoff)
|
package/bin/swoff
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { fileURLToPath } from 'url';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
7
6
|
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const entryPoint = join(distDir, 'index.js');
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const entryPoint = join(__dirname, '..', 'dist', 'index.js');
|
|
11
9
|
|
|
12
10
|
if (!existsSync(entryPoint)) {
|
|
13
11
|
console.error('Error: CLI not built. Run: npm run build');
|
|
14
12
|
process.exit(1);
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
proc.on('exit', (code) => {
|
|
23
|
-
process.exit(code || 0);
|
|
15
|
+
import(entryPoint).catch((err) => {
|
|
16
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
17
|
+
process.exit(1);
|
|
24
18
|
});
|
|
@@ -9,7 +9,7 @@ describe("assembleSW", () => {
|
|
|
9
9
|
const sw = assembleSW(config, "1.0.0");
|
|
10
10
|
expect(sw).toContain("CACHE_NAME = 'sw-v1.0.0'");
|
|
11
11
|
expect(sw).toContain("self.addEventListener");
|
|
12
|
-
expect(sw).toContain("
|
|
12
|
+
expect(sw).toContain("CACHE_NAME_RUNTIME");
|
|
13
13
|
});
|
|
14
14
|
it("includes config header with resolved version", () => {
|
|
15
15
|
const sw = assembleSW(config, "2.5.0");
|
|
@@ -41,7 +41,7 @@ describe("assembleSW", () => {
|
|
|
41
41
|
const sw = assembleSW(config, "1.0.0");
|
|
42
42
|
expect(sw).toContain("fromPrecache");
|
|
43
43
|
expect(sw).toContain("async function fromPrecache");
|
|
44
|
-
expect(sw).toContain("cache.match(
|
|
44
|
+
expect(sw).toContain("return cache.match(new URL");
|
|
45
45
|
expect(sw).toContain("precached = await fromPrecache(request)");
|
|
46
46
|
});
|
|
47
47
|
it("includes message handler", () => {
|
|
@@ -157,8 +157,8 @@ describe("assembleSW", () => {
|
|
|
157
157
|
};
|
|
158
158
|
const sw = assembleSW(configWithTrim, "1.0.0");
|
|
159
159
|
expect(sw).toContain("trimRuntimeCache");
|
|
160
|
-
expect(sw).toContain("
|
|
161
|
-
expect(sw).toContain("
|
|
160
|
+
expect(sw).toContain("GLOBAL_MAX_ENTRIES = 100");
|
|
161
|
+
expect(sw).toContain("GLOBAL_MAX_AGE = 0");
|
|
162
162
|
});
|
|
163
163
|
it("includes trimRuntimeCache when maxCacheAge is set", () => {
|
|
164
164
|
const configWithTrim = {
|
|
@@ -173,8 +173,8 @@ describe("assembleSW", () => {
|
|
|
173
173
|
};
|
|
174
174
|
const sw = assembleSW(configWithTrim, "1.0.0");
|
|
175
175
|
expect(sw).toContain("trimRuntimeCache");
|
|
176
|
-
expect(sw).toContain("
|
|
177
|
-
expect(sw).toContain("
|
|
176
|
+
expect(sw).toContain("GLOBAL_MAX_AGE = 86400000");
|
|
177
|
+
expect(sw).toContain("GLOBAL_MAX_ENTRIES = 0");
|
|
178
178
|
});
|
|
179
179
|
it("excludes trimRuntimeCache when no trimming configured", () => {
|
|
180
180
|
const sw = assembleSW(config, "1.0.0");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assemble-sw.test.js","sourceRoot":"","sources":["../../src/__tests__/assemble-sw.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAoB,MAAM,+BAA+B,CAAC;AAEhF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAgB;QAC1B,GAAG,aAAa;KACjB,CAAC;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"assemble-sw.test.js","sourceRoot":"","sources":["../../src/__tests__/assemble-sw.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,6 @@ describe("CLI commands integration", () => {
|
|
|
35
35
|
auth: { enabled: false, type: "bearer", refreshPath: "/api/refresh", userEndpoint: "/api/me" },
|
|
36
36
|
crossTabSync: true,
|
|
37
37
|
tagInvalidation: true,
|
|
38
|
-
clientRegistration: true,
|
|
39
38
|
},
|
|
40
39
|
build: { outputDir: "dist", swFilename: "sw" },
|
|
41
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACzG,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,OAAO,GAAG,qBAAqB,CAAC;IAEtC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,UAAU,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,0CAA0C;gBACnD,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE;oBACR,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE;oBACpD,aAAa,EAAE;wBACb,OAAO,EAAE;4BACP,OAAO,EAAE,IAAI;4BACb,MAAM,EAAE,cAAc;4BACtB,mBAAmB,EAAE,OAAO;yBAC7B;wBACD,UAAU,EAAE,IAAI;wBAChB,YAAY,EAAE,KAAK;wBACnB,eAAe,EAAE,aAAa;wBAC9B,UAAU,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE;qBACtE;oBACD,aAAa,EAAE,KAAK;oBACpB,cAAc,EAAE,KAAK;oBACrB,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE;oBAC9F,YAAY,EAAE,IAAI;oBAClB,eAAe,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"cli-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,10 +23,10 @@ describe("config-types", () => {
|
|
|
23
23
|
expect(defaultConfig.features.pwa.enabled).toBe(true);
|
|
24
24
|
expect(defaultConfig.features.pwa.preventDefaultInstall).toBe(false);
|
|
25
25
|
});
|
|
26
|
-
it("has all known features
|
|
26
|
+
it("has all known features with correct types", () => {
|
|
27
27
|
for (const feature of KNOWN_FEATURES) {
|
|
28
28
|
expect(defaultConfig.features).toHaveProperty(feature);
|
|
29
|
-
if (feature === "auth") {
|
|
29
|
+
if (feature === "auth" || feature === "pushNotifications" || feature === "mutationQueue" || feature === "graphql" || feature === "serverPush") {
|
|
30
30
|
expect(typeof defaultConfig.features[feature]).toBe("object");
|
|
31
31
|
}
|
|
32
32
|
else {
|
|
@@ -58,22 +58,26 @@ describe("config-types", () => {
|
|
|
58
58
|
});
|
|
59
59
|
});
|
|
60
60
|
describe("constants", () => {
|
|
61
|
-
it("KNOWN_FEATURES
|
|
61
|
+
it("KNOWN_FEATURES lists all known features", () => {
|
|
62
62
|
expect(KNOWN_FEATURES).toContain("mutationQueue");
|
|
63
63
|
expect(KNOWN_FEATURES).toContain("backgroundSync");
|
|
64
64
|
expect(KNOWN_FEATURES).toContain("auth");
|
|
65
65
|
expect(KNOWN_FEATURES).toContain("crossTabSync");
|
|
66
66
|
expect(KNOWN_FEATURES).toContain("tagInvalidation");
|
|
67
|
-
expect(KNOWN_FEATURES).toContain("
|
|
67
|
+
expect(KNOWN_FEATURES).toContain("graphql");
|
|
68
|
+
expect(KNOWN_FEATURES).toContain("pushNotifications");
|
|
69
|
+
expect(KNOWN_FEATURES).not.toContain("clientRegistration");
|
|
68
70
|
expect(KNOWN_FEATURES).not.toContain("pwa");
|
|
69
71
|
expect(KNOWN_FEATURES).not.toContain("serviceWorker");
|
|
70
72
|
expect(KNOWN_FEATURES).not.toContain("versionedSw");
|
|
71
73
|
expect(KNOWN_FEATURES).not.toContain("autoUpdate");
|
|
72
74
|
});
|
|
73
|
-
it("OBJECT_FEATURES lists
|
|
75
|
+
it("OBJECT_FEATURES lists object-typed features", () => {
|
|
74
76
|
expect(OBJECT_FEATURES).toContain("pwa");
|
|
75
77
|
expect(OBJECT_FEATURES).toContain("serviceWorker");
|
|
76
78
|
expect(OBJECT_FEATURES).toContain("auth");
|
|
79
|
+
expect(OBJECT_FEATURES).toContain("pushNotifications");
|
|
80
|
+
expect(OBJECT_FEATURES).toContain("graphql");
|
|
77
81
|
});
|
|
78
82
|
it("VALID_STRATEGIES contains all 5 strategies", () => {
|
|
79
83
|
expect(VALID_STRATEGIES).toContain("cache-first");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-types.test.js","sourceRoot":"","sources":["../../src/__tests__/config-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAElJ,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjF,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9E,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1E,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjF,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvF,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"config-types.test.js","sourceRoot":"","sources":["../../src/__tests__/config-types.test.ts"],"names":[],"mappings":"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"}
|