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 { 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 = []; 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 = []; const folderList: Array = []; // 无用数据 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();