diff --git a/packages/plugin-ext-vscode/src/node/scanner-vscode.ts b/packages/plugin-ext-vscode/src/node/scanner-vscode.ts index 0a486d348bdd6..6f16ded66af85 100644 --- a/packages/plugin-ext-vscode/src/node/scanner-vscode.ts +++ b/packages/plugin-ext-vscode/src/node/scanner-vscode.ts @@ -63,6 +63,6 @@ export class VsCodePluginScanner extends TheiaPluginScanner implements PluginSca * to an array of deployable extension dependencies */ private getDeployableDependencies(dependencies: string[]): string[] { - return dependencies.map(dep => this.VSCODE_PREFIX + dep); + return dependencies.map(dep => this.VSCODE_PREFIX + dep.toLowerCase()); } } diff --git a/packages/plugin-ext/src/common/plugin-protocol.ts b/packages/plugin-ext/src/common/plugin-protocol.ts index 1bb8e317c00cb..0db4e0f0be4ff 100644 --- a/packages/plugin-ext/src/common/plugin-protocol.ts +++ b/packages/plugin-ext/src/common/plugin-protocol.ts @@ -377,6 +377,10 @@ export interface PluginModel { backend?: string; }; contributes?: PluginContribution; + /** + * The deployable form of extensionDependencies from package.json, + * i.e. not `publisher.name`, but `vscode:extension/publisher.name`. + */ extensionDependencies?: string[]; } diff --git a/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts b/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts index d572a05aa9e00..8f3613eed317c 100644 --- a/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts +++ b/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts @@ -114,27 +114,40 @@ export class PluginDeployerImpl implements PluginDeployer { const queue = [...pluginEntries]; while (queue.length) { - const current = queue.shift()!; - if (visited.has(current)) { - continue; + const chunk = []; + while (queue.length) { + const current = queue.shift()!; + if (visited.has(current)) { + continue; + } + visited.add(current); + try { + const pluginDeployerEntries = await this.resolvePlugin(current); + await this.applyFileHandlers(pluginDeployerEntries); + await this.applyDirectoryFileHandlers(pluginDeployerEntries); + for (const deployerEntry of pluginDeployerEntries) { + const metadata = await this.pluginDeployerHandler.getPluginMetadata(deployerEntry); + if (metadata && !pluginsToDeploy.has(metadata.model.id)) { + pluginsToDeploy.set(metadata.model.id, deployerEntry); + chunk.push(metadata); + } + } + } catch (e) { + console.error(`Failed to resolve plugins from '${current}'`, e); + } } - visited.add(current); - - // resolve plugins - const pluginDeployerEntries = await this.resolvePlugin(current); - - // now that we have plugins check if we have File Handler for them - await this.applyFileHandlers(pluginDeployerEntries); - - // ok now ask for directory handlers - await this.applyDirectoryFileHandlers(pluginDeployerEntries); - - for (const deployerEntry of pluginDeployerEntries) { - const metadata = await this.pluginDeployerHandler.getPluginMetadata(deployerEntry); - if (metadata && !pluginsToDeploy.has(metadata.model.id)) { - pluginsToDeploy.set(metadata.model.id, deployerEntry); - if (metadata.model.extensionDependencies) { - queue.push(...metadata.model.extensionDependencies); + for (const metadata of chunk) { + const extensionDependencies = metadata.source.extensionDependencies; + const deployableExtensionDependencies = metadata.model.extensionDependencies; + if (extensionDependencies && deployableExtensionDependencies) { + for (let dependencyIndex = 0; dependencyIndex < extensionDependencies.length; dependencyIndex++) { + const dependencyId = extensionDependencies[dependencyIndex].toLowerCase(); + if (!pluginsToDeploy.has(dependencyId)) { + const deployableDependency = deployableExtensionDependencies[dependencyIndex]; + if (deployableDependency) { + queue.push(deployableDependency); + } + } } } } diff --git a/packages/plugin-ext/src/plugin/plugin-manager.ts b/packages/plugin-ext/src/plugin/plugin-manager.ts index bcd300e24a1c1..1088e684edd97 100644 --- a/packages/plugin-ext/src/plugin/plugin-manager.ts +++ b/packages/plugin-ext/src/plugin/plugin-manager.ts @@ -192,7 +192,7 @@ export class PluginManagerExtImpl implements PluginManagerExt, PluginManager { loading = (async () => { if (plugin.rawModel.extensionDependencies) { for (const dependencyId of plugin.rawModel.extensionDependencies) { - const dependency = this.registry.get(dependencyId); + const dependency = this.registry.get(dependencyId.toLowerCase()); if (dependency) { await this.loadPlugin(dependency, configStorage, visited); } else {