合同小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

87 lines
2.4 KiB

const { readFileSync, existsSync } = require('fs');
const path = require('path');
const {generate} = require('./utils/generate')
// 插件的名称
const pluginName = 'vite-plugin-limeIcon';
// 要监听的组件的名称
const targetComponent = 'l-icon';
function parseAttributes(attributesStr) {
if (!attributesStr.includes("'")) {
return [attributesStr]
}
const regex = /'([^']+)'/g;
const matches = attributesStr.match(regex);
if (matches) {
const targetContent = matches.map(item => item.replace(/'/g, ''));
return targetContent
} else {
return [attributesStr]
}
}
function extractAttributes(content) {
const regex = /<l-icon\s*[^>]*(:?)name=["]([^"]+)["][^>]*>/g; // /<l-icon\s+(.*?)\s*\/?>/g //<l-icon\s+([^>]+)\s*\/?>/g;
let attributes = [];
const attributesSet = new Set(attributes);
let match;
while ((match = regex.exec(content)) !== null) {
const attributesStr = match[2];
const attributesList = parseAttributes(attributesStr);
for (const attribute of attributesList) {
attributesSet.add(attribute); // 添加新属性到Set中
}
}
attributes = [...attributesSet];
return attributes;
}
// 遍历每个文件并检查是否使用了目标组件
let iconCollections = {}
let files = {}
let timer = null
function processFile(file, options) {
const filePath = path.resolve(file);
const content = readFileSync(filePath, 'utf-8');
// 检查文件是否包含目标组件
if (content.includes(targetComponent) && (!file.includes('l-icon.vue') || !file.includes('l-icon.uvue')) && files[file] !== content) {
const icons = extractAttributes(content)
if(icons && icons.length) {
files[file] = content
iconCollections[file] = icons
}
Object.values(iconCollections).forEach(icons => {
if(options.icons) {
options.icons = options.icons.concat(icons);
} else {
options.icons = icons
}
})
clearTimeout(timer)
timer = setTimeout(() => {
options.icons = Array.from(new Set(options.icons))
generate(options)
},500)
}
}
// 插件的钩子函数
function vitePlugin(options = {}) {
const {useInDevelopment = false} = options
const isDev = process.env.NODE_ENV === 'development'
return {
name: pluginName,
transform(code, id) {
if (id.endsWith('.vue') && (useInDevelopment && isDev || !useInDevelopment && !isDev)) {
// 处理Vue文件
processFile(id, options);
}
},
};
}
module.exports = vitePlugin;