2017-09-28 19:18:12 -04:00
|
|
|
/**
|
|
|
|
* @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';
|
|
|
|
|
2017-12-16 17:42:55 -05:00
|
|
|
{
|
2017-09-28 19:18:12 -04:00
|
|
|
describe('Generator', () => {
|
|
|
|
it('generates a correct config', (done: DoneFn) => {
|
|
|
|
const fs = new MockFilesystem({
|
|
|
|
'/index.html': 'This is a test',
|
2017-10-20 16:11:43 -04:00
|
|
|
'/test.txt': 'Another test',
|
2017-09-28 19:18:12 -04:00
|
|
|
'/foo/test.html': 'Another test',
|
|
|
|
'/ignored/x.html': 'should be ignored',
|
|
|
|
});
|
|
|
|
const gen = new Generator(fs, '/test');
|
|
|
|
const res = gen.process({
|
|
|
|
appData: {
|
|
|
|
test: true,
|
|
|
|
},
|
2018-04-12 11:04:11 -04:00
|
|
|
index: '/index.html',
|
2017-09-28 19:18:12 -04:00
|
|
|
assetGroups: [{
|
|
|
|
name: 'test',
|
|
|
|
resources: {
|
|
|
|
files: [
|
|
|
|
'/**/*.html', '!/ignored/**',
|
|
|
|
// '/*.html',
|
|
|
|
],
|
2017-10-20 16:11:43 -04:00
|
|
|
versionedFiles: [
|
|
|
|
'/**/*.txt',
|
|
|
|
],
|
2017-09-28 19:18:12 -04:00
|
|
|
urls: [
|
|
|
|
'/absolute/**',
|
2017-10-02 18:59:57 -04:00
|
|
|
'/some/url?with+escaped+chars',
|
2017-09-28 19:18:12 -04:00
|
|
|
'relative/*.txt',
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}],
|
|
|
|
dataGroups: [{
|
|
|
|
name: 'other',
|
|
|
|
urls: [
|
|
|
|
'/api/**',
|
|
|
|
'relapi/**',
|
|
|
|
],
|
|
|
|
cacheConfig: {
|
|
|
|
maxSize: 100,
|
|
|
|
maxAge: '3d',
|
|
|
|
timeout: '1m',
|
|
|
|
}
|
2018-04-12 11:04:11 -04:00
|
|
|
}],
|
|
|
|
navigationUrls: [
|
|
|
|
'/included/absolute/**',
|
|
|
|
'!/excluded/absolute/**',
|
|
|
|
'/included/some/url?with+escaped+chars',
|
|
|
|
'!excluded/relative/*.txt',
|
|
|
|
'http://example.com/included',
|
|
|
|
'!http://example.com/excluded',
|
|
|
|
],
|
2017-09-28 19:18:12 -04:00
|
|
|
});
|
|
|
|
res.then(config => {
|
|
|
|
expect(config).toEqual({
|
2018-04-12 11:04:11 -04:00
|
|
|
configVersion: 1,
|
|
|
|
appData: {
|
|
|
|
test: true,
|
2017-09-28 19:18:12 -04:00
|
|
|
},
|
2018-04-12 11:04:11 -04:00
|
|
|
index: '/test/index.html',
|
|
|
|
assetGroups: [{
|
|
|
|
name: 'test',
|
|
|
|
installMode: 'prefetch',
|
|
|
|
updateMode: 'prefetch',
|
|
|
|
urls: [
|
2017-10-20 16:11:43 -04:00
|
|
|
'/test/index.html',
|
|
|
|
'/test/foo/test.html',
|
|
|
|
'/test/test.txt',
|
|
|
|
],
|
2018-04-12 11:04:11 -04:00
|
|
|
patterns: [
|
2017-10-02 18:59:57 -04:00
|
|
|
'\\/absolute\\/.*',
|
|
|
|
'\\/some\\/url\\?with\\+escaped\\+chars',
|
2018-04-12 16:34:43 -04:00
|
|
|
'\\/test\\/relative\\/[^\\/]*\\.txt',
|
2017-10-02 18:59:57 -04:00
|
|
|
]
|
2017-09-28 19:18:12 -04:00
|
|
|
}],
|
2018-04-12 11:04:11 -04:00
|
|
|
dataGroups: [{
|
|
|
|
name: 'other',
|
|
|
|
patterns: ['\\/api\\/.*', '\\/test\\/relapi\\/.*'],
|
|
|
|
strategy: 'performance',
|
|
|
|
maxSize: 100,
|
|
|
|
maxAge: 259200000,
|
|
|
|
timeoutMs: 60000,
|
|
|
|
version: 1,
|
2017-09-28 19:18:12 -04:00
|
|
|
}],
|
2018-04-12 11:04:11 -04:00
|
|
|
navigationUrls: [
|
|
|
|
{positive: true, regex: '^\\/included\\/absolute\\/.*$'},
|
|
|
|
{positive: false, regex: '^\\/excluded\\/absolute\\/.*$'},
|
|
|
|
{positive: true, regex: '^\\/included\\/some\\/url\\?with\\+escaped\\+chars$'},
|
2018-04-12 16:34:43 -04:00
|
|
|
{positive: false, regex: '^\\/test\\/excluded\\/relative\\/[^\\/]*\\.txt$'},
|
2018-04-12 11:04:11 -04:00
|
|
|
{positive: true, regex: '^http:\\/\\/example\\.com\\/included$'},
|
|
|
|
{positive: false, regex: '^http:\\/\\/example\\.com\\/excluded$'},
|
|
|
|
],
|
|
|
|
hashTable: {
|
2017-10-20 16:11:43 -04:00
|
|
|
'/test/test.txt': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643',
|
2017-09-28 19:18:12 -04:00
|
|
|
'/test/index.html': 'a54d88e06612d820bc3be72877c74f257b561b19',
|
|
|
|
'/test/foo/test.html': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643'
|
|
|
|
}
|
|
|
|
});
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(err => done.fail(err));
|
|
|
|
});
|
2018-04-12 11:04:11 -04:00
|
|
|
|
|
|
|
it('uses default `navigationUrls` if not provided', (done: DoneFn) => {
|
|
|
|
const fs = new MockFilesystem({
|
|
|
|
'/index.html': 'This is a test',
|
|
|
|
});
|
|
|
|
const gen = new Generator(fs, '/test');
|
|
|
|
const res = gen.process({
|
|
|
|
index: '/index.html',
|
|
|
|
});
|
|
|
|
res.then(config => {
|
|
|
|
expect(config).toEqual({
|
|
|
|
configVersion: 1,
|
|
|
|
appData: undefined,
|
|
|
|
index: '/test/index.html',
|
|
|
|
assetGroups: [],
|
|
|
|
dataGroups: [],
|
|
|
|
navigationUrls: [
|
|
|
|
{positive: true, regex: '^\\/.*$'},
|
2018-04-12 16:34:43 -04:00
|
|
|
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]*\\.[^\\/]*$'},
|
|
|
|
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]*__[^\\/]*$'},
|
|
|
|
{positive: false, regex: '^\\/(?:.+\\/)?[^\\/]*__[^\\/]*\\/.*$'},
|
2018-04-12 11:04:11 -04:00
|
|
|
],
|
|
|
|
hashTable: {}
|
|
|
|
});
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(err => done.fail(err));
|
|
|
|
});
|
2017-09-28 19:18:12 -04:00
|
|
|
});
|
|
|
|
}
|