@spartacus/core
Version:
Spartacus - the core framework
90 lines • 11.4 kB
JavaScript
/**
* @license
* The MIT License
* Copyright (c) 2010-2019 Google LLC. http://angular.io/license
*
* See:
* - https://github.com/angular/angular/blob/6f5f481fdae03f1d8db36284b64c7b82d9519d85/packages/service-worker/config/src/glob.ts
* - https://github.com/angular/angular/blob/6f5f481fdae03f1d8db36284b64c7b82d9519d85/aio/tests/deployment/shared/helpers.ts#L17
* - https://github.com/angular/angular/blob/6f5f481fdae03f1d8db36284b64c7b82d9519d85/packages/service-worker/config/src/generator.ts#L86
*/
const QUESTION_MARK = '[^/]';
const WILD_SINGLE = '[^/]*';
const WILD_OPEN = '(?:.+\\/)?';
const TO_ESCAPE_BASE = [
{ replace: /\./g, with: '\\.' },
{ replace: /\+/g, with: '\\+' },
{ replace: /\*/g, with: WILD_SINGLE },
];
const TO_ESCAPE_WILDCARD_QM = [
...TO_ESCAPE_BASE,
{ replace: /\?/g, with: QUESTION_MARK },
];
const TO_ESCAPE_LITERAL_QM = [
...TO_ESCAPE_BASE,
{ replace: /\?/g, with: '\\?' },
];
/**
* Converts the glob-like pattern into regex string.
*
* Patterns use a limited glob format:
* `**` matches 0 or more path segments
* `*` matches 0 or more characters excluding `/`
* `?` matches exactly one character excluding `/` (but when @param literalQuestionMark is true, `?` is treated as normal character)
* The `!` prefix marks the pattern as being negative, meaning that only URLs that don't match the pattern will be included
*
* @param glob glob-like pattern
* @param literalQuestionMark when true, it tells that `?` is treated as a normal character
*/
export function globToRegex(glob, literalQuestionMark = false) {
const toEscape = literalQuestionMark
? TO_ESCAPE_LITERAL_QM
: TO_ESCAPE_WILDCARD_QM;
const segments = glob.split('/').reverse();
let regex = '';
while (segments.length > 0) {
const segment = segments.pop();
if (segment === '**') {
if (segments.length > 0) {
regex += WILD_OPEN;
}
else {
regex += '.*';
}
}
else {
const processed = toEscape.reduce((seg, escape) => seg.replace(escape.replace, escape.with), segment);
regex += processed;
if (segments.length > 0) {
regex += '\\/';
}
}
}
return regex;
}
/**
* For given list of glob-like patterns, returns a matcher function.
*
* The matcher returns true for given URL only when ANY of the positive patterns is matched and NONE of the negative ones.
*/
export function getGlobMatcher(patterns) {
const processedPatterns = processGlobPatterns(patterns).map(({ positive, regex }) => ({
positive,
regex: new RegExp(regex),
}));
const includePatterns = processedPatterns.filter((spec) => spec.positive);
const excludePatterns = processedPatterns.filter((spec) => !spec.positive);
return (url) => includePatterns.some((pattern) => pattern.regex.test(url)) &&
!excludePatterns.some((pattern) => pattern.regex.test(url));
}
/**
* Converts list of glob-like patterns into list of RegExps with information whether the glob pattern is positive or negative
*/
export function processGlobPatterns(urls) {
return urls.map((url) => {
const positive = !url.startsWith('!');
url = positive ? url : url.substr(1);
return { positive, regex: `^${globToRegex(url)}$` };
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYi11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWwvZ2xvYi11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDN0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQzVCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQztBQUMvQixNQUFNLGNBQWMsR0FBRztJQUNyQixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUMvQixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUMvQixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtDQUN0QyxDQUFDO0FBQ0YsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixHQUFHLGNBQWM7SUFDakIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7Q0FDeEMsQ0FBQztBQUNGLE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsR0FBRyxjQUFjO0lBQ2pCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0NBQ2hDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWSxFQUFFLG1CQUFtQixHQUFHLEtBQUs7SUFDbkUsTUFBTSxRQUFRLEdBQUcsbUJBQW1CO1FBQ2xDLENBQUMsQ0FBQyxvQkFBb0I7UUFDdEIsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO0lBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0MsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMxQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3BCLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZCLEtBQUssSUFBSSxTQUFTLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0wsS0FBSyxJQUFJLElBQUksQ0FBQzthQUNmO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQy9CLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDekQsT0FBTyxDQUNSLENBQUM7WUFDRixLQUFLLElBQUksU0FBUyxDQUFDO1lBQ25CLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZCLEtBQUssSUFBSSxLQUFLLENBQUM7YUFDaEI7U0FDRjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBa0I7SUFDL0MsTUFBTSxpQkFBaUIsR0FHakIsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEUsUUFBUTtRQUNSLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7S0FDekIsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRSxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTNFLE9BQU8sQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUNyQixlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxJQUFjO0lBRWQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogVGhlIE1JVCBMaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxOSBHb29nbGUgTExDLiBodHRwOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKlxuICogU2VlOlxuICogLSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvNmY1ZjQ4MWZkYWUwM2YxZDhkYjM2Mjg0YjY0YzdiODJkOTUxOWQ4NS9wYWNrYWdlcy9zZXJ2aWNlLXdvcmtlci9jb25maWcvc3JjL2dsb2IudHNcbiAqIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzZmNWY0ODFmZGFlMDNmMWQ4ZGIzNjI4NGI2NGM3YjgyZDk1MTlkODUvYWlvL3Rlc3RzL2RlcGxveW1lbnQvc2hhcmVkL2hlbHBlcnMudHMjTDE3XG4gKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi82ZjVmNDgxZmRhZTAzZjFkOGRiMzYyODRiNjRjN2I4MmQ5NTE5ZDg1L3BhY2thZ2VzL3NlcnZpY2Utd29ya2VyL2NvbmZpZy9zcmMvZ2VuZXJhdG9yLnRzI0w4NlxuICovXG5cbmNvbnN0IFFVRVNUSU9OX01BUksgPSAnW14vXSc7XG5jb25zdCBXSUxEX1NJTkdMRSA9ICdbXi9dKic7XG5jb25zdCBXSUxEX09QRU4gPSAnKD86LitcXFxcLyk/JztcbmNvbnN0IFRPX0VTQ0FQRV9CQVNFID0gW1xuICB7IHJlcGxhY2U6IC9cXC4vZywgd2l0aDogJ1xcXFwuJyB9LFxuICB7IHJlcGxhY2U6IC9cXCsvZywgd2l0aDogJ1xcXFwrJyB9LFxuICB7IHJlcGxhY2U6IC9cXCovZywgd2l0aDogV0lMRF9TSU5HTEUgfSxcbl07XG5jb25zdCBUT19FU0NBUEVfV0lMRENBUkRfUU0gPSBbXG4gIC4uLlRPX0VTQ0FQRV9CQVNFLFxuICB7IHJlcGxhY2U6IC9cXD8vZywgd2l0aDogUVVFU1RJT05fTUFSSyB9LFxuXTtcbmNvbnN0IFRPX0VTQ0FQRV9MSVRFUkFMX1FNID0gW1xuICAuLi5UT19FU0NBUEVfQkFTRSxcbiAgeyByZXBsYWNlOiAvXFw/L2csIHdpdGg6ICdcXFxcPycgfSxcbl07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGdsb2ItbGlrZSBwYXR0ZXJuIGludG8gcmVnZXggc3RyaW5nLlxuICpcbiAqIFBhdHRlcm5zIHVzZSBhIGxpbWl0ZWQgZ2xvYiBmb3JtYXQ6XG4gKiBgKipgIG1hdGNoZXMgMCBvciBtb3JlIHBhdGggc2VnbWVudHNcbiAqIGAqYCBtYXRjaGVzIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIGV4Y2x1ZGluZyBgL2BcbiAqIGA/YCBtYXRjaGVzIGV4YWN0bHkgb25lIGNoYXJhY3RlciBleGNsdWRpbmcgYC9gIChidXQgd2hlbiBAcGFyYW0gbGl0ZXJhbFF1ZXN0aW9uTWFyayBpcyB0cnVlLCBgP2AgaXMgdHJlYXRlZCBhcyBub3JtYWwgY2hhcmFjdGVyKVxuICogVGhlIGAhYCBwcmVmaXggbWFya3MgdGhlIHBhdHRlcm4gYXMgYmVpbmcgbmVnYXRpdmUsIG1lYW5pbmcgdGhhdCBvbmx5IFVSTHMgdGhhdCBkb24ndCBtYXRjaCB0aGUgcGF0dGVybiB3aWxsIGJlIGluY2x1ZGVkXG4gKlxuICogQHBhcmFtIGdsb2IgZ2xvYi1saWtlIHBhdHRlcm5cbiAqIEBwYXJhbSBsaXRlcmFsUXVlc3Rpb25NYXJrIHdoZW4gdHJ1ZSwgaXQgdGVsbHMgdGhhdCBgP2AgaXMgdHJlYXRlZCBhcyBhIG5vcm1hbCBjaGFyYWN0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdsb2JUb1JlZ2V4KGdsb2I6IHN0cmluZywgbGl0ZXJhbFF1ZXN0aW9uTWFyayA9IGZhbHNlKTogc3RyaW5nIHtcbiAgY29uc3QgdG9Fc2NhcGUgPSBsaXRlcmFsUXVlc3Rpb25NYXJrXG4gICAgPyBUT19FU0NBUEVfTElURVJBTF9RTVxuICAgIDogVE9fRVNDQVBFX1dJTERDQVJEX1FNO1xuICBjb25zdCBzZWdtZW50cyA9IGdsb2Iuc3BsaXQoJy8nKS5yZXZlcnNlKCk7XG4gIGxldCByZWdleCA9ICcnO1xuICB3aGlsZSAoc2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50cy5wb3AoKTtcbiAgICBpZiAoc2VnbWVudCA9PT0gJyoqJykge1xuICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnZXggKz0gV0lMRF9PUEVOO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVnZXggKz0gJy4qJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gdG9Fc2NhcGUucmVkdWNlKFxuICAgICAgICAoc2VnLCBlc2NhcGUpID0+IHNlZy5yZXBsYWNlKGVzY2FwZS5yZXBsYWNlLCBlc2NhcGUud2l0aCksXG4gICAgICAgIHNlZ21lbnRcbiAgICAgICk7XG4gICAgICByZWdleCArPSBwcm9jZXNzZWQ7XG4gICAgICBpZiAoc2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZWdleCArPSAnXFxcXC8nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVnZXg7XG59XG5cbi8qKlxuICogRm9yIGdpdmVuIGxpc3Qgb2YgZ2xvYi1saWtlIHBhdHRlcm5zLCByZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgbWF0Y2hlciByZXR1cm5zIHRydWUgZm9yIGdpdmVuIFVSTCBvbmx5IHdoZW4gQU5ZIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBpcyBtYXRjaGVkIGFuZCBOT05FIG9mIHRoZSBuZWdhdGl2ZSBvbmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYk1hdGNoZXIocGF0dGVybnM6IHN0cmluZ1tdKTogKHVybDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgY29uc3QgcHJvY2Vzc2VkUGF0dGVybnM6IHtcbiAgICBwb3NpdGl2ZTogYm9vbGVhbjtcbiAgICByZWdleDogUmVnRXhwO1xuICB9W10gPSBwcm9jZXNzR2xvYlBhdHRlcm5zKHBhdHRlcm5zKS5tYXAoKHsgcG9zaXRpdmUsIHJlZ2V4IH0pID0+ICh7XG4gICAgcG9zaXRpdmUsXG4gICAgcmVnZXg6IG5ldyBSZWdFeHAocmVnZXgpLFxuICB9KSk7XG5cbiAgY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gcHJvY2Vzc2VkUGF0dGVybnMuZmlsdGVyKChzcGVjKSA9PiBzcGVjLnBvc2l0aXZlKTtcbiAgY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gcHJvY2Vzc2VkUGF0dGVybnMuZmlsdGVyKChzcGVjKSA9PiAhc3BlYy5wb3NpdGl2ZSk7XG5cbiAgcmV0dXJuICh1cmw6IHN0cmluZykgPT5cbiAgICBpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi5yZWdleC50ZXN0KHVybCkpICYmXG4gICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnJlZ2V4LnRlc3QodXJsKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgbGlzdCBvZiBnbG9iLWxpa2UgcGF0dGVybnMgaW50byBsaXN0IG9mIFJlZ0V4cHMgd2l0aCBpbmZvcm1hdGlvbiB3aGV0aGVyIHRoZSBnbG9iIHBhdHRlcm4gaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NHbG9iUGF0dGVybnMoXG4gIHVybHM6IHN0cmluZ1tdXG4pOiB7IHBvc2l0aXZlOiBib29sZWFuOyByZWdleDogc3RyaW5nIH1bXSB7XG4gIHJldHVybiB1cmxzLm1hcCgodXJsKSA9PiB7XG4gICAgY29uc3QgcG9zaXRpdmUgPSAhdXJsLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICB1cmwgPSBwb3NpdGl2ZSA/IHVybCA6IHVybC5zdWJzdHIoMSk7XG4gICAgcmV0dXJuIHsgcG9zaXRpdmUsIHJlZ2V4OiBgXiR7Z2xvYlRvUmVnZXgodXJsKX0kYCB9O1xuICB9KTtcbn1cbiJdfQ==