UNPKG

@yinxulai/babel-plugin-less

Version:

一个 `Babel` 插件,用来帮助你对文件中引用的 `less` 进行预处理、转换成 `css` 并自动管理, 支持 `cssModule`, `autoPrefix`

75 lines 3.44 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import path from 'path'; import less from 'less'; import postcss from 'postcss'; import cssnano from 'cssnano'; import { readFileSync } from 'fs'; import autoprefixer from 'autoprefixer'; import postcssModules from 'postcss-modules'; const optionsArgs = process.argv.slice(2); const options = JSON.parse(optionsArgs[0]); // 预处理语法 function transformStyleSyntax(source, options) { return __awaiter(this, void 0, void 0, function* () { const data = yield less.render(source, options); return data.css || ''; }); } // 处理 css module, 同时会补充浏览器前缀 function transformStyleByPostCss(source, options) { return __awaiter(this, void 0, void 0, function* () { const result = {}; const plugins = []; const { cssModule, autoPrefix } = options, postcssOptions = __rest(options, ["cssModule", "autoPrefix"]); plugins.push(cssnano()); // 开启补充浏览器前缀 if (autoPrefix) { plugins.push(autoprefixer()); } // 开启 css Module if (cssModule) { // 如果开启了 cssModule // 保证一定有 tokens 对象 // 因为使用者会调用 style.className result.tokens = {}; const options = Object.assign(Object.assign({}, (typeof cssModule === 'object' ? cssModule : {})), { getJSON: (_, token) => result.tokens = token || {} }); plugins.push(postcssModules(options)); } const postcssResult = yield postcss(plugins) .process(source || '', postcssOptions); result.css = postcssResult.css; return result; }); } function transform() { return __awaiter(this, void 0, void 0, function* () { const { fileName, cssModule } = options; const dirname = path.dirname(fileName); const source = readFileSync(fileName).toString(); const styleString = yield transformStyleSyntax(source, { paths: [dirname] }); return yield transformStyleByPostCss(styleString, { from: fileName, autoPrefix: true, cssModule }); }); } transform() .catch(error => console.error(JSON.stringify(error))) .then(result => console.log(JSON.stringify(result))); //# sourceMappingURL=transform.js.map