aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/Template.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/webpack/lib/Template.js
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
node_modules
Diffstat (limited to 'node_modules/webpack/lib/Template.js')
-rw-r--r--node_modules/webpack/lib/Template.js161
1 files changed, 161 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/Template.js b/node_modules/webpack/lib/Template.js
new file mode 100644
index 000000000..74f42b8fb
--- /dev/null
+++ b/node_modules/webpack/lib/Template.js
@@ -0,0 +1,161 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Tapable = require("tapable");
+const ConcatSource = require("webpack-sources").ConcatSource;
+
+const START_LOWERCASE_ALPHABET_CODE = "a".charCodeAt(0);
+const START_UPPERCASE_ALPHABET_CODE = "A".charCodeAt(0);
+const DELTA_A_TO_Z = "z".charCodeAt(0) - START_LOWERCASE_ALPHABET_CODE + 1;
+
+module.exports = class Template extends Tapable {
+ constructor(outputOptions) {
+ super();
+ this.outputOptions = outputOptions || {};
+ }
+
+ static getFunctionContent(fn) {
+ return fn.toString().replace(/^function\s?\(\)\s?\{\n?|\n?\}$/g, "").replace(/^\t/mg, "");
+ }
+
+ static toIdentifier(str) {
+ if(typeof str !== "string") return "";
+ return str.replace(/^[^a-zA-Z$_]/, "_").replace(/[^a-zA-Z0-9$_]/g, "_");
+ }
+
+ // map number to a single character a-z, A-Z or <_ + number> if number is too big
+ static numberToIdentifer(n) {
+ // lower case
+ if(n < DELTA_A_TO_Z) return String.fromCharCode(START_LOWERCASE_ALPHABET_CODE + n);
+
+ // upper case
+ n -= DELTA_A_TO_Z;
+ if(n < DELTA_A_TO_Z) return String.fromCharCode(START_UPPERCASE_ALPHABET_CODE + n);
+
+ // fall back to _ + number
+ n -= DELTA_A_TO_Z;
+ return "_" + n;
+ }
+
+ indent(str) {
+ if(Array.isArray(str)) {
+ return str.map(this.indent.bind(this)).join("\n");
+ } else {
+ str = str.trimRight();
+ if(!str) return "";
+ var ind = (str[0] === "\n" ? "" : "\t");
+ return ind + str.replace(/\n([^\n])/g, "\n\t$1");
+ }
+ }
+
+ prefix(str, prefix) {
+ if(Array.isArray(str)) {
+ str = str.join("\n");
+ }
+ str = str.trim();
+ if(!str) return "";
+ const ind = (str[0] === "\n" ? "" : prefix);
+ return ind + str.replace(/\n([^\n])/g, "\n" + prefix + "$1");
+ }
+
+ asString(str) {
+ if(Array.isArray(str)) {
+ return str.join("\n");
+ }
+ return str;
+ }
+
+ getModulesArrayBounds(modules) {
+ if(!modules.every(moduleIdIsNumber))
+ return false;
+ var maxId = -Infinity;
+ var minId = Infinity;
+ modules.forEach(function(module) {
+ if(maxId < module.id) maxId = module.id;
+ if(minId > module.id) minId = module.id;
+ });
+ if(minId < 16 + ("" + minId).length) {
+ // add minId x ',' instead of 'Array(minId).concat(...)'
+ minId = 0;
+ }
+ var objectOverhead = modules.map(function(module) {
+ var idLength = (module.id + "").length;
+ return idLength + 2;
+ }).reduce(function(a, b) {
+ return a + b;
+ }, -1);
+ var arrayOverhead = minId === 0 ? maxId : 16 + ("" + minId).length + maxId;
+ return arrayOverhead < objectOverhead ? [minId, maxId] : false;
+ }
+
+ renderChunkModules(chunk, moduleTemplate, dependencyTemplates, prefix) {
+ if(!prefix) prefix = "";
+ var source = new ConcatSource();
+ if(chunk.modules.length === 0) {
+ source.add("[]");
+ return source;
+ }
+ var removedModules = chunk.removedModules;
+ var allModules = chunk.modules.map(function(module) {
+ return {
+ id: module.id,
+ source: moduleTemplate.render(module, dependencyTemplates, chunk)
+ };
+ });
+ if(removedModules && removedModules.length > 0) {
+ removedModules.forEach(function(id) {
+ allModules.push({
+ id: id,
+ source: "false"
+ });
+ });
+ }
+ var bounds = this.getModulesArrayBounds(chunk.modules);
+
+ if(bounds) {
+ // Render a spare array
+ var minId = bounds[0];
+ var maxId = bounds[1];
+ if(minId !== 0) source.add("Array(" + minId + ").concat(");
+ source.add("[\n");
+ var modules = {};
+ allModules.forEach(function(module) {
+ modules[module.id] = module;
+ });
+ for(var idx = minId; idx <= maxId; idx++) {
+ var module = modules[idx];
+ if(idx !== minId) source.add(",\n");
+ source.add("/* " + idx + " */");
+ if(module) {
+ source.add("\n");
+ source.add(module.source);
+ }
+ }
+ source.add("\n" + prefix + "]");
+ if(minId !== 0) source.add(")");
+ } else {
+ // Render an object
+ source.add("{\n");
+ allModules.sort(function(a, b) {
+ var aId = a.id + "";
+ var bId = b.id + "";
+ if(aId < bId) return -1;
+ if(aId > bId) return 1;
+ return 0;
+ }).forEach(function(module, idx) {
+ if(idx !== 0) source.add(",\n");
+ source.add("\n/***/ " + JSON.stringify(module.id) + ":\n");
+ source.add(module.source);
+ });
+ source.add("\n\n" + prefix + "}");
+ }
+ return source;
+ }
+};
+
+function moduleIdIsNumber(module) {
+ return typeof module.id === "number";
+}