1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const url = require("url");
|
5 | const path = require("path");
|
6 | const less = require("less");
|
7 | const postcss = require("postcss");
|
8 | const class_1 = require("../class");
|
9 | const declare_1 = require("../declare");
|
10 | const util_1 = require("../util");
|
11 | const plugin_1 = require("../plugin");
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | const postcssMixins = require('postcss-mixins');
|
17 | const postcssAdvancedVariables = require('postcss-advanced-variables');
|
18 | const postcssCustomMedia = require('postcss-custom-media');
|
19 | const postcssCustomProperties = require('postcss-custom-properties');
|
20 | const postcssMediaMinmax = require('postcss-media-minmax');
|
21 | const postcssColorFunction = require('postcss-color-function');
|
22 | const postcssNesting = require('postcss-nesting');
|
23 | const postcssNested = require('postcss-nested');
|
24 | const postcssCustomSelectors = require('postcss-custom-selectors');
|
25 | const postcssAtroot = require('postcss-atroot');
|
26 | const postcssPropertyLookup = require('postcss-property-lookup');
|
27 | const postcssExtend = require('postcss-extend');
|
28 | const postcssSelectorMatches = require('postcss-selector-matches');
|
29 | const postcssSelectorNot = require('postcss-selector-not');
|
30 |
|
31 | const postcssBem = require('postcss-bem');
|
32 | const postcssCalc = require('postcss-calc');
|
33 |
|
34 | const postcssBemOptions = {
|
35 | defaultNamespace: undefined,
|
36 | style: 'suit',
|
37 | separators: {
|
38 | descendent: '__',
|
39 | modifier: '--'
|
40 | },
|
41 | shortcuts: {
|
42 | utility: 'u',
|
43 | component: 'b',
|
44 | descendent: 'e',
|
45 | modifier: 'm',
|
46 | when: 'is'
|
47 | }
|
48 | };
|
49 |
|
50 | const processor = postcss([
|
51 | postcssBem(postcssBemOptions),
|
52 | postcssMixins,
|
53 | postcssAdvancedVariables,
|
54 | postcssCustomMedia,
|
55 | postcssCustomProperties,
|
56 | postcssMediaMinmax,
|
57 | postcssColorFunction,
|
58 | postcssNesting,
|
59 | postcssNested,
|
60 | postcssCustomSelectors,
|
61 | postcssAtroot,
|
62 | postcssPropertyLookup,
|
63 | postcssExtend,
|
64 | postcssSelectorMatches,
|
65 | postcssSelectorNot,
|
66 | postcssCalc,
|
67 | plugin_1.postcssUnit2rpx
|
68 | ]);
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 | class WxSFMStyle extends class_1.WxSFM {
|
77 | |
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 | constructor(source, request, options) {
|
85 | super(source, request, {
|
86 | destExt: util_1.config.ext.wxss
|
87 | });
|
88 | this.options = options;
|
89 | |
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 | this.depends = [];
|
97 | this.initDepends();
|
98 | }
|
99 | |
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 | compileStyle() {
|
106 | return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
107 | if (!this.result)
|
108 | return '';
|
109 |
|
110 | return yield postcss([
|
111 | plugin_1.postcssUnit2rpx
|
112 | ]).process(this.result).then(result => result.css);
|
113 | });
|
114 | }
|
115 | |
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 | compileLess() {
|
122 | return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
123 | if (!this.source)
|
124 | return '';
|
125 |
|
126 |
|
127 |
|
128 | let source = '';
|
129 | let options = {
|
130 | filename: this.request.src
|
131 | };
|
132 | source = this.source;
|
133 |
|
134 | source = util_1.Global.config.style.lessCode + '\n' + source;
|
135 |
|
136 | source = yield less.render(source, options).then(result => result.css);
|
137 |
|
138 | source = yield postcss([
|
139 | plugin_1.postcssUnit2rpx
|
140 | ]).process(source).then(result => result.css);
|
141 | return source;
|
142 | });
|
143 | }
|
144 | |
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 | compilePcss() {
|
151 | return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
152 | if (!this.result)
|
153 | return '';
|
154 |
|
155 | let source = '';
|
156 |
|
157 | source = yield postcss().process(this.result).then(result => result.css);
|
158 |
|
159 | source = util_1.Global.config.style.pcssCode + '\n' + source;
|
160 |
|
161 | source = yield processor.process(source).then(result => result.css);
|
162 | return source;
|
163 | });
|
164 | }
|
165 | |
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 | generator() {
|
172 | return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
173 | switch (this.options.compileType) {
|
174 | case declare_1.CompileType.LESS:
|
175 | return yield this.compileLess();
|
176 | case declare_1.CompileType.PCSS:
|
177 | return yield this.compilePcss();
|
178 | default:
|
179 | return yield this.compileStyle();
|
180 | }
|
181 | });
|
182 | }
|
183 | |
184 |
|
185 |
|
186 |
|
187 |
|
188 | save() {
|
189 | super.save();
|
190 | }
|
191 | |
192 |
|
193 |
|
194 |
|
195 |
|
196 | remove() {
|
197 | super.remove();
|
198 | }
|
199 | |
200 |
|
201 |
|
202 |
|
203 |
|
204 |
|
205 | getDepends() {
|
206 | return this.depends;
|
207 | }
|
208 | |
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 | updateDepends(useRequests) {
|
215 | let depends = this.getDepends();
|
216 | if (!depends.length)
|
217 | return;
|
218 | useRequests.forEach(useRequest => {
|
219 | depends
|
220 | .filter(depend => {
|
221 | return depend.requestType === useRequest.requestType && depend.request === useRequest.request;
|
222 | })
|
223 | .forEach(depend => {
|
224 | let request = '';
|
225 | request = path.relative(path.dirname(this.dest), path.dirname(useRequest.dest));
|
226 | request = path.join(request, path.basename(useRequest.dest, useRequest.ext));
|
227 | request = request.charAt(0) !== '.' ? `./${request}` : request;
|
228 | request = request.split(path.sep).join('/');
|
229 | switch (depend.requestType) {
|
230 | case declare_1.RequestType.STYLE:
|
231 |
|
232 | depend.$atRule.params = `'${request}${util_1.config.ext.wxss}'`;
|
233 | break;
|
234 | case declare_1.RequestType.ICONFONT:
|
235 | let requestURL = url.parse(depend.request);
|
236 |
|
237 |
|
238 | depend.$decl.value = depend.$decl.value.replace(depend.request, `${request}${useRequest.ext}${requestURL.search}`);
|
239 | break;
|
240 | }
|
241 | });
|
242 | });
|
243 | }
|
244 | |
245 |
|
246 |
|
247 |
|
248 |
|
249 |
|
250 | initDepends() {
|
251 | if (!this.source)
|
252 | return;
|
253 | if (this.options.compileType === declare_1.CompileType.LESS)
|
254 | return;
|
255 | let transformer = root => {
|
256 |
|
257 | root.walkAtRules((rule, index) => {
|
258 | if (rule.name !== 'import') {
|
259 | return;
|
260 | }
|
261 |
|
262 | this.depends.push({
|
263 | request: rule.params.replace(/^('|")(.*)('|")$/g, (match, quotn, filename) => filename),
|
264 | requestType: declare_1.RequestType.STYLE,
|
265 | $atRule: rule
|
266 | });
|
267 | });
|
268 |
|
269 | root.walkDecls((decl, index) => {
|
270 |
|
271 |
|
272 |
|
273 |
|
274 | if (decl.prop !== 'src') {
|
275 | return;
|
276 | }
|
277 |
|
278 | if (decl.value.indexOf('url') === -1) {
|
279 | return;
|
280 | }
|
281 |
|
282 |
|
283 | let urls = decl.value.split(/format\([\'\"][a-z-]+[\'\"]\),/);
|
284 | urls.forEach(url => {
|
285 | let matchs = url.match(util_1.ICONFONT_PATTERN);
|
286 | if (!matchs) {
|
287 | return;
|
288 | }
|
289 |
|
290 | url = matchs[1];
|
291 |
|
292 | if (!util_1.default.checkLocalFile(url)) {
|
293 | return;
|
294 | }
|
295 | this.depends.push({
|
296 | request: url,
|
297 | requestType: declare_1.RequestType.ICONFONT,
|
298 | $decl: decl
|
299 | });
|
300 | });
|
301 | });
|
302 | };
|
303 | let lazyResult = postcss([transformer]).process(this.source);
|
304 | lazyResult.toString();
|
305 | this.result = lazyResult['result'];
|
306 | }
|
307 | }
|
308 | exports.WxSFMStyle = WxSFMStyle;
|
309 |
|
310 |
|
311 |
|
312 |
|
313 |
|
314 |
|
315 |
|
316 |
|
317 |
|
318 |
|
319 |
|
320 |
|
321 |
|
322 |
|
323 |
|
324 |
|
325 |
|
326 |
|
327 |
|
328 |
|
329 |
|
330 |
|
331 |
|
332 |
|
333 |
|
334 |
|
335 |
|
336 |
|
337 |
|
338 |
|
339 |
|
340 |
|
341 |
|
342 |
|
343 |
|
344 |
|
345 |
|
346 |
|
347 |
|
348 |
|
349 |
|
350 |
|
351 |
|