@swoff/cli 0.3.13 → 0.3.14
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 +28 -32
- package/dist/index.js +2 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +3 -8
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/add.js +29 -87
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +16 -30
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/generate.js +31 -6
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/init.js +188 -11
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js +2 -4
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/loader.js +34 -25
- package/dist/lib/config/loader.js.map +1 -1
- package/dist/lib/config/validator.js +202 -96
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/api-config.js +1 -1
- package/dist/lib/generators/file-generators/api-config.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-adapter.js +13 -0
- package/dist/lib/generators/file-generators/auth-adapter.js.map +1 -0
- package/dist/lib/generators/file-generators/auth-check.js +40 -0
- package/dist/lib/generators/file-generators/auth-check.js.map +1 -0
- package/dist/lib/generators/file-generators/auth-store.js +2 -5
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/background-sync.js +1 -1
- package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +2 -1
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector-bundle.js +15 -0
- package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -0
- package/dist/lib/generators/file-generators/client-injector.js +2 -1
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/connectivity-manager.js +12 -0
- package/dist/lib/generators/file-generators/connectivity-manager.js.map +1 -0
- package/dist/lib/generators/file-generators/connectivity.js +12 -0
- package/dist/lib/generators/file-generators/connectivity.js.map +1 -0
- package/dist/lib/generators/file-generators/context.js +7 -0
- package/dist/lib/generators/file-generators/context.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-framework-adapters.js +29 -20
- package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +2 -2
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +51 -1
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/invalidation-tags.js +2 -3
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +2 -2
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
- package/dist/lib/generators/file-generators/notification-generator.js +6 -0
- package/dist/lib/generators/file-generators/notification-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/open-db.js +6 -0
- package/dist/lib/generators/file-generators/open-db.js.map +1 -0
- package/dist/lib/generators/file-generators/push.js +1 -2
- package/dist/lib/generators/file-generators/push.js.map +1 -1
- package/dist/lib/generators/file-generators/pwa-install.js +2 -6
- package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
- package/dist/lib/generators/file-generators/server-push.js +1 -1
- package/dist/lib/generators/file-generators/server-push.js.map +1 -1
- package/dist/lib/generators/file-generators/storage-generator.js +6 -0
- package/dist/lib/generators/file-generators/storage-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/storage-notify.js +6 -0
- package/dist/lib/generators/file-generators/storage-notify.js.map +1 -0
- package/dist/lib/generators/file-generators/storage.js +6 -0
- package/dist/lib/generators/file-generators/storage.js.map +1 -0
- package/dist/lib/generators/file-generators/sw-generator-build.js +96 -45
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +0 -4
- package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-template.js +8 -9
- package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-version-gen.js +32 -0
- package/dist/lib/generators/file-generators/sw-version-gen.js.map +1 -0
- package/dist/lib/generators/file-generators/swoff-api-bundle.js +51 -0
- package/dist/lib/generators/file-generators/swoff-api-bundle.js.map +1 -0
- package/dist/lib/generators/sw-build-utils.js +69 -0
- package/dist/lib/generators/sw-build-utils.js.map +1 -0
- package/dist/lib/generators/sw-generator.js +23 -34
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js +74 -23
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +15 -94
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +74 -72
- package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js +102 -0
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js.map +1 -0
- package/dist/lib/generators/sw-sections/config-header.js +2 -3
- package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
- package/dist/lib/generators/sw-sections/default-template.js +59 -6
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +621 -495
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/install-handler.js +40 -23
- package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/message-handler.js +25 -8
- package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/server-push-handler.js +10 -14
- package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/shared.js +68 -0
- package/dist/lib/generators/sw-sections/shared.js.map +1 -0
- package/dist/lib/generators/sw-sections/sw-push.js +2 -6
- package/dist/lib/generators/sw-sections/sw-push.js.map +1 -1
- package/dist/lib/generators/sw-sections/tag-management.js +55 -86
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +183 -59
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +67 -63
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/shared/feature-registry.js +198 -0
- package/dist/lib/shared/feature-registry.js.map +1 -0
- package/dist/lib/utils/detect-framework.js +52 -9
- package/dist/lib/utils/detect-framework.js.map +1 -1
- package/dist/runtime/api-config.js +2 -2
- package/dist/runtime/api-config.js.map +1 -1
- package/dist/runtime/auth-adapter.js +179 -0
- package/dist/runtime/auth-adapter.js.map +1 -0
- package/dist/runtime/auth-state.js +16 -6
- package/dist/runtime/auth-state.js.map +1 -1
- package/dist/runtime/auth-store.js +219 -213
- package/dist/runtime/auth-store.js.map +1 -1
- package/dist/runtime/auth-user.js +5 -19
- package/dist/runtime/auth-user.js.map +1 -1
- package/dist/runtime/background-sync.js +5 -2
- package/dist/runtime/background-sync.js.map +1 -1
- package/dist/runtime/cache.js +91 -3
- package/dist/runtime/cache.js.map +1 -1
- package/dist/runtime/client-injector-bundle.js +314 -0
- package/dist/runtime/client-injector-bundle.js.map +1 -0
- package/dist/runtime/client-injector.js +173 -30
- package/dist/runtime/client-injector.js.map +1 -1
- package/dist/runtime/connectivity-manager.js +83 -0
- package/dist/runtime/connectivity-manager.js.map +1 -0
- package/dist/runtime/connectivity.js +83 -0
- package/dist/runtime/connectivity.js.map +1 -0
- package/dist/runtime/fetch-wrapper.js +26 -59
- package/dist/runtime/fetch-wrapper.js.map +1 -1
- package/dist/runtime/gql-wrapper.js +15 -9
- package/dist/runtime/gql-wrapper.js.map +1 -1
- package/dist/runtime/invalidation-tags.js +12 -89
- package/dist/runtime/invalidation-tags.js.map +1 -1
- package/dist/runtime/mutation-queue.js +83 -31
- package/dist/runtime/mutation-queue.js.map +1 -1
- package/dist/runtime/mutation-state.js +3 -3
- package/dist/runtime/mutation-state.js.map +1 -1
- package/dist/runtime/notification.js +65 -0
- package/dist/runtime/notification.js.map +1 -0
- package/dist/runtime/open-db.js +41 -0
- package/dist/runtime/open-db.js.map +1 -0
- package/dist/runtime/push.js +15 -27
- package/dist/runtime/push.js.map +1 -1
- package/dist/runtime/pwa-injector.js +3 -32
- package/dist/runtime/pwa-injector.js.map +1 -1
- package/dist/runtime/pwa-prompt.js +35 -3
- package/dist/runtime/pwa-prompt.js.map +1 -1
- package/dist/runtime/reset.js +39 -42
- package/dist/runtime/reset.js.map +1 -1
- package/dist/runtime/server-push.js +23 -13
- package/dist/runtime/server-push.js.map +1 -1
- package/dist/runtime/storage.js +32 -0
- package/dist/runtime/storage.js.map +1 -0
- package/dist/runtime/sw-injector.js +19 -178
- package/dist/runtime/sw-injector.js.map +1 -1
- package/dist/runtime/sw-version.js +13 -0
- package/dist/runtime/sw-version.js.map +1 -0
- package/dist/runtime/swoff-api-bundle.js +1491 -0
- package/dist/runtime/swoff-api-bundle.js.map +1 -0
- package/dist/runtime/type-definitions.js +8 -7
- package/dist/runtime/type-definitions.js.map +1 -1
- package/dist/runtime/utils.js +4 -0
- package/dist/runtime/utils.js.map +1 -1
- package/dist/swoff-nkdhhmw8. +18 -0
- package/dist/swoff.js +5 -0
- package/package.json +1 -1
- package/templates/react/useAuth.jsx +7 -4
- package/templates/react/useAuth.tsx +14 -14
- package/templates/react/useBackgroundSync.jsx +5 -4
- package/templates/react/useBackgroundSync.tsx +5 -4
- package/templates/react/useCachedFetch.jsx +8 -0
- package/templates/react/useCachedFetch.tsx +8 -0
- package/templates/react/useMutation.jsx +60 -56
- package/templates/react/useMutation.tsx +65 -64
- package/templates/react/useMutationQueue.jsx +5 -1
- package/templates/react/useMutationQueue.tsx +8 -2
- package/templates/react/useMutationState.jsx +3 -4
- package/templates/react/useMutationState.tsx +4 -8
- package/templates/react/useNetworkStatus.jsx +57 -17
- package/templates/react/useNetworkStatus.tsx +42 -20
- package/templates/react/useOfflineAnalytics.jsx +42 -0
- package/templates/react/useOfflineAnalytics.tsx +50 -0
- package/templates/react/usePwaInstall.jsx +26 -0
- package/templates/react/usePwaInstall.tsx +26 -0
- package/templates/react/useSWUpdate.jsx +7 -52
- package/templates/react/useSWUpdate.tsx +12 -51
- package/templates/react/useStorageEstimate.jsx +56 -0
- package/templates/react/useStorageEstimate.tsx +67 -0
- package/dist/__tests__/assemble-sw.test.js +0 -145
- package/dist/__tests__/assemble-sw.test.js.map +0 -1
- package/dist/__tests__/cli-integration.test.js +0 -231
- package/dist/__tests__/cli-integration.test.js.map +0 -1
- package/dist/__tests__/config-types.test.js +0 -124
- package/dist/__tests__/config-types.test.js.map +0 -1
- package/dist/__tests__/detect-language.test.js +0 -51
- package/dist/__tests__/detect-language.test.js.map +0 -1
- package/dist/__tests__/file-generators.test.js +0 -228
- package/dist/__tests__/file-generators.test.js.map +0 -1
- package/dist/__tests__/glob-matcher.test.js +0 -86
- package/dist/__tests__/glob-matcher.test.js.map +0 -1
- package/dist/__tests__/invalidation-tags.test.js +0 -283
- package/dist/__tests__/invalidation-tags.test.js.map +0 -1
- package/dist/__tests__/loader.test.js +0 -77
- package/dist/__tests__/loader.test.js.map +0 -1
- package/dist/__tests__/validator.test.js +0 -340
- package/dist/__tests__/validator.test.js.map +0 -1
- package/templates/react/useCacheInvalidation.jsx +0 -19
- package/templates/react/useCacheInvalidation.tsx +0 -52
- package/templates/react/useIsFetching.jsx +0 -32
- package/templates/react/useIsFetching.tsx +0 -32
|
@@ -3,21 +3,20 @@ export function generateSwGeneratorBuild(ctx) {
|
|
|
3
3
|
const code = `#!/usr/bin/env node
|
|
4
4
|
/**
|
|
5
5
|
* Swoff SW Generator Build Script
|
|
6
|
-
* Reads swoff/sw/template.js and generates
|
|
6
|
+
* Reads swoff/sw/template.js and generates the final SW output.
|
|
7
7
|
*
|
|
8
8
|
* Add to package.json:
|
|
9
9
|
* "build": "your-build && node swoff/sw/generator.js"
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';
|
|
13
|
-
import { join, dirname, relative } from 'path';
|
|
14
|
-
import { createHash } from 'crypto';
|
|
13
|
+
import { join, dirname, relative, extname } from 'path';
|
|
15
14
|
import { fileURLToPath } from 'url';
|
|
15
|
+
import { createRequire } from 'module';
|
|
16
16
|
|
|
17
17
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
18
|
const projectRoot = process.cwd();
|
|
19
19
|
|
|
20
|
-
const pkgPath = join(projectRoot, 'package.json');
|
|
21
20
|
const templatePath = join(__dirname, 'template.js');
|
|
22
21
|
const configPath = join(projectRoot, 'swoff.config.json');
|
|
23
22
|
|
|
@@ -32,18 +31,46 @@ if (!existsSync(templatePath)) {
|
|
|
32
31
|
process.exit(1);
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
const pkg = existsSync(pkgPath) ? JSON.parse(readFileSync(pkgPath, 'utf8')) : { version: '1.0.0' };
|
|
36
34
|
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
37
|
-
|
|
35
|
+
let template = readFileSync(templatePath, 'utf8');
|
|
36
|
+
|
|
37
|
+
const swoffDir = join(projectRoot, 'swoff');
|
|
38
|
+
|
|
39
|
+
// Prepend isAuthFailureResponse from user's auth/check, or use default fallback
|
|
40
|
+
const authCheckTsPath = join(swoffDir, 'auth', 'check.ts');
|
|
41
|
+
const authCheckJsPath = join(swoffDir, 'auth', 'check.js');
|
|
42
|
+
const authCheckPath = existsSync(authCheckTsPath) ? authCheckTsPath : authCheckJsPath;
|
|
43
|
+
let authFailureFn = 'async function isAuthFailureResponse(response) {\\n return response.status === 401;\\n}';
|
|
44
|
+
if (existsSync(authCheckPath)) {
|
|
45
|
+
const authContent = readFileSync(authCheckPath, 'utf8');
|
|
46
|
+
const fnMatch = authContent.match(/export\\s+async\\s+function\\s+isAuthFailureResponse[\\s\\S]*?\\n\\}/);
|
|
47
|
+
if (fnMatch) {
|
|
48
|
+
authFailureFn = fnMatch[0].replace(/^export\\s+/, '');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
template = authFailureFn + '\\n\\n' + template;
|
|
52
|
+
|
|
53
|
+
// Resolve API_BASE for server push endpoint
|
|
54
|
+
if (config.features?.serverPush?.enabled) {
|
|
55
|
+
let apiBase = '';
|
|
56
|
+
const configJsPath = join(swoffDir, 'config.js');
|
|
57
|
+
if (existsSync(configJsPath)) {
|
|
58
|
+
try {
|
|
59
|
+
const _require = createRequire(import.meta.url);
|
|
60
|
+
const configMod = _require(configJsPath);
|
|
61
|
+
apiBase = configMod.API_BASE || '';
|
|
62
|
+
} catch {}
|
|
63
|
+
} else {
|
|
64
|
+
const configTsPath = join(swoffDir, 'config.ts');
|
|
65
|
+
if (existsSync(configTsPath)) {
|
|
66
|
+
const content = readFileSync(configTsPath, 'utf8');
|
|
67
|
+
const match = content.match(/export\\s+const\\s+API_BASE\\s*=\\s*"([^"]+)"/);
|
|
68
|
+
apiBase = match ? match[1] : '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
template = template.replace(/SWOFF_API_BASE/g, apiBase);
|
|
72
|
+
}
|
|
38
73
|
|
|
39
|
-
const swConfig = config.features?.serviceWorker || {};
|
|
40
|
-
const versionField = swConfig.version;
|
|
41
|
-
const versionEnabled = versionField !== "hash";
|
|
42
|
-
const version = versionField === "package"
|
|
43
|
-
? (pkg.version || '1.0.0')
|
|
44
|
-
: versionField === "hash"
|
|
45
|
-
? "0.0.0"
|
|
46
|
-
: versionField || (pkg.version || '1.0.0');
|
|
47
74
|
const outputDir = config.build?.outputDir || 'dist';
|
|
48
75
|
const swFilename = config.build?.swFilename || 'sw';
|
|
49
76
|
|
|
@@ -52,56 +79,80 @@ if (!existsSync(outDir)) {
|
|
|
52
79
|
mkdirSync(outDir, { recursive: true });
|
|
53
80
|
}
|
|
54
81
|
|
|
55
|
-
function collectAssets(dir) {
|
|
82
|
+
function collectAssets(dir, baseDir) {
|
|
83
|
+
if (!existsSync(dir)) return [];
|
|
56
84
|
const entries = readdirSync(dir, { withFileTypes: true });
|
|
57
85
|
const assets = [];
|
|
58
86
|
for (const entry of entries) {
|
|
59
87
|
const fullPath = join(dir, entry.name);
|
|
60
88
|
if (entry.isDirectory()) {
|
|
61
|
-
assets.push(...collectAssets(fullPath));
|
|
89
|
+
assets.push(...collectAssets(fullPath, baseDir));
|
|
62
90
|
} else {
|
|
63
|
-
assets.push('/' + relative(
|
|
91
|
+
assets.push('/' + relative(baseDir, fullPath));
|
|
64
92
|
}
|
|
65
93
|
}
|
|
66
94
|
return assets;
|
|
67
95
|
}
|
|
68
96
|
|
|
69
|
-
|
|
70
|
-
|
|
97
|
+
const dirsRaw = config.build?.precacheDirs || {};
|
|
98
|
+
const dirs = dirsRaw;
|
|
99
|
+
const allAssets = [];
|
|
100
|
+
for (const [dir, raw] of Object.entries(dirs)) {
|
|
101
|
+
const dirPath = join(projectRoot, dir);
|
|
102
|
+
if (existsSync(dirPath)) {
|
|
103
|
+
const cfg = raw;
|
|
104
|
+
const normPrefix = cfg.prefix.replace(/\\/+$/, '');
|
|
105
|
+
const matchExtensions = cfg.matchExtensions;
|
|
106
|
+
const stripExtensions = cfg.stripExtensions;
|
|
107
|
+
const stripSuffixes = cfg.stripSuffixes;
|
|
108
|
+
for (const a of collectAssets(dirPath, dirPath)) {
|
|
109
|
+
if (matchExtensions?.length && !matchExtensions.includes(extname(a))) continue;
|
|
110
|
+
let url = normPrefix + '/' + a.slice(1);
|
|
111
|
+
if (stripExtensions?.includes(extname(a))) url = url.replace(/\\.[^/.]+$/, '');
|
|
112
|
+
if (stripSuffixes) {
|
|
113
|
+
for (const suffix of stripSuffixes) {
|
|
114
|
+
if (url.endsWith('/' + suffix)) {
|
|
115
|
+
url = url.slice(0, -suffix.length - 1) + '/';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (url !== '/' && url.endsWith('/')) {
|
|
120
|
+
url = url.slice(0, -1);
|
|
121
|
+
}
|
|
122
|
+
allAssets.push(url);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
71
125
|
}
|
|
72
|
-
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
|
|
126
|
+
const swFile = \`\${swFilename}.js\`;
|
|
127
|
+
const filtered = allAssets.filter(a => a !== \`/\${swFile}\`);
|
|
128
|
+
const nav = config.features?.serviceWorker?.navigation || {};
|
|
129
|
+
const fallback = [];
|
|
130
|
+
if (nav.fallback) fallback.push(nav.fallback);
|
|
77
131
|
if (config.features?.pwa?.enabled) fallback.push('/manifest.json');
|
|
132
|
+
if (nav.precacheRoutes) {
|
|
133
|
+
for (const route of nav.precacheRoutes) {
|
|
134
|
+
if (!fallback.includes(route)) fallback.push(route);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (nav.rules) {
|
|
138
|
+
for (const rule of nav.rules) {
|
|
139
|
+
if (rule.fallback && !fallback.includes(rule.fallback)) fallback.push(rule.fallback);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
78
142
|
const combined = [...new Set([...fallback, ...filtered])];
|
|
79
143
|
const assetsToCache = combined.map(url => ({ url, options: {} }));
|
|
80
144
|
|
|
81
145
|
let sw = template;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const sentinel = 'SW_CACHE_SENTINEL';
|
|
86
|
-
sw = sw.replace('// [[CACHE_NAME]]', \`CACHE_NAME = '\${sentinel}'\`);
|
|
87
|
-
}
|
|
88
|
-
sw = sw.replace('// [[ASSETS_LIST]]', \`ASSETS_TO_CACHE = \${JSON.stringify(assetsToCache, null, 2)}\`);
|
|
89
|
-
sw = sw.replace('// [[AUTO_SKIP_WAITING]]', \`const AUTO_SKIP_WAITING = \${config.features?.serviceWorker?.autoActivate || false};\`);
|
|
146
|
+
sw = sw.replace(/let ASSETS_TO_CACHE = \\[\\]/, () => \`let ASSETS_TO_CACHE = \${JSON.stringify(assetsToCache, null, 2)};\`);
|
|
147
|
+
sw = sw.replace(/let AUTO_SKIP_WAITING = (?:true|false)/, () => \`let AUTO_SKIP_WAITING = \${config.features?.serviceWorker?.autoActivate || false};\`);
|
|
148
|
+
sw += \`\\nconst CACHE_NAME = "\${Date.now()}";\\n\`;
|
|
90
149
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
console.log(\`Service worker built: \${outputDir}/\${swFile}\`);
|
|
96
|
-
} else {
|
|
97
|
-
writeFileSync(join(outDir, swFile), sw);
|
|
98
|
-
writeFileSync(join(outDir, 'version.json'), JSON.stringify({
|
|
99
|
-
version,
|
|
100
|
-
minSupportedVersion: swConfig.minSupportedVersion || '0.0.0',
|
|
101
|
-
generatedAt: new Date().toISOString(),
|
|
102
|
-
}, null, 2));
|
|
103
|
-
console.log(\`Service worker built: \${outputDir}/\${swFile}\`);
|
|
150
|
+
writeFileSync(join(outDir, swFile), sw);
|
|
151
|
+
const hasPrecache = Object.keys(config.build?.precacheDirs || {}).length > 0;
|
|
152
|
+
if (!hasPrecache) {
|
|
153
|
+
console.warn('Warning: No precacheDirs configured. Only explicit fallback routes will be precached.');
|
|
104
154
|
}
|
|
155
|
+
console.log(\`Service worker built: \${outputDir}/\${swFile}\`);
|
|
105
156
|
`;
|
|
106
157
|
writeFile(ctx, "sw/generator.js", code);
|
|
107
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw-generator-build.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-generator-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,wBAAwB,CAAC,GAAqB;IAC5D,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"sw-generator-build.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-generator-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,wBAAwB,CAAC,GAAqB;IAC5D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyJd,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -4,14 +4,10 @@
|
|
|
4
4
|
import { writeFile } from "./context.js";
|
|
5
5
|
import { generateSwInjectorCode } from "../../../runtime/sw-injector.js";
|
|
6
6
|
export function generateSwInjector(ctx) {
|
|
7
|
-
const v = ctx.config.features.serviceWorker.version;
|
|
8
|
-
const versionEnabled = v !== "hash";
|
|
9
7
|
writeFile(ctx, `sw/injector.${ctx.ext}`, generateSwInjectorCode({
|
|
10
8
|
ts: ctx.ext === "ts",
|
|
11
9
|
ext: ctx.ext,
|
|
12
|
-
autoUpdate: ctx.config.features.serviceWorker.autoUpdate,
|
|
13
10
|
autoActivate: ctx.config.features.serviceWorker.autoActivate,
|
|
14
|
-
versionEnabled,
|
|
15
11
|
swFilename: ctx.config.build?.swFilename || "sw",
|
|
16
12
|
}));
|
|
17
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw-injector.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-injector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,
|
|
1
|
+
{"version":3,"file":"sw-injector.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-injector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,SAAS,CACP,GAAG,EACH,eAAe,GAAG,CAAC,GAAG,EAAE,EACxB,sBAAsB,CAAC;QACrB,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY;QAC5D,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,IAAI,IAAI;KACjD,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -3,16 +3,15 @@
|
|
|
3
3
|
* Placeholders are replaced during build by sw-generator.js.
|
|
4
4
|
*/
|
|
5
5
|
import { writeFile } from "./context.js";
|
|
6
|
-
import {
|
|
6
|
+
import { getDefaultTemplate } from "../sw-sections/default-template.js";
|
|
7
|
+
import { applySwSections, shouldIncludeBackgroundSync, generateBackgroundSyncCode } from "../sw-sections/shared.js";
|
|
7
8
|
export function generateSwTemplate(ctx) {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
// Dev mode fallback — if placeholders weren't replaced, use a dev cache name
|
|
15
|
-
code += `\n// Dev mode fallback\nif (!CACHE_NAME) CACHE_NAME = "sw-dev-cache";\n`;
|
|
9
|
+
const { config, debug } = ctx;
|
|
10
|
+
let code = getDefaultTemplate();
|
|
11
|
+
code = applySwSections(code, config, true, debug);
|
|
12
|
+
if (shouldIncludeBackgroundSync(config)) {
|
|
13
|
+
code += generateBackgroundSyncCode(config);
|
|
14
|
+
}
|
|
16
15
|
writeFile(ctx, "sw/template.js", code);
|
|
17
16
|
}
|
|
18
17
|
//# sourceMappingURL=sw-template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw-template.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sw-template.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEpH,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAE9B,IAAI,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAEhC,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAElD,IAAI,2BAA2B,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAGD,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { writeFile } from "./context.js";
|
|
4
|
+
import { generateSwVersionCode } from "../../../runtime/sw-version.js";
|
|
5
|
+
export function generateSwVersion(ctx) {
|
|
6
|
+
const v = ctx.config.features.serviceWorker.version;
|
|
7
|
+
let version;
|
|
8
|
+
if (v === "hash") {
|
|
9
|
+
version = "0.0.0";
|
|
10
|
+
}
|
|
11
|
+
else if (v === "package") {
|
|
12
|
+
const pkgPath = join(ctx.projectRoot, "package.json");
|
|
13
|
+
if (existsSync(pkgPath)) {
|
|
14
|
+
try {
|
|
15
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
16
|
+
version = pkg.version || "1.0.0";
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
version = "1.0.0";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
version = "1.0.0";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// "manual" — start with a default; user edits this file directly
|
|
28
|
+
version = "1.0.0";
|
|
29
|
+
}
|
|
30
|
+
writeFile(ctx, `sw/version.${ctx.ext}`, generateSwVersionCode({ ts: ctx.ext === "ts", ext: ctx.ext, version }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=sw-version-gen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-version-gen.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/sw-version-gen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IAEpD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC;SAAM,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QACtD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtD,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,OAAO,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,iEAAiE;QACjE,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC;IAED,SAAS,CACP,GAAG,EACH,cAAc,GAAG,CAAC,GAAG,EAAE,EACvB,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CACvE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates swoff-api.bundle.{js|ts} — a self-contained IIFE that exposes
|
|
3
|
+
* the full Swoff API on window.swoff for no-bundler users (vanilla, HTMX,
|
|
4
|
+
* Laravel, Django, Go, Rails).
|
|
5
|
+
*
|
|
6
|
+
* Requires client-injector.bundle.js to be loaded first for SW registration.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* <script src="/swoff/client-injector.bundle.js"></script>
|
|
10
|
+
* <script src="/swoff/swoff-api.bundle.js"></script>
|
|
11
|
+
* <script>
|
|
12
|
+
* swoff.fetchWithCache("/api/todos").then(r => r.json());
|
|
13
|
+
* swoff.invalidateByTag("todos");
|
|
14
|
+
* </script>
|
|
15
|
+
*/
|
|
16
|
+
import { writeFile } from "./context.js";
|
|
17
|
+
import { generateSwoffApiBundleCode } from "../../../runtime/swoff-api-bundle.js";
|
|
18
|
+
export function generateSwoffApiBundle(ctx) {
|
|
19
|
+
const ext = ctx.ext;
|
|
20
|
+
const sw = ctx.config.features.serviceWorker;
|
|
21
|
+
const mq = ctx.config.features.mutationQueue;
|
|
22
|
+
const ti = ctx.config.features.tagInvalidation;
|
|
23
|
+
const code = generateSwoffApiBundleCode({ ts: ext === "ts", ext }, {
|
|
24
|
+
authEnabled: ctx.config.features.auth.enabled,
|
|
25
|
+
authType: ctx.config.features.auth.type,
|
|
26
|
+
authRoutePaths: ctx.config.features.auth.routePaths,
|
|
27
|
+
mutationQueueEnabled: mq.enabled,
|
|
28
|
+
mutationQueueBatchSize: mq.batchSize,
|
|
29
|
+
mutationQueueBatchDelayMs: mq.batchDelayMs,
|
|
30
|
+
mutationQueueMaxRetries: mq.retry.maxRetries,
|
|
31
|
+
mutationQueueRetryBackoffMs: mq.retry.backoffMs,
|
|
32
|
+
mutationQueueRetryMaxBackoffMs: mq.retry.maxBackoffMs,
|
|
33
|
+
mutationQueueRetryJitterMs: mq.retry.jitterMs,
|
|
34
|
+
pwaEnabled: ctx.config.features.pwa.enabled,
|
|
35
|
+
pwaPreventDefaultInstall: ctx.config.features.pwa.preventDefaultInstall,
|
|
36
|
+
requestBatchWindowMs: ctx.config.features.requestBatchWindowMs,
|
|
37
|
+
tagInvalidationSkipPrefixes: ti.skipPrefixes ?? [],
|
|
38
|
+
tagInvalidationPatterns: ti.patterns ?? {},
|
|
39
|
+
tagInvalidationSingularization: ti.singularization ?? {},
|
|
40
|
+
tagInvalidationCascading: ti.cascading ?? {},
|
|
41
|
+
gqlEnabled: ctx.config.features.graphql.enabled,
|
|
42
|
+
gqlEndpoints: ctx.config.features.graphql.endpoints ?? [],
|
|
43
|
+
pushNotificationsEnabled: ctx.config.features.pushNotifications,
|
|
44
|
+
serverPushEnabled: ctx.config.features.serverPush.enabled,
|
|
45
|
+
serverPushType: ctx.config.features.serverPush.type,
|
|
46
|
+
serverPushEndpoint: ctx.config.features.serverPush.endpoint,
|
|
47
|
+
serverPushReconnectDelayMs: ctx.config.features.serverPush.reconnectDelayMs,
|
|
48
|
+
});
|
|
49
|
+
writeFile(ctx, `swoff-api.bundle.${ext}`, code);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=swoff-api-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swoff-api-bundle.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/swoff-api-bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAElF,MAAM,UAAU,sBAAsB,CAAC,GAAqB;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;IAE/C,MAAM,IAAI,GAAG,0BAA0B,CACrC,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,EACzB;QACE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO;QAC7C,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI;QACvC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU;QACnD,oBAAoB,EAAE,EAAE,CAAC,OAAO;QAChC,sBAAsB,EAAE,EAAE,CAAC,SAAS;QACpC,yBAAyB,EAAE,EAAE,CAAC,YAAY;QAC1C,uBAAuB,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;QAC5C,2BAA2B,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS;QAC/C,8BAA8B,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY;QACrD,0BAA0B,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;QAC7C,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO;QAC3C,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,qBAAqB;QACvE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB;QAC9D,2BAA2B,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;QAClD,uBAAuB,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE;QAC1C,8BAA8B,EAAE,EAAE,CAAC,eAAe,IAAI,EAAE;QACxD,wBAAwB,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE;QAC5C,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;QAC/C,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;QACzD,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB;QAC/D,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO;QACzD,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;QACnD,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ;QAC3D,0BAA0B,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,gBAAgB;KAC5E,CACF,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE,oBAAoB,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readdirSync, existsSync } from "fs";
|
|
2
|
+
import { join, relative, extname } from "path";
|
|
3
|
+
export function collectAssets(dir, baseDir) {
|
|
4
|
+
if (!existsSync(dir))
|
|
5
|
+
return [];
|
|
6
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
7
|
+
const assets = [];
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
const fullPath = join(dir, entry.name);
|
|
10
|
+
if (entry.isDirectory()) {
|
|
11
|
+
assets.push(...collectAssets(fullPath, baseDir));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
assets.push("/" + relative(baseDir, fullPath));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return assets;
|
|
18
|
+
}
|
|
19
|
+
export function buildFallbackList(config) {
|
|
20
|
+
const fallback = [];
|
|
21
|
+
if (config.features.pwa.enabled)
|
|
22
|
+
fallback.push("/manifest.json");
|
|
23
|
+
const nav = config.features.serviceWorker.navigation;
|
|
24
|
+
if (nav.fallback && !fallback.includes(nav.fallback)) {
|
|
25
|
+
fallback.push(nav.fallback);
|
|
26
|
+
}
|
|
27
|
+
for (const route of nav.precacheRoutes || []) {
|
|
28
|
+
if (!fallback.includes(route))
|
|
29
|
+
fallback.push(route);
|
|
30
|
+
}
|
|
31
|
+
for (const rule of nav.rules || []) {
|
|
32
|
+
if (rule.fallback && !fallback.includes(rule.fallback)) {
|
|
33
|
+
fallback.push(rule.fallback);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
export function scanPrecacheAssets(config, projectRoot, swFile) {
|
|
39
|
+
const dirsRaw = config.build.precacheDirs || {};
|
|
40
|
+
const dirs = dirsRaw;
|
|
41
|
+
const scanned = [];
|
|
42
|
+
for (const [dir, raw] of Object.entries(dirs)) {
|
|
43
|
+
const dirPath = join(projectRoot, dir);
|
|
44
|
+
const cfg = raw;
|
|
45
|
+
const normPrefix = cfg.prefix.replace(/\/+$/, "");
|
|
46
|
+
for (const a of collectAssets(dirPath, dirPath)) {
|
|
47
|
+
if (cfg.matchExtensions?.length && !cfg.matchExtensions.includes(extname(a)))
|
|
48
|
+
continue;
|
|
49
|
+
let urlPath = normPrefix + "/" + a.slice(1);
|
|
50
|
+
if (cfg.stripExtensions?.includes(extname(a))) {
|
|
51
|
+
urlPath = urlPath.replace(/\.[^/.]+$/, "");
|
|
52
|
+
}
|
|
53
|
+
if (cfg.stripSuffixes) {
|
|
54
|
+
for (const suffix of cfg.stripSuffixes) {
|
|
55
|
+
if (urlPath.endsWith("/" + suffix)) {
|
|
56
|
+
urlPath = urlPath.slice(0, -suffix.length - 1) + "/";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (urlPath !== "/" && urlPath.endsWith("/")) {
|
|
61
|
+
urlPath = urlPath.slice(0, -1);
|
|
62
|
+
}
|
|
63
|
+
if (urlPath !== `/${swFile}`)
|
|
64
|
+
scanned.push(urlPath);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return scanned;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=sw-build-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-build-utils.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-build-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +1,50 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { writeFileSync, existsSync, mkdirSync } from "fs";
|
|
2
|
+
import { readFile } from "fs/promises";
|
|
2
3
|
import { join } from "path";
|
|
3
4
|
import { fileURLToPath } from "url";
|
|
4
5
|
import { loadConfigAsync } from "../config/loader.js";
|
|
5
6
|
import { assembleSW } from "./sw-sections/assemble-sw.js";
|
|
6
|
-
|
|
7
|
-
const v = config.features.serviceWorker.version;
|
|
8
|
-
if (v === "hash")
|
|
9
|
-
return "0.0.0";
|
|
10
|
-
if (v === "package")
|
|
11
|
-
return pkgVersion || "1.0.0";
|
|
12
|
-
return v;
|
|
13
|
-
}
|
|
7
|
+
import { createRequire } from "module";
|
|
14
8
|
export async function generateSW(options = {}) {
|
|
15
9
|
const optProjectRoot = options.projectRoot || process.cwd();
|
|
16
10
|
const optConfigPath = options.configPath;
|
|
17
|
-
const
|
|
18
|
-
let
|
|
19
|
-
|
|
11
|
+
const { config } = await loadConfigAsync(optProjectRoot, optConfigPath);
|
|
12
|
+
let sw = assembleSW(config, optProjectRoot);
|
|
13
|
+
let apiBase = "";
|
|
14
|
+
const configJsPath = join(optProjectRoot, "swoff", "config.js");
|
|
15
|
+
if (existsSync(configJsPath)) {
|
|
20
16
|
try {
|
|
21
|
-
|
|
17
|
+
const _require = createRequire(import.meta.url);
|
|
18
|
+
const configMod = _require(configJsPath);
|
|
19
|
+
apiBase = configMod.API_BASE || "";
|
|
22
20
|
}
|
|
23
|
-
catch {
|
|
24
|
-
|
|
21
|
+
catch { }
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const configTsPath = join(optProjectRoot, "swoff", "config.ts");
|
|
25
|
+
if (existsSync(configTsPath)) {
|
|
26
|
+
const content = await readFile(configTsPath, "utf8");
|
|
27
|
+
const match = content.match(/export\s+const\s+API_BASE\s*=\s*"([^"]+)"/);
|
|
28
|
+
apiBase = match ? match[1] : "";
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
console.log("Swoff config generation disabled. Using custom code mode.");
|
|
30
|
-
return { version: "", outputFile: "" };
|
|
31
|
+
if (sw.includes("SWOFF_API_BASE")) {
|
|
32
|
+
sw = sw.replace(/SWOFF_API_BASE/g, apiBase);
|
|
31
33
|
}
|
|
32
|
-
const v = config.features.serviceWorker.version;
|
|
33
|
-
const versionEnabled = v !== "hash";
|
|
34
|
-
const version = resolveVersion(config, pkg.version || "1.0.0");
|
|
35
|
-
const sw = assembleSW(config, version, optProjectRoot);
|
|
36
34
|
const outputDir = join(optProjectRoot, config.build.outputDir);
|
|
37
35
|
if (!existsSync(outputDir)) {
|
|
38
36
|
mkdirSync(outputDir, { recursive: true });
|
|
39
37
|
}
|
|
40
38
|
const swFilename = config.build.swFilename;
|
|
41
|
-
const outputFile =
|
|
39
|
+
const outputFile = `${swFilename}.js`;
|
|
42
40
|
try {
|
|
43
41
|
writeFileSync(join(outputDir, outputFile), sw);
|
|
44
|
-
if (versionEnabled) {
|
|
45
|
-
writeFileSync(join(outputDir, "version.json"), JSON.stringify({
|
|
46
|
-
version,
|
|
47
|
-
minSupportedVersion: config.features.serviceWorker.minSupportedVersion,
|
|
48
|
-
generatedAt: new Date().toISOString(),
|
|
49
|
-
configEnabled: config.enabled,
|
|
50
|
-
configSource,
|
|
51
|
-
}, null, 2));
|
|
52
|
-
}
|
|
53
42
|
console.log(`${outputDir}/${outputFile}`);
|
|
54
43
|
}
|
|
55
44
|
catch (err) {
|
|
56
45
|
console.log(`Error writing files: ${err instanceof Error ? err.message : String(err)}`);
|
|
57
46
|
}
|
|
58
|
-
return {
|
|
47
|
+
return { outputFile };
|
|
59
48
|
}
|
|
60
49
|
if (fileURLToPath(import.meta.url) === fileURLToPath(new URL(process.argv[1], "file:"))) {
|
|
61
50
|
const args = process.argv.slice(2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sw-generator.js","sourceRoot":"","sources":["../../../src/lib/generators/sw-generator.ts"],"names":[],"mappings":"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"}
|