1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
16 | return new (P || (P = Promise))(function (resolve, reject) {
|
17 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
18 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
19 | function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
20 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
21 | });
|
22 | };
|
23 | Object.defineProperty(exports, "__esModule", { value: true });
|
24 |
|
25 | const chai_1 = require("chai");
|
26 | const fs = require("mz/fs");
|
27 | const path = require("path");
|
28 | const vfs = require("vinyl-fs");
|
29 | const polymer_project_1 = require("../polymer-project");
|
30 | const serviceWorker = require("../service-worker");
|
31 | const temp = require('temp').track();
|
32 | const mergeStream = require('merge-stream');
|
33 | suite('service-worker', () => {
|
34 | let testBuildRoot;
|
35 | let defaultProject;
|
36 | setup((done) => {
|
37 | defaultProject = new polymer_project_1.PolymerProject({
|
38 | root: path.resolve('test-fixtures/test-project'),
|
39 | entrypoint: 'index.html',
|
40 | shell: 'shell.html',
|
41 | sources: [
|
42 | 'source-dir/**',
|
43 | ],
|
44 | });
|
45 | temp.mkdir('polymer-build-test', (err, dir) => {
|
46 | if (err || dir === undefined) {
|
47 | return done(err || 'no dir given');
|
48 | }
|
49 | testBuildRoot = dir;
|
50 | vfs.src(path.join('test-fixtures/test-project/**'))
|
51 | .pipe(vfs.dest(dir))
|
52 | .on('end', () => {
|
53 | mergeStream(defaultProject.sources(), defaultProject.dependencies())
|
54 | .pipe(vfs.dest(testBuildRoot))
|
55 | .on('end', () => done())
|
56 | .on('error', done);
|
57 | });
|
58 | });
|
59 | });
|
60 | teardown((done) => {
|
61 | temp.cleanup(done);
|
62 | });
|
63 | suite('hasNoFileExtension regexp', () => {
|
64 | test('matches URL paths correctly', () => {
|
65 | const test = (s) => serviceWorker.hasNoFileExtension.test(s);
|
66 | chai_1.assert.isTrue(test('/'));
|
67 | chai_1.assert.isTrue(test('/foo'));
|
68 | chai_1.assert.isTrue(test('/foo/'));
|
69 | chai_1.assert.isTrue(test('/foo.png/bar/'));
|
70 | chai_1.assert.isTrue(test('/foo?baz.png'));
|
71 | chai_1.assert.isFalse(test('/foo.png'));
|
72 | chai_1.assert.isFalse(test('/foo/bar.png'));
|
73 | });
|
74 | });
|
75 | suite('generateServiceWorkerConfig()', () => {
|
76 | test('should set entrypoint related options', () => __awaiter(this, void 0, void 0, function* () {
|
77 | const config = yield serviceWorker.generateServiceWorkerConfig({
|
78 | project: defaultProject,
|
79 | buildRoot: testBuildRoot,
|
80 | });
|
81 | chai_1.assert.equal(config.navigateFallback, 'index.html');
|
82 | chai_1.assert.deepEqual(config.navigateFallbackWhitelist, [serviceWorker.hasNoFileExtension]);
|
83 | chai_1.assert.equal(config.directoryIndex, '');
|
84 | }));
|
85 | });
|
86 | suite('generateServiceWorker()', () => {
|
87 | test('should throw when options are not provided', () => {
|
88 |
|
89 | return serviceWorker.generateServiceWorker().then(() => {
|
90 | chai_1.assert.fail('generateServiceWorker() resolved, expected rejection!');
|
91 | }, (error) => {
|
92 | chai_1.assert.include(error.name, 'AssertionError');
|
93 | chai_1.assert.equal(error.message, '`project` & `buildRoot` options are required');
|
94 | });
|
95 | });
|
96 | test('should throw when options.project is not provided', () => {
|
97 |
|
98 | const unsafeForm = serviceWorker.generateServiceWorker;
|
99 | return unsafeForm({ buildRoot: testBuildRoot })
|
100 | .then(() => {
|
101 | chai_1.assert.fail('generateServiceWorker() resolved, expected rejection!');
|
102 | }, (error) => {
|
103 | chai_1.assert.include(error.name, 'AssertionError');
|
104 | chai_1.assert.equal(error.message, '`project` option is required');
|
105 | });
|
106 | });
|
107 | test('should throw when options.buildRoot is not provided', () => {
|
108 |
|
109 | const unsafeForm = serviceWorker.generateServiceWorker;
|
110 | return unsafeForm({ project: defaultProject })
|
111 | .then(() => {
|
112 | chai_1.assert.fail('generateServiceWorker() resolved, expected rejection!');
|
113 | }, (error) => {
|
114 | chai_1.assert.include(error.name, 'AssertionError');
|
115 | chai_1.assert.equal(error.message, '`buildRoot` option is required');
|
116 | });
|
117 | });
|
118 | test('should not modify the options object provided when called', () => {
|
119 | const swPrecacheConfig = { staticFileGlobs: [] };
|
120 | return serviceWorker
|
121 | .generateServiceWorker({
|
122 | project: defaultProject,
|
123 | buildRoot: testBuildRoot,
|
124 | swPrecacheConfig: swPrecacheConfig,
|
125 | })
|
126 | .then(() => {
|
127 | chai_1.assert.equal(swPrecacheConfig.staticFileGlobs.length, 0);
|
128 | });
|
129 | });
|
130 | test('should resolve with a Buffer representing the generated service worker code', () => {
|
131 | return serviceWorker
|
132 | .generateServiceWorker({
|
133 | project: defaultProject,
|
134 | buildRoot: testBuildRoot,
|
135 | })
|
136 | .then((swCode) => {
|
137 | chai_1.assert.ok(swCode instanceof Buffer);
|
138 | });
|
139 | });
|
140 | test('should add unbundled precached assets when options.unbundled is not provided', () => {
|
141 | return serviceWorker
|
142 | .generateServiceWorker({
|
143 | project: defaultProject,
|
144 | buildRoot: testBuildRoot,
|
145 | })
|
146 | .then((swFile) => {
|
147 | const fileContents = swFile.toString();
|
148 | chai_1.assert.include(fileContents, '"index.html"');
|
149 | chai_1.assert.include(fileContents, '"shell.html"');
|
150 | chai_1.assert.include(fileContents, '"bower_components/dep.html"');
|
151 | chai_1.assert.notInclude(fileContents, '"source-dir/my-app.html"');
|
152 | });
|
153 | });
|
154 | test('should add bundled precached assets when options.bundled is provided', () => {
|
155 | return serviceWorker
|
156 | .generateServiceWorker({
|
157 | project: defaultProject,
|
158 | buildRoot: testBuildRoot,
|
159 | bundled: true,
|
160 | })
|
161 | .then((swFile) => {
|
162 | const fileContents = swFile.toString();
|
163 | chai_1.assert.include(fileContents, '"index.html"');
|
164 | chai_1.assert.include(fileContents, '"shell.html"');
|
165 | chai_1.assert.notInclude(fileContents, '"bower_components/dep.html"');
|
166 | chai_1.assert.notInclude(fileContents, '"source-dir/my-app.html"');
|
167 | });
|
168 | });
|
169 | test('should add provided staticFileGlobs paths to the final list', () => {
|
170 | return serviceWorker
|
171 | .generateServiceWorker({
|
172 | project: defaultProject,
|
173 | buildRoot: testBuildRoot,
|
174 | bundled: true,
|
175 | swPrecacheConfig: {
|
176 | staticFileGlobs: ['/bower_components/dep.html'],
|
177 | },
|
178 | })
|
179 | .then((swFile) => {
|
180 | const fileContents = swFile.toString();
|
181 | chai_1.assert.include(fileContents, '"index.html"');
|
182 | chai_1.assert.include(fileContents, '"shell.html"');
|
183 | chai_1.assert.include(fileContents, '"bower_components/dep.html"');
|
184 | chai_1.assert.notInclude(fileContents, '"source-dir/my-app.html"');
|
185 | });
|
186 | });
|
187 | test('basePath should prefix resources', () => {
|
188 | return serviceWorker
|
189 | .generateServiceWorker({
|
190 | project: defaultProject,
|
191 | buildRoot: testBuildRoot,
|
192 | basePath: '/my/base/path',
|
193 | })
|
194 | .then((swFile) => {
|
195 | const fileContents = swFile.toString();
|
196 | chai_1.assert.include(fileContents, '"/my/base/path/index.html"');
|
197 | });
|
198 | });
|
199 | test('basePath prefixes should not have double delimiters', () => {
|
200 | return serviceWorker
|
201 | .generateServiceWorker({
|
202 | project: defaultProject,
|
203 | buildRoot: testBuildRoot,
|
204 | basePath: '/my/base/path/',
|
205 | })
|
206 | .then((swFile) => {
|
207 | const fileContents = swFile.toString();
|
208 | chai_1.assert.include(fileContents, '"/my/base/path/index.html"');
|
209 | chai_1.assert.notInclude(fileContents, '"/my/base/path//index.html"');
|
210 | });
|
211 | });
|
212 | });
|
213 | suite('addServiceWorker()', () => {
|
214 | test('should write generated service worker to file system', () => {
|
215 | return serviceWorker
|
216 | .addServiceWorker({
|
217 | project: defaultProject,
|
218 | buildRoot: testBuildRoot,
|
219 | })
|
220 | .then(() => {
|
221 | const content = fs.readFileSync(path.join(testBuildRoot, 'service-worker.js'), 'utf-8');
|
222 | chai_1.assert.include(content, '// This generated service worker JavaScript will precache your site\'s resources.');
|
223 | });
|
224 | });
|
225 | });
|
226 | });
|
227 |
|
\ | No newline at end of file |