summaryrefslogtreecommitdiffstats
path: root/node_modules/webpack/lib/RequestShortener.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack/lib/RequestShortener.js')
-rw-r--r--node_modules/webpack/lib/RequestShortener.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/RequestShortener.js b/node_modules/webpack/lib/RequestShortener.js
new file mode 100644
index 0000000..3d9af00
--- /dev/null
+++ b/node_modules/webpack/lib/RequestShortener.js
@@ -0,0 +1,83 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const path = require("path");
+const NORMALIZE_SLASH_DIRECTION_REGEXP = /\\/g;
+const PATH_CHARS_REGEXP = /[-[\]{}()*+?.,\\^$|#\s]/g;
+const SEPARATOR_REGEXP = /[/\\]$/;
+const FRONT_OR_BACK_BANG_REGEXP = /^!|!$/g;
+const INDEX_JS_REGEXP = /\/index.js(!|\?|\(query\))/g;
+const MATCH_RESOURCE_REGEXP = /!=!/;
+
+const normalizeBackSlashDirection = request => {
+ return request.replace(NORMALIZE_SLASH_DIRECTION_REGEXP, "/");
+};
+
+const createRegExpForPath = path => {
+ const regexpTypePartial = path.replace(PATH_CHARS_REGEXP, "\\$&");
+ return new RegExp(`(^|!)${regexpTypePartial}`, "g");
+};
+
+class RequestShortener {
+ constructor(directory) {
+ directory = normalizeBackSlashDirection(directory);
+ if (SEPARATOR_REGEXP.test(directory)) {
+ directory = directory.substr(0, directory.length - 1);
+ }
+
+ if (directory) {
+ this.currentDirectoryRegExp = createRegExpForPath(directory);
+ }
+
+ const dirname = path.dirname(directory);
+ const endsWithSeparator = SEPARATOR_REGEXP.test(dirname);
+ const parentDirectory = endsWithSeparator
+ ? dirname.substr(0, dirname.length - 1)
+ : dirname;
+ if (parentDirectory && parentDirectory !== directory) {
+ this.parentDirectoryRegExp = createRegExpForPath(`${parentDirectory}/`);
+ }
+
+ if (__dirname.length >= 2) {
+ const buildins = normalizeBackSlashDirection(path.join(__dirname, ".."));
+ const buildinsAsModule =
+ this.currentDirectoryRegExp &&
+ this.currentDirectoryRegExp.test(buildins);
+ this.buildinsAsModule = buildinsAsModule;
+ this.buildinsRegExp = createRegExpForPath(buildins);
+ }
+
+ this.cache = new Map();
+ }
+
+ shorten(request) {
+ if (!request) return request;
+ const cacheEntry = this.cache.get(request);
+ if (cacheEntry !== undefined) {
+ return cacheEntry;
+ }
+ let result = normalizeBackSlashDirection(request);
+ if (this.buildinsAsModule && this.buildinsRegExp) {
+ result = result.replace(this.buildinsRegExp, "!(webpack)");
+ }
+ if (this.currentDirectoryRegExp) {
+ result = result.replace(this.currentDirectoryRegExp, "!.");
+ }
+ if (this.parentDirectoryRegExp) {
+ result = result.replace(this.parentDirectoryRegExp, "!../");
+ }
+ if (!this.buildinsAsModule && this.buildinsRegExp) {
+ result = result.replace(this.buildinsRegExp, "!(webpack)");
+ }
+ result = result.replace(INDEX_JS_REGEXP, "$1");
+ result = result.replace(FRONT_OR_BACK_BANG_REGEXP, "");
+ result = result.replace(MATCH_RESOURCE_REGEXP, " = ");
+ this.cache.set(request, result);
+ return result;
+ }
+}
+
+module.exports = RequestShortener;