@angular/service-worker 21.0.0-next.9 → 21.0.0-rc.1
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/fesm2022/config.mjs +185 -203
- package/fesm2022/config.mjs.map +1 -1
- package/fesm2022/service-worker.mjs +379 -643
- package/fesm2022/service-worker.mjs.map +1 -1
- package/ngsw-worker.js +1 -1
- package/package.json +2 -2
- package/types/config.d.ts +1 -1
- package/types/service-worker.d.ts +1 -9
package/fesm2022/config.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v21.0.0-
|
|
2
|
+
* @license Angular v21.0.0-rc.1
|
|
3
3
|
* (c) 2010-2025 Google LLC. https://angular.dev/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -7,236 +7,218 @@
|
|
|
7
7
|
const PARSE_TO_PAIRS = /([0-9]+[^0-9]+)/g;
|
|
8
8
|
const PAIR_SPLIT = /^([0-9]+)([dhmsu]+)$/;
|
|
9
9
|
function parseDurationToMs(duration) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const matches = [];
|
|
11
|
+
let array;
|
|
12
|
+
while ((array = PARSE_TO_PAIRS.exec(duration)) !== null) {
|
|
13
|
+
matches.push(array[0]);
|
|
14
|
+
}
|
|
15
|
+
return matches.map(match => {
|
|
16
|
+
const res = PAIR_SPLIT.exec(match);
|
|
17
|
+
if (res === null) {
|
|
18
|
+
throw new Error(`Not a valid duration: ${match}`);
|
|
14
19
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
break;
|
|
38
|
-
default:
|
|
39
|
-
throw new Error(`Not a valid duration unit: ${res[2]}`);
|
|
40
|
-
}
|
|
41
|
-
return parseInt(res[1]) * factor;
|
|
42
|
-
})
|
|
43
|
-
.reduce((total, value) => total + value, 0);
|
|
20
|
+
let factor = 0;
|
|
21
|
+
switch (res[2]) {
|
|
22
|
+
case 'd':
|
|
23
|
+
factor = 86400000;
|
|
24
|
+
break;
|
|
25
|
+
case 'h':
|
|
26
|
+
factor = 3600000;
|
|
27
|
+
break;
|
|
28
|
+
case 'm':
|
|
29
|
+
factor = 60000;
|
|
30
|
+
break;
|
|
31
|
+
case 's':
|
|
32
|
+
factor = 1000;
|
|
33
|
+
break;
|
|
34
|
+
case 'u':
|
|
35
|
+
factor = 1;
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
throw new Error(`Not a valid duration unit: ${res[2]}`);
|
|
39
|
+
}
|
|
40
|
+
return parseInt(res[1]) * factor;
|
|
41
|
+
}).reduce((total, value) => total + value, 0);
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
const QUESTION_MARK = '[^/]';
|
|
47
45
|
const WILD_SINGLE = '[^/]*';
|
|
48
46
|
const WILD_OPEN = '(?:.+\\/)?';
|
|
49
|
-
const TO_ESCAPE_BASE = [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
const TO_ESCAPE_BASE = [{
|
|
48
|
+
replace: /\./g,
|
|
49
|
+
with: '\\.'
|
|
50
|
+
}, {
|
|
51
|
+
replace: /\+/g,
|
|
52
|
+
with: '\\+'
|
|
53
|
+
}, {
|
|
54
|
+
replace: /\*/g,
|
|
55
|
+
with: WILD_SINGLE
|
|
56
|
+
}];
|
|
57
|
+
const TO_ESCAPE_WILDCARD_QM = [...TO_ESCAPE_BASE, {
|
|
58
|
+
replace: /\?/g,
|
|
59
|
+
with: QUESTION_MARK
|
|
60
|
+
}];
|
|
61
|
+
const TO_ESCAPE_LITERAL_QM = [...TO_ESCAPE_BASE, {
|
|
62
|
+
replace: /\?/g,
|
|
63
|
+
with: '\\?'
|
|
64
|
+
}];
|
|
56
65
|
function globToRegex(glob, literalQuestionMark = false) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
regex += '\\/';
|
|
75
|
-
}
|
|
76
|
-
}
|
|
66
|
+
const toEscape = literalQuestionMark ? TO_ESCAPE_LITERAL_QM : TO_ESCAPE_WILDCARD_QM;
|
|
67
|
+
const segments = glob.split('/').reverse();
|
|
68
|
+
let regex = '';
|
|
69
|
+
while (segments.length > 0) {
|
|
70
|
+
const segment = segments.pop();
|
|
71
|
+
if (segment === '**') {
|
|
72
|
+
if (segments.length > 0) {
|
|
73
|
+
regex += WILD_OPEN;
|
|
74
|
+
} else {
|
|
75
|
+
regex += '.*';
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
const processed = toEscape.reduce((segment, escape) => segment.replace(escape.replace, escape.with), segment);
|
|
79
|
+
regex += processed;
|
|
80
|
+
if (segments.length > 0) {
|
|
81
|
+
regex += '\\/';
|
|
82
|
+
}
|
|
77
83
|
}
|
|
78
|
-
|
|
84
|
+
}
|
|
85
|
+
return regex;
|
|
79
86
|
}
|
|
80
87
|
|
|
81
|
-
const DEFAULT_NAVIGATION_URLS = [
|
|
82
|
-
'/**', // Include all URLs.
|
|
83
|
-
'!/**/*.*', // Exclude URLs to files (containing a file extension in the last segment).
|
|
84
|
-
'!/**/*__*', // Exclude URLs containing `__` in the last segment.
|
|
85
|
-
'!/**/*__*/**', // Exclude URLs containing `__` in any other segment.
|
|
86
|
-
];
|
|
87
|
-
/**
|
|
88
|
-
* Consumes service worker configuration files and processes them into control files.
|
|
89
|
-
*
|
|
90
|
-
* @publicApi
|
|
91
|
-
*/
|
|
88
|
+
const DEFAULT_NAVIGATION_URLS = ['/**', '!/**/*.*', '!/**/*__*', '!/**/*__*/**'];
|
|
92
89
|
class Generator {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
const fileMatcher = globListToMatcher(group.resources.files || []);
|
|
129
|
-
const matchedFiles = allFiles
|
|
130
|
-
.filter(fileMatcher)
|
|
131
|
-
.filter((file) => !seenMap.has(file))
|
|
132
|
-
.sort();
|
|
133
|
-
matchedFiles.forEach((file) => seenMap.add(file));
|
|
134
|
-
filesPerGroup.set(group, matchedFiles);
|
|
135
|
-
}
|
|
136
|
-
// Compute hashes for all matched files and add them to the hash-table.
|
|
137
|
-
const allMatchedFiles = [].concat(...Array.from(filesPerGroup.values())).sort();
|
|
138
|
-
const allMatchedHashes = await processInBatches(allMatchedFiles, 500, (file) => this.fs.hash(file));
|
|
139
|
-
allMatchedFiles.forEach((file, idx) => {
|
|
140
|
-
hashTable[joinUrls(this.baseHref, file)] = allMatchedHashes[idx];
|
|
141
|
-
});
|
|
142
|
-
// Generate and return the processed asset-groups.
|
|
143
|
-
return Array.from(filesPerGroup.entries()).map(([group, matchedFiles]) => ({
|
|
144
|
-
name: group.name,
|
|
145
|
-
installMode: group.installMode || 'prefetch',
|
|
146
|
-
updateMode: group.updateMode || group.installMode || 'prefetch',
|
|
147
|
-
cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),
|
|
148
|
-
urls: matchedFiles.map((url) => joinUrls(this.baseHref, url)),
|
|
149
|
-
patterns: (group.resources.urls || []).map((url) => urlToRegex(url, this.baseHref, true)),
|
|
150
|
-
}));
|
|
151
|
-
}
|
|
152
|
-
processDataGroups(config) {
|
|
153
|
-
return (config.dataGroups || []).map((group) => {
|
|
154
|
-
return {
|
|
155
|
-
name: group.name,
|
|
156
|
-
patterns: group.urls.map((url) => urlToRegex(url, this.baseHref, true)),
|
|
157
|
-
strategy: group.cacheConfig.strategy || 'performance',
|
|
158
|
-
maxSize: group.cacheConfig.maxSize,
|
|
159
|
-
maxAge: parseDurationToMs(group.cacheConfig.maxAge),
|
|
160
|
-
timeoutMs: group.cacheConfig.timeout && parseDurationToMs(group.cacheConfig.timeout),
|
|
161
|
-
refreshAheadMs: group.cacheConfig.refreshAhead && parseDurationToMs(group.cacheConfig.refreshAhead),
|
|
162
|
-
cacheOpaqueResponses: group.cacheConfig.cacheOpaqueResponses,
|
|
163
|
-
cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),
|
|
164
|
-
version: group.version !== undefined ? group.version : 1,
|
|
165
|
-
};
|
|
166
|
-
});
|
|
90
|
+
fs;
|
|
91
|
+
baseHref;
|
|
92
|
+
constructor(fs, baseHref) {
|
|
93
|
+
this.fs = fs;
|
|
94
|
+
this.baseHref = baseHref;
|
|
95
|
+
}
|
|
96
|
+
async process(config) {
|
|
97
|
+
const unorderedHashTable = {};
|
|
98
|
+
const assetGroups = await this.processAssetGroups(config, unorderedHashTable);
|
|
99
|
+
return {
|
|
100
|
+
configVersion: 1,
|
|
101
|
+
timestamp: Date.now(),
|
|
102
|
+
appData: config.appData,
|
|
103
|
+
index: joinUrls(this.baseHref, config.index),
|
|
104
|
+
assetGroups,
|
|
105
|
+
dataGroups: this.processDataGroups(config),
|
|
106
|
+
hashTable: withOrderedKeys(unorderedHashTable),
|
|
107
|
+
navigationUrls: processNavigationUrls(this.baseHref, config.navigationUrls),
|
|
108
|
+
navigationRequestStrategy: config.navigationRequestStrategy ?? 'performance',
|
|
109
|
+
applicationMaxAge: config.applicationMaxAge ? parseDurationToMs(config.applicationMaxAge) : undefined
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async processAssetGroups(config, hashTable) {
|
|
113
|
+
const allFiles = await this.fs.list('/');
|
|
114
|
+
const seenMap = new Set();
|
|
115
|
+
const filesPerGroup = new Map();
|
|
116
|
+
for (const group of config.assetGroups || []) {
|
|
117
|
+
if (group.resources.versionedFiles) {
|
|
118
|
+
throw new Error(`Asset-group '${group.name}' in 'ngsw-config.json' uses the 'versionedFiles' option, ` + "which is no longer supported. Use 'files' instead.");
|
|
119
|
+
}
|
|
120
|
+
const fileMatcher = globListToMatcher(group.resources.files || []);
|
|
121
|
+
const matchedFiles = allFiles.filter(fileMatcher).filter(file => !seenMap.has(file)).sort();
|
|
122
|
+
matchedFiles.forEach(file => seenMap.add(file));
|
|
123
|
+
filesPerGroup.set(group, matchedFiles);
|
|
167
124
|
}
|
|
125
|
+
const allMatchedFiles = [].concat(...Array.from(filesPerGroup.values())).sort();
|
|
126
|
+
const allMatchedHashes = await processInBatches(allMatchedFiles, 500, file => this.fs.hash(file));
|
|
127
|
+
allMatchedFiles.forEach((file, idx) => {
|
|
128
|
+
hashTable[joinUrls(this.baseHref, file)] = allMatchedHashes[idx];
|
|
129
|
+
});
|
|
130
|
+
return Array.from(filesPerGroup.entries()).map(([group, matchedFiles]) => ({
|
|
131
|
+
name: group.name,
|
|
132
|
+
installMode: group.installMode || 'prefetch',
|
|
133
|
+
updateMode: group.updateMode || group.installMode || 'prefetch',
|
|
134
|
+
cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),
|
|
135
|
+
urls: matchedFiles.map(url => joinUrls(this.baseHref, url)),
|
|
136
|
+
patterns: (group.resources.urls || []).map(url => urlToRegex(url, this.baseHref, true))
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
processDataGroups(config) {
|
|
140
|
+
return (config.dataGroups || []).map(group => {
|
|
141
|
+
return {
|
|
142
|
+
name: group.name,
|
|
143
|
+
patterns: group.urls.map(url => urlToRegex(url, this.baseHref, true)),
|
|
144
|
+
strategy: group.cacheConfig.strategy || 'performance',
|
|
145
|
+
maxSize: group.cacheConfig.maxSize,
|
|
146
|
+
maxAge: parseDurationToMs(group.cacheConfig.maxAge),
|
|
147
|
+
timeoutMs: group.cacheConfig.timeout && parseDurationToMs(group.cacheConfig.timeout),
|
|
148
|
+
refreshAheadMs: group.cacheConfig.refreshAhead && parseDurationToMs(group.cacheConfig.refreshAhead),
|
|
149
|
+
cacheOpaqueResponses: group.cacheConfig.cacheOpaqueResponses,
|
|
150
|
+
cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),
|
|
151
|
+
version: group.version !== undefined ? group.version : 1
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
}
|
|
168
155
|
}
|
|
169
156
|
function processNavigationUrls(baseHref, urls = DEFAULT_NAVIGATION_URLS) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
157
|
+
return urls.map(url => {
|
|
158
|
+
const positive = !url.startsWith('!');
|
|
159
|
+
url = positive ? url : url.slice(1);
|
|
160
|
+
return {
|
|
161
|
+
positive,
|
|
162
|
+
regex: `^${urlToRegex(url, baseHref)}$`
|
|
163
|
+
};
|
|
164
|
+
});
|
|
175
165
|
}
|
|
176
166
|
async function processInBatches(items, batchSize, processFn) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
167
|
+
const batches = [];
|
|
168
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
169
|
+
batches.push(items.slice(i, i + batchSize));
|
|
170
|
+
}
|
|
171
|
+
return batches.reduce(async (prev, batch) => (await prev).concat(await Promise.all(batch.map(item => processFn(item)))), Promise.resolve([]));
|
|
182
172
|
}
|
|
183
173
|
function globListToMatcher(globs) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return (file) => matches(file, patterns);
|
|
174
|
+
const patterns = globs.map(pattern => {
|
|
175
|
+
if (pattern.startsWith('!')) {
|
|
176
|
+
return {
|
|
177
|
+
positive: false,
|
|
178
|
+
regex: new RegExp('^' + globToRegex(pattern.slice(1)) + '$')
|
|
179
|
+
};
|
|
180
|
+
} else {
|
|
181
|
+
return {
|
|
182
|
+
positive: true,
|
|
183
|
+
regex: new RegExp('^' + globToRegex(pattern) + '$')
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
return file => matches(file, patterns);
|
|
199
188
|
}
|
|
200
189
|
function matches(file, patterns) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}, false);
|
|
190
|
+
return patterns.reduce((isMatch, pattern) => {
|
|
191
|
+
if (pattern.positive) {
|
|
192
|
+
return isMatch || pattern.regex.test(file);
|
|
193
|
+
} else {
|
|
194
|
+
return isMatch && !pattern.regex.test(file);
|
|
195
|
+
}
|
|
196
|
+
}, false);
|
|
209
197
|
}
|
|
210
198
|
function urlToRegex(url, baseHref, literalQuestionMark) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
url = joinUrls(baseHref.replace(/^\.(?=\/)/, ''), url);
|
|
216
|
-
}
|
|
217
|
-
return globToRegex(url, literalQuestionMark);
|
|
199
|
+
if (!url.startsWith('/') && url.indexOf('://') === -1) {
|
|
200
|
+
url = joinUrls(baseHref.replace(/^\.(?=\/)/, ''), url);
|
|
201
|
+
}
|
|
202
|
+
return globToRegex(url, literalQuestionMark);
|
|
218
203
|
}
|
|
219
204
|
function joinUrls(a, b) {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
return a + b;
|
|
205
|
+
if (a.endsWith('/') && b.startsWith('/')) {
|
|
206
|
+
return a + b.slice(1);
|
|
207
|
+
} else if (!a.endsWith('/') && !b.startsWith('/')) {
|
|
208
|
+
return a + '/' + b;
|
|
209
|
+
}
|
|
210
|
+
return a + b;
|
|
227
211
|
}
|
|
228
212
|
function withOrderedKeys(unorderedObj) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
.forEach((key) => (orderedObj[key] = unorderedObj[key]));
|
|
233
|
-
return orderedObj;
|
|
213
|
+
const orderedObj = {};
|
|
214
|
+
Object.keys(unorderedObj).sort().forEach(key => orderedObj[key] = unorderedObj[key]);
|
|
215
|
+
return orderedObj;
|
|
234
216
|
}
|
|
235
217
|
function buildCacheQueryOptions(inOptions) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
218
|
+
return {
|
|
219
|
+
ignoreVary: true,
|
|
220
|
+
...inOptions
|
|
221
|
+
};
|
|
240
222
|
}
|
|
241
223
|
|
|
242
224
|
export { Generator };
|
package/fesm2022/config.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.mjs","sources":["../../../../../k8-fastbuild-ST-199a4f3c4e20/bin/packages/service-worker/config/src/duration.ts","../../../../../k8-fastbuild-ST-199a4f3c4e20/bin/packages/service-worker/config/src/glob.ts","../../../../../k8-fastbuild-ST-199a4f3c4e20/bin/packages/service-worker/config/src/generator.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nconst PARSE_TO_PAIRS = /([0-9]+[^0-9]+)/g;\nconst PAIR_SPLIT = /^([0-9]+)([dhmsu]+)$/;\n\nexport function parseDurationToMs(duration: string): number {\n const matches: string[] = [];\n\n let array: RegExpExecArray | null;\n while ((array = PARSE_TO_PAIRS.exec(duration)) !== null) {\n matches.push(array[0]);\n }\n return matches\n .map((match) => {\n const res = PAIR_SPLIT.exec(match);\n if (res === null) {\n throw new Error(`Not a valid duration: ${match}`);\n }\n let factor: number = 0;\n switch (res[2]) {\n case 'd':\n factor = 86400000;\n break;\n case 'h':\n factor = 3600000;\n break;\n case 'm':\n factor = 60000;\n break;\n case 's':\n factor = 1000;\n break;\n case 'u':\n factor = 1;\n break;\n default:\n throw new Error(`Not a valid duration unit: ${res[2]}`);\n }\n return parseInt(res[1]) * factor;\n })\n .reduce((total, value) => total + value, 0);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nconst QUESTION_MARK = '[^/]';\nconst WILD_SINGLE = '[^/]*';\nconst WILD_OPEN = '(?:.+\\\\/)?';\n\nconst TO_ESCAPE_BASE = [\n {replace: /\\./g, with: '\\\\.'},\n {replace: /\\+/g, with: '\\\\+'},\n {replace: /\\*/g, with: WILD_SINGLE},\n];\nconst TO_ESCAPE_WILDCARD_QM = [...TO_ESCAPE_BASE, {replace: /\\?/g, with: QUESTION_MARK}];\nconst TO_ESCAPE_LITERAL_QM = [...TO_ESCAPE_BASE, {replace: /\\?/g, with: '\\\\?'}];\n\nexport function globToRegex(glob: string, literalQuestionMark = false): string {\n const toEscape = literalQuestionMark ? TO_ESCAPE_LITERAL_QM : TO_ESCAPE_WILDCARD_QM;\n const segments = glob.split('/').reverse();\n let regex: string = '';\n while (segments.length > 0) {\n const segment = segments.pop()!;\n if (segment === '**') {\n if (segments.length > 0) {\n regex += WILD_OPEN;\n } else {\n regex += '.*';\n }\n } else {\n const processed = toEscape.reduce(\n (segment, escape) => segment.replace(escape.replace, escape.with),\n segment,\n );\n regex += processed;\n if (segments.length > 0) {\n regex += '\\\\/';\n }\n }\n }\n return regex;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {parseDurationToMs} from './duration';\nimport {Filesystem} from './filesystem';\nimport {globToRegex} from './glob';\nimport {AssetGroup, Config} from './in';\n\nconst DEFAULT_NAVIGATION_URLS = [\n '/**', // Include all URLs.\n '!/**/*.*', // Exclude URLs to files (containing a file extension in the last segment).\n '!/**/*__*', // Exclude URLs containing `__` in the last segment.\n '!/**/*__*/**', // Exclude URLs containing `__` in any other segment.\n];\n\n/**\n * Consumes service worker configuration files and processes them into control files.\n *\n * @publicApi\n */\nexport class Generator {\n constructor(\n readonly fs: Filesystem,\n private baseHref: string,\n ) {}\n\n async process(config: Config): Promise<Object> {\n const unorderedHashTable = {};\n const assetGroups = await this.processAssetGroups(config, unorderedHashTable);\n\n return {\n configVersion: 1,\n timestamp: Date.now(),\n appData: config.appData,\n index: joinUrls(this.baseHref, config.index),\n assetGroups,\n dataGroups: this.processDataGroups(config),\n hashTable: withOrderedKeys(unorderedHashTable),\n navigationUrls: processNavigationUrls(this.baseHref, config.navigationUrls),\n navigationRequestStrategy: config.navigationRequestStrategy ?? 'performance',\n applicationMaxAge: config.applicationMaxAge\n ? parseDurationToMs(config.applicationMaxAge)\n : undefined,\n };\n }\n\n private async processAssetGroups(\n config: Config,\n hashTable: {[file: string]: string | undefined},\n ): Promise<Object[]> {\n // Retrieve all files of the build.\n const allFiles = await this.fs.list('/');\n const seenMap = new Set<string>();\n const filesPerGroup = new Map<AssetGroup, string[]>();\n\n // Computed which files belong to each asset-group.\n for (const group of config.assetGroups || []) {\n if ((group.resources as any).versionedFiles) {\n throw new Error(\n `Asset-group '${group.name}' in 'ngsw-config.json' uses the 'versionedFiles' option, ` +\n \"which is no longer supported. Use 'files' instead.\",\n );\n }\n\n const fileMatcher = globListToMatcher(group.resources.files || []);\n const matchedFiles = allFiles\n .filter(fileMatcher)\n .filter((file) => !seenMap.has(file))\n .sort();\n\n matchedFiles.forEach((file) => seenMap.add(file));\n filesPerGroup.set(group, matchedFiles);\n }\n\n // Compute hashes for all matched files and add them to the hash-table.\n const allMatchedFiles = ([] as string[]).concat(...Array.from(filesPerGroup.values())).sort();\n const allMatchedHashes = await processInBatches(allMatchedFiles, 500, (file) =>\n this.fs.hash(file),\n );\n allMatchedFiles.forEach((file, idx) => {\n hashTable[joinUrls(this.baseHref, file)] = allMatchedHashes[idx];\n });\n\n // Generate and return the processed asset-groups.\n return Array.from(filesPerGroup.entries()).map(([group, matchedFiles]) => ({\n name: group.name,\n installMode: group.installMode || 'prefetch',\n updateMode: group.updateMode || group.installMode || 'prefetch',\n cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),\n urls: matchedFiles.map((url) => joinUrls(this.baseHref, url)),\n patterns: (group.resources.urls || []).map((url) => urlToRegex(url, this.baseHref, true)),\n }));\n }\n\n private processDataGroups(config: Config): Object[] {\n return (config.dataGroups || []).map((group) => {\n return {\n name: group.name,\n patterns: group.urls.map((url) => urlToRegex(url, this.baseHref, true)),\n strategy: group.cacheConfig.strategy || 'performance',\n maxSize: group.cacheConfig.maxSize,\n maxAge: parseDurationToMs(group.cacheConfig.maxAge),\n timeoutMs: group.cacheConfig.timeout && parseDurationToMs(group.cacheConfig.timeout),\n refreshAheadMs:\n group.cacheConfig.refreshAhead && parseDurationToMs(group.cacheConfig.refreshAhead),\n cacheOpaqueResponses: group.cacheConfig.cacheOpaqueResponses,\n cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),\n version: group.version !== undefined ? group.version : 1,\n };\n });\n }\n}\n\nexport function processNavigationUrls(\n baseHref: string,\n urls = DEFAULT_NAVIGATION_URLS,\n): {positive: boolean; regex: string}[] {\n return urls.map((url) => {\n const positive = !url.startsWith('!');\n url = positive ? url : url.slice(1);\n return {positive, regex: `^${urlToRegex(url, baseHref)}$`};\n });\n}\n\nasync function processInBatches<I, O>(\n items: I[],\n batchSize: number,\n processFn: (item: I) => O | Promise<O>,\n): Promise<O[]> {\n const batches = [];\n\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push(items.slice(i, i + batchSize));\n }\n\n return batches.reduce(\n async (prev, batch) =>\n (await prev).concat(await Promise.all(batch.map((item) => processFn(item)))),\n Promise.resolve<O[]>([]),\n );\n}\n\nfunction globListToMatcher(globs: string[]): (file: string) => boolean {\n const patterns = globs.map((pattern) => {\n if (pattern.startsWith('!')) {\n return {\n positive: false,\n regex: new RegExp('^' + globToRegex(pattern.slice(1)) + '$'),\n };\n } else {\n return {\n positive: true,\n regex: new RegExp('^' + globToRegex(pattern) + '$'),\n };\n }\n });\n return (file: string) => matches(file, patterns);\n}\n\nfunction matches(file: string, patterns: {positive: boolean; regex: RegExp}[]): boolean {\n return patterns.reduce((isMatch, pattern) => {\n if (pattern.positive) {\n return isMatch || pattern.regex.test(file);\n } else {\n return isMatch && !pattern.regex.test(file);\n }\n }, false);\n}\n\nfunction urlToRegex(url: string, baseHref: string, literalQuestionMark?: boolean): string {\n if (!url.startsWith('/') && url.indexOf('://') === -1) {\n // Prefix relative URLs with `baseHref`.\n // Strip a leading `.` from a relative `baseHref` (e.g. `./foo/`), since it would result in an\n // incorrect regex (matching a literal `.`).\n url = joinUrls(baseHref.replace(/^\\.(?=\\/)/, ''), url);\n }\n\n return globToRegex(url, literalQuestionMark);\n}\n\nfunction joinUrls(a: string, b: string): string {\n if (a.endsWith('/') && b.startsWith('/')) {\n return a + b.slice(1);\n } else if (!a.endsWith('/') && !b.startsWith('/')) {\n return a + '/' + b;\n }\n return a + b;\n}\n\nfunction withOrderedKeys<T extends {[key: string]: any}>(unorderedObj: T): T {\n const orderedObj = {} as {[key: string]: any};\n Object.keys(unorderedObj)\n .sort()\n .forEach((key) => (orderedObj[key] = unorderedObj[key]));\n return orderedObj as T;\n}\n\nfunction buildCacheQueryOptions(\n inOptions?: Pick<CacheQueryOptions, 'ignoreSearch'>,\n): CacheQueryOptions {\n return {\n ignoreVary: true,\n ...inOptions,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/packages/service-worker/config/src/duration.ts","../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/packages/service-worker/config/src/glob.ts","../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/packages/service-worker/config/src/generator.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nconst PARSE_TO_PAIRS = /([0-9]+[^0-9]+)/g;\nconst PAIR_SPLIT = /^([0-9]+)([dhmsu]+)$/;\n\nexport function parseDurationToMs(duration: string): number {\n const matches: string[] = [];\n\n let array: RegExpExecArray | null;\n while ((array = PARSE_TO_PAIRS.exec(duration)) !== null) {\n matches.push(array[0]);\n }\n return matches\n .map((match) => {\n const res = PAIR_SPLIT.exec(match);\n if (res === null) {\n throw new Error(`Not a valid duration: ${match}`);\n }\n let factor: number = 0;\n switch (res[2]) {\n case 'd':\n factor = 86400000;\n break;\n case 'h':\n factor = 3600000;\n break;\n case 'm':\n factor = 60000;\n break;\n case 's':\n factor = 1000;\n break;\n case 'u':\n factor = 1;\n break;\n default:\n throw new Error(`Not a valid duration unit: ${res[2]}`);\n }\n return parseInt(res[1]) * factor;\n })\n .reduce((total, value) => total + value, 0);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nconst QUESTION_MARK = '[^/]';\nconst WILD_SINGLE = '[^/]*';\nconst WILD_OPEN = '(?:.+\\\\/)?';\n\nconst TO_ESCAPE_BASE = [\n {replace: /\\./g, with: '\\\\.'},\n {replace: /\\+/g, with: '\\\\+'},\n {replace: /\\*/g, with: WILD_SINGLE},\n];\nconst TO_ESCAPE_WILDCARD_QM = [...TO_ESCAPE_BASE, {replace: /\\?/g, with: QUESTION_MARK}];\nconst TO_ESCAPE_LITERAL_QM = [...TO_ESCAPE_BASE, {replace: /\\?/g, with: '\\\\?'}];\n\nexport function globToRegex(glob: string, literalQuestionMark = false): string {\n const toEscape = literalQuestionMark ? TO_ESCAPE_LITERAL_QM : TO_ESCAPE_WILDCARD_QM;\n const segments = glob.split('/').reverse();\n let regex: string = '';\n while (segments.length > 0) {\n const segment = segments.pop()!;\n if (segment === '**') {\n if (segments.length > 0) {\n regex += WILD_OPEN;\n } else {\n regex += '.*';\n }\n } else {\n const processed = toEscape.reduce(\n (segment, escape) => segment.replace(escape.replace, escape.with),\n segment,\n );\n regex += processed;\n if (segments.length > 0) {\n regex += '\\\\/';\n }\n }\n }\n return regex;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {parseDurationToMs} from './duration';\nimport {Filesystem} from './filesystem';\nimport {globToRegex} from './glob';\nimport {AssetGroup, Config} from './in';\n\nconst DEFAULT_NAVIGATION_URLS = [\n '/**', // Include all URLs.\n '!/**/*.*', // Exclude URLs to files (containing a file extension in the last segment).\n '!/**/*__*', // Exclude URLs containing `__` in the last segment.\n '!/**/*__*/**', // Exclude URLs containing `__` in any other segment.\n];\n\n/**\n * Consumes service worker configuration files and processes them into control files.\n *\n * @publicApi\n */\nexport class Generator {\n constructor(\n readonly fs: Filesystem,\n private baseHref: string,\n ) {}\n\n async process(config: Config): Promise<Object> {\n const unorderedHashTable = {};\n const assetGroups = await this.processAssetGroups(config, unorderedHashTable);\n\n return {\n configVersion: 1,\n timestamp: Date.now(),\n appData: config.appData,\n index: joinUrls(this.baseHref, config.index),\n assetGroups,\n dataGroups: this.processDataGroups(config),\n hashTable: withOrderedKeys(unorderedHashTable),\n navigationUrls: processNavigationUrls(this.baseHref, config.navigationUrls),\n navigationRequestStrategy: config.navigationRequestStrategy ?? 'performance',\n applicationMaxAge: config.applicationMaxAge\n ? parseDurationToMs(config.applicationMaxAge)\n : undefined,\n };\n }\n\n private async processAssetGroups(\n config: Config,\n hashTable: {[file: string]: string | undefined},\n ): Promise<Object[]> {\n // Retrieve all files of the build.\n const allFiles = await this.fs.list('/');\n const seenMap = new Set<string>();\n const filesPerGroup = new Map<AssetGroup, string[]>();\n\n // Computed which files belong to each asset-group.\n for (const group of config.assetGroups || []) {\n if ((group.resources as any).versionedFiles) {\n throw new Error(\n `Asset-group '${group.name}' in 'ngsw-config.json' uses the 'versionedFiles' option, ` +\n \"which is no longer supported. Use 'files' instead.\",\n );\n }\n\n const fileMatcher = globListToMatcher(group.resources.files || []);\n const matchedFiles = allFiles\n .filter(fileMatcher)\n .filter((file) => !seenMap.has(file))\n .sort();\n\n matchedFiles.forEach((file) => seenMap.add(file));\n filesPerGroup.set(group, matchedFiles);\n }\n\n // Compute hashes for all matched files and add them to the hash-table.\n const allMatchedFiles = ([] as string[]).concat(...Array.from(filesPerGroup.values())).sort();\n const allMatchedHashes = await processInBatches(allMatchedFiles, 500, (file) =>\n this.fs.hash(file),\n );\n allMatchedFiles.forEach((file, idx) => {\n hashTable[joinUrls(this.baseHref, file)] = allMatchedHashes[idx];\n });\n\n // Generate and return the processed asset-groups.\n return Array.from(filesPerGroup.entries()).map(([group, matchedFiles]) => ({\n name: group.name,\n installMode: group.installMode || 'prefetch',\n updateMode: group.updateMode || group.installMode || 'prefetch',\n cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),\n urls: matchedFiles.map((url) => joinUrls(this.baseHref, url)),\n patterns: (group.resources.urls || []).map((url) => urlToRegex(url, this.baseHref, true)),\n }));\n }\n\n private processDataGroups(config: Config): Object[] {\n return (config.dataGroups || []).map((group) => {\n return {\n name: group.name,\n patterns: group.urls.map((url) => urlToRegex(url, this.baseHref, true)),\n strategy: group.cacheConfig.strategy || 'performance',\n maxSize: group.cacheConfig.maxSize,\n maxAge: parseDurationToMs(group.cacheConfig.maxAge),\n timeoutMs: group.cacheConfig.timeout && parseDurationToMs(group.cacheConfig.timeout),\n refreshAheadMs:\n group.cacheConfig.refreshAhead && parseDurationToMs(group.cacheConfig.refreshAhead),\n cacheOpaqueResponses: group.cacheConfig.cacheOpaqueResponses,\n cacheQueryOptions: buildCacheQueryOptions(group.cacheQueryOptions),\n version: group.version !== undefined ? group.version : 1,\n };\n });\n }\n}\n\nexport function processNavigationUrls(\n baseHref: string,\n urls = DEFAULT_NAVIGATION_URLS,\n): {positive: boolean; regex: string}[] {\n return urls.map((url) => {\n const positive = !url.startsWith('!');\n url = positive ? url : url.slice(1);\n return {positive, regex: `^${urlToRegex(url, baseHref)}$`};\n });\n}\n\nasync function processInBatches<I, O>(\n items: I[],\n batchSize: number,\n processFn: (item: I) => O | Promise<O>,\n): Promise<O[]> {\n const batches = [];\n\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push(items.slice(i, i + batchSize));\n }\n\n return batches.reduce(\n async (prev, batch) =>\n (await prev).concat(await Promise.all(batch.map((item) => processFn(item)))),\n Promise.resolve<O[]>([]),\n );\n}\n\nfunction globListToMatcher(globs: string[]): (file: string) => boolean {\n const patterns = globs.map((pattern) => {\n if (pattern.startsWith('!')) {\n return {\n positive: false,\n regex: new RegExp('^' + globToRegex(pattern.slice(1)) + '$'),\n };\n } else {\n return {\n positive: true,\n regex: new RegExp('^' + globToRegex(pattern) + '$'),\n };\n }\n });\n return (file: string) => matches(file, patterns);\n}\n\nfunction matches(file: string, patterns: {positive: boolean; regex: RegExp}[]): boolean {\n return patterns.reduce((isMatch, pattern) => {\n if (pattern.positive) {\n return isMatch || pattern.regex.test(file);\n } else {\n return isMatch && !pattern.regex.test(file);\n }\n }, false);\n}\n\nfunction urlToRegex(url: string, baseHref: string, literalQuestionMark?: boolean): string {\n if (!url.startsWith('/') && url.indexOf('://') === -1) {\n // Prefix relative URLs with `baseHref`.\n // Strip a leading `.` from a relative `baseHref` (e.g. `./foo/`), since it would result in an\n // incorrect regex (matching a literal `.`).\n url = joinUrls(baseHref.replace(/^\\.(?=\\/)/, ''), url);\n }\n\n return globToRegex(url, literalQuestionMark);\n}\n\nfunction joinUrls(a: string, b: string): string {\n if (a.endsWith('/') && b.startsWith('/')) {\n return a + b.slice(1);\n } else if (!a.endsWith('/') && !b.startsWith('/')) {\n return a + '/' + b;\n }\n return a + b;\n}\n\nfunction withOrderedKeys<T extends {[key: string]: any}>(unorderedObj: T): T {\n const orderedObj = {} as {[key: string]: any};\n Object.keys(unorderedObj)\n .sort()\n .forEach((key) => (orderedObj[key] = unorderedObj[key]));\n return orderedObj as T;\n}\n\nfunction buildCacheQueryOptions(\n inOptions?: Pick<CacheQueryOptions, 'ignoreSearch'>,\n): CacheQueryOptions {\n return {\n ignoreVary: true,\n ...inOptions,\n };\n}\n"],"names":["PARSE_TO_PAIRS","PAIR_SPLIT","parseDurationToMs","duration","matches","array","exec","push","map","match","res","Error","factor","parseInt","reduce","total","value","QUESTION_MARK","WILD_SINGLE","WILD_OPEN","TO_ESCAPE_BASE","replace","with","TO_ESCAPE_WILDCARD_QM","TO_ESCAPE_LITERAL_QM","globToRegex","glob","literalQuestionMark","toEscape","segments","split","reverse","regex","length","segment","pop","processed","escape","DEFAULT_NAVIGATION_URLS","Generator","fs","baseHref","constructor","process","config","unorderedHashTable","assetGroups","processAssetGroups","configVersion","timestamp","Date","now","appData","index","joinUrls","dataGroups","processDataGroups","hashTable","withOrderedKeys","navigationUrls","processNavigationUrls","navigationRequestStrategy","applicationMaxAge","undefined","allFiles","list","seenMap","Set","filesPerGroup","Map","group","resources","versionedFiles","name","fileMatcher","globListToMatcher","files","matchedFiles","filter","file","has","sort","forEach","add","set","allMatchedFiles","concat","Array","from","values","allMatchedHashes","processInBatches","hash","idx","entries","installMode","updateMode","cacheQueryOptions","buildCacheQueryOptions","urls","url","patterns","urlToRegex","strategy","cacheConfig","maxSize","maxAge","timeoutMs","timeout","refreshAheadMs","refreshAhead","cacheOpaqueResponses","version","positive","startsWith","slice","items","batchSize","processFn","batches","i","prev","batch","Promise","all","item","resolve","globs","pattern","RegExp","isMatch","test","indexOf","a","b","endsWith","unorderedObj","orderedObj","Object","keys","key","inOptions","ignoreVary"],"mappings":"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"}
|