86 lines
3.4 KiB
JavaScript
86 lines
3.4 KiB
JavaScript
'use strict';
|
|
|
|
(function bootstrapChimera() {
|
|
const loaded = new Map();
|
|
const featureModules = Object.freeze({
|
|
games: ['modules/games.js', 'modules/game-source-scan.js', 'modules/ftpbrowser.js', 'modules/backpork-gen.js', 'modules/hash.js', 'modules/manage.js', 'modules/compatibility-guidance.js', 'modules/title-workspace.js', '../src/renderer/recipe-editor.js', 'modules/install-destination.js', 'modules/cheats.js', 'modules/modal.js'],
|
|
packages: ['modules/packages.js'],
|
|
backporks: ['modules/backporks.js', 'modules/backpork-gen.js', 'modules/ftpbrowser.js'],
|
|
backups: ['modules/protection-model.js', 'modules/backups.js', 'modules/ftpbrowser.js'],
|
|
trophies: ['../src/renderer/trophies.js'],
|
|
database: ['modules/database.js'],
|
|
settings: ['modules/payload.js', 'modules/settings.js'],
|
|
jailbreak: ['modules/payload.js', 'modules/y2jb-generator.js', 'modules/bdjb-generator.js', 'modules/system-state.js', 'modules/autoloader.js'],
|
|
psnotify: ['modules/psnotify.js'],
|
|
xavatar: [{ src: '../src/xavatarElectronModule/renderer/xavatarRenderer.js', type: 'module' }, 'modules/xavatar.js'],
|
|
'system-view': ['gif-encoder.js', 'modules/system-view.js', 'modules/hotkeys.js'],
|
|
transfers: ['modules/transfers.js'],
|
|
media: ['modules/media.js'],
|
|
cheats: ['modules/cheats.js'],
|
|
garlic: ['modules/cheats.js'],
|
|
'elf-arsenal': ['modules/elf-arsenal.js'],
|
|
'pfs-ripper': ['modules/pfs-ripper.js'],
|
|
savemgr: ['modules/savemgr.js'],
|
|
ecosystem: ['modules/etahen-link-ux.js', 'modules/ecosystem.js'],
|
|
operations: ['modules/operations.js'],
|
|
});
|
|
const coreModules = [
|
|
'pork-web-shim.js',
|
|
'pork-evidence-bridge.js',
|
|
'modules/i18n.js',
|
|
'modules/state.js',
|
|
'modules/library-model.js',
|
|
'modules/helpers.js',
|
|
'modules/connection.js',
|
|
'modules/navigation-routes.js',
|
|
'modules/navigation.js',
|
|
'modules/premium-illustrations.js?v=sol-ultra-1',
|
|
'modules/dashboard-widgets.js',
|
|
'modules/init.js',
|
|
'modules/pwa.js',
|
|
];
|
|
|
|
function descriptor(value) {
|
|
return typeof value === 'string' ? { src: value, type: 'text/javascript' } : value;
|
|
}
|
|
|
|
function load(value) {
|
|
const item = descriptor(value);
|
|
if (loaded.has(item.src)) return loaded.get(item.src);
|
|
const promise = new Promise((resolve, reject) => {
|
|
const script = document.createElement('script');
|
|
script.src = item.src;
|
|
script.type = item.type || 'text/javascript';
|
|
script.dataset.chimeraModule = item.src;
|
|
script.addEventListener('load', () => resolve(item.src), { once: true });
|
|
script.addEventListener('error', () => {
|
|
loaded.delete(item.src);
|
|
reject(new Error(`Could not load ${item.src}.`));
|
|
}, { once: true });
|
|
document.head.appendChild(script);
|
|
});
|
|
loaded.set(item.src, promise);
|
|
return promise;
|
|
}
|
|
|
|
async function loadSequence(items) {
|
|
for (const item of items) await load(item);
|
|
}
|
|
|
|
window.ChimeraModuleLoader = Object.freeze({
|
|
ensureForPage: page => loadSequence(featureModules[page] || []),
|
|
isLoaded: src => loaded.has(src),
|
|
loadedModules: () => [...loaded.keys()],
|
|
});
|
|
|
|
loadSequence(coreModules).catch(error => {
|
|
console.error('[bootstrap]', error);
|
|
const status = document.getElementById('sb-msg');
|
|
if (status) {
|
|
status.textContent = `Chimera could not start: ${error.message}`;
|
|
status.style.color = 'var(--red)';
|
|
}
|
|
document.body.dataset.bootstrapFailed = 'true';
|
|
});
|
|
})();
|