1 | import fs from 'fs-extra';
|
2 | import { dirname } from 'path';
|
3 | import less from 'less';
|
4 | import { createFilter } from 'rollup-pluginutils';
|
5 | import { insertStyle } from './style.js';
|
6 |
|
7 |
|
8 | let renderSync = (code, option) => {
|
9 | return less.render(code, option)
|
10 | .then(function(output){
|
11 | return output.css;
|
12 | }, function(error){
|
13 | throw error;
|
14 | })
|
15 | };
|
16 |
|
17 | let fileCount = 0;
|
18 |
|
19 | export default function plugin (options = {}) {
|
20 | options.insert = options.insert || false;
|
21 | const filter = createFilter(options.include || [ '**/*.less', '**/*.css' ], options.exclude || 'node_modules/**');
|
22 |
|
23 | const injectFnName = '__$styleInject'
|
24 | return {
|
25 | name: 'less',
|
26 | intro() {
|
27 | return options.insert ? insertStyle.toString().replace(/insertStyle/, injectFnName) : '';
|
28 | },
|
29 | async transform(code, id) {
|
30 | if (!filter(id)) {
|
31 | return null;
|
32 | }
|
33 | fileCount++;
|
34 |
|
35 | try {
|
36 | options.option = options.option || {};
|
37 | options.option['filename'] = id;
|
38 | options.output = options.output || 'rollup.build.css';
|
39 | if (options.plugins) {
|
40 | options.option['plugins'] = options.plugins
|
41 | }
|
42 |
|
43 | let css = await renderSync(code, options.option);
|
44 |
|
45 | if(options.output&&isFunc(options.output)){
|
46 | css = await options.output(css, id);
|
47 | }
|
48 |
|
49 | if (options.output&&isString(options.output)) {
|
50 | if(fileCount == 1){
|
51 |
|
52 | fs.removeSync(options.output);
|
53 | }
|
54 | fs.appendFileSync(options.output, css);
|
55 | }
|
56 |
|
57 | let exportCode = '';
|
58 |
|
59 | if(options.insert!=false){
|
60 | exportCode = `export default ${injectFnName}(${JSON.stringify(css.toString())});`;
|
61 | }else{
|
62 | exportCode = `export default ${JSON.stringify(css.toString())};`;
|
63 | }
|
64 | return {
|
65 | code: exportCode,
|
66 | map: { mappings: '' }
|
67 | };
|
68 | } catch (error) {
|
69 | throw error;
|
70 | }
|
71 | }
|
72 | };
|
73 | };
|
74 |
|
75 | function isString (str) {
|
76 | if(typeof str == 'string'){
|
77 | return true;
|
78 | }else{
|
79 | return false;
|
80 | }
|
81 | }
|
82 |
|
83 | function isFunc (fn){
|
84 | if ( typeof fn == 'function' ){
|
85 | return true;
|
86 | }else{
|
87 | return false;
|
88 | }
|
89 | }
|