1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.errorFactory = errorFactory;
|
7 | exports.getLessImplementation = getLessImplementation;
|
8 | exports.getLessOptions = getLessOptions;
|
9 | exports.isUnsupportedUrl = isUnsupportedUrl;
|
10 | exports.normalizeSourceMap = normalizeSourceMap;
|
11 | var _path = _interopRequireDefault(require("path"));
|
12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13 |
|
14 | const trailingSlash = /[/\\]$/;
|
15 |
|
16 |
|
17 |
|
18 |
|
19 | const IS_SPECIAL_MODULE_IMPORT = /^~[^/]+$/;
|
20 |
|
21 |
|
22 | const IS_NATIVE_WIN32_PATH = /^[a-z]:[/\\]|^\\\\/i;
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 | const IS_MODULE_IMPORT = /^~([^/]+|[^/]+\/|@[^/]+[/][^/]+|@[^/]+\/?|@[^/]+[/][^/]+\/)$/;
|
32 | const MODULE_REQUEST_REGEX = /^[^?]*~/;
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 | function createWebpackLessPlugin(loaderContext, implementation) {
|
42 | const resolve = loaderContext.getResolve({
|
43 | dependencyType: "less",
|
44 | conditionNames: ["less", "style", "..."],
|
45 | mainFields: ["less", "style", "main", "..."],
|
46 | mainFiles: ["index", "..."],
|
47 | extensions: [".less", ".css"],
|
48 | preferRelative: true
|
49 | });
|
50 | class WebpackFileManager extends implementation.FileManager {
|
51 | supports(filename) {
|
52 | if (filename[0] === "/" || IS_NATIVE_WIN32_PATH.test(filename)) {
|
53 | return true;
|
54 | }
|
55 | if (this.isPathAbsolute(filename)) {
|
56 | return false;
|
57 | }
|
58 | return true;
|
59 | }
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 | supportsSync() {
|
67 | return false;
|
68 | }
|
69 | async resolveFilename(filename, currentDirectory) {
|
70 |
|
71 | const context = currentDirectory.replace(trailingSlash, "");
|
72 | let request = filename;
|
73 |
|
74 |
|
75 | if (MODULE_REQUEST_REGEX.test(filename)) {
|
76 | request = request.replace(MODULE_REQUEST_REGEX, "");
|
77 | }
|
78 | if (IS_MODULE_IMPORT.test(filename)) {
|
79 | request = request[request.length - 1] === "/" ? request : `${request}/`;
|
80 | }
|
81 | return this.resolveRequests(context, [...new Set([request, filename])]);
|
82 | }
|
83 | async resolveRequests(context, possibleRequests) {
|
84 | if (possibleRequests.length === 0) {
|
85 | return Promise.reject();
|
86 | }
|
87 | let result;
|
88 | try {
|
89 | result = await resolve(context, possibleRequests[0]);
|
90 | } catch (error) {
|
91 | const [, ...tailPossibleRequests] = possibleRequests;
|
92 | if (tailPossibleRequests.length === 0) {
|
93 | throw error;
|
94 | }
|
95 | result = await this.resolveRequests(context, tailPossibleRequests);
|
96 | }
|
97 | return result;
|
98 | }
|
99 | async loadFile(filename, ...args) {
|
100 | let result;
|
101 | try {
|
102 | if (IS_SPECIAL_MODULE_IMPORT.test(filename)) {
|
103 | const error = new Error();
|
104 | error.type = "Next";
|
105 | throw error;
|
106 | }
|
107 | result = await super.loadFile(filename, ...args);
|
108 | } catch (error) {
|
109 | if (error.type !== "File" && error.type !== "Next") {
|
110 | return Promise.reject(error);
|
111 | }
|
112 | try {
|
113 | result = await this.resolveFilename(filename, ...args);
|
114 | } catch (webpackResolveError) {
|
115 | error.message = `Less resolver error:\n${error.message}\n\n` + `Webpack resolver error details:\n${webpackResolveError.details}\n\n` + `Webpack resolver error missing:\n${webpackResolveError.missing}\n\n`;
|
116 | return Promise.reject(error);
|
117 | }
|
118 | loaderContext.addDependency(result);
|
119 | return super.loadFile(result, ...args);
|
120 | }
|
121 | const absoluteFilename = _path.default.isAbsolute(result.filename) ? result.filename : _path.default.resolve(".", result.filename);
|
122 | loaderContext.addDependency(_path.default.normalize(absoluteFilename));
|
123 | return result;
|
124 | }
|
125 | }
|
126 | return {
|
127 | install(lessInstance, pluginManager) {
|
128 | pluginManager.addFileManager(new WebpackFileManager());
|
129 | },
|
130 | minVersion: [3, 0, 0]
|
131 | };
|
132 | }
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 | function getLessOptions(loaderContext, loaderOptions, implementation) {
|
143 | const options = typeof loaderOptions.lessOptions === "function" ? loaderOptions.lessOptions(loaderContext) || {} : loaderOptions.lessOptions || {};
|
144 | const lessOptions = {
|
145 | plugins: [],
|
146 | relativeUrls: true,
|
147 |
|
148 | filename: loaderContext.resourcePath,
|
149 | ...options
|
150 | };
|
151 | const plugins = lessOptions.plugins.slice();
|
152 | const shouldUseWebpackImporter = typeof loaderOptions.webpackImporter === "boolean" ? loaderOptions.webpackImporter : true;
|
153 | if (shouldUseWebpackImporter) {
|
154 | plugins.unshift(createWebpackLessPlugin(loaderContext, implementation));
|
155 | }
|
156 | plugins.unshift({
|
157 | install(lessProcessor, pluginManager) {
|
158 |
|
159 | pluginManager.webpackLoaderContext = loaderContext;
|
160 | lessOptions.pluginManager = pluginManager;
|
161 | }
|
162 | });
|
163 | lessOptions.plugins = plugins;
|
164 | return lessOptions;
|
165 | }
|
166 | function isUnsupportedUrl(url) {
|
167 |
|
168 | if (IS_NATIVE_WIN32_PATH.test(url)) {
|
169 | return false;
|
170 | }
|
171 |
|
172 |
|
173 |
|
174 | return /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(url);
|
175 | }
|
176 | function normalizeSourceMap(map) {
|
177 | const newMap = map;
|
178 |
|
179 |
|
180 |
|
181 |
|
182 | delete newMap.file;
|
183 |
|
184 |
|
185 | newMap.sourceRoot = "";
|
186 |
|
187 |
|
188 |
|
189 | newMap.sources = newMap.sources.map(source => _path.default.normalize(source));
|
190 | return newMap;
|
191 | }
|
192 | function getLessImplementation(loaderContext, implementation) {
|
193 | let resolvedImplementation = implementation;
|
194 | if (!implementation || typeof implementation === "string") {
|
195 | const lessImplPkg = implementation || "less";
|
196 |
|
197 |
|
198 | resolvedImplementation = require(lessImplPkg);
|
199 | }
|
200 |
|
201 |
|
202 | return resolvedImplementation;
|
203 | }
|
204 | function getFileExcerptIfPossible(error) {
|
205 | if (typeof error.extract === "undefined") {
|
206 | return [];
|
207 | }
|
208 | const excerpt = error.extract.slice(0, 2);
|
209 | const column = Math.max(error.column - 1, 0);
|
210 | if (typeof excerpt[0] === "undefined") {
|
211 | excerpt.shift();
|
212 | }
|
213 | excerpt.push(`${new Array(column).join(" ")}^`);
|
214 | return excerpt;
|
215 | }
|
216 | function errorFactory(error) {
|
217 | const message = ["\n", ...getFileExcerptIfPossible(error), error.message.charAt(0).toUpperCase() + error.message.slice(1), error.filename ? ` Error in ${_path.default.normalize(error.filename)} (line ${error.line}, column ${error.column})` : ""].join("\n");
|
218 | const obj = new Error(message, {
|
219 | cause: error
|
220 | });
|
221 | obj.stack = null;
|
222 | return obj;
|
223 | } |
\ | No newline at end of file |