@swoff/cli 0.3.5 → 0.3.7
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 +610 -24
- package/bin/swoff +8 -14
- package/dist/__tests__/assemble-sw.test.js +17 -3
- package/dist/__tests__/assemble-sw.test.js.map +1 -1
- package/dist/__tests__/cli-integration.test.js +9 -9
- package/dist/__tests__/cli-integration.test.js.map +1 -1
- package/dist/__tests__/config-types.test.js +10 -9
- package/dist/__tests__/config-types.test.js.map +1 -1
- package/dist/__tests__/file-generators.test.js +65 -68
- package/dist/__tests__/file-generators.test.js.map +1 -1
- package/dist/__tests__/loader.test.js +12 -14
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/validator.test.js +41 -22
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +3 -3
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/add.js +11 -5
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/clean.js +5 -0
- package/dist/lib/commands/clean.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +43 -13
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/generate.js +7 -3
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/info.js +149 -32
- 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/commands/validate.js +3 -1
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/validator.js +25 -16
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-fetch.js +29 -34
- package/dist/lib/generators/file-generators/auth-fetch.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-state.js +8 -5
- package/dist/lib/generators/file-generators/auth-state.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-store.js +181 -41
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-user.js +28 -32
- package/dist/lib/generators/file-generators/auth-user.js.map +1 -1
- package/dist/lib/generators/file-generators/background-sync.js +9 -5
- package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +8 -5
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +101 -0
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -0
- package/dist/lib/generators/file-generators/context.js +7 -6
- package/dist/lib/generators/file-generators/context.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +196 -41
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +23 -151
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +450 -0
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/invalidation-tags.js +12 -10
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +65 -87
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-reconcile.js +57 -0
- package/dist/lib/generators/file-generators/mutation-reconcile.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/pwa-install.js +41 -9
- package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
- package/dist/lib/generators/file-generators/quick-readme.js +88 -0
- package/dist/lib/generators/file-generators/quick-readme.js.map +1 -0
- package/dist/lib/generators/file-generators/reconcile.js +7 -12
- package/dist/lib/generators/file-generators/reconcile.js.map +1 -1
- package/dist/lib/generators/file-generators/store.js +30 -20
- package/dist/lib/generators/file-generators/store.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-generator-build.js +38 -17
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +82 -111
- package/dist/lib/generators/file-generators/sw-injector.js.map +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 +3 -1
- package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
- package/dist/lib/generators/file-generators/type-definitions.js +45 -22
- package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
- package/dist/lib/generators/sw-generator.js +27 -19
- 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 +36 -12
- package/dist/lib/generators/sw-sections/assemble-sw.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 +1 -30
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +176 -90
- 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/tag-management.js +36 -5
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +14 -12
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +26 -9
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/utils/build-script.js +35 -0
- package/dist/lib/utils/build-script.js.map +1 -0
- 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 +55 -0
- package/templates/hooks/useCachedFetch.tsx +69 -0
- package/templates/hooks/useMutationQueue.jsx +34 -0
- package/templates/hooks/useMutationQueue.tsx +34 -0
- package/templates/hooks/useNetworkStatus.jsx +19 -0
- package/templates/hooks/useNetworkStatus.tsx +19 -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
|
@@ -1,50 +1,167 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* info command
|
|
2
|
+
* info command — minimal summary or per-feature detail.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* swoff info List enabled features and generated files
|
|
6
|
+
* swoff info <feature> Detailed explanation of a specific feature
|
|
3
7
|
*/
|
|
4
8
|
import { readFileSync, existsSync, readdirSync } from "fs";
|
|
5
9
|
import { join } from "path";
|
|
6
10
|
import { log } from "../cli/logger.js";
|
|
7
11
|
import { loadConfigAsync } from "../config/loader.js";
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
const FEATURES = {
|
|
13
|
+
"mutation-queue": {
|
|
14
|
+
label: "Mutation Queue",
|
|
15
|
+
description: "Queues offline write operations in IndexedDB and replays them when the connection returns. Uses the Background Sync API or the online event listener.",
|
|
16
|
+
files: ["mutation-queue.ts"],
|
|
17
|
+
functions: [
|
|
18
|
+
"queueMutation(mutation) — store a write for later sync",
|
|
19
|
+
"processMutationQueue() — replay all queued writes",
|
|
20
|
+
"flushMutations() — same as processMutationQueue, call after re-login",
|
|
21
|
+
"getPendingCount() — number of mutations waiting to sync",
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
"background-sync": {
|
|
25
|
+
label: "Background Sync",
|
|
26
|
+
description: "Registers Background Sync API events so mutations are processed even after the tab is closed. Falls back to online event listener in unsupported browsers (Firefox, Safari).",
|
|
27
|
+
files: ["background-sync.ts"],
|
|
28
|
+
functions: [
|
|
29
|
+
"syncWhenPossible(mutation) — queue and register background sync",
|
|
30
|
+
"retrySync() — re-register sync if mutations are still pending",
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
auth: {
|
|
34
|
+
label: "Auth",
|
|
35
|
+
description: "Token-based authentication with memory-only tokens, IndexedDB user caching, and auth-aware fetch with automatic 401 handling.",
|
|
36
|
+
files: ["auth/store.ts", "auth/user.ts", "auth/state.ts"],
|
|
37
|
+
functions: [
|
|
38
|
+
"setAuth(authData) / getAuth() / clearAuth() — manage auth state",
|
|
39
|
+
"isAuthValid(auth) — check expiry",
|
|
40
|
+
"createAuthFromResponse(response) — extract AuthData from login response (edit this)",
|
|
41
|
+
"fetchWithCache(input, { auth: true }) — auth-aware fetch (handles bearer, cookie, custom)",
|
|
42
|
+
"ensureValidAuth() — check expiry and refresh token",
|
|
43
|
+
"fetchCurrentUser() / getCachedUser() / cacheUser(user) / clearCachedUser() — user caching",
|
|
44
|
+
"getAuthState() — detect 4-state matrix (online/offline × authenticated/not)",
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
"tag-invalidation": {
|
|
48
|
+
label: "Tag Invalidation",
|
|
49
|
+
description: "Generates cache tags from URL paths and invalidates stale cache entries after mutations. Keeps cached data fresh.",
|
|
50
|
+
files: ["invalidation-tags.ts", "cache.ts"],
|
|
51
|
+
functions: [
|
|
52
|
+
"generateTags(url) — extract tags from URL (e.g. /api/todos/42 → ['todos', 'todo:42'])",
|
|
53
|
+
"generateTagsFromMethod(method, url) — method-prefixed tags",
|
|
54
|
+
"invalidateUrl(url) — invalidate all cache entries matching a URL's tags",
|
|
55
|
+
"invalidateByTag(tag) / invalidateByTags(tags) — low-level invalidation",
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
"cross-tab": {
|
|
59
|
+
label: "Cross-tab Sync",
|
|
60
|
+
description: "Broadcasts cache invalidation and auth state changes across all open tabs via the service worker.",
|
|
61
|
+
files: ["client-injector.ts (internal handling)"],
|
|
62
|
+
functions: ["No separate imports needed — handled automatically by client-injector.ts"],
|
|
63
|
+
},
|
|
64
|
+
"push-notification": {
|
|
65
|
+
label: "Push Notifications",
|
|
66
|
+
description: "Push notification subscription management with IndexedDB persistence, VAPID key support, and service worker push/notificationclick event handlers.",
|
|
67
|
+
files: ["push.ts"],
|
|
68
|
+
functions: [
|
|
69
|
+
"subscribeToPush(vapidPublicKey) — request permission and subscribe",
|
|
70
|
+
"unsubscribeFromPush() — unsubscribe and clear stored subscription",
|
|
71
|
+
"isSubscribed() — check subscription status",
|
|
72
|
+
"getPushSubscription() — get current PushSubscription object",
|
|
73
|
+
"requestNotificationPermission() — request permission only",
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
pwa: {
|
|
77
|
+
label: "PWA",
|
|
78
|
+
description: "Install prompt handling, manifest generation, and React hooks for update management.",
|
|
79
|
+
files: ["pwa/install.ts", "manifest.json"],
|
|
80
|
+
functions: [
|
|
81
|
+
"setupPwaInstall() — listen for beforeinstallprompt/appinstalled events",
|
|
82
|
+
"isInstallable() — check if install prompt is available",
|
|
83
|
+
"promptInstall() — show native install prompt",
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
export async function infoCommand(projectRoot, feature) {
|
|
88
|
+
if (feature) {
|
|
89
|
+
return showFeatureDetail(feature);
|
|
90
|
+
}
|
|
91
|
+
// Minimal top-level summary
|
|
10
92
|
const { config, configPath } = await loadConfigAsync(projectRoot);
|
|
11
93
|
if (!configPath) {
|
|
12
94
|
log.warn('No swoff.config.json found. Run "swoff init" first.');
|
|
13
95
|
return;
|
|
14
96
|
}
|
|
15
|
-
log.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
97
|
+
log.header("Swoff");
|
|
98
|
+
// Show version
|
|
99
|
+
try {
|
|
100
|
+
const pkg = JSON.parse(readFileSync(join(projectRoot, "node_modules", "@swoff", "cli", "package.json"), "utf8"));
|
|
101
|
+
log.normal(`Version: ${pkg.version}`);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// version not available
|
|
105
|
+
}
|
|
106
|
+
// Show enabled features
|
|
107
|
+
const enabled = [];
|
|
108
|
+
if (config.features.mutationQueue)
|
|
109
|
+
enabled.push("mutation-queue");
|
|
110
|
+
if (config.features.backgroundSync)
|
|
111
|
+
enabled.push("background-sync");
|
|
112
|
+
if (config.features.auth.enabled)
|
|
113
|
+
enabled.push("auth");
|
|
114
|
+
if (config.features.crossTabSync)
|
|
115
|
+
enabled.push("cross-tab");
|
|
116
|
+
if (config.features.tagInvalidation)
|
|
117
|
+
enabled.push("tag-invalidation");
|
|
118
|
+
if (config.features.pushNotifications?.enabled)
|
|
119
|
+
enabled.push("push-notification");
|
|
120
|
+
if (config.features.pwa.enabled)
|
|
121
|
+
enabled.push("pwa");
|
|
122
|
+
if (enabled.length > 0) {
|
|
123
|
+
log.normal(`\nEnabled features: ${enabled.join(", ")}`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
log.normal("\nEnabled features: (none)");
|
|
127
|
+
}
|
|
128
|
+
// Count generated files
|
|
32
129
|
const swoffDir = join(projectRoot, "swoff");
|
|
33
130
|
if (existsSync(swoffDir)) {
|
|
34
|
-
const
|
|
35
|
-
|
|
131
|
+
const count = countFilesRecursive(swoffDir);
|
|
132
|
+
log.normal(`Generated files: ${count} in swoff/`);
|
|
36
133
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
134
|
+
log.help("\n swoff info <feature> — detailed info for a feature");
|
|
135
|
+
log.help(" Features: mutation-queue, background-sync, auth, tag-invalidation, cross-tab, push-notification, pwa");
|
|
136
|
+
log.help(" Read swoff/GUIDE.md for the full integration guide");
|
|
137
|
+
}
|
|
138
|
+
function showFeatureDetail(feature) {
|
|
139
|
+
const key = feature.toLowerCase().replace(/[_-]/g, "-").replace(/^-+|-+$/g, "");
|
|
140
|
+
const info = FEATURES[key];
|
|
141
|
+
if (!info) {
|
|
142
|
+
log.error(`Unknown feature: ${feature}`);
|
|
143
|
+
log.info("Available: mutation-queue, background-sync, auth, tag-invalidation, cross-tab, push-notification, pwa");
|
|
144
|
+
return;
|
|
40
145
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
146
|
+
log.header(info.label);
|
|
147
|
+
log.normal(info.description);
|
|
148
|
+
log.normal("\nGenerated files:");
|
|
149
|
+
info.files.forEach((f) => log.help(` swoff/${f}`));
|
|
150
|
+
log.normal("\nFunctions:");
|
|
151
|
+
info.functions.forEach((f) => log.help(` ${f}`));
|
|
152
|
+
log.help("\n Read swoff/GUIDE.md for code examples and usage details.");
|
|
153
|
+
}
|
|
154
|
+
function countFilesRecursive(dir) {
|
|
155
|
+
let count = 0;
|
|
156
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
157
|
+
const full = join(dir, entry.name);
|
|
158
|
+
if (entry.isDirectory()) {
|
|
159
|
+
count += countFilesRecursive(full);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
count++;
|
|
163
|
+
}
|
|
48
164
|
}
|
|
165
|
+
return count;
|
|
49
166
|
}
|
|
50
167
|
//# sourceMappingURL=info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,9 +15,13 @@ export async function initCommand(projectRoot, framework) {
|
|
|
15
15
|
log.info("To reinitialize, delete the config file first.");
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
|
+
const detected = framework || detectFramework(projectRoot);
|
|
18
19
|
const config = {
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
$schema: defaultInitConfig.$schema,
|
|
21
|
+
enabled: defaultInitConfig.enabled,
|
|
22
|
+
framework: detected,
|
|
23
|
+
build: defaultInitConfig.build,
|
|
24
|
+
features: defaultInitConfig.features,
|
|
21
25
|
};
|
|
22
26
|
const configPath = join(projectRoot, "swoff.config.json");
|
|
23
27
|
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/lib/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAkB;IACvE,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;IAEF,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,kBAAkB,cAAc,kBAAkB,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/lib/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAkB;IACvE,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;IAEF,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,kBAAkB,cAAc,kBAAkB,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,iBAAiB,CAAC,OAAO;QAClC,OAAO,EAAE,iBAAiB,CAAC,OAAO;QAClC,SAAS,EAAE,QAAoC;QAC/C,KAAK,EAAE,iBAAiB,CAAC,KAAK;QAC9B,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;KACrC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC1D,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC/C,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -20,8 +20,10 @@ export async function validateCommand(projectRoot) {
|
|
|
20
20
|
}
|
|
21
21
|
log.success("Configuration is valid!");
|
|
22
22
|
log.info("\nConfig summary:");
|
|
23
|
-
log.help(`Version: ${config.version}`);
|
|
23
|
+
log.help(`Version source: ${config.features.serviceWorker.version.source}`);
|
|
24
|
+
log.help(`Version enabled: ${config.features.serviceWorker.version.enabled}`);
|
|
24
25
|
log.help(`Default strategy: ${config.features.serviceWorker.defaultStrategy}`);
|
|
26
|
+
log.help(`Auto update: ${config.features.serviceWorker.autoUpdate}`);
|
|
25
27
|
log.help(`Features enabled: ${Object.entries(config.features)
|
|
26
28
|
.filter(([k, v]) => {
|
|
27
29
|
if (k === "serviceWorker")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/lib/commands/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,GAAG,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAEhF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,cAAc,CAAC,MAA4C,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/lib/commands/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,GAAG,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAEhF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,cAAc,CAAC,MAA4C,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,GAAG,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;IAC/E,GAAG,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IACrE,GAAG,CAAC,IAAI,CACN,qBAAqB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,KAAK,eAAe;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAQ,CAA6B,CAAC,OAAO,KAAK,IAAI,CAAC;QAChG,OAAO,CAAC,KAAK,IAAI,CAAC;IACpB,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { KNOWN_FEATURES, OBJECT_FEATURES, VALID_STRATEGIES } from "../shared/config-types.js";
|
|
2
2
|
export function validateConfig(config) {
|
|
3
3
|
const errors = [];
|
|
4
|
-
const requiredFields = ["enabled", "
|
|
4
|
+
const requiredFields = ["enabled", "features", "build"];
|
|
5
5
|
const missingFields = requiredFields.filter((field) => config[field] === undefined || config[field] === null);
|
|
6
6
|
if (missingFields.length > 0) {
|
|
7
7
|
errors.push(`Missing required fields: ${missingFields.join(", ")}`);
|
|
@@ -34,8 +34,8 @@ export function validateConfig(config) {
|
|
|
34
34
|
}
|
|
35
35
|
const sw = features.serviceWorker;
|
|
36
36
|
if (sw) {
|
|
37
|
-
if (sw.
|
|
38
|
-
errors.push("features.serviceWorker.
|
|
37
|
+
if (sw.autoUpdate !== undefined && typeof sw.autoUpdate !== "boolean") {
|
|
38
|
+
errors.push("features.serviceWorker.autoUpdate must be a boolean");
|
|
39
39
|
}
|
|
40
40
|
if (sw.autoActivate !== undefined && typeof sw.autoActivate !== "boolean") {
|
|
41
41
|
errors.push("features.serviceWorker.autoActivate must be a boolean");
|
|
@@ -54,15 +54,34 @@ export function validateConfig(config) {
|
|
|
54
54
|
if (sw.clearRuntimeOnUpdate !== undefined && typeof sw.clearRuntimeOnUpdate !== "boolean") {
|
|
55
55
|
errors.push("features.serviceWorker.clearRuntimeOnUpdate must be a boolean");
|
|
56
56
|
}
|
|
57
|
-
if (sw.versionedSw !== undefined && typeof sw.versionedSw !== "boolean") {
|
|
58
|
-
errors.push("features.serviceWorker.versionedSw must be a boolean");
|
|
59
|
-
}
|
|
60
57
|
if (sw.navigationMode !== undefined && !["spa", "default"].includes(sw.navigationMode)) {
|
|
61
58
|
errors.push('features.serviceWorker.navigationMode must be "spa" or "default"');
|
|
62
59
|
}
|
|
63
60
|
if (sw.spaEntry !== undefined && typeof sw.spaEntry !== "string") {
|
|
64
61
|
errors.push("features.serviceWorker.spaEntry must be a string");
|
|
65
62
|
}
|
|
63
|
+
const ver = sw.version;
|
|
64
|
+
if (ver) {
|
|
65
|
+
if (ver.enabled !== undefined && typeof ver.enabled !== "boolean") {
|
|
66
|
+
errors.push("features.serviceWorker.version.enabled must be a boolean");
|
|
67
|
+
}
|
|
68
|
+
if (ver.source !== undefined && !["from-package", "manual"].includes(ver.source)) {
|
|
69
|
+
errors.push('features.serviceWorker.version.source must be "from-package" or "manual"');
|
|
70
|
+
}
|
|
71
|
+
if (ver.source === "manual" && !ver.value) {
|
|
72
|
+
errors.push("features.serviceWorker.version.value is required when source is 'manual'");
|
|
73
|
+
}
|
|
74
|
+
if (ver.value !== undefined && typeof ver.value === "string" && ver.value !== "from-package") {
|
|
75
|
+
if (!/^\d+\.\d+\.\d+$/.test(ver.value)) {
|
|
76
|
+
errors.push(`Invalid version value "${ver.value}". Must be semver (e.g., "1.0.0")`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (ver.minSupportedVersion !== undefined && typeof ver.minSupportedVersion === "string") {
|
|
80
|
+
if (!/^\d+\.\d+\.\d+$/.test(ver.minSupportedVersion)) {
|
|
81
|
+
errors.push(`Invalid minSupportedVersion "${ver.minSupportedVersion}". Must be semver (e.g., "1.0.0")`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
66
85
|
}
|
|
67
86
|
const tagInvalidationVal = features.tagInvalidation;
|
|
68
87
|
const crossTabSyncVal = features.crossTabSync;
|
|
@@ -90,16 +109,6 @@ export function validateConfig(config) {
|
|
|
90
109
|
}
|
|
91
110
|
}
|
|
92
111
|
}
|
|
93
|
-
if (config.version && typeof config.version === "string" && config.version !== "from-package") {
|
|
94
|
-
if (!/^\d+\.\d+\.\d+$/.test(config.version)) {
|
|
95
|
-
errors.push(`Invalid version "${config.version}". Must be "from-package" or semver (e.g., "1.0.0")`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (config.minSupportedVersion && typeof config.minSupportedVersion === "string") {
|
|
99
|
-
if (!/^\d+\.\d+\.\d+$/.test(config.minSupportedVersion)) {
|
|
100
|
-
errors.push(`Invalid minSupportedVersion "${config.minSupportedVersion}". Must be semver (e.g., "1.0.0")`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
112
|
const fw = config.framework;
|
|
104
113
|
if (fw !== undefined && typeof fw === "string" && !["react", "vue", "svelte", "vanilla"].includes(fw)) {
|
|
105
114
|
errors.push('framework must be "react", "vue", "svelte", or "vanilla"');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/config/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE9F,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/config/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generates auth-fetch.ts/js —
|
|
3
|
-
* Uses auth config to generate appropriate withAuthHeaders() and isAuthUrl().
|
|
2
|
+
* Generates auth-fetch.ts/js — thin auth wrapper around fetchWithCache.
|
|
4
3
|
*/
|
|
5
4
|
import { writeFile } from "./context.js";
|
|
6
5
|
export function generateAuthFetch(ctx) {
|
|
7
6
|
const ext = ctx.ext;
|
|
7
|
+
const ts = ext === "ts";
|
|
8
|
+
const T = (type) => (ts ? `: ${type}` : "");
|
|
9
|
+
const R = (type) => (ts ? `: ${type} ` : " ");
|
|
8
10
|
const authConfig = ctx.config.features.auth;
|
|
9
11
|
const { refreshPath, userEndpoint, type } = authConfig;
|
|
10
12
|
function generateWithAuthHeaders() {
|
|
13
|
+
const a = T("AuthData | null");
|
|
14
|
+
const h = T("Headers");
|
|
15
|
+
const hd = T("Headers");
|
|
11
16
|
switch (type) {
|
|
12
17
|
case "cookie":
|
|
13
|
-
return `function withAuthHeaders(headers, _auth)
|
|
14
|
-
// Cookie/Session auth — browser auto-sends cookies.
|
|
15
|
-
// No header modification needed.
|
|
18
|
+
return `function withAuthHeaders(headers${hd}, _auth${a})${h}{
|
|
16
19
|
return headers;
|
|
17
20
|
}`;
|
|
18
21
|
case "bearer":
|
|
19
|
-
return `function withAuthHeaders(headers, auth)
|
|
20
|
-
// --- EDIT THIS BLOCK FOR YOUR BACKEND ---
|
|
21
|
-
// JWT Bearer token:
|
|
22
|
+
return `function withAuthHeaders(headers${hd}, auth${a})${h}{
|
|
22
23
|
if (auth?.token) {
|
|
23
24
|
headers.set("Authorization", \`Bearer \${auth.token}\`);
|
|
24
25
|
}
|
|
25
|
-
// --- END OF EDITABLE BLOCK ---
|
|
26
26
|
return headers;
|
|
27
27
|
}`;
|
|
28
28
|
case "custom":
|
|
29
|
-
return `function withAuthHeaders(headers, auth)
|
|
29
|
+
return `function withAuthHeaders(headers${hd}, auth${a})${h}{
|
|
30
30
|
// --- EDIT THIS BLOCK FOR YOUR BACKEND ---
|
|
31
|
-
// Custom header (e.g., X-API-Key, X-Auth-Token):
|
|
32
31
|
// if (auth?.token) {
|
|
33
32
|
// headers.set("X-Auth-Token", auth.token);
|
|
34
33
|
// }
|
|
@@ -36,30 +35,32 @@ export function generateAuthFetch(ctx) {
|
|
|
36
35
|
return headers;
|
|
37
36
|
}`;
|
|
38
37
|
default:
|
|
39
|
-
return `function withAuthHeaders(headers, auth)
|
|
40
|
-
// --- EDIT THIS BLOCK FOR YOUR BACKEND ---
|
|
38
|
+
return `function withAuthHeaders(headers${hd}, auth${a})${h}{
|
|
41
39
|
if (auth?.token) {
|
|
42
40
|
headers.set("Authorization", \`Bearer \${auth.token}\`);
|
|
43
41
|
}
|
|
44
|
-
// --- END OF EDITABLE BLOCK ---
|
|
45
42
|
return headers;
|
|
46
43
|
}`;
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
const credentialsLine = type === "cookie"
|
|
50
|
-
? `const fetchOptions = { ...options, headers, credentials: "include" };`
|
|
51
|
-
: `const fetchOptions = { ...options, headers };`;
|
|
47
|
+
? `const fetchOptions = { ...options, headers, credentials: "include" as RequestCredentials };`
|
|
48
|
+
: ` const fetchOptions = { ...options, headers };`;
|
|
52
49
|
const code = `/**
|
|
53
|
-
* Auth-
|
|
54
|
-
* and handles 401 responses.
|
|
50
|
+
* Auth-Fetch — attaches auth headers, excludes auth endpoints from cache,
|
|
51
|
+
* and handles 401 responses. Thin wrapper around fetchWithCache.
|
|
55
52
|
*
|
|
56
53
|
* Usage:
|
|
57
|
-
* import { authenticatedFetch } from "./auth
|
|
54
|
+
* import { authenticatedFetch } from "./auth/fetch.${ext}";
|
|
58
55
|
* const data = await authenticatedFetch("/api/data").then((r) => r.json());
|
|
56
|
+
*
|
|
57
|
+
* Or use fetchWithCache directly:
|
|
58
|
+
* import { fetchWithCache } from "../fetch-wrapper.${ext}";
|
|
59
|
+
* const data = await fetchWithCache("/api/me", { auth: true });
|
|
59
60
|
*/
|
|
60
61
|
|
|
61
|
-
import { fetchWithCache } from "
|
|
62
|
-
import { getAuth, setAuth, clearAuth } from "./
|
|
62
|
+
import { fetchWithCache } from "../fetch-wrapper.${ext}";
|
|
63
|
+
import { getAuth, setAuth, clearAuth${ts ? ", type AuthData" : ""} } from "./store.${ext}";
|
|
63
64
|
|
|
64
65
|
${generateWithAuthHeaders()}
|
|
65
66
|
|
|
@@ -67,7 +68,7 @@ ${generateWithAuthHeaders()}
|
|
|
67
68
|
* Auth endpoints that should never be cached by the SW.
|
|
68
69
|
* Edit this list to match your backend's auth routes.
|
|
69
70
|
*/
|
|
70
|
-
function isAuthUrl(url)
|
|
71
|
+
function isAuthUrl(url${T("string")})${R("boolean")}{
|
|
71
72
|
const authPaths = [
|
|
72
73
|
"/login",
|
|
73
74
|
"/logout",
|
|
@@ -81,18 +82,13 @@ function isAuthUrl(url) {
|
|
|
81
82
|
return authPaths.some((path) => url.includes(path));
|
|
82
83
|
}
|
|
83
84
|
|
|
84
|
-
/**
|
|
85
|
-
|
|
86
|
-
* Attaches identity, excludes auth endpoints from cache, handles 401.
|
|
87
|
-
*/
|
|
88
|
-
export async function authenticatedFetch(input, options = {}) {
|
|
85
|
+
/** Auth-aware fetch. Delegates to fetchWithCache with auth headers, cache bypass for auth endpoints, and 401 handling. Options may include \`type: 'read' | 'mutation'\` to override method-based caching. */
|
|
86
|
+
export async function authenticatedFetch(input${T("RequestInfo")}, options${T("RequestInit & { type?: 'read' | 'mutation' }")} = {})${R("Promise<Response>")}{
|
|
89
87
|
const auth = await getAuth();
|
|
90
88
|
const headers = new Headers(options.headers);
|
|
91
89
|
|
|
92
|
-
// Attach auth headers (your backend determines how)
|
|
93
90
|
withAuthHeaders(headers, auth);
|
|
94
91
|
|
|
95
|
-
// Determine if this is an auth endpoint (login, logout, refresh)
|
|
96
92
|
const url = typeof input === "string" ? input : input.url;
|
|
97
93
|
|
|
98
94
|
// Mark auth endpoints as mutation to bypass SW cache
|
|
@@ -101,7 +97,7 @@ export async function authenticatedFetch(input, options = {}) {
|
|
|
101
97
|
}
|
|
102
98
|
|
|
103
99
|
${credentialsLine}
|
|
104
|
-
const response = await fetchWithCache(input, fetchOptions);
|
|
100
|
+
const { response } = await fetchWithCache(input, fetchOptions);
|
|
105
101
|
|
|
106
102
|
// Handle 401 — auth expired or invalidated server-side
|
|
107
103
|
if (response.status === 401) {
|
|
@@ -116,14 +112,13 @@ export async function authenticatedFetch(input, options = {}) {
|
|
|
116
112
|
* Token refresh helper — called before requests when token may be expired.
|
|
117
113
|
* Uses refreshPath from config.
|
|
118
114
|
*/
|
|
119
|
-
let refreshPromise = null;
|
|
115
|
+
let refreshPromise${T("Promise<AuthData | null> | null")} = null;
|
|
120
116
|
|
|
121
|
-
export async function ensureValidAuth() {
|
|
117
|
+
export async function ensureValidAuth()${R("Promise<AuthData | null>")}{
|
|
122
118
|
const auth = await getAuth();
|
|
123
119
|
if (!auth) return null;
|
|
124
120
|
if (!auth.expiresAt || Date.now() < auth.expiresAt) return auth;
|
|
125
121
|
|
|
126
|
-
// Token expired — refresh it (deduplicated)
|
|
127
122
|
if (!refreshPromise) {
|
|
128
123
|
refreshPromise = (async () => {
|
|
129
124
|
const response = await authenticatedFetch("${refreshPath}", {
|
|
@@ -151,6 +146,6 @@ export async function ensureValidAuth() {
|
|
|
151
146
|
}
|
|
152
147
|
}
|
|
153
148
|
`;
|
|
154
|
-
writeFile(ctx, `auth
|
|
149
|
+
writeFile(ctx, `auth/fetch.${ext}`, code);
|
|
155
150
|
}
|
|
156
151
|
//# sourceMappingURL=auth-fetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-fetch.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-fetch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"auth-fetch.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-fetch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;IAEvD,SAAS,uBAAuB;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACxB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,OAAO,mCAAmC,EAAE,UAAU,CAAC,IAAI,CAAC;;EAElE,CAAC;YACG,KAAK,QAAQ;gBACX,OAAO,mCAAmC,EAAE,SAAS,CAAC,IAAI,CAAC;;;;;EAKjE,CAAC;YACG,KAAK,QAAQ;gBACX,OAAO,mCAAmC,EAAE,SAAS,CAAC,IAAI,CAAC;;;;;;;EAOjE,CAAC;YACG;gBACE,OAAO,mCAAmC,EAAE,SAAS,CAAC,IAAI,CAAC;;;;;EAKjE,CAAC;QACC,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GACnB,IAAI,KAAK,QAAQ;QACf,CAAC,CAAC,6FAA6F;QAC/F,CAAC,CAAC,iDAAiD,CAAC;IAExD,MAAM,IAAI,GAAG;;;;;wDAKyC,GAAG;;;;wDAIH,GAAG;;;;mDAIR,GAAG;sCAChB,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,oBAAoB,GAAG;;EAEtF,uBAAuB,EAAE;;;;;;wBAMH,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;;;;;;;;OAQ5C,WAAW;OACX,YAAY;;;;;;gDAM6B,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,8CAA8C,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC;;;;;;;;;;;;;IAaxJ,eAAe;;;;;;;;;;;;;;;;oBAgBC,CAAC,CAAC,iCAAiC,CAAC;;yCAEf,CAAC,CAAC,0BAA0B,CAAC;;;;;;;mDAOnB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;CAwB7D,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
import { writeFile } from "./context.js";
|
|
5
5
|
export function generateAuthState(ctx) {
|
|
6
6
|
const ext = ctx.ext;
|
|
7
|
+
const ts = ext === "ts";
|
|
8
|
+
const R = (type) => (ts ? `: ${type} ` : " ");
|
|
7
9
|
const code = `/**
|
|
8
10
|
* Auth State — detect the four auth states for offline/online handling.
|
|
9
11
|
*
|
|
@@ -14,14 +16,15 @@ export function generateAuthState(ctx) {
|
|
|
14
16
|
* 4. Offline + Unauthenticated → Strict offline (public content only)
|
|
15
17
|
*
|
|
16
18
|
* Usage:
|
|
17
|
-
* import { getAuthState } from "./auth
|
|
19
|
+
* import { getAuthState } from "./auth/state.${ext}";
|
|
18
20
|
* const { authenticated, user, online } = await getAuthState();
|
|
19
21
|
*/
|
|
20
22
|
|
|
21
|
-
import { getAuth, isAuthValid } from "./
|
|
22
|
-
import { getCachedUser } from "./
|
|
23
|
+
import { getAuth, isAuthValid } from "./store.${ext}";
|
|
24
|
+
import { getCachedUser } from "./user.${ext}";
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
/** Detect current auth state across the 4-state matrix (online/offline × authenticated/not). */
|
|
27
|
+
export async function getAuthState()${R("Promise<{ authenticated: boolean; user: Record<string, unknown> | null; online: boolean }>")}{
|
|
25
28
|
const auth = await getAuth();
|
|
26
29
|
const valid = isAuthValid(auth);
|
|
27
30
|
const user = valid ? await getCachedUser() : null;
|
|
@@ -33,6 +36,6 @@ export async function getAuthState() {
|
|
|
33
36
|
};
|
|
34
37
|
}
|
|
35
38
|
`;
|
|
36
|
-
writeFile(ctx, `auth
|
|
39
|
+
writeFile(ctx, `auth/state.${ext}`, code);
|
|
37
40
|
}
|
|
38
41
|
//# sourceMappingURL=auth-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-state.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-state.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAG;;;;;;;;;;kDAUmC,GAAG;;;;gDAIL,GAAG;wCACX,GAAG;;;sCAGL,CAAC,CAAC,4FAA4F,CAAC;;;;;;;;;;;CAWpI,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
|