mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-06 16:33:15 +01:00
68 lines
No EOL
1.7 KiB
JavaScript
68 lines
No EOL
1.7 KiB
JavaScript
import {STORAGE_GLOBAL_PREFIX} from '../projectBundle';
|
|
|
|
export const BundleName = "@Extensions";
|
|
|
|
const EXTENSIONS_STORAGE_PREFIX = `${STORAGE_GLOBAL_PREFIX}.Extensions`;
|
|
|
|
let extensions = [];
|
|
|
|
export function activate(ctx) {
|
|
const {services} = ctx;
|
|
const extensionsStr = services.storage.get(EXTENSIONS_STORAGE_PREFIX);
|
|
if (extensionsStr) {
|
|
extensions = JSON.parse(extensionsStr);
|
|
}
|
|
|
|
function registerExtension(id, url){
|
|
extensions.push({id, url});
|
|
services.storage.set(EXTENSIONS_STORAGE_PREFIX, JSON.stringify(extensions));
|
|
loadExtension(extensions[extensions.length - 1]);
|
|
}
|
|
|
|
function extensionReady(id, activate) {
|
|
const extension = extensions.find(e => e.id === id);
|
|
if (!extension) {
|
|
console.warn(`extension "${id}" not registered`);
|
|
} else {
|
|
extension.activate = activate;
|
|
console.info(`extension "${id}" is ready`);
|
|
}
|
|
services.lifecycle.loadProjectRequest();
|
|
}
|
|
|
|
function allExtensionsReady() {
|
|
for (const e of extensions) {
|
|
if (e.activate === NO_OP) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function activateAllExtensions() {
|
|
for (const e of extensions) {
|
|
e.activate(ctx);
|
|
}
|
|
}
|
|
|
|
services.extension = {
|
|
registerExtension,
|
|
allExtensions: extensions,
|
|
extensionReady,
|
|
allExtensionsReady,
|
|
activateAllExtensions
|
|
};
|
|
|
|
extensions.forEach(e => e.activate = NO_OP);
|
|
extensions.forEach(loadExtension);
|
|
}
|
|
|
|
function loadExtension({id, url}) {
|
|
console.info(`starting extension "${id}"...`);
|
|
|
|
const extensionScript = document.createElement('script');
|
|
extensionScript.setAttribute('src', url);
|
|
document.head.appendChild(extensionScript);
|
|
}
|
|
|
|
const NO_OP = () => null; |