@yinxulai/babel-plugin-less
Version:
一个 `Babel` 插件,用来帮助你对文件中引用的 `less` 进行预处理、转换成 `css` 并自动管理, 支持 `cssModule`, `autoPrefix`
103 lines • 4.06 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
var path_1 = __importDefault(require("path"));
var hash_1 = __importDefault(require("./hash"));
var t = __importStar(require("@babel/types"));
var child_process_1 = require("child_process");
var template_1 = require("./template");
function isDevelopment() {
return process.env.NODE_ENV === 'development';
}
// 同步调用 PostCss 处理资源
function transformStyle(options) {
var isDev = isDevelopment();
var optionsStr = JSON.stringify(options);
var transform = path_1.default.resolve(__dirname, "./transform." + (isDev ? 'ts' : 'js'));
var result = child_process_1.execFileSync(isDev ? 'ts-node' : 'node', [transform, optionsStr]);
return JSON.parse(result.toString());
}
function getImportDefaultSpecifier(node) {
var defaultImport = node.specifiers.find(function (s) { return t.isImportDefaultSpecifier(s); });
if (t.isImportDefaultSpecifier(defaultImport)) {
return defaultImport;
}
return null;
}
function generateImportStyleAST(data, node) {
var nodeArray = [];
if (data.css) {
var elementID = hash_1.default(data.css);
nodeArray.push(template_1.insertStyleElement(elementID, data.css));
}
if (data.tokens) {
// 获取默认导入的信息
// import * from '*'
var defaultImport = getImportDefaultSpecifier(node);
// 用户没有默认导入
// TODO: 支持其他类型的导入
if (!defaultImport) {
return nodeArray;
}
// TODO: 考虑允许用户其他方式导入
var variableName = defaultImport.local.name;
nodeArray.push(template_1.styleTokenMap(variableName, data.tokens));
}
return nodeArray;
}
function plugin() {
return {
name: 'less',
// 语法转换
visitor: {
// import styles from './style.css';
ImportDeclaration: {
enter: function (data, state) {
var source = data.node.source;
var pluginOptions = state.opts;
var matcher = /(.less)|(.css)$/i;
var entryfile = state.file.opts.filename;
var importSourceliteralValue = source.value;
var styleFileName = path_1.default.resolve(path_1.default.dirname(entryfile), importSourceliteralValue);
// 匹配文件后缀
if (!matcher.test(importSourceliteralValue)) {
return;
}
// import '*'
// 关闭 css module
if (!data.node.specifiers.length) {
pluginOptions.cssModule = false;
}
// 转换 css
var result = transformStyle(__assign(__assign({}, pluginOptions), { fileName: styleFileName }));
// 生成 AST
var newImportAST = generateImportStyleAST(result, data.node);
// 替换当前节点
data.replaceWithMultiple(newImportAST);
}
},
}
};
}
module.exports = plugin;
//# sourceMappingURL=index.js.map