aboutsummaryrefslogtreecommitdiff
path: root/node_modules/workbox-sw/controllers
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/workbox-sw/controllers
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/workbox-sw/controllers')
-rw-r--r--node_modules/workbox-sw/controllers/WorkboxSW.mjs184
1 files changed, 184 insertions, 0 deletions
diff --git a/node_modules/workbox-sw/controllers/WorkboxSW.mjs b/node_modules/workbox-sw/controllers/WorkboxSW.mjs
new file mode 100644
index 00000000..ec4b9ff7
--- /dev/null
+++ b/node_modules/workbox-sw/controllers/WorkboxSW.mjs
@@ -0,0 +1,184 @@
+/*
+ Copyright 2017 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+import '../_version.mjs';
+
+const CDN_PATH = `WORKBOX_CDN_ROOT_URL`;
+
+const MODULE_KEY_TO_NAME_MAPPING = {
+ backgroundSync: 'background-sync',
+ broadcastUpdate: 'broadcast-cache-update',
+ cacheableResponse: 'cacheable-response',
+ core: 'core',
+ expiration: 'cache-expiration',
+ googleAnalytics: 'google-analytics',
+ navigationPreload: 'navigation-preload',
+ precaching: 'precaching',
+ rangeRequests: 'range-requests',
+ routing: 'routing',
+ strategies: 'strategies',
+ streams: 'streams',
+};
+
+/**
+ * This class can be used to make it easy to use the various parts of
+ * Workbox.
+ *
+ * @private
+ */
+class WorkboxSW {
+ /**
+ * Creates a proxy that automatically loads workbox namespaces on demand.
+ *
+ * @private
+ */
+ constructor() {
+ this.v = {};
+ this._options = {
+ debug: self.location.hostname === 'localhost',
+ modulePathPrefix: null,
+ modulePathCb: null,
+ };
+
+ this._env = this._options.debug ? 'dev' : 'prod';
+ this._modulesLoaded = false;
+
+ return new Proxy(this, {
+ get(target, key) {
+ if (target[key]) {
+ return target[key];
+ }
+
+ const moduleName = MODULE_KEY_TO_NAME_MAPPING[key];
+ if (moduleName) {
+ target.loadModule(`workbox-${moduleName}`);
+ }
+
+ return target[key];
+ },
+ });
+ }
+
+ /**
+ * Updates the configuration options. You can specify whether to treat as a
+ * debug build and whether to use a CDN or a specific path when importing
+ * other workbox-modules
+ *
+ * @param {Object} [options]
+ * @param {boolean} [options.debug] If true, `dev` builds are using, otherwise
+ * `prod` builds are used. By default, `prod` is used unless on localhost.
+ * @param {Function} [options.modulePathPrefix] To avoid using the CDN with
+ * `workbox-sw` set the path prefix of where modules should be loaded from.
+ * For example `modulePathPrefix: '/third_party/workbox/v3.0.0/'`.
+ * @param {workbox~ModulePathCallback} [options.modulePathCb] If defined,
+ * this callback will be responsible for determining the path of each
+ * workbox module.
+ *
+ * @alias workbox.setConfig
+ */
+ setConfig(options = {}) {
+ if (!this._modulesLoaded) {
+ Object.assign(this._options, options);
+ this._env = this._options.debug ? 'dev' : 'prod';
+ } else {
+ throw new Error('Config must be set before accessing workbox.* modules');
+ }
+ }
+
+ /**
+ * Force a service worker to become active, instead of waiting. This is
+ * normally used in conjunction with `clientsClaim()`.
+ *
+ * @alias workbox.skipWaiting
+ */
+ skipWaiting() {
+ self.addEventListener('install', () => self.skipWaiting());
+ }
+
+ /**
+ * Claim any currently available clients once the service worker
+ * becomes active. This is normally used in conjunction with `skipWaiting()`.
+ *
+ * @alias workbox.clientsClaim
+ */
+ clientsClaim() {
+ self.addEventListener('activate', () => self.clients.claim());
+ }
+
+ /**
+ * Load a Workbox module by passing in the appropriate module name.
+ *
+ * This is not generally needed unless you know there are modules that are
+ * dynamically used and you want to safe guard use of the module while the
+ * user may be offline.
+ *
+ * @param {string} moduleName
+ *
+ * @alias workbox.loadModule
+ */
+ loadModule(moduleName) {
+ const modulePath = this._getImportPath(moduleName);
+ try {
+ importScripts(modulePath);
+ this._modulesLoaded = true;
+ } catch (err) {
+ // TODO Add context of this error if using the CDN vs the local file.
+
+ // We can't rely on workbox-core being loaded so using console
+ // eslint-disable-next-line
+ console.error(
+ `Unable to import module '${moduleName}' from '${modulePath}'.`);
+ throw err;
+ }
+ }
+
+ /**
+ * This method will get the path / CDN URL to be used for importScript calls.
+ *
+ * @param {string} moduleName
+ * @return {string} URL to the desired module.
+ *
+ * @private
+ */
+ _getImportPath(moduleName) {
+ if (this._options.modulePathCb) {
+ return this._options.modulePathCb(moduleName, this._options.debug);
+ }
+
+ // TODO: This needs to be dynamic some how.
+ let pathParts = [CDN_PATH];
+
+ const fileName = `${moduleName}.${this._env}.js`;
+
+ const pathPrefix = this._options.modulePathPrefix;
+ if (pathPrefix) {
+ // Split to avoid issues with developers ending / not ending with slash
+ pathParts = pathPrefix.split('/');
+
+ // We don't need a slash at the end as we will be adding
+ // a filename regardless
+ if (pathParts[pathParts.length - 1] === '') {
+ pathParts.splice(pathParts.length - 1, 1);
+ }
+ }
+
+ pathParts.push(fileName);
+
+ return pathParts.join('/');
+ }
+}
+
+export default WorkboxSW;