packages/babel-plugin-wind-rc/lib/index.js (73 lines of code) (raw):

const _ = require('lodash') const { isStringLiteral, importDeclaration, stringLiteral, } = require('@babel/types') const { declare } = require('@babel/helper-plugin-utils') const REG_MATCH_PATTERN = /^@ali\/wind-rc-(?:[\w-]+)$/ const CSS_FILE_PATH = 'dist/index.css' const transPatterns = patterns => { let result = patterns if (_.isRegExp(patterns)) { result = [patterns] } return result.filter(_.isRegExp) } const babelPluginWindRc = declare((api, options) => { api.assertVersion(7) const { includePatterns = [REG_MATCH_PATTERN], excludePatterns = [], cssFilePath = CSS_FILE_PATH, } = options const visitor = { ImportDeclaration(path) { const { source } = path.node if (!isStringLiteral(source)) { return } const { value: sourceValue } = source const exactExcludePatterns = transPatterns(excludePatterns) if (Array.isArray(exactExcludePatterns)) { for (const pattern of exactExcludePatterns) { if (pattern.test(sourceValue)) { return } } } const exactIncludePatterns = transPatterns(includePatterns) if ( !Array.isArray(exactIncludePatterns) || !exactIncludePatterns.length ) { console.warn( '[babel-plugin-wind-rc] ' + 'It will be not importing related css files automatically, ' + 'because the plugin cannot find any import sources ' + 'that can be matched `includePatterns`.' ) return } let canBeInject = false _.forEach(exactIncludePatterns, (pattern) => { if (pattern.test(sourceValue)) { canBeInject = true } }) if (canBeInject) { path.insertBefore( importDeclaration( [], stringLiteral(`${sourceValue}/${cssFilePath}`) ) ) } }, } return { name: 'babel-plugin-wind-rc', visitor, } }) module.exports = babelPluginWindRc