jsketcher/web/app/cad/craft/extensionsBundle.js
2022-08-15 23:47:20 -07:00

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;