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;
|