/* Copyright 2018 Google LLC Use of this source code is governed by an MIT-style license that can be found in the LICENSE file or at https://opensource.org/licenses/MIT. */ 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};