Skip to content

Commit 9518fdf

Browse files
committed
fix: force plugin activation order
api plugin must start before any tool VSIX without explicitly updating the `extensionDependencies` with the API. Signed-off-by: dankeboy36 <[email protected]>
1 parent 58cfdfa commit 9518fdf

File tree

2 files changed

+41
-8
lines changed

2 files changed

+41
-8
lines changed

Diff for: arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts

+40-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { Emitter, Event, JsonRpcProxy } from '@theia/core';
1+
import { DisposableCollection } from '@theia/core/lib/common/disposable';
2+
import { Emitter, Event } from '@theia/core/lib/common/event';
23
import { injectable, interfaces } from '@theia/core/shared/inversify';
3-
import { HostedPluginServer } from '@theia/plugin-ext/lib/common/plugin-protocol';
4-
import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin';
4+
import {
5+
PluginContributions,
6+
HostedPluginSupport as TheiaHostedPluginSupport,
7+
} from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin';
58

69
@injectable()
710
export class HostedPluginSupport extends TheiaHostedPluginSupport {
@@ -10,7 +13,7 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport {
1013

1114
override onStart(container: interfaces.Container): void {
1215
super.onStart(container);
13-
this.hostedPluginServer.onDidCloseConnection(() =>
16+
this['server'].onDidCloseConnection(() =>
1417
this.onDidCloseConnectionEmitter.fire()
1518
);
1619
}
@@ -28,8 +31,38 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport {
2831
return this.onDidCloseConnectionEmitter.event;
2932
}
3033

31-
private get hostedPluginServer(): JsonRpcProxy<HostedPluginServer> {
32-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
33-
return (this as any).server;
34+
protected override startPlugins(
35+
contributionsByHost: Map<string, PluginContributions[]>,
36+
toDisconnect: DisposableCollection
37+
): Promise<void> {
38+
reorderPlugins(contributionsByHost);
39+
return super.startPlugins(contributionsByHost, toDisconnect);
3440
}
3541
}
42+
43+
/**
44+
* Force the `vscode-arduino-ide` API to activate before any Arduino IDE tool VSIX.
45+
*
46+
* Arduino IDE tool VISXs are not forced to declare the `vscode-arduino-api` as a `extensionDependencies`,
47+
* but the API must activate before any tools. This in place sorting helps to bypass Theia's plugin resolution
48+
* without forcing tools developers to add `vscode-arduino-api` to the `extensionDependencies`.
49+
*/
50+
function reorderPlugins(
51+
contributionsByHost: Map<string, PluginContributions[]>
52+
): void {
53+
for (const [, contributions] of contributionsByHost) {
54+
const apiPluginIndex = contributions.findIndex(isArduinoAPI);
55+
if (apiPluginIndex >= 0) {
56+
const apiPlugin = contributions[apiPluginIndex];
57+
contributions.splice(apiPluginIndex, 1);
58+
contributions.unshift(apiPlugin);
59+
}
60+
}
61+
}
62+
63+
function isArduinoAPI(pluginContribution: PluginContributions): boolean {
64+
return (
65+
pluginContribution.plugin.metadata.model.id ===
66+
'dankeboy36.vscode-arduino-api'
67+
);
68+
}

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"watch": "lerna run watch --parallel",
4444
"test": "lerna run test",
4545
"test:slow": "lerna run test:slow",
46-
"download:plugins": "theia download:plugins --ignore-errors",
46+
"download:plugins": "theia download:plugins",
4747
"update:version": "node ./scripts/update-version.js",
4848
"i18n:generate": "theia nls-extract -e vscode -f \"+(arduino-ide-extension|electron-app|plugins)/**/*.ts?(x)\" -o ./i18n/en.json",
4949
"i18n:check": "yarn i18n:generate && git add -N ./i18n && git diff --exit-code ./i18n",

0 commit comments

Comments
 (0)