UNPKG

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