
There is no difference in runtime (yet) between versioned and unversioned files. Theoretically, the SW does not have to cache-bust versioned files, but the SW doesn't cache bust files on the first request anyway, so in the common case it doesn't matter. If the hash doesn't match, the SW will cache bust the file to be sure, which is technically unnecessary, but since the file itself is versioned, the likelihood of this happening is rare. This fixes a critical bug where versioned files were erroneously not included in the hashTable in the generated manifest. This could lead to applications not updating if only versioned files changed in between versions. PR Close #19837
100 lines
2.8 KiB
TypeScript
100 lines
2.8 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {Generator} from '../src/generator';
|
|
import {MockFilesystem} from '../testing/mock';
|
|
|
|
export function main() {
|
|
describe('Generator', () => {
|
|
it('generates a correct config', (done: DoneFn) => {
|
|
const fs = new MockFilesystem({
|
|
'/index.html': 'This is a test',
|
|
'/test.txt': 'Another test',
|
|
'/foo/test.html': 'Another test',
|
|
'/ignored/x.html': 'should be ignored',
|
|
});
|
|
const gen = new Generator(fs, '/test');
|
|
const res = gen.process({
|
|
index: '/index.html',
|
|
appData: {
|
|
test: true,
|
|
},
|
|
assetGroups: [{
|
|
name: 'test',
|
|
resources: {
|
|
files: [
|
|
'/**/*.html', '!/ignored/**',
|
|
// '/*.html',
|
|
],
|
|
versionedFiles: [
|
|
'/**/*.txt',
|
|
],
|
|
urls: [
|
|
'/absolute/**',
|
|
'/some/url?with+escaped+chars',
|
|
'relative/*.txt',
|
|
]
|
|
}
|
|
}],
|
|
dataGroups: [{
|
|
name: 'other',
|
|
urls: [
|
|
'/api/**',
|
|
'relapi/**',
|
|
],
|
|
cacheConfig: {
|
|
maxSize: 100,
|
|
maxAge: '3d',
|
|
timeout: '1m',
|
|
}
|
|
}]
|
|
});
|
|
res.then(config => {
|
|
expect(config).toEqual({
|
|
'configVersion': 1,
|
|
'index': '/test/index.html',
|
|
'appData': {
|
|
'test': true,
|
|
},
|
|
'assetGroups': [{
|
|
'name': 'test',
|
|
'installMode': 'prefetch',
|
|
'updateMode': 'prefetch',
|
|
'urls': [
|
|
'/test/index.html',
|
|
'/test/foo/test.html',
|
|
'/test/test.txt',
|
|
],
|
|
'patterns': [
|
|
'\\/absolute\\/.*',
|
|
'\\/some\\/url\\?with\\+escaped\\+chars',
|
|
'\\/test\\/relative\\/[^\\/]+\\.txt',
|
|
]
|
|
}],
|
|
'dataGroups': [{
|
|
'name': 'other',
|
|
'patterns': ['\\/api\\/.*', '\\/test\\/relapi\\/.*'],
|
|
'strategy': 'performance',
|
|
'maxSize': 100,
|
|
'maxAge': 259200000,
|
|
'timeoutMs': 60000,
|
|
'version': 1,
|
|
}],
|
|
'hashTable': {
|
|
'/test/test.txt': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643',
|
|
'/test/index.html': 'a54d88e06612d820bc3be72877c74f257b561b19',
|
|
'/test/foo/test.html': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643'
|
|
}
|
|
});
|
|
done();
|
|
})
|
|
.catch(err => done.fail(err));
|
|
});
|
|
});
|
|
}
|