1 |
|
2 |
|
3 |
|
4 |
|
5 | var ModuleFilenameHelpers = exports;
|
6 |
|
7 | ModuleFilenameHelpers.ALL_LOADERS_RESOURCE = "[all-loaders][resource]";
|
8 | ModuleFilenameHelpers.REGEXP_ALL_LOADERS_RESOURCE = /\[all-?loaders\]\[resource\]/gi;
|
9 | ModuleFilenameHelpers.LOADERS_RESOURCE = "[loaders][resource]";
|
10 | ModuleFilenameHelpers.REGEXP_LOADERS_RESOURCE = /\[loaders\]\[resource\]/gi;
|
11 | ModuleFilenameHelpers.RESOURCE = "[resource]";
|
12 | ModuleFilenameHelpers.REGEXP_RESOURCE = /\[resource\]/gi;
|
13 | ModuleFilenameHelpers.ABSOLUTE_RESOURCE_PATH = "[absolute-resource-path]";
|
14 | ModuleFilenameHelpers.REGEXP_ABSOLUTE_RESOURCE_PATH = /\[abs(olute)?-?resource-?path\]/gi;
|
15 | ModuleFilenameHelpers.RESOURCE_PATH = "[resource-path]";
|
16 | ModuleFilenameHelpers.REGEXP_RESOURCE_PATH = /\[resource-?path\]/gi;
|
17 | ModuleFilenameHelpers.ALL_LOADERS = "[all-loaders]";
|
18 | ModuleFilenameHelpers.REGEXP_ALL_LOADERS = /\[all-?loaders\]/gi;
|
19 | ModuleFilenameHelpers.LOADERS = "[loaders]";
|
20 | ModuleFilenameHelpers.REGEXP_LOADERS = /\[loaders\]/gi;
|
21 | ModuleFilenameHelpers.QUERY = "[query]";
|
22 | ModuleFilenameHelpers.REGEXP_QUERY = /\[query\]/gi;
|
23 | ModuleFilenameHelpers.ID = "[id]";
|
24 | ModuleFilenameHelpers.REGEXP_ID = /\[id\]/gi;
|
25 | ModuleFilenameHelpers.HASH = "[hash]";
|
26 | ModuleFilenameHelpers.REGEXP_HASH = /\[hash\]/gi;
|
27 |
|
28 | function getAfter(str, token) {
|
29 | var idx = str.indexOf(token);
|
30 | return idx < 0 ? "" : str.substr(idx);
|
31 | }
|
32 |
|
33 | function getBefore(str, token) {
|
34 | var idx = str.lastIndexOf(token);
|
35 | return idx < 0 ? "" : str.substr(0, idx);
|
36 | }
|
37 |
|
38 | function getHash(str) {
|
39 | var hash = require("crypto").createHash("md5");
|
40 | hash.update(str);
|
41 | return hash.digest("hex").substr(0, 4);
|
42 | }
|
43 |
|
44 | function asRegExp(test) {
|
45 | if(typeof test === "string") test = new RegExp("^" + test.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"));
|
46 | return test;
|
47 | }
|
48 |
|
49 | ModuleFilenameHelpers.createFilename = function createFilename(module, moduleFilenameTemplate, requestShortener) {
|
50 | if(!module) module = "";
|
51 | if(typeof module === "string") {
|
52 | var shortIdentifier = requestShortener.shorten(module);
|
53 | var identifier = shortIdentifier;
|
54 | var moduleId = "";
|
55 | var absoluteResourcePath = module.split("!").pop();
|
56 | var hash = getHash(identifier);
|
57 | } else {
|
58 | var shortIdentifier = module.readableIdentifier(requestShortener);
|
59 | var identifier = requestShortener.shorten(module.identifier());
|
60 | var moduleId = module.id;
|
61 | var absoluteResourcePath = module.resourcePath || module.identifier().split("!").pop();
|
62 | var hash = getHash(identifier);
|
63 | }
|
64 | var resource = shortIdentifier.split("!").pop();
|
65 | var loaders = getBefore(shortIdentifier, "!");
|
66 | var allLoaders = getBefore(identifier, "!");
|
67 | var query = getAfter(resource, "?");
|
68 | var resourcePath = resource.substr(0, resource.length - query.length);
|
69 | if(typeof moduleFilenameTemplate === "function") {
|
70 | return moduleFilenameTemplate({
|
71 | identifier: identifier,
|
72 | shortIdentifier: shortIdentifier,
|
73 | resource: resource,
|
74 | resourcePath: resourcePath,
|
75 | absoluteResourcePath: absoluteResourcePath,
|
76 | allLoaders: allLoaders,
|
77 | query: query,
|
78 | moduleId: moduleId,
|
79 | hash: hash
|
80 | });
|
81 | }
|
82 | return moduleFilenameTemplate
|
83 | .replace(ModuleFilenameHelpers.REGEXP_ALL_LOADERS_RESOURCE, identifier)
|
84 | .replace(ModuleFilenameHelpers.REGEXP_LOADERS_RESOURCE, shortIdentifier)
|
85 | .replace(ModuleFilenameHelpers.REGEXP_RESOURCE, resource)
|
86 | .replace(ModuleFilenameHelpers.REGEXP_RESOURCE_PATH, resourcePath)
|
87 | .replace(ModuleFilenameHelpers.REGEXP_ABSOLUTE_RESOURCE_PATH, absoluteResourcePath)
|
88 | .replace(ModuleFilenameHelpers.REGEXP_ALL_LOADERS, allLoaders)
|
89 | .replace(ModuleFilenameHelpers.REGEXP_LOADERS, loaders)
|
90 | .replace(ModuleFilenameHelpers.REGEXP_QUERY, query)
|
91 | .replace(ModuleFilenameHelpers.REGEXP_ID, moduleId)
|
92 | .replace(ModuleFilenameHelpers.REGEXP_HASH, hash);
|
93 | };
|
94 |
|
95 | ModuleFilenameHelpers.createFooter = function createFooter(module, requestShortener) {
|
96 | if(!module) module = "";
|
97 | if(typeof module === "string") {
|
98 | return [
|
99 | "/** WEBPACK FOOTER **",
|
100 | " ** " + requestShortener.shorten(module),
|
101 | " **/"
|
102 | ].join("\n");
|
103 | } else {
|
104 | return [
|
105 | "/*****************",
|
106 | " ** WEBPACK FOOTER",
|
107 | " ** " + module.readableIdentifier(requestShortener),
|
108 | " ** module id = " + module.id,
|
109 | " ** module chunks = " + module.chunks.map(function(c) {
|
110 | return c.id;
|
111 | }).join(" "),
|
112 | " **/"
|
113 | ].join("\n");
|
114 | }
|
115 | };
|
116 |
|
117 | ModuleFilenameHelpers.replaceDuplicates = function replaceDuplicates(array, fn, comparator) {
|
118 | var countMap = {};
|
119 | var posMap = {};
|
120 | array.forEach(function(item, idx) {
|
121 | countMap[item] = (countMap[item] || []);
|
122 | countMap[item].push(idx);
|
123 | posMap[item] = 0;
|
124 | });
|
125 | if(comparator) {
|
126 | Object.keys(countMap).forEach(function(item) {
|
127 | countMap[item].sort(comparator);
|
128 | });
|
129 | }
|
130 | return array.map(function(item, i) {
|
131 | if(countMap[item].length > 1) {
|
132 | if(comparator && countMap[item][0] === i)
|
133 | return item;
|
134 | return fn(item, i, posMap[item]++);
|
135 | } else return item;
|
136 | });
|
137 | };
|
138 |
|
139 | ModuleFilenameHelpers.matchPart = function matchPart(str, test) {
|
140 | if(!test) return true;
|
141 | test = asRegExp(test);
|
142 | if(Array.isArray(test)) {
|
143 | return test.map(asRegExp).filter(function(regExp) {
|
144 | return regExp.test(str);
|
145 | }).length > 0;
|
146 | } else {
|
147 | return test.test(str);
|
148 | }
|
149 | };
|
150 |
|
151 | ModuleFilenameHelpers.matchObject = function matchObject(obj, str) {
|
152 | if(obj.test)
|
153 | if(!ModuleFilenameHelpers.matchPart(str, obj.test)) return false;
|
154 | if(obj.include)
|
155 | if(!ModuleFilenameHelpers.matchPart(str, obj.include)) return false;
|
156 | if(obj.exclude)
|
157 | if(ModuleFilenameHelpers.matchPart(str, obj.exclude)) return false;
|
158 | return true;
|
159 | };
|