@yinxulai/babel-plugin-less
Version:
一个 `Babel` 插件,用来帮助你对文件中引用的 `less` 进行预处理、转换成 `css` 并自动管理, 支持 `cssModule`, `autoPrefix`
75 lines • 3.44 kB
JavaScript
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