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 assert = require("assert");
|
26 | const fs_1 = require("fs");
|
27 | const path = require("path");
|
28 | const logging = require("plylog");
|
29 | const sw_precache_1 = require("sw-precache");
|
30 | const path_transformers_1 = require("./path-transformers");
|
31 | const logger = logging.getLogger('polymer-build.service-worker');
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | function fixDeprecatedOptions(options) {
|
38 | if (typeof options.serviceWorkerPath !== 'undefined') {
|
39 | logger.warn('"serviceWorkerPath" config option has been renamed to "path" and will no longer be supported in future versions');
|
40 | options.path = options.path || options.serviceWorkerPath;
|
41 | }
|
42 | if (typeof options.swConfig !== 'undefined') {
|
43 | logger.warn('"swConfig" config option has been renamed to "swPrecacheConfig" and will no longer be supported in future versions');
|
44 | options.swPrecacheConfig = options.swPrecacheConfig || options.swConfig;
|
45 | }
|
46 | return options;
|
47 | }
|
48 |
|
49 |
|
50 |
|
51 |
|
52 | function getPrecachedAssets(depsIndex, project) {
|
53 | const precachedAssets = new Set(project.config.allFragments);
|
54 | precachedAssets.add(project.config.entrypoint);
|
55 | for (const depImports of depsIndex.fragmentToFullDeps.values()) {
|
56 | depImports.imports.forEach((s) => precachedAssets.add(s));
|
57 | depImports.scripts.forEach((s) => precachedAssets.add(s));
|
58 | depImports.styles.forEach((s) => precachedAssets.add(s));
|
59 | }
|
60 | return Array.from(precachedAssets);
|
61 | }
|
62 |
|
63 |
|
64 |
|
65 |
|
66 | function getBundledPrecachedAssets(project) {
|
67 | const precachedAssets = new Set(project.config.allFragments);
|
68 | precachedAssets.add(project.config.entrypoint);
|
69 | return Array.from(precachedAssets);
|
70 | }
|
71 |
|
72 | exports.hasNoFileExtension = /\/[^\/\.]*(\?|$)/;
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | function generateServiceWorkerConfig(options) {
|
78 | return __awaiter(this, void 0, void 0, function* () {
|
79 | assert(!!options, '`project` & `buildRoot` options are required');
|
80 | assert(!!options.project, '`project` option is required');
|
81 | assert(!!options.buildRoot, '`buildRoot` option is required');
|
82 | options = fixDeprecatedOptions(options);
|
83 | options = Object.assign({}, options);
|
84 | const project = options.project;
|
85 | const buildRoot = options.buildRoot;
|
86 | const swPrecacheConfig = Object.assign({}, options.swPrecacheConfig);
|
87 | const depsIndex = yield project.analyzer.analyzeDependencies;
|
88 | let staticFileGlobs = Array.from(swPrecacheConfig.staticFileGlobs || []);
|
89 | const precachedAssets = (options.bundled) ?
|
90 | getBundledPrecachedAssets(project) :
|
91 | getPrecachedAssets(depsIndex, project);
|
92 | staticFileGlobs = staticFileGlobs.concat(precachedAssets);
|
93 | staticFileGlobs = staticFileGlobs.map((filePath) => {
|
94 | if (filePath.startsWith(project.config.root)) {
|
95 | filePath = filePath.substring(project.config.root.length);
|
96 | }
|
97 | return path.join(buildRoot, filePath);
|
98 | });
|
99 | if (swPrecacheConfig.navigateFallback === undefined) {
|
100 |
|
101 | swPrecacheConfig.navigateFallback =
|
102 | path.relative(project.config.root, project.config.entrypoint);
|
103 | }
|
104 | if (swPrecacheConfig.navigateFallbackWhitelist === undefined) {
|
105 |
|
106 |
|
107 |
|
108 |
|
109 | swPrecacheConfig.navigateFallbackWhitelist = [exports.hasNoFileExtension];
|
110 | }
|
111 | if (swPrecacheConfig.directoryIndex === undefined) {
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 | swPrecacheConfig.directoryIndex = '';
|
118 | }
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 |
|
126 |
|
127 | swPrecacheConfig.stripPrefix = addTrailingSlash(path_transformers_1.posixifyPath(buildRoot));
|
128 | if (options.basePath) {
|
129 |
|
130 | let replacePrefix = path_transformers_1.posixifyPath(options.basePath);
|
131 | if (!replacePrefix.endsWith('/')) {
|
132 | replacePrefix = replacePrefix + '/';
|
133 | }
|
134 | if (swPrecacheConfig.replacePrefix) {
|
135 | console.info(`Replacing service worker configuration's ` +
|
136 | `replacePrefix option (${swPrecacheConfig.replacePrefix}) ` +
|
137 | `with the build configuration's basePath (${replacePrefix}).`);
|
138 | }
|
139 | swPrecacheConfig.replacePrefix = replacePrefix;
|
140 | }
|
141 |
|
142 | swPrecacheConfig.staticFileGlobs = staticFileGlobs;
|
143 |
|
144 | swPrecacheConfig.logger = swPrecacheConfig.logger || logger.debug;
|
145 | return swPrecacheConfig;
|
146 | });
|
147 | }
|
148 | exports.generateServiceWorkerConfig = generateServiceWorkerConfig;
|
149 |
|
150 |
|
151 |
|
152 |
|
153 | function generateServiceWorker(options) {
|
154 | return __awaiter(this, void 0, void 0, function* () {
|
155 | const swPrecacheConfig = yield generateServiceWorkerConfig(options);
|
156 | return yield (new Promise((resolve, reject) => {
|
157 | logger.debug(`writing service worker...`, swPrecacheConfig);
|
158 | sw_precache_1.generate(swPrecacheConfig, (err, fileContents) => {
|
159 | if (err || fileContents == null) {
|
160 | reject(err || 'No file contents provided.');
|
161 | }
|
162 | else {
|
163 |
|
164 |
|
165 |
|
166 |
|
167 |
|
168 | fileContents = fileContents.replace(/\bfunction\(/g, 'function (');
|
169 | resolve(Buffer.from(fileContents));
|
170 | }
|
171 | });
|
172 | }));
|
173 | });
|
174 | }
|
175 | exports.generateServiceWorker = generateServiceWorker;
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|
181 |
|
182 | function addServiceWorker(options) {
|
183 | return generateServiceWorker(options).then((fileContents) => {
|
184 | return new Promise((resolve, reject) => {
|
185 | const serviceWorkerPath = path.join(options.buildRoot, options.path || 'service-worker.js');
|
186 | fs_1.writeFile(serviceWorkerPath, fileContents, (err) => {
|
187 | if (err) {
|
188 | reject(err);
|
189 | }
|
190 | else {
|
191 | resolve();
|
192 | }
|
193 | });
|
194 | });
|
195 | });
|
196 | }
|
197 | exports.addServiceWorker = addServiceWorker;
|
198 | function addTrailingSlash(s) {
|
199 | return s.endsWith('/') ? s : s + '/';
|
200 | }
|
201 |
|
\ | No newline at end of file |