Plugins: Introduce magic modules to fe sandbox loader (#89274)

* feat(fe-sandbox): introduce module and exports magic modules to executed plugin code

* refactor(fe-sandbox): rename module and exports vars for clarity
pull/89535/head
Jack Westbrook 11 months ago committed by GitHub
parent f0ff7d57b4
commit e5474511d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 34
      public/app/features/plugins/sandbox/sandbox_plugin_loader.ts

@ -162,7 +162,7 @@ async function doImportPluginModuleInSandbox(meta: SandboxPluginMeta): Promise<S
}
try {
const resolvedDeps = resolvePluginDependencies(dependencies, meta.id);
const resolvedDeps = resolvePluginDependencies(dependencies, meta);
// execute the plugin's code
const pluginExportsRaw = factory.apply(null, resolvedDeps);
// only after the plugin has been executed
@ -213,7 +213,21 @@ async function doImportPluginModuleInSandbox(meta: SandboxPluginMeta): Promise<S
});
}
function resolvePluginDependencies(deps: string[], pluginId: string) {
/**
*
* This function resolves the dependencies using the array of AMD deps.
* Additionally it supports the RequireJS magic modules `module` and `exports`.
* https://github.com/requirejs/requirejs/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define#magic
*
*/
function resolvePluginDependencies(deps: string[], pluginMeta: SandboxPluginMeta) {
const pluginExports = {};
const pluginModuleDep: ModuleMeta = {
id: pluginMeta.id,
uri: pluginMeta.module,
exports: pluginExports,
};
// resolve dependencies
const resolvedDeps: CompartmentDependencyModule[] = [];
for (const dep of deps) {
@ -222,10 +236,18 @@ function resolvePluginDependencies(deps: string[], pluginId: string) {
resolvedDep = resolvedDep.default;
}
if (dep === 'module') {
resolvedDep = pluginModuleDep;
}
if (dep === 'exports') {
resolvedDep = pluginExports;
}
if (!resolvedDep) {
const error = new Error(`[sandbox] Could not resolve dependency ${dep}`);
logError(error, {
pluginId,
pluginId: pluginMeta.id,
dependency: dep,
error: String(error),
});
@ -235,3 +257,9 @@ function resolvePluginDependencies(deps: string[], pluginId: string) {
}
return resolvedDeps;
}
interface ModuleMeta {
id: string;
uri: string;
exports: System.Module;
}

Loading…
Cancel
Save