修改电脑端game.createDir逻辑使已存在文件夹不报错。修改导入扩展逻辑,支持导入esm扩展(必须有info.json)
This commit is contained in:
parent
b6fd697671
commit
9d75dfafde
|
@ -2229,18 +2229,72 @@ export class Game {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
alert(`导入失败:\n${JSON.stringify(error, null, "\t")}`);
|
alert(`导入失败:\n${JSON.stringify(error, null, "\t")}`);
|
||||||
|
console.error(error);
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
zip.load(data);
|
zip.load(data);
|
||||||
// alert(zip.file('文件夹/加扩展.js').asText())
|
let extensionFile = zip.file("extension.js");
|
||||||
const str = zip.file("extension.js").asText();
|
let isTsFile = false;
|
||||||
if (str === "" || undefined) throw "你导入的不是扩展!请选择正确的文件";
|
// 未找到extension.js
|
||||||
|
if (!extensionFile) {
|
||||||
|
extensionFile = zip.file("extension.ts");
|
||||||
|
if (!extensionFile) throw new Error("未找到extension.js");
|
||||||
|
isTsFile = true;
|
||||||
|
}
|
||||||
|
/** @type { string } */
|
||||||
|
// @ts-ignore
|
||||||
|
let str = extensionFile.asText();
|
||||||
|
if (str === "" || str === undefined) throw "你导入的不是扩展!请选择正确的文件";
|
||||||
|
// 编译ts扩展
|
||||||
|
if (isTsFile) {
|
||||||
|
if (typeof globalThis.ts === 'undefined') {
|
||||||
|
await lib.init.promises.js('game', 'typescript');
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @type {typeof import('typescript')}
|
||||||
|
*/
|
||||||
|
const ts = globalThis.ts;
|
||||||
|
str = ts.transpile(str, {
|
||||||
|
module: ts.ModuleKind.ES2015,
|
||||||
|
//@todo: ES2019 -> ES2020
|
||||||
|
target: ts.ScriptTarget.ES2019,
|
||||||
|
inlineSourceMap: true,
|
||||||
|
resolveJsonModule: true,
|
||||||
|
esModuleInterop: true,
|
||||||
|
}, 'extension.ts');
|
||||||
|
}
|
||||||
_status.importingExtension = true;
|
_status.importingExtension = true;
|
||||||
|
try {
|
||||||
|
// 导入普通扩展
|
||||||
eval(str);
|
eval(str);
|
||||||
|
// esm扩展可以不写game.impoprt或许会导致_status.extensionLoading不存在
|
||||||
|
if (Array.isArray(_status.extensionLoading)) {
|
||||||
await Promise.allSettled(_status.extensionLoading);
|
await Promise.allSettled(_status.extensionLoading);
|
||||||
delete _status.extensionLoading;
|
delete _status.extensionLoading;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// 是模块扩展
|
||||||
|
if (
|
||||||
|
// @ts-ignore
|
||||||
|
error.message === 'Cannot use import statement outside a module' ||
|
||||||
|
// @ts-ignore
|
||||||
|
error.message === 'await is only valid in async functions and the top level bodies of modules'
|
||||||
|
) {
|
||||||
|
// 改为用info.json判断扩展名
|
||||||
|
const infoFile = zip.file("info.json");
|
||||||
|
if (!infoFile) throw new Error("未找到info.json,导入模块化扩展必须加入info.json!");
|
||||||
|
const info = JSON.parse(infoFile.asText());
|
||||||
|
if (typeof info.name == 'string') {
|
||||||
|
await game.import('extension', () => {
|
||||||
|
return Object.assign(info, {
|
||||||
|
config: {},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
_status.importingExtension = false;
|
_status.importingExtension = false;
|
||||||
if (!game.importedPack) throw "err";
|
if (!game.importedPack) throw "此压缩包不是一个扩展";
|
||||||
const extensionName = game.importedPack.name;
|
const extensionName = game.importedPack.name;
|
||||||
if (lib.config.all.plays.includes(extensionName)) throw "禁止安装游戏原生扩展";
|
if (lib.config.all.plays.includes(extensionName)) throw "禁止安装游戏原生扩展";
|
||||||
const extensions = lib.config.extensions;
|
const extensions = lib.config.extensions;
|
||||||
|
@ -2260,7 +2314,6 @@ export class Game {
|
||||||
fileList = Object.keys(files)
|
fileList = Object.keys(files)
|
||||||
.filter((key) => !files[key].dir && !hiddenFileFlags.includes(key[0]))
|
.filter((key) => !files[key].dir && !hiddenFileFlags.includes(key[0]))
|
||||||
.reverse();
|
.reverse();
|
||||||
//alert(filelist)
|
|
||||||
//电脑端
|
//电脑端
|
||||||
//具备nodeJS环境
|
//具备nodeJS环境
|
||||||
if (lib.node && lib.node.fs) {
|
if (lib.node && lib.node.fs) {
|
||||||
|
@ -2286,14 +2339,14 @@ export class Game {
|
||||||
)
|
)
|
||||||
).then(writeFile);
|
).then(writeFile);
|
||||||
return fileName.length
|
return fileName.length
|
||||||
? game
|
? game.promises
|
||||||
.createDir(`extension/${extensionName}/${fileName.join("/")}`)
|
.createDir(`extension/${extensionName}/${fileName.join("/")}`)
|
||||||
.then(() => letGo(`${fileName.join("/")}/${name}`))
|
.then(() => letGo(`${fileName.join("/")}/${name}`))
|
||||||
: letGo(name);
|
: letGo(name);
|
||||||
}
|
}
|
||||||
finishLoad();
|
finishLoad();
|
||||||
};
|
};
|
||||||
game.ensureDirectory(`extension/${extensionName}`).then(writeFile).catch(UHP);
|
game.promises.ensureDirectory(`extension/${extensionName}`).then(writeFile).catch(UHP);
|
||||||
} else
|
} else
|
||||||
new Promise((resolve, reject) =>
|
new Promise((resolve, reject) =>
|
||||||
window.resolveLocalFileSystemURL(nonameInitialized, resolve, reject)
|
window.resolveLocalFileSystemURL(nonameInitialized, resolve, reject)
|
||||||
|
@ -2351,7 +2404,7 @@ export class Game {
|
||||||
)
|
)
|
||||||
.then(writeFile);
|
.then(writeFile);
|
||||||
return fileName.length
|
return fileName.length
|
||||||
? game
|
? game.promises
|
||||||
.createDir(`extension/${extensionName}/${fileName.join("/")}`)
|
.createDir(`extension/${extensionName}/${fileName.join("/")}`)
|
||||||
.then(() => letGo(`${fileName.join("/")}/${name}`))
|
.then(() => letGo(`${fileName.join("/")}/${name}`))
|
||||||
: letGo(name);
|
: letGo(name);
|
||||||
|
@ -4960,10 +5013,13 @@ export class Game {
|
||||||
* @param { string } extensionName
|
* @param { string } extensionName
|
||||||
*/
|
*/
|
||||||
hasExtension(extensionName) {
|
hasExtension(extensionName) {
|
||||||
|
if (this.hasExtensionInstalled(extensionName)) {
|
||||||
if (typeof lib.config[`extension_${extensionName}_enable`] != "boolean") {
|
if (typeof lib.config[`extension_${extensionName}_enable`] != "boolean") {
|
||||||
game.saveExtensionConfig(extensionName, "enable", true);
|
game.saveExtensionConfig(extensionName, "enable", true);
|
||||||
}
|
}
|
||||||
return this.hasExtensionInstalled(extensionName) && lib.config[`extension_${extensionName}_enable`];
|
return lib.config[`extension_${extensionName}_enable`] === true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @param { string } extensionName
|
* @param { string } extensionName
|
||||||
|
|
|
@ -184,9 +184,12 @@ export function nodeReady() {
|
||||||
game.createDir = (directory, successCallback, errorCallback) => {
|
game.createDir = (directory, successCallback, errorCallback) => {
|
||||||
const target = lib.node.path.join(__dirname, directory);
|
const target = lib.node.path.join(__dirname, directory);
|
||||||
if (lib.node.fs.existsSync(target)) {
|
if (lib.node.fs.existsSync(target)) {
|
||||||
if (typeof errorCallback == "function") {
|
// 修改逻辑,路径存在且是文件才会报错
|
||||||
errorCallback(new Error(`${target}已存在`));
|
if (!lib.node.fs.lstatSync(target).isDirectory()){
|
||||||
|
if (typeof errorCallback == "function") errorCallback(new Error(`${target}文件已存在`));
|
||||||
|
else if (typeof successCallback == "function") successCallback();
|
||||||
}
|
}
|
||||||
|
else if (typeof successCallback == "function") successCallback();
|
||||||
} else if (checkVersion(process.versions.node, "10.12.0") > -1) {
|
} else if (checkVersion(process.versions.node, "10.12.0") > -1) {
|
||||||
lib.node.fs.mkdir(target, { recursive: true }, (e) => {
|
lib.node.fs.mkdir(target, { recursive: true }, (e) => {
|
||||||
if (e) {
|
if (e) {
|
||||||
|
|
|
@ -2632,9 +2632,9 @@ export const extensionMenu = function (connectMenu) {
|
||||||
fileReader.onerror = reject;
|
fileReader.onerror = reject;
|
||||||
fileReader.onload = resolve;
|
fileReader.onload = resolve;
|
||||||
fileReader.readAsArrayBuffer(fileToLoad, "UTF-8");
|
fileReader.readAsArrayBuffer(fileToLoad, "UTF-8");
|
||||||
}).then((progressEvent) => {
|
}).then(async (progressEvent) => {
|
||||||
if (
|
if (
|
||||||
game.importExtension(progressEvent.target.result, () => {
|
await game.importExtension(progressEvent.target.result, () => {
|
||||||
extensionNode.innerHTML = "导入成功,3秒后将重启";
|
extensionNode.innerHTML = "导入成功,3秒后将重启";
|
||||||
new Promise((resolve) => setTimeout(resolve, 1000))
|
new Promise((resolve) => setTimeout(resolve, 1000))
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|
Loading…
Reference in New Issue