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