1.1.1版本审核修复
[spine-utils.js (line 35)](/Users/tianmokeji/Desktop/特效/SpineViewer/SpineViewer/js/spine-utils.js:35) 统一拦截绝对路径、..、Windows 盘符、UNC、URI、控制字符和符号链接越界。 跨素材贴图只能使用已枚举、验证且位于 Eagle 素材目录内的文件。 [spine-render.js (line 62)](/Users/tianmokeji/Desktop/特效/SpineViewer/SpineViewer/js/spine-render.js:62) 已删除未经验证的路径备用拼接。 自动缩略图只写当前回调提供的 dest,不再调用接口改写同组素材。 已删除后台整组补刷进程及 relatedDataPaths。 [viewer/spine.html (line 482)](/Users/tianmokeji/Desktop/特效/SpineViewer/SpineViewer/viewer/spine.html:482) 的手动缩略图只针对当前素材,并核对素材 ID、文件名和扩展名。 当前素材已有自定义缩略图时,会提示替换后无法自动恢复并要求确认。 手动生成的中间文件改存系统临时目录,API 失败时不再直接写 Eagle 素材目录。 八种语言文案及 README 已同步。 处理历史日志遗留问题
This commit is contained in:
1 parent
473a270510
commit
bb73cc9227
36 files changed
+499
-652
No files matched your search
@@ -0,0 +1,43 @@
|
||||
'use strict';
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
|
||||
const root = path.resolve(__dirname, '..');
|
||||
const releaseDir = path.join(root, 'release', 'UNIVERSAL_SpineViewer');
|
||||
const archive = path.join(root, 'release', 'SpineViewer.eagleplugin');
|
||||
|
||||
function walk(directory, prefix = '') {
|
||||
const files = [];
|
||||
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
|
||||
const relative = path.posix.join(prefix, entry.name);
|
||||
if (entry.isDirectory()) files.push(...walk(path.join(directory, entry.name), relative));
|
||||
else files.push(relative);
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
||||
function zipEntries(file) {
|
||||
const data = fs.readFileSync(file);
|
||||
const entries = [];
|
||||
for (let offset = 0; offset + 46 <= data.length;) {
|
||||
const header = data.indexOf(Buffer.from([0x50, 0x4b, 0x01, 0x02]), offset);
|
||||
if (header < 0) break;
|
||||
const nameLength = data.readUInt16LE(header + 28);
|
||||
const extraLength = data.readUInt16LE(header + 30);
|
||||
const commentLength = data.readUInt16LE(header + 32);
|
||||
entries.push(data.subarray(header + 46, header + 46 + nameLength).toString('utf8'));
|
||||
offset = header + 46 + nameLength + extraLength + commentLength;
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
for (const [label, files] of [
|
||||
['release directory', walk(releaseDir)],
|
||||
['eagleplugin archive', zipEntries(archive)],
|
||||
]) {
|
||||
assert.equal(files.some((file) => /\.log$/i.test(file)), false, label + ' must not contain runtime or historical logs');
|
||||
assert.equal(files.some((file) => /(^|\/)\.DS_Store$/i.test(file)), false, label + ' must not contain macOS metadata');
|
||||
}
|
||||
|
||||
console.log('PASS: release directory and .eagleplugin contain no logs or .DS_Store files');
|
||||
Reference in new issue
Block a user