fix(service-worker): let `*` match 0 characters in globs (#23339)
In [glob patterns][1], the `*` wildcard is supposed to match 0 or more characters. For reference: - This is also how `*` works in other implementations, such as `.gitignore` files or Firebase hosting config. - Some popular JS implementations (e.g. [minimatch][2], [micromatch][3]) work differently, matching 1 or more character (but not 0). This commit "fixes" the minimal glob support in `@angular/service-worker` to allow `*` to also match 0 characters. [1]: https://en.wikipedia.org/wiki/Glob_%28programming%29 [2]: https://www.npmjs.com/package/minimatch [3]: https://www.npmjs.com/package/micromatch PR Close #23339
This commit is contained in:
parent
08325aaffc
commit
6c2c95851a
|
@ -6,7 +6,7 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const WILD_SINGLE = '[^\\/]+';
|
const WILD_SINGLE = '[^\\/]*';
|
||||||
const WILD_OPEN = '(?:.+\\/)?';
|
const WILD_OPEN = '(?:.+\\/)?';
|
||||||
|
|
||||||
const TO_ESCAPE = [
|
const TO_ESCAPE = [
|
||||||
|
|
|
@ -81,7 +81,7 @@ import {MockFilesystem} from '../testing/mock';
|
||||||
patterns: [
|
patterns: [
|
||||||
'\\/absolute\\/.*',
|
'\\/absolute\\/.*',
|
||||||
'\\/some\\/url\\?with\\+escaped\\+chars',
|
'\\/some\\/url\\?with\\+escaped\\+chars',
|
||||||
'\\/test\\/relative\\/[^\\/]+\\.txt',
|
'\\/test\\/relative\\/[^\\/]*\\.txt',
|
||||||
]
|
]
|
||||||
}],
|
}],
|
||||||
dataGroups: [{
|
dataGroups: [{
|
||||||
|
@ -97,7 +97,7 @@ import {MockFilesystem} from '../testing/mock';
|
||||||
{positive: true, regex: '^\\/included\\/absolute\\/.*$'},
|
{positive: true, regex: '^\\/included\\/absolute\\/.*$'},
|
||||||
{positive: false, regex: '^\\/excluded\\/absolute\\/.*$'},
|
{positive: false, regex: '^\\/excluded\\/absolute\\/.*$'},
|
||||||
{positive: true, regex: '^\\/included\\/some\\/url\\?with\\+escaped\\+chars$'},
|
{positive: true, regex: '^\\/included\\/some\\/url\\?with\\+escaped\\+chars$'},
|
||||||
{positive: false, regex: '^\\/test\\/excluded\\/relative\\/[^\\/]+\\.txt$'},
|
{positive: false, regex: '^\\/test\\/excluded\\/relative\\/[^\\/]*\\.txt$'},
|
||||||
{positive: true, regex: '^http:\\/\\/example\\.com\\/included$'},
|
{positive: true, regex: '^http:\\/\\/example\\.com\\/included$'},
|
||||||
{positive: false, regex: '^http:\\/\\/example\\.com\\/excluded$'},
|
{positive: false, regex: '^http:\\/\\/example\\.com\\/excluded$'},
|
||||||
],
|
],
|
||||||
|
@ -129,8 +129,9 @@ import {MockFilesystem} from '../testing/mock';
|
||||||
dataGroups: [],
|
dataGroups: [],
|
||||||
navigationUrls: [
|
navigationUrls: [
|
||||||
{positive: true, regex: '^\\/.*$'},
|
{positive: true, regex: '^\\/.*$'},
|
||||||
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]+\\.[^\\/]+$'},
|
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]*\\.[^\\/]*$'},
|
||||||
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]+__[^\\/]+\\/.*$'},
|
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]*__[^\\/]*$'},
|
||||||
|
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]*__[^\\/]*\\/.*$'},
|
||||||
],
|
],
|
||||||
hashTable: {}
|
hashTable: {}
|
||||||
});
|
});
|
||||||
|
|
|
@ -688,6 +688,12 @@ const manifestUpdateHash = sha1(JSON.stringify(manifestUpdate));
|
||||||
|
|
||||||
expect(await navRequest('/baz/x__x/qux')).toBeNull();
|
expect(await navRequest('/baz/x__x/qux')).toBeNull();
|
||||||
server.assertSawRequestFor('/baz/x__x/qux');
|
server.assertSawRequestFor('/baz/x__x/qux');
|
||||||
|
|
||||||
|
expect(await navRequest('/baz/__')).toBeNull();
|
||||||
|
server.assertSawRequestFor('/baz/__');
|
||||||
|
|
||||||
|
expect(await navRequest('/baz/__/qux')).toBeNull();
|
||||||
|
server.assertSawRequestFor('/baz/__/qux');
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('(with custom `navigationUrls`)', () => {
|
describe('(with custom `navigationUrls`)', () => {
|
||||||
|
|
Loading…
Reference in New Issue