1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.default = stylusLoader;
|
7 |
|
8 | var _path = _interopRequireDefault(require("path"));
|
9 |
|
10 | var _options = _interopRequireDefault(require("./options.json"));
|
11 |
|
12 | var _utils = require("./utils");
|
13 |
|
14 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
15 |
|
16 | async function stylusLoader(source) {
|
17 | const options = this.getOptions(_options.default);
|
18 | const callback = this.async();
|
19 | const implementation = (0, _utils.getStylusImplementation)(this, options.implementation);
|
20 |
|
21 | if (!implementation) {
|
22 | callback();
|
23 | return;
|
24 | }
|
25 |
|
26 | let data = source;
|
27 |
|
28 | if (typeof options.additionalData !== "undefined") {
|
29 | data = typeof options.additionalData === "function" ? await options.additionalData(data, this) : `${options.additionalData}\n${data}`;
|
30 | }
|
31 |
|
32 | const stylusOptions = (0, _utils.getStylusOptions)(this, options);
|
33 | const styl = implementation(data, stylusOptions);
|
34 |
|
35 | if (stylusOptions.includeCSS) {
|
36 | styl.set("include css", true);
|
37 | }
|
38 |
|
39 | if (stylusOptions.hoistAtrules) {
|
40 | styl.set("hoist atrules", true);
|
41 | }
|
42 |
|
43 | if (stylusOptions.lineNumbers) {
|
44 | styl.set("linenos", true);
|
45 | }
|
46 |
|
47 | if (stylusOptions.disableCache) {
|
48 | styl.set("cache", false);
|
49 | }
|
50 |
|
51 | const useSourceMap = typeof options.sourceMap === "boolean" ? options.sourceMap : this.sourceMap;
|
52 |
|
53 | if (stylusOptions.sourcemap || useSourceMap) {
|
54 | styl.set("sourcemap", useSourceMap ? {
|
55 | comment: false,
|
56 | sourceRoot: stylusOptions.dest,
|
57 | basePath: this.rootContext
|
58 | } : stylusOptions.sourcemap);
|
59 | }
|
60 |
|
61 | if (typeof stylusOptions.use !== "undefined" && stylusOptions.use.length > 0) {
|
62 | let {
|
63 | length
|
64 | } = stylusOptions.use;
|
65 |
|
66 | while (length--) {
|
67 | let [item] = stylusOptions.use.splice(length, 1);
|
68 |
|
69 | if (typeof item === "string") {
|
70 | try {
|
71 | const resolved = require.resolve(item);
|
72 |
|
73 |
|
74 | item = require(resolved)(stylusOptions);
|
75 | } catch (error) {
|
76 | callback(`Failed to load "${item}" Stylus plugin. Are you sure it's installed?\n${error}`);
|
77 | return;
|
78 | }
|
79 | }
|
80 |
|
81 | styl.use(item);
|
82 | }
|
83 | }
|
84 |
|
85 | if (typeof stylusOptions.import !== "undefined") {
|
86 | for (const imported of stylusOptions.import) {
|
87 | styl.import(imported);
|
88 | }
|
89 | }
|
90 |
|
91 | if (typeof stylusOptions.include !== "undefined") {
|
92 | for (const included of stylusOptions.include) {
|
93 | styl.include(included);
|
94 | }
|
95 | }
|
96 |
|
97 | if (stylusOptions.resolveURL !== false) {
|
98 | styl.define("url", (0, _utils.urlResolver)(stylusOptions.resolveURL));
|
99 | }
|
100 |
|
101 | const shouldUseWebpackImporter = typeof options.webpackImporter === "boolean" ? options.webpackImporter : true;
|
102 |
|
103 | if (shouldUseWebpackImporter) {
|
104 | styl.set("Evaluator", await (0, _utils.createEvaluator)(this, source, stylusOptions));
|
105 | }
|
106 |
|
107 | if (typeof stylusOptions.define !== "undefined") {
|
108 | const definitions = Array.isArray(stylusOptions.define) ? stylusOptions.define : Object.entries(stylusOptions.define);
|
109 |
|
110 | for (const defined of definitions) {
|
111 | styl.define(...defined);
|
112 | }
|
113 | }
|
114 |
|
115 | styl.render(async (error, css) => {
|
116 | if (error) {
|
117 | if (error.filename) {
|
118 | this.addDependency(_path.default.normalize(error.filename));
|
119 | }
|
120 |
|
121 | callback(error);
|
122 | return;
|
123 | }
|
124 |
|
125 |
|
126 | if (stylusOptions._imports.length > 0) {
|
127 |
|
128 | for (const importData of stylusOptions._imports) {
|
129 | if (_path.default.isAbsolute(importData.path)) {
|
130 | this.addDependency(_path.default.normalize(importData.path));
|
131 | } else {
|
132 | this.addDependency(_path.default.resolve(process.cwd(), importData.path));
|
133 | }
|
134 | }
|
135 | }
|
136 |
|
137 | let map = styl.sourcemap;
|
138 |
|
139 | if (map && useSourceMap) {
|
140 | map = (0, _utils.normalizeSourceMap)(map, stylusOptions.dest);
|
141 |
|
142 | try {
|
143 | map.sourcesContent = await Promise.all(map.sources.map(async file => (await (0, _utils.readFile)(this.fs, file)).toString()));
|
144 | } catch (fsError) {
|
145 | callback(fsError);
|
146 | return;
|
147 | }
|
148 | }
|
149 |
|
150 | callback(null, css, map);
|
151 | });
|
152 | } |
\ | No newline at end of file |