import { compare } from "compare-versions";
import PluginManager from "./pluginManager";
import MusicSheet from "@/core/musicSheet";
import { ResumeMode } from "@/constants/commonConst.ts";
* 结果:一份大的json文件
* {
* musicSheets: [],
* plugins: [],
* }
*/
interface IBackJson {
musicSheets: IMusic.IMusicSheetItem[];
plugins: Array<{ srcUrl: string; version: string }>;
}
function backup() {
const musicSheets = MusicSheet.backupSheets();
const plugins = PluginManager.getEnabledPlugins();
const normalizedPlugins = plugins.map(_ => ({
srcUrl: _.instance.srcUrl,
version: _.instance.version,
}));
return JSON.stringify({
musicSheets: musicSheets,
plugins: normalizedPlugins,
});
}
async function resume(
raw: string | Object,
resumeMode: ResumeMode = ResumeMode.Append,
) {
let obj: IBackJson;
if (typeof raw === "string") {
obj = JSON.parse(raw);
} else {
obj = raw as IBackJson;
}
const { plugins, musicSheets } = obj ?? {};
const validPlugins = PluginManager.getEnabledPlugins();
const resumePlugins = plugins?.map(_ => {
if (
validPlugins.find(
plugin =>
plugin.instance.srcUrl === _.srcUrl &&
compare(
plugin.instance.version ?? "0.0.0",
_.version ?? "0.0.1",
">=",
),
)
) {
return;
}
return PluginManager.installPluginFromUrl(_.srcUrl);
});
const resumeMusicSheets = MusicSheet.resumeSheets(musicSheets, resumeMode);
return Promise.all([...(resumePlugins ?? []), resumeMusicSheets]);
}
const Backup = {
backup,
resume,
};
export default Backup;