mirror of
https://github.com/klxf/eda-copilot.git
synced 2025-09-21 15:43:26 +08:00
91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
import fs from 'fs-extra';
|
|
import ignore from 'ignore';
|
|
import JSZip from 'jszip';
|
|
|
|
import * as extensionConfig from '../extension.json';
|
|
|
|
/**
|
|
* 将多行字符串拆分成字符串数组
|
|
*
|
|
* @param str - 多行字符串
|
|
* @returns 字符串数组
|
|
*/
|
|
function multiLineStrToArray(str: string): Array<string> {
|
|
return str.split(/[\r\n]+/);
|
|
}
|
|
|
|
/**
|
|
* 检查 UUID 是否合法
|
|
*
|
|
* @param uuid - UUID
|
|
* @returns 是否合法
|
|
*/
|
|
function testUuid(uuid?: string): uuid is string {
|
|
const regExp = /^[a-z0-9]{32}$/g;
|
|
if (uuid && uuid !== '00000000000000000000000000000000') {
|
|
return regExp.test(uuid.trim());
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取正确的 UUID
|
|
*
|
|
* @param uuid - UUID
|
|
* @returns UUID
|
|
*/
|
|
function fixUuid(uuid?: string): string {
|
|
uuid = uuid?.trim() || undefined;
|
|
if (testUuid(uuid)) {
|
|
return uuid.trim();
|
|
} else {
|
|
return crypto.randomUUID().replaceAll('-', '');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 主逻辑方法
|
|
*/
|
|
function main() {
|
|
if (!testUuid(extensionConfig.uuid)) {
|
|
const newExtensionConfig = { ...extensionConfig };
|
|
// @ts-ignore
|
|
delete newExtensionConfig.default;
|
|
newExtensionConfig.uuid = fixUuid(extensionConfig.uuid);
|
|
fs.writeJsonSync(__dirname + '/../extension.json', newExtensionConfig, { spaces: '\t', EOL: '\n', encoding: 'utf-8' });
|
|
}
|
|
const filepathListWithoutFilter = fs.readdirSync(__dirname + '/../', { encoding: 'utf-8', recursive: true });
|
|
const edaignoreListWithoutResolve = multiLineStrToArray(fs.readFileSync(__dirname + '/../.edaignore', { encoding: 'utf-8' }));
|
|
const edaignoreList: Array<string> = [];
|
|
for (const edaignoreLine of edaignoreListWithoutResolve) {
|
|
if (edaignoreLine.endsWith('/') || edaignoreLine.endsWith('\\')) {
|
|
edaignoreList.push(edaignoreLine.slice(0, edaignoreLine.length - 1));
|
|
} else {
|
|
edaignoreList.push(edaignoreLine);
|
|
}
|
|
}
|
|
const edaignore = ignore().add(edaignoreList);
|
|
const filepathListWithoutResolve = edaignore.filter(filepathListWithoutFilter);
|
|
const fileList: Array<string> = [];
|
|
const folderList: Array<string> = []; // 无用数据
|
|
for (const filepath of filepathListWithoutResolve) {
|
|
if (fs.lstatSync(filepath).isFile()) {
|
|
fileList.push(filepath.replace(/\\/g, '/'));
|
|
} else {
|
|
folderList.push(filepath.replace(/\\/g, '/'));
|
|
}
|
|
}
|
|
|
|
const zip = new JSZip();
|
|
for (const file of fileList) {
|
|
zip.file(file, fs.createReadStream(__dirname + '/../' + file));
|
|
}
|
|
|
|
zip.generateNodeStream({ type: 'nodebuffer', streamFiles: true }).pipe(
|
|
fs.createWriteStream(__dirname + '/dist/' + extensionConfig.name + '_v' + extensionConfig.version + '.eext'),
|
|
);
|
|
}
|
|
|
|
main();
|