diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/workbox-routing | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/workbox-routing')
| -rw-r--r-- | node_modules/workbox-routing/LICENSE | 201 | ||||
| -rw-r--r-- | node_modules/workbox-routing/NavigationRoute.mjs | 121 | ||||
| -rw-r--r-- | node_modules/workbox-routing/README.md | 1 | ||||
| -rw-r--r-- | node_modules/workbox-routing/RegExpRoute.mjs | 93 | ||||
| -rw-r--r-- | node_modules/workbox-routing/Route.mjs | 65 | ||||
| -rw-r--r-- | node_modules/workbox-routing/Router.mjs | 313 | ||||
| -rw-r--r-- | node_modules/workbox-routing/_default.mjs | 208 | ||||
| -rw-r--r-- | node_modules/workbox-routing/_public.mjs | 28 | ||||
| -rw-r--r-- | node_modules/workbox-routing/_types.mjs | 61 | ||||
| -rw-r--r-- | node_modules/workbox-routing/_version.mjs | 1 | ||||
| -rw-r--r-- | node_modules/workbox-routing/browser.mjs | 24 | ||||
| -rw-r--r-- | node_modules/workbox-routing/index.mjs | 28 | ||||
| -rw-r--r-- | node_modules/workbox-routing/package.json | 32 | ||||
| -rw-r--r-- | node_modules/workbox-routing/utils/constants.mjs | 42 | ||||
| -rw-r--r-- | node_modules/workbox-routing/utils/normalizeHandler.mjs | 48 |
15 files changed, 1266 insertions, 0 deletions
diff --git a/node_modules/workbox-routing/LICENSE b/node_modules/workbox-routing/LICENSE new file mode 100644 index 00000000..136b9039 --- /dev/null +++ b/node_modules/workbox-routing/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + 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 + + http://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. diff --git a/node_modules/workbox-routing/NavigationRoute.mjs b/node_modules/workbox-routing/NavigationRoute.mjs new file mode 100644 index 00000000..a223f171 --- /dev/null +++ b/node_modules/workbox-routing/NavigationRoute.mjs @@ -0,0 +1,121 @@ +/* + Copyright 2016 Google Inc. All Rights Reserved. + 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 + + http://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 {assert} from 'workbox-core/_private/assert.mjs'; +import {logger} from 'workbox-core/_private/logger.mjs'; +import {Route} from './Route.mjs'; +import './_version.mjs'; + +/** + * NavigationRoute makes it easy to create a [Route]{@link + * workbox.routing.Route} that matches for browser + * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}. + * + * It will only match incoming Requests whose + * [`mode`]{@link https://fetch.spec.whatwg.org/#concept-request-mode} + * is set to `navigate`. + * + * You can optionally only apply this route to a subset of navigation requests + * by using one or both of the `blacklist` and `whitelist` parameters. + * + * @memberof workbox.routing + * @extends workbox.routing.Route + */ +class NavigationRoute extends Route { + /** + * If both `blacklist` and `whiltelist` are provided, the `blacklist` will + * take precedence and the request will not match this route. + * + * The regular expressions in `whitelist` and `blacklist` + * are matched against the concatenated + * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname} + * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search} + * portions of the requested URL. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {Object} options + * @param {Array<RegExp>} [options.blacklist] If any of these patterns match, + * the route will not handle the request (even if a whitelist RegExp matches). + * @param {Array<RegExp>} [options.whitelist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the blacklist doesn't match). + */ + constructor(handler, {whitelist = [/./], blacklist = []} = {}) { + if (process.env.NODE_ENV !== 'production') { + assert.isArrayOfClass(whitelist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.whitelist', + }); + assert.isArrayOfClass(blacklist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.blacklist', + }); + } + + super((...args) => this._match(...args), handler); + + this._whitelist = whitelist; + this._blacklist = blacklist; + } + + /** + * Routes match handler. + * + * @param {Object} options + * @param {FetchEvent} options.event + * @param {URL} options.url + * @return {boolean} + * + * @private + */ + _match({event, url}) { + if (event.request.mode !== 'navigate') { + return false; + } + + const pathnameAndSearch = url.pathname + url.search; + + if (this._blacklist.some((regExp) => regExp.test(pathnameAndSearch))) { + if (process.env.NODE_ENV !== 'production') { + logger.debug(`The navigation route is not being used, since the ` + + `request URL matches both the whitelist and blacklist.`); + } + return false; + } + + if (this._whitelist.some((regExp) => regExp.test(pathnameAndSearch))) { + if (process.env.NODE_ENV !== 'production') { + logger.debug(`The navigation route is being used.`); + } + return true; + } else { + if (process.env.NODE_ENV !== 'production') { + logger.debug( + `The navigation route is not being used, since the ` + + `URL being navigated to doesn't match the whitelist.` + ); + } + } + + return false; + } +} + +export {NavigationRoute}; diff --git a/node_modules/workbox-routing/README.md b/node_modules/workbox-routing/README.md new file mode 100644 index 00000000..0c19ecc1 --- /dev/null +++ b/node_modules/workbox-routing/README.md @@ -0,0 +1 @@ +This module's documentation can be found at https://developers.google.com/web/tools/workbox/modules/workbox-routing diff --git a/node_modules/workbox-routing/RegExpRoute.mjs b/node_modules/workbox-routing/RegExpRoute.mjs new file mode 100644 index 00000000..7d217d31 --- /dev/null +++ b/node_modules/workbox-routing/RegExpRoute.mjs @@ -0,0 +1,93 @@ +/* + Copyright 2017 Google Inc. All Rights Reserved. + 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 + + http://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 {assert} from 'workbox-core/_private/assert.mjs'; +import {logger} from 'workbox-core/_private/logger.mjs'; +import {Route} from './Route.mjs'; +import './_version.mjs'; + +/** + * RegExpRoute makes it easy to create a regular expression based + * [Route]{@link workbox.routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing} + * + * @memberof workbox.routing + * @extends workbox.routing.Route + */ +class RegExpRoute extends Route { + /** + * If the regulard expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * th ecaptured values will be passed to the + * [handler's]{@link workbox.routing.Route~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + if (process.env.NODE_ENV !== 'production') { + assert.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern', + }); + } + + const match = ({url}) => { + const result = regExp.exec(url.href); + + // Return null immediately if there's no match. + if (!result) { + return null; + } + + // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + if ((url.origin !== location.origin) && (result.index !== 0)) { + if (process.env.NODE_ENV !== 'production') { + logger.debug( + `The regular expression '${regExp}' only partially matched ` + + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + + `handle cross-origin requests if they match the entire URL.` + ); + } + + return null; + } + + // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + return result.slice(1); + }; + + super(match, handler, method); + } +} + +export {RegExpRoute}; diff --git a/node_modules/workbox-routing/Route.mjs b/node_modules/workbox-routing/Route.mjs new file mode 100644 index 00000000..dba3b43a --- /dev/null +++ b/node_modules/workbox-routing/Route.mjs @@ -0,0 +1,65 @@ +/* + Copyright 2017 Google Inc. All Rights Reserved. + 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 + + http://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 {assert} from 'workbox-core/_private/assert.mjs'; + +import {defaultMethod, validMethods} from './utils/constants.mjs'; +import normalizeHandler from './utils/normalizeHandler.mjs'; +import './_version.mjs'; + +/** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof workbox.routing + */ +class Route { + /** + * Constructor for Route class. + * + * @param {workbox.routing.Route~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method) { + if (process.env.NODE_ENV !== 'production') { + assert.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match', + }); + + if (method) { + assert.isOneOf(method, validMethods, {paramName: 'method'}); + } + } + + // These values are referenced directly by Router so cannot be + // altered by minifification. + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method || defaultMethod; + } +} + +export {Route}; diff --git a/node_modules/workbox-routing/Router.mjs b/node_modules/workbox-routing/Router.mjs new file mode 100644 index 00000000..c2938d24 --- /dev/null +++ b/node_modules/workbox-routing/Router.mjs @@ -0,0 +1,313 @@ +/* + Copyright 2017 Google Inc. All Rights Reserved. + 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 + + http://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 {assert} from 'workbox-core/_private/assert.mjs'; +import {logger} from 'workbox-core/_private/logger.mjs'; +import {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs'; +import {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs'; + +import normalizeHandler from './utils/normalizeHandler.mjs'; +import './_version.mjs'; + +/** + * The Router can be used to process a FetchEvent through one or more + * [Routes]{@link workbox.routing.Route} responding with a Request if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof workbox.routing + */ +class Router { + /** + * Initializes a new Router. + */ + constructor() { + // _routes will contain a mapping of HTTP method name ('GET', etc.) to an + // array of all the corresponding Route instances that are registered. + this._routes = new Map(); + } + + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {FetchEvent} event The event from a service worker's 'fetch' event + * listener. + * @return {Promise<Response>|undefined} A promise is returned if a + * registered route can handle the FetchEvent's request. If there is no + * matching route and there's no `defaultHandler`, `undefined` is returned. + */ + handleRequest(event) { + if (process.env.NODE_ENV !== 'production') { + assert.isInstance(event, FetchEvent, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'handleRequest', + paramName: 'event', + }); + } + + const url = new URL(event.request.url); + if (!url.protocol.startsWith('http')) { + if (process.env.NODE_ENV !== 'production') { + logger.debug( + `Workbox Router only supports URLs that start with 'http'.`); + } + return; + } + + let route = null; + let handler = null; + let params = null; + let debugMessages = []; + + const result = this._findHandlerAndParams(event, url); + handler = result.handler; + params = result.params; + route = result.route; + if (process.env.NODE_ENV !== 'production') { + if (handler) { + debugMessages.push([ + `Found a route to handle this request:`, route, + ]); + + if (params) { + debugMessages.push([ + `Passing the following params to the route's handler:`, params, + ]); + } + } + } + + // If we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + if (!handler && this._defaultHandler) { + if (process.env.NODE_ENV !== 'production') { + debugMessages.push(`Failed to find a matching route. Falling ` + + `back to the default handler.`); + + // This is used for debugging in logs in the case of an error. + route = '[Default Handler]'; + } + handler = this._defaultHandler; + } + + if (!handler) { + if (process.env.NODE_ENV !== 'production') { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger.debug(`No route found for: ${getFriendlyURL(url)}`); + } + return; + } + + if (process.env.NODE_ENV !== 'production') { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); + debugMessages.forEach((msg) => { + if (Array.isArray(msg)) { + logger.log(...msg); + } else { + logger.log(msg); + } + }); + + // The Request and Response objects contains a great deal of information, + // hide it under a group in case developers want to see it. + logger.groupCollapsed(`View request details here.`); + logger.unprefixed.log(event.request); + logger.groupEnd(); + + logger.groupEnd(); + } + + // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + let responsePromise; + try { + responsePromise = handler.handle({url, event, params}); + } catch (err) { + responsePromise = Promise.reject(err); + } + + if (responsePromise && this._catchHandler) { + responsePromise = responsePromise.catch((err) => { + if (process.env.NODE_ENV !== 'production') { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + + ` ${getFriendlyURL(url)}. Falling back to Catch Handler.`); + logger.unprefixed.error(`Error thrown by:`, route); + logger.unprefixed.error(err); + logger.groupEnd(); + } + return this._catchHandler.handle({url, event, err}); + }); + } + + return responsePromise; + } + + /** + * Checks the incoming `event.request` against the registered routes, and if + * there's a match, returns the corresponding handler along with any params + * generated by the match. + * + * @param {FetchEvent} event + * @param {URL} url + * @return {Object} Returns an object with `handler` and `params` properties. + * They are populated if a matching route was found or `undefined` otherwise. + * + * @private + */ + _findHandlerAndParams(event, url) { + const routes = this._routes.get(event.request.method) || []; + for (const route of routes) { + let matchResult = route.match({url, event}); + if (matchResult) { + if (Array.isArray(matchResult) && matchResult.length === 0) { + // Instead of passing an empty array in as params, use undefined. + matchResult = undefined; + } else if ((matchResult.constructor === Object && + Object.keys(matchResult).length === 0) || matchResult === true) { + // Instead of passing an empty object in as params, use undefined. + matchResult = undefined; + } + + // Break out of the loop and return the appropriate values as soon as + // we have a match. + return { + route, + params: matchResult, + handler: route.handler, + }; + } + } + + // If we didn't have a match, then return undefined values. + return {handler: undefined, params: undefined}; + } + + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setDefaultHandler(handler) { + this._defaultHandler = normalizeHandler(handler); + } + + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + + /** + * Registers a route with the router. + * + * @param {workbox.routing.Route} route The route to register. + */ + registerRoute(route) { + if (process.env.NODE_ENV !== 'production') { + assert.isType(route, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route', + }); + + assert.hasMethod(route, 'match', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route', + }); + + assert.isType(route.handler, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route', + }); + + assert.hasMethod(route.handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.handler', + }); + + assert.isType(route.method, 'string', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.method', + }); + } + + if (!this._routes.has(route.method)) { + this._routes.set(route.method, []); + } + + // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + this._routes.get(route.method).push(route); + } + + /** + * Unregisters a route with the router. + * + * @param {workbox.routing.Route} route The route to unregister. + */ + unregisterRoute(route) { + if (!this._routes.has(route.method)) { + throw new WorkboxError( + 'unregister-route-but-not-found-with-method', { + method: route.method, + } + ); + } + + const routeIndex = this._routes.get(route.method).indexOf(route); + if (routeIndex > -1) { + this._routes.get(route.method).splice(routeIndex, 1); + } else { + throw new WorkboxError('unregister-route-route-not-registered'); + } + } +} + +export {Router}; diff --git a/node_modules/workbox-routing/_default.mjs b/node_modules/workbox-routing/_default.mjs new file mode 100644 index 00000000..d97baf76 --- /dev/null +++ b/node_modules/workbox-routing/_default.mjs @@ -0,0 +1,208 @@ +/* + 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 {NavigationRoute} from './NavigationRoute.mjs'; +import {RegExpRoute} from './RegExpRoute.mjs'; +import {Router} from './Router.mjs'; +import {Route} from './Route.mjs'; +import {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs'; +import {assert} from 'workbox-core/_private/assert.mjs'; +import {cacheNames} from 'workbox-core/_private/cacheNames.mjs'; +import {logger} from 'workbox-core/_private/logger.mjs'; +import './_version.mjs'; + +if (process.env.NODE_ENV !== 'production') { + assert.isSwEnv('workbox-routing'); +} + +/** + * @private + */ +class DefaultRouter extends Router { + /** + * Easily register a RegExp, string, or function with a caching + * strategy to the Router. + * + * This method will generate a Route for you if needed and + * call [Router.registerRoute()]{@link + * workbox.routing.Router#registerRoute}. + * + * @param { + * RegExp| + * string| + * workbox.routing.Route~matchCallback| + * workbox.routing.Route + * } capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {workbox.routing.Route} The generated `Route`(Useful for + * unregistering). + * + * @alias workbox.routing.registerRoute + */ + registerRoute(capture, handler, method = 'GET') { + let route; + + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location); + + if (process.env.NODE_ENV !== 'production') { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + className: 'DefaultRouter', + funcName: 'registerRoute', + paramName: 'capture', + }); + } + + // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + const valueToCheck = capture.startsWith('http') ? + captureUrl.pathname : + capture; + // See https://github.com/pillarjs/path-to-regexp#parameters + const wildcards = '[*:?+]'; + if (valueToCheck.match(new RegExp(`${wildcards}`))) { + logger.debug( + `The '$capture' parameter contains an Express-style wildcard ` + + `character (${wildcards}). Strings are now always interpreted as ` + + `exact matches; use a RegExp for partial or wildcard matches.` + ); + } + } + + const matchCallback = ({url}) => { + if (process.env.NODE_ENV !== 'production') { + if ((url.pathname === captureUrl.pathname) && + (url.origin !== captureUrl.origin)) { + logger.debug( + `${capture} only partially matches the cross-origin URL ` + + `${url}. This route will only handle cross-origin requests ` + + `if they match the entire URL.` + ); + } + } + + return url.href === captureUrl.href; + }; + + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + route = new Route(capture, handler, method); + } else if (capture instanceof Route) { + route = capture; + } else { + throw new WorkboxError('unsupported-route-type', { + moduleName: 'workbox-routing', + className: 'DefaultRouter', + funcName: 'registerRoute', + paramName: 'capture', + }); + } + + super.registerRoute(route); + return route; + } + + /** + * Register a route that will return a precached file for a navigation + * request. This is useful for the + * [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}. + * + * This method will generate a + * [NavigationRoute]{@link workbox.routing.NavigationRoute} + * and call + * [Router.registerRoute()]{@link workbox.routing.Router#registerRoute} + * . + * + * @param {string} cachedAssetUrl + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to precache cache name provided by + * [workbox-core.cacheNames]{@link workbox.core.cacheNames}. + * @param {Array<RegExp>} [options.blacklist=[]] If any of these patterns + * match, the route will not handle the request (even if a whitelist entry + * matches). + * @param {Array<RegExp>} [options.whitelist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the blacklist doesn't match). + * @return {workbox.routing.NavigationRoute} Returns the generated + * Route. + * + * @alias workbox.routing.registerNavigationRoute + */ + registerNavigationRoute(cachedAssetUrl, options = {}) { + if (process.env.NODE_ENV !== 'production') { + assert.isType(cachedAssetUrl, 'string', { + moduleName: 'workbox-routing', + className: '[default export]', + funcName: 'registerNavigationRoute', + paramName: 'cachedAssetUrl', + }); + } + + const cacheName = cacheNames.getPrecacheName(options.cacheName); + const handler = () => caches.match(cachedAssetUrl, {cacheName}) + .then((response) => { + if (response) { + return response; + } + // This shouldn't normally happen, but there are edge cases: + // https://github.com/GoogleChrome/workbox/issues/1441 + throw new Error(`The cache ${cacheName} did not have an entry for ` + + `${cachedAssetUrl}.`); + }).catch((error) => { + // If there's either a cache miss, or the caches.match() call threw + // an exception, then attempt to fulfill the navigation request with + // a response from the network rather than leaving the user with a + // failed navigation. + if (process.env.NODE_ENV !== 'production') { + logger.debug(`Unable to respond to navigation request with cached ` + + `response: ${error.message}. Falling back to network.`); + } + + // This might still fail if the browser is offline... + return fetch(cachedAssetUrl); + }); + + const route = new NavigationRoute(handler, { + whitelist: options.whitelist, + blacklist: options.blacklist, + }); + super.registerRoute(route); + + return route; + } +} + +const router = new DefaultRouter(); + +// By default, register a fetch event listener that will respond to a request +// only if there's a matching route. +self.addEventListener('fetch', (event) => { + const responsePromise = router.handleRequest(event); + if (responsePromise) { + event.respondWith(responsePromise); + } +}); + +export default router; diff --git a/node_modules/workbox-routing/_public.mjs b/node_modules/workbox-routing/_public.mjs new file mode 100644 index 00000000..dd93a617 --- /dev/null +++ b/node_modules/workbox-routing/_public.mjs @@ -0,0 +1,28 @@ +/* + 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 {RegExpRoute} from './RegExpRoute.mjs'; +import {Route} from './Route.mjs'; +import {Router} from './Router.mjs'; +import {NavigationRoute} from './NavigationRoute.mjs'; +import './_version.mjs'; + +export { + RegExpRoute, + Route, + Router, + NavigationRoute, +}; diff --git a/node_modules/workbox-routing/_types.mjs b/node_modules/workbox-routing/_types.mjs new file mode 100644 index 00000000..c82319c3 --- /dev/null +++ b/node_modules/workbox-routing/_types.mjs @@ -0,0 +1,61 @@ +/* + Copyright 2016 Google Inc. All Rights Reserved. + 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 + + http://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'; + +/** + * The "match" callback is used to determine if a `Route` should handle a + * service worker's `fetch` event. Returning a truthy value means + * this `Route` will handle and respond to the event. + * + * Return `null` if this Route shouldn't match against the `fetch` event. + * + * Any truthy value returned by this callback will be passed to the + * Route's + * [handler callback]{@link workbox.routing.Route~handlerCallback}. + * + * @callback Route~matchCallback + * @param {Object} context + * @param {URL} context.url The request's URL. + * @param {FetchEvent} context.event The service worker`s `fetch` + * event. + * @return {Object|null} To signify a match, return anything other than `null`. + * Return `null` if the route shouldn't match. + * [handler]{@link workbox.routing.Route~handlerCallback}. + * + * @memberof workbox.routing + */ + +/** + * The "handler" callback is called when a service worker's `fetch` event + * has been matched by a `Route`. This callback should return a Promise that + * resolves with a `Response`. + * + * If a value is returned by the + * [match callback]{@link workbox.routing.Route~matchCallback} it + * will be passed in as the `context.params` argument. + * + * @callback Route~handlerCallback + * @param {Object} context + * @param {URL} context.url The request's URL. + * @param {FetchEvent} context.event The service worker's `fetch` + * event. + * @param {Object} [context.params] Parameters returned by the Route's + * [match callback]{@link workbox.routing.Route~matchCallback} function. + * This will be undefined if nothing was returned. + * @return {Promise<Response>} The response that will fulfill the request. + * + * @memberof workbox.routing + */ diff --git a/node_modules/workbox-routing/_version.mjs b/node_modules/workbox-routing/_version.mjs new file mode 100644 index 00000000..03befa43 --- /dev/null +++ b/node_modules/workbox-routing/_version.mjs @@ -0,0 +1 @@ +try{self.workbox.v['workbox:routing:3.6.3']=1;}catch(e){} // eslint-disable-line
\ No newline at end of file diff --git a/node_modules/workbox-routing/browser.mjs b/node_modules/workbox-routing/browser.mjs new file mode 100644 index 00000000..b01d2ff7 --- /dev/null +++ b/node_modules/workbox-routing/browser.mjs @@ -0,0 +1,24 @@ +/* + 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 * as publicAPI from './_public.mjs'; +import defaultExport from './_default.mjs'; +import './_version.mjs'; + +const finalExport = Object.assign(defaultExport, publicAPI); + +export default finalExport; diff --git a/node_modules/workbox-routing/index.mjs b/node_modules/workbox-routing/index.mjs new file mode 100644 index 00000000..074870d2 --- /dev/null +++ b/node_modules/workbox-routing/index.mjs @@ -0,0 +1,28 @@ +/* + 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 defaultExport from './_default.mjs'; +import './_version.mjs'; + +/** + * @namespace workbox.routing + * @borrows workbox.routing.Router#setCatchHandler as setCatchHandler + * @borrows workbox.routing.Router#setDefaultHandler as setDefaultHandler + * @borrows workbox.routing.Router#unregisterRoute as unregisterRoute + */ + +export * from './_public.mjs'; +export default defaultExport; diff --git a/node_modules/workbox-routing/package.json b/node_modules/workbox-routing/package.json new file mode 100644 index 00000000..7a0fdea8 --- /dev/null +++ b/node_modules/workbox-routing/package.json @@ -0,0 +1,32 @@ +{ + "name": "workbox-routing", + "version": "3.6.3", + "license": "Apache-2.0", + "author": "Google's Web DevRel Team", + "description": "A service worker helper library to route request URLs to handlers.", + "repository": "googlechrome/workbox", + "bugs": "https://github.com/googlechrome/workbox/issues", + "homepage": "https://github.com/GoogleChrome/workbox", + "keywords": [ + "workbox", + "workboxjs", + "service worker", + "sw", + "router", + "routing" + ], + "scripts": { + "build": "gulp build-packages --package workbox-routing", + "version": "npm run build", + "prepare": "npm run build" + }, + "workbox": { + "browserNamespace": "workbox.routing", + "packageType": "browser" + }, + "main": "build/workbox-routing.prod.js", + "module": "index.mjs", + "dependencies": { + "workbox-core": "^3.6.3" + } +} diff --git a/node_modules/workbox-routing/utils/constants.mjs b/node_modules/workbox-routing/utils/constants.mjs new file mode 100644 index 00000000..8acaf5cd --- /dev/null +++ b/node_modules/workbox-routing/utils/constants.mjs @@ -0,0 +1,42 @@ +/* + Copyright 2017 Google Inc. All Rights Reserved. + 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 + + http://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'; + +/** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ +export const defaultMethod = 'GET'; + +/** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array<string>} + * + * @private + */ +export const validMethods = [ + 'DELETE', + 'GET', + 'HEAD', + 'PATCH', + 'POST', + 'PUT', +]; diff --git a/node_modules/workbox-routing/utils/normalizeHandler.mjs b/node_modules/workbox-routing/utils/normalizeHandler.mjs new file mode 100644 index 00000000..b27187f8 --- /dev/null +++ b/node_modules/workbox-routing/utils/normalizeHandler.mjs @@ -0,0 +1,48 @@ +/* + Copyright 2017 Google Inc. All Rights Reserved. + 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 + + http://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 {assert} from 'workbox-core/_private/assert.mjs'; +import '../_version.mjs'; + +/** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ +export default (handler) => { + if (handler && typeof handler === 'object') { + if (process.env.NODE_ENV !== 'production') { + assert.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler', + }); + } + return handler; + } else { + if (process.env.NODE_ENV !== 'production') { + assert.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler', + }); + } + return {handle: handler}; + } +}; |
