import ab2str from './util/ab2str'; const evalGlobal = eval; const makeSourceURL = (name) => `${name} | GM Module`.replace(/ /g, '%20'); let goosemodScope = {}; export const setThisScope = (scope) => { goosemodScope = scope; }; export const importModule = async (f, disabled = false) => { let field = f.name; goosemodScope.logger.debug('import', `Importing module: "${field}"`); if (goosemodScope.modules[field]?.goosemodHandlers?.onImport !== undefined) { goosemodScope.logger.debug(`import.load.module.${field}`, 'Module already imported, removing then installing new version'); await goosemodScope.modules[field].goosemodHandlers.onRemove(); } if (typeof f.data === 'object') { // ArrayBuffer (UTF-8) -> String f.data = ab2str(f.data); } const modulesKey = !disabled ? 'modules' : 'disabledModules'; goosemodScope[modulesKey][field] = Object.assign(evalGlobal(`const goosemodScope=goosemod;` + f.data + ` //# sourceURL=${makeSourceURL(f.name)}`), f.metadata); // Set goosemodScope.modules. to the return value of the module (an object containing handlers) if (disabled) return; await goosemodScope.modules[field].goosemodHandlers.onImport(); // Run the module's onImport handler };