summaryrefslogtreecommitdiffstats
path: root/node_modules/loader-utils/lib
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/loader-utils/lib')
-rw-r--r--node_modules/loader-utils/lib/getCurrentRequest.js16
-rw-r--r--node_modules/loader-utils/lib/getHashDigest.js69
-rw-r--r--node_modules/loader-utils/lib/getOptions.js20
-rw-r--r--node_modules/loader-utils/lib/getRemainingRequest.js16
-rw-r--r--node_modules/loader-utils/lib/index.js23
-rw-r--r--node_modules/loader-utils/lib/interpolateName.js151
-rw-r--r--node_modules/loader-utils/lib/isUrlRequest.js31
-rw-r--r--node_modules/loader-utils/lib/parseQuery.js68
-rw-r--r--node_modules/loader-utils/lib/parseString.js23
-rw-r--r--node_modules/loader-utils/lib/stringifyRequest.js51
-rw-r--r--node_modules/loader-utils/lib/urlToRequest.js60
11 files changed, 528 insertions, 0 deletions
diff --git a/node_modules/loader-utils/lib/getCurrentRequest.js b/node_modules/loader-utils/lib/getCurrentRequest.js
new file mode 100644
index 0000000..4818563
--- /dev/null
+++ b/node_modules/loader-utils/lib/getCurrentRequest.js
@@ -0,0 +1,16 @@
+'use strict';
+
+function getCurrentRequest(loaderContext) {
+ if (loaderContext.currentRequest) {
+ return loaderContext.currentRequest;
+ }
+
+ const request = loaderContext.loaders
+ .slice(loaderContext.loaderIndex)
+ .map((obj) => obj.request)
+ .concat([loaderContext.resource]);
+
+ return request.join('!');
+}
+
+module.exports = getCurrentRequest;
diff --git a/node_modules/loader-utils/lib/getHashDigest.js b/node_modules/loader-utils/lib/getHashDigest.js
new file mode 100644
index 0000000..bbc4e03
--- /dev/null
+++ b/node_modules/loader-utils/lib/getHashDigest.js
@@ -0,0 +1,69 @@
+'use strict';
+
+const baseEncodeTables = {
+ 26: 'abcdefghijklmnopqrstuvwxyz',
+ 32: '123456789abcdefghjkmnpqrstuvwxyz', // no 0lio
+ 36: '0123456789abcdefghijklmnopqrstuvwxyz',
+ 49: 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ', // no lIO
+ 52: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 58: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ', // no 0lIO
+ 62: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 64: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_',
+};
+
+function encodeBufferToBase(buffer, base) {
+ const encodeTable = baseEncodeTables[base];
+ if (!encodeTable) {
+ throw new Error('Unknown encoding base' + base);
+ }
+
+ const readLength = buffer.length;
+ const Big = require('big.js');
+
+ Big.RM = Big.DP = 0;
+ let b = new Big(0);
+
+ for (let i = readLength - 1; i >= 0; i--) {
+ b = b.times(256).plus(buffer[i]);
+ }
+
+ let output = '';
+ while (b.gt(0)) {
+ output = encodeTable[b.mod(base)] + output;
+ b = b.div(base);
+ }
+
+ Big.DP = 20;
+ Big.RM = 1;
+
+ return output;
+}
+
+function getHashDigest(buffer, hashType, digestType, maxLength) {
+ hashType = hashType || 'md5';
+ maxLength = maxLength || 9999;
+
+ const hash = require('crypto').createHash(hashType);
+
+ hash.update(buffer);
+
+ if (
+ digestType === 'base26' ||
+ digestType === 'base32' ||
+ digestType === 'base36' ||
+ digestType === 'base49' ||
+ digestType === 'base52' ||
+ digestType === 'base58' ||
+ digestType === 'base62' ||
+ digestType === 'base64'
+ ) {
+ return encodeBufferToBase(hash.digest(), digestType.substr(4)).substr(
+ 0,
+ maxLength
+ );
+ } else {
+ return hash.digest(digestType || 'hex').substr(0, maxLength);
+ }
+}
+
+module.exports = getHashDigest;
diff --git a/node_modules/loader-utils/lib/getOptions.js b/node_modules/loader-utils/lib/getOptions.js
new file mode 100644
index 0000000..9cbbed4
--- /dev/null
+++ b/node_modules/loader-utils/lib/getOptions.js
@@ -0,0 +1,20 @@
+'use strict';
+
+const parseQuery = require('./parseQuery');
+
+function getOptions(loaderContext) {
+ const query = loaderContext.query;
+
+ if (typeof query === 'string' && query !== '') {
+ return parseQuery(loaderContext.query);
+ }
+
+ if (!query || typeof query !== 'object') {
+ // Not object-like queries are not supported.
+ return null;
+ }
+
+ return query;
+}
+
+module.exports = getOptions;
diff --git a/node_modules/loader-utils/lib/getRemainingRequest.js b/node_modules/loader-utils/lib/getRemainingRequest.js
new file mode 100644
index 0000000..5839b2f
--- /dev/null
+++ b/node_modules/loader-utils/lib/getRemainingRequest.js
@@ -0,0 +1,16 @@
+'use strict';
+
+function getRemainingRequest(loaderContext) {
+ if (loaderContext.remainingRequest) {
+ return loaderContext.remainingRequest;
+ }
+
+ const request = loaderContext.loaders
+ .slice(loaderContext.loaderIndex + 1)
+ .map((obj) => obj.request)
+ .concat([loaderContext.resource]);
+
+ return request.join('!');
+}
+
+module.exports = getRemainingRequest;
diff --git a/node_modules/loader-utils/lib/index.js b/node_modules/loader-utils/lib/index.js
new file mode 100644
index 0000000..2591310
--- /dev/null
+++ b/node_modules/loader-utils/lib/index.js
@@ -0,0 +1,23 @@
+'use strict';
+
+const getOptions = require('./getOptions');
+const parseQuery = require('./parseQuery');
+const stringifyRequest = require('./stringifyRequest');
+const getRemainingRequest = require('./getRemainingRequest');
+const getCurrentRequest = require('./getCurrentRequest');
+const isUrlRequest = require('./isUrlRequest');
+const urlToRequest = require('./urlToRequest');
+const parseString = require('./parseString');
+const getHashDigest = require('./getHashDigest');
+const interpolateName = require('./interpolateName');
+
+exports.getOptions = getOptions;
+exports.parseQuery = parseQuery;
+exports.stringifyRequest = stringifyRequest;
+exports.getRemainingRequest = getRemainingRequest;
+exports.getCurrentRequest = getCurrentRequest;
+exports.isUrlRequest = isUrlRequest;
+exports.urlToRequest = urlToRequest;
+exports.parseString = parseString;
+exports.getHashDigest = getHashDigest;
+exports.interpolateName = interpolateName;
diff --git a/node_modules/loader-utils/lib/interpolateName.js b/node_modules/loader-utils/lib/interpolateName.js
new file mode 100644
index 0000000..6a13a36
--- /dev/null
+++ b/node_modules/loader-utils/lib/interpolateName.js
@@ -0,0 +1,151 @@
+'use strict';
+
+const path = require('path');
+const emojisList = require('emojis-list');
+const getHashDigest = require('./getHashDigest');
+
+const emojiRegex = /[\uD800-\uDFFF]./;
+const emojiList = emojisList.filter((emoji) => emojiRegex.test(emoji));
+const emojiCache = {};
+
+function encodeStringToEmoji(content, length) {
+ if (emojiCache[content]) {
+ return emojiCache[content];
+ }
+
+ length = length || 1;
+
+ const emojis = [];
+
+ do {
+ if (!emojiList.length) {
+ throw new Error('Ran out of emoji');
+ }
+
+ const index = Math.floor(Math.random() * emojiList.length);
+
+ emojis.push(emojiList[index]);
+ emojiList.splice(index, 1);
+ } while (--length > 0);
+
+ const emojiEncoding = emojis.join('');
+
+ emojiCache[content] = emojiEncoding;
+
+ return emojiEncoding;
+}
+
+function interpolateName(loaderContext, name, options) {
+ let filename;
+
+ const hasQuery =
+ loaderContext.resourceQuery && loaderContext.resourceQuery.length > 1;
+
+ if (typeof name === 'function') {
+ filename = name(
+ loaderContext.resourcePath,
+ hasQuery ? loaderContext.resourceQuery : undefined
+ );
+ } else {
+ filename = name || '[hash].[ext]';
+ }
+
+ const context = options.context;
+ const content = options.content;
+ const regExp = options.regExp;
+
+ let ext = 'bin';
+ let basename = 'file';
+ let directory = '';
+ let folder = '';
+ let query = '';
+
+ if (loaderContext.resourcePath) {
+ const parsed = path.parse(loaderContext.resourcePath);
+ let resourcePath = loaderContext.resourcePath;
+
+ if (parsed.ext) {
+ ext = parsed.ext.substr(1);
+ }
+
+ if (parsed.dir) {
+ basename = parsed.name;
+ resourcePath = parsed.dir + path.sep;
+ }
+
+ if (typeof context !== 'undefined') {
+ directory = path
+ .relative(context, resourcePath + '_')
+ .replace(/\\/g, '/')
+ .replace(/\.\.(\/)?/g, '_$1');
+ directory = directory.substr(0, directory.length - 1);
+ } else {
+ directory = resourcePath.replace(/\\/g, '/').replace(/\.\.(\/)?/g, '_$1');
+ }
+
+ if (directory.length === 1) {
+ directory = '';
+ } else if (directory.length > 1) {
+ folder = path.basename(directory);
+ }
+ }
+
+ if (loaderContext.resourceQuery && loaderContext.resourceQuery.length > 1) {
+ query = loaderContext.resourceQuery;
+
+ const hashIdx = query.indexOf('#');
+
+ if (hashIdx >= 0) {
+ query = query.substr(0, hashIdx);
+ }
+ }
+
+ let url = filename;
+
+ if (content) {
+ // Match hash template
+ url = url
+ // `hash` and `contenthash` are same in `loader-utils` context
+ // let's keep `hash` for backward compatibility
+ .replace(
+ /\[(?:([^:\]]+):)?(?:hash|contenthash)(?::([a-z]+\d*))?(?::(\d+))?\]/gi,
+ (all, hashType, digestType, maxLength) =>
+ getHashDigest(content, hashType, digestType, parseInt(maxLength, 10))
+ )
+ .replace(/\[emoji(?::(\d+))?\]/gi, (all, length) =>
+ encodeStringToEmoji(content, parseInt(length, 10))
+ );
+ }
+
+ url = url
+ .replace(/\[ext\]/gi, () => ext)
+ .replace(/\[name\]/gi, () => basename)
+ .replace(/\[path\]/gi, () => directory)
+ .replace(/\[folder\]/gi, () => folder)
+ .replace(/\[query\]/gi, () => query);
+
+ if (regExp && loaderContext.resourcePath) {
+ const match = loaderContext.resourcePath.match(new RegExp(regExp));
+
+ match &&
+ match.forEach((matched, i) => {
+ url = url.replace(new RegExp('\\[' + i + '\\]', 'ig'), matched);
+ });
+ }
+
+ if (
+ typeof loaderContext.options === 'object' &&
+ typeof loaderContext.options.customInterpolateName === 'function'
+ ) {
+ url = loaderContext.options.customInterpolateName.call(
+ loaderContext,
+ url,
+ name,
+ options
+ );
+ }
+
+ return url;
+}
+
+module.exports = interpolateName;
diff --git a/node_modules/loader-utils/lib/isUrlRequest.js b/node_modules/loader-utils/lib/isUrlRequest.js
new file mode 100644
index 0000000..4592cb1
--- /dev/null
+++ b/node_modules/loader-utils/lib/isUrlRequest.js
@@ -0,0 +1,31 @@
+'use strict';
+
+const path = require('path');
+
+function isUrlRequest(url, root) {
+ // An URL is not an request if
+
+ // 1. It's an absolute url and it is not `windows` path like `C:\dir\file`
+ if (/^[a-z][a-z0-9+.-]*:/i.test(url) && !path.win32.isAbsolute(url)) {
+ return false;
+ }
+
+ // 2. It's a protocol-relative
+ if (/^\/\//.test(url)) {
+ return false;
+ }
+
+ // 3. It's some kind of url for a template
+ if (/^[{}[\]#*;,'§$%&(=?`´^°<>]/.test(url)) {
+ return false;
+ }
+
+ // 4. It's also not an request if root isn't set and it's a root-relative url
+ if ((root === undefined || root === false) && /^\//.test(url)) {
+ return false;
+ }
+
+ return true;
+}
+
+module.exports = isUrlRequest;
diff --git a/node_modules/loader-utils/lib/parseQuery.js b/node_modules/loader-utils/lib/parseQuery.js
new file mode 100644
index 0000000..12b3efc
--- /dev/null
+++ b/node_modules/loader-utils/lib/parseQuery.js
@@ -0,0 +1,68 @@
+'use strict';
+
+const JSON5 = require('json5');
+
+const specialValues = {
+ null: null,
+ true: true,
+ false: false,
+};
+
+function parseQuery(query) {
+ if (query.substr(0, 1) !== '?') {
+ throw new Error(
+ "A valid query string passed to parseQuery should begin with '?'"
+ );
+ }
+
+ query = query.substr(1);
+
+ if (!query) {
+ return {};
+ }
+
+ if (query.substr(0, 1) === '{' && query.substr(-1) === '}') {
+ return JSON5.parse(query);
+ }
+
+ const queryArgs = query.split(/[,&]/g);
+ const result = {};
+
+ queryArgs.forEach((arg) => {
+ const idx = arg.indexOf('=');
+
+ if (idx >= 0) {
+ let name = arg.substr(0, idx);
+ let value = decodeURIComponent(arg.substr(idx + 1));
+
+ if (specialValues.hasOwnProperty(value)) {
+ value = specialValues[value];
+ }
+
+ if (name.substr(-2) === '[]') {
+ name = decodeURIComponent(name.substr(0, name.length - 2));
+
+ if (!Array.isArray(result[name])) {
+ result[name] = [];
+ }
+
+ result[name].push(value);
+ } else {
+ name = decodeURIComponent(name);
+ result[name] = value;
+ }
+ } else {
+ if (arg.substr(0, 1) === '-') {
+ result[decodeURIComponent(arg.substr(1))] = false;
+ } else if (arg.substr(0, 1) === '+') {
+ result[decodeURIComponent(arg.substr(1))] = true;
+ } else {
+ result[decodeURIComponent(arg)] = true;
+ }
+ }
+ });
+
+ return result;
+}
+
+module.exports = parseQuery;
diff --git a/node_modules/loader-utils/lib/parseString.js b/node_modules/loader-utils/lib/parseString.js
new file mode 100644
index 0000000..6e36f29
--- /dev/null
+++ b/node_modules/loader-utils/lib/parseString.js
@@ -0,0 +1,23 @@
+'use strict';
+
+function parseString(str) {
+ try {
+ if (str[0] === '"') {
+ return JSON.parse(str);
+ }
+
+ if (str[0] === "'" && str.substr(str.length - 1) === "'") {
+ return parseString(
+ str
+ .replace(/\\.|"/g, (x) => (x === '"' ? '\\"' : x))
+ .replace(/^'|'$/g, '"')
+ );
+ }
+
+ return JSON.parse('"' + str + '"');
+ } catch (e) {
+ return str;
+ }
+}
+
+module.exports = parseString;
diff --git a/node_modules/loader-utils/lib/stringifyRequest.js b/node_modules/loader-utils/lib/stringifyRequest.js
new file mode 100644
index 0000000..9bd5593
--- /dev/null
+++ b/node_modules/loader-utils/lib/stringifyRequest.js
@@ -0,0 +1,51 @@
+'use strict';
+
+const path = require('path');
+
+const matchRelativePath = /^\.\.?[/\\]/;
+
+function isAbsolutePath(str) {
+ return path.posix.isAbsolute(str) || path.win32.isAbsolute(str);
+}
+
+function isRelativePath(str) {
+ return matchRelativePath.test(str);
+}
+
+function stringifyRequest(loaderContext, request) {
+ const splitted = request.split('!');
+ const context =
+ loaderContext.context ||
+ (loaderContext.options && loaderContext.options.context);
+
+ return JSON.stringify(
+ splitted
+ .map((part) => {
+ // First, separate singlePath from query, because the query might contain paths again
+ const splittedPart = part.match(/^(.*?)(\?.*)/);
+ const query = splittedPart ? splittedPart[2] : '';
+ let singlePath = splittedPart ? splittedPart[1] : part;
+
+ if (isAbsolutePath(singlePath) && context) {
+ singlePath = path.relative(context, singlePath);
+
+ if (isAbsolutePath(singlePath)) {
+ // If singlePath still matches an absolute path, singlePath was on a different drive than context.
+ // In this case, we leave the path platform-specific without replacing any separators.
+ // @see https://github.com/webpack/loader-utils/pull/14
+ return singlePath + query;
+ }
+
+ if (isRelativePath(singlePath) === false) {
+ // Ensure that the relative path starts at least with ./ otherwise it would be a request into the modules directory (like node_modules).
+ singlePath = './' + singlePath;
+ }
+ }
+
+ return singlePath.replace(/\\/g, '/') + query;
+ })
+ .join('!')
+ );
+}
+
+module.exports = stringifyRequest;
diff --git a/node_modules/loader-utils/lib/urlToRequest.js b/node_modules/loader-utils/lib/urlToRequest.js
new file mode 100644
index 0000000..e2b60d3
--- /dev/null
+++ b/node_modules/loader-utils/lib/urlToRequest.js
@@ -0,0 +1,60 @@
+'use strict';
+
+// we can't use path.win32.isAbsolute because it also matches paths starting with a forward slash
+const matchNativeWin32Path = /^[A-Z]:[/\\]|^\\\\/i;
+
+function urlToRequest(url, root) {
+ // Do not rewrite an empty url
+ if (url === '') {
+ return '';
+ }
+
+ const moduleRequestRegex = /^[^?]*~/;
+ let request;
+
+ if (matchNativeWin32Path.test(url)) {
+ // absolute windows path, keep it
+ request = url;
+ } else if (root !== undefined && root !== false && /^\//.test(url)) {
+ // if root is set and the url is root-relative
+ switch (typeof root) {
+ // 1. root is a string: root is prefixed to the url
+ case 'string':
+ // special case: `~` roots convert to module request
+ if (moduleRequestRegex.test(root)) {
+ request = root.replace(/([^~/])$/, '$1/') + url.slice(1);
+ } else {
+ request = root + url;
+ }
+ break;
+ // 2. root is `true`: absolute paths are allowed
+ // *nix only, windows-style absolute paths are always allowed as they doesn't start with a `/`
+ case 'boolean':
+ request = url;
+ break;
+ default:
+ throw new Error(
+ "Unexpected parameters to loader-utils 'urlToRequest': url = " +
+ url +
+ ', root = ' +
+ root +
+ '.'
+ );
+ }
+ } else if (/^\.\.?\//.test(url)) {
+ // A relative url stays
+ request = url;
+ } else {
+ // every other url is threaded like a relative url
+ request = './' + url;
+ }
+
+ // A `~` makes the url an module
+ if (moduleRequestRegex.test(request)) {
+ request = request.replace(moduleRequestRegex, '');
+ }
+
+ return request;
+}
+
+module.exports = urlToRequest;