UNPKG

@yinxulai/babel-plugin-less

Version:

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

103 lines 4.06 kB
"use strict"; 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