@theia/plugin-ext 1.74.0-next.35 → 1.74.0-next.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,13 +13,14 @@ export declare class HostedPluginReader implements BackendApplicationContributio
13
13
  protected pluginsIdsFiles: Map<string, string>;
14
14
  configure(app: express.Application): void;
15
15
  /**
16
- * Resolves a plugin file path with fallback to .js and .cjs extensions.
17
- *
18
- * This handles cases where plugins reference modules without extensions,
19
- * which is common in Node.js/CommonJS environments.
16
+ * Resolves `filePath` under `localPath`, with fallback to `.js`, `.cjs` and `.mjs`
17
+ * extensions. Returns `undefined` if the resolved path is not under `localPath`
18
+ * or if no candidate exists on disk.
20
19
  *
20
+ * The extension fallback handles cases where plugins reference modules without
21
+ * extensions, which is common in Node.js/CommonJS environments.
21
22
  */
22
- protected resolveFile(absolutePath: string): Promise<string | undefined>;
23
+ protected resolveFile(localPath: string, filePath: string): Promise<string | undefined>;
23
24
  protected handleMissingResource(req: express.Request, res: express.Response): Promise<void>;
24
25
  /**
25
26
  * @throws never
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-reader.d.ts","sourceRoot":"","sources":["../../../src/hosted/node/plugin-reader.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAkC,aAAa,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACjI,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,qBACa,kBAAmB,YAAW,8BAA8B;IAGrE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAGnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAGZ,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsB;IAEzF;;OAEG;IACH,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAE3D,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI;IAoCzC;;;;;;OAMG;cACa,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;cAwB9D,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjG;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAUtF,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAa/E,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAoB5D,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAKtF,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;CAK3E"}
1
+ {"version":3,"file":"plugin-reader.d.ts","sourceRoot":"","sources":["../../../src/hosted/node/plugin-reader.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAkC,aAAa,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACjI,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,qBACa,kBAAmB,YAAW,8BAA8B;IAGrE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAGnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAGZ,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsB;IAEzF;;OAEG;IACH,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAE3D,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI;IAmCzC;;;;;;;OAOG;cACa,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;cAiC7E,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjG;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAUtF,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAa/E,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAoB5D,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAKtF,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;CAK3E"}
@@ -38,8 +38,7 @@ let HostedPluginReader = class HostedPluginReader {
38
38
  const filePath = req.params.path;
39
39
  const localPath = this.pluginsIdsFiles.get(pluginId);
40
40
  if (localPath) {
41
- const absolutePath = path.resolve(localPath, filePath);
42
- const resolvedFile = await this.resolveFile(absolutePath);
41
+ const resolvedFile = await this.resolveFile(localPath, filePath);
43
42
  if (!resolvedFile) {
44
43
  res.status(404).send(`No such file found in '${escape_html(pluginId)}' plugin.`);
45
44
  return;
@@ -69,13 +68,21 @@ let HostedPluginReader = class HostedPluginReader {
69
68
  });
70
69
  }
71
70
  /**
72
- * Resolves a plugin file path with fallback to .js and .cjs extensions.
73
- *
74
- * This handles cases where plugins reference modules without extensions,
75
- * which is common in Node.js/CommonJS environments.
71
+ * Resolves `filePath` under `localPath`, with fallback to `.js`, `.cjs` and `.mjs`
72
+ * extensions. Returns `undefined` if the resolved path is not under `localPath`
73
+ * or if no candidate exists on disk.
76
74
  *
75
+ * The extension fallback handles cases where plugins reference modules without
76
+ * extensions, which is common in Node.js/CommonJS environments.
77
77
  */
78
- async resolveFile(absolutePath) {
78
+ async resolveFile(localPath, filePath) {
79
+ const absolutePath = path.resolve(localPath, filePath);
80
+ // `path.relative` yields a path starting with '..' (or an absolute path on
81
+ // Windows when the drive differs) when `absolutePath` is not under `localPath`.
82
+ const relativePath = path.relative(localPath, absolutePath);
83
+ if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
84
+ return undefined;
85
+ }
79
86
  const candidates = [absolutePath];
80
87
  const pathExtension = path.extname(absolutePath).toLowerCase();
81
88
  if (!pathExtension) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-reader.js","sourceRoot":"","sources":["../../../src/hosted/node/plugin-reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-reader.js","sourceRoot":"","sources":["../../../src/hosted/node/plugin-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-reader.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-reader.spec.d.ts","sourceRoot":"","sources":["../../../src/hosted/node/plugin-reader.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const chai_1 = require("chai");
19
+ const fs = require("fs");
20
+ const os = require("os");
21
+ const path = require("path");
22
+ const plugin_reader_1 = require("./plugin-reader");
23
+ class TestHostedPluginReader extends plugin_reader_1.HostedPluginReader {
24
+ resolve(localPath, filePath) {
25
+ return this.resolveFile(localPath, filePath);
26
+ }
27
+ }
28
+ describe('HostedPluginReader#resolveFile', () => {
29
+ let pluginDir;
30
+ let nearSiblingFile;
31
+ let farSiblingFile;
32
+ const reader = new TestHostedPluginReader();
33
+ before(() => {
34
+ // Layout:
35
+ // <root>/far-sibling.txt (reachable via `../../far-sibling.txt`)
36
+ // <root>/wrapper/sibling.txt (reachable via `../sibling.txt`)
37
+ // <root>/wrapper/plugin/ (pluginDir)
38
+ // ├── main.js
39
+ // └── media/icon.png
40
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'theia-plugin-reader-'));
41
+ const wrapper = path.join(root, 'wrapper');
42
+ pluginDir = path.join(wrapper, 'plugin');
43
+ fs.mkdirSync(pluginDir, { recursive: true });
44
+ fs.writeFileSync(path.join(pluginDir, 'main.js'), 'console.log("ok");');
45
+ fs.mkdirSync(path.join(pluginDir, 'media'));
46
+ fs.writeFileSync(path.join(pluginDir, 'media', 'icon.png'), 'png');
47
+ nearSiblingFile = path.join(wrapper, 'sibling.txt');
48
+ fs.writeFileSync(nearSiblingFile, 'near');
49
+ farSiblingFile = path.join(root, 'far-sibling.txt');
50
+ fs.writeFileSync(farSiblingFile, 'far');
51
+ });
52
+ it('serves a file inside the plugin directory', async () => {
53
+ (0, chai_1.expect)(await reader.resolve(pluginDir, 'main.js')).to.equal(path.join(pluginDir, 'main.js'));
54
+ (0, chai_1.expect)(await reader.resolve(pluginDir, 'media/icon.png')).to.equal(path.join(pluginDir, 'media', 'icon.png'));
55
+ });
56
+ it('resolves extensionless references with the .js fallback', async () => {
57
+ (0, chai_1.expect)(await reader.resolve(pluginDir, 'main')).to.equal(path.join(pluginDir, 'main.js'));
58
+ });
59
+ it('returns undefined for a relative path pointing outside the plugin directory', async () => {
60
+ (0, chai_1.expect)(await reader.resolve(pluginDir, '../sibling.txt')).to.be.undefined;
61
+ });
62
+ it('returns undefined for a relative path composed of parent-directory segments', async () => {
63
+ (0, chai_1.expect)(await reader.resolve(pluginDir, '../../far-sibling.txt')).to.be.undefined;
64
+ });
65
+ it('returns undefined for an absolute path outside the plugin directory', async () => {
66
+ (0, chai_1.expect)(await reader.resolve(pluginDir, nearSiblingFile)).to.be.undefined;
67
+ });
68
+ it('returns undefined for a missing file inside the plugin directory', async () => {
69
+ (0, chai_1.expect)(await reader.resolve(pluginDir, 'does-not-exist.js')).to.be.undefined;
70
+ });
71
+ });
72
+ //# sourceMappingURL=plugin-reader.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-reader.spec.js","sourceRoot":"","sources":["../../../src/hosted/node/plugin-reader.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,39 +1,39 @@
1
1
  {
2
2
  "name": "@theia/plugin-ext",
3
- "version": "1.74.0-next.35+9ecf480ca",
3
+ "version": "1.74.0-next.44+a2edcb58b",
4
4
  "description": "Theia - Plugin Extension",
5
5
  "main": "lib/common/index.js",
6
6
  "typings": "lib/common/index.d.ts",
7
7
  "dependencies": {
8
- "@theia/ai-core": "1.74.0-next.35+9ecf480ca",
9
- "@theia/ai-mcp": "1.74.0-next.35+9ecf480ca",
10
- "@theia/bulk-edit": "1.74.0-next.35+9ecf480ca",
11
- "@theia/callhierarchy": "1.74.0-next.35+9ecf480ca",
12
- "@theia/console": "1.74.0-next.35+9ecf480ca",
13
- "@theia/core": "1.74.0-next.35+9ecf480ca",
14
- "@theia/debug": "1.74.0-next.35+9ecf480ca",
15
- "@theia/editor": "1.74.0-next.35+9ecf480ca",
16
- "@theia/editor-preview": "1.74.0-next.35+9ecf480ca",
17
- "@theia/file-search": "1.74.0-next.35+9ecf480ca",
18
- "@theia/filesystem": "1.74.0-next.35+9ecf480ca",
19
- "@theia/markers": "1.74.0-next.35+9ecf480ca",
20
- "@theia/messages": "1.74.0-next.35+9ecf480ca",
21
- "@theia/monaco": "1.74.0-next.35+9ecf480ca",
8
+ "@theia/ai-core": "1.74.0-next.44+a2edcb58b",
9
+ "@theia/ai-mcp": "1.74.0-next.44+a2edcb58b",
10
+ "@theia/bulk-edit": "1.74.0-next.44+a2edcb58b",
11
+ "@theia/callhierarchy": "1.74.0-next.44+a2edcb58b",
12
+ "@theia/console": "1.74.0-next.44+a2edcb58b",
13
+ "@theia/core": "1.74.0-next.44+a2edcb58b",
14
+ "@theia/debug": "1.74.0-next.44+a2edcb58b",
15
+ "@theia/editor": "1.74.0-next.44+a2edcb58b",
16
+ "@theia/editor-preview": "1.74.0-next.44+a2edcb58b",
17
+ "@theia/file-search": "1.74.0-next.44+a2edcb58b",
18
+ "@theia/filesystem": "1.74.0-next.44+a2edcb58b",
19
+ "@theia/markers": "1.74.0-next.44+a2edcb58b",
20
+ "@theia/messages": "1.74.0-next.44+a2edcb58b",
21
+ "@theia/monaco": "1.74.0-next.44+a2edcb58b",
22
22
  "@theia/monaco-editor-core": "1.108.201",
23
- "@theia/navigator": "1.74.0-next.35+9ecf480ca",
24
- "@theia/notebook": "1.74.0-next.35+9ecf480ca",
25
- "@theia/output": "1.74.0-next.35+9ecf480ca",
26
- "@theia/plugin": "1.74.0-next.35+9ecf480ca",
27
- "@theia/preferences": "1.74.0-next.35+9ecf480ca",
28
- "@theia/scm": "1.74.0-next.35+9ecf480ca",
29
- "@theia/search-in-workspace": "1.74.0-next.35+9ecf480ca",
30
- "@theia/task": "1.74.0-next.35+9ecf480ca",
31
- "@theia/terminal": "1.74.0-next.35+9ecf480ca",
32
- "@theia/test": "1.74.0-next.35+9ecf480ca",
33
- "@theia/timeline": "1.74.0-next.35+9ecf480ca",
34
- "@theia/typehierarchy": "1.74.0-next.35+9ecf480ca",
35
- "@theia/variable-resolver": "1.74.0-next.35+9ecf480ca",
36
- "@theia/workspace": "1.74.0-next.35+9ecf480ca",
23
+ "@theia/navigator": "1.74.0-next.44+a2edcb58b",
24
+ "@theia/notebook": "1.74.0-next.44+a2edcb58b",
25
+ "@theia/output": "1.74.0-next.44+a2edcb58b",
26
+ "@theia/plugin": "1.74.0-next.44+a2edcb58b",
27
+ "@theia/preferences": "1.74.0-next.44+a2edcb58b",
28
+ "@theia/scm": "1.74.0-next.44+a2edcb58b",
29
+ "@theia/search-in-workspace": "1.74.0-next.44+a2edcb58b",
30
+ "@theia/task": "1.74.0-next.44+a2edcb58b",
31
+ "@theia/terminal": "1.74.0-next.44+a2edcb58b",
32
+ "@theia/test": "1.74.0-next.44+a2edcb58b",
33
+ "@theia/timeline": "1.74.0-next.44+a2edcb58b",
34
+ "@theia/typehierarchy": "1.74.0-next.44+a2edcb58b",
35
+ "@theia/variable-resolver": "1.74.0-next.44+a2edcb58b",
36
+ "@theia/workspace": "1.74.0-next.44+a2edcb58b",
37
37
  "@types/mime": "^2.0.3",
38
38
  "@vscode/debugprotocol": "^1.68.0",
39
39
  "@vscode/proxy-agent": "^0.13.2",
@@ -98,5 +98,5 @@
98
98
  "nyc": {
99
99
  "extends": "../../configs/nyc.json"
100
100
  },
101
- "gitHead": "9ecf480caa3af5c4f78af906654a88948f477b34"
101
+ "gitHead": "a2edcb58ba5792bb20b3d604b98e1920a219bb2e"
102
102
  }
@@ -0,0 +1,80 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2026 EclipseSource and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { expect } from 'chai';
18
+ import * as fs from 'fs';
19
+ import * as os from 'os';
20
+ import * as path from 'path';
21
+ import { HostedPluginReader } from './plugin-reader';
22
+
23
+ class TestHostedPluginReader extends HostedPluginReader {
24
+ resolve(localPath: string, filePath: string): Promise<string | undefined> {
25
+ return this.resolveFile(localPath, filePath);
26
+ }
27
+ }
28
+
29
+ describe('HostedPluginReader#resolveFile', () => {
30
+
31
+ let pluginDir: string;
32
+ let nearSiblingFile: string;
33
+ let farSiblingFile: string;
34
+ const reader = new TestHostedPluginReader();
35
+
36
+ before(() => {
37
+ // Layout:
38
+ // <root>/far-sibling.txt (reachable via `../../far-sibling.txt`)
39
+ // <root>/wrapper/sibling.txt (reachable via `../sibling.txt`)
40
+ // <root>/wrapper/plugin/ (pluginDir)
41
+ // ├── main.js
42
+ // └── media/icon.png
43
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'theia-plugin-reader-'));
44
+ const wrapper = path.join(root, 'wrapper');
45
+ pluginDir = path.join(wrapper, 'plugin');
46
+ fs.mkdirSync(pluginDir, { recursive: true });
47
+ fs.writeFileSync(path.join(pluginDir, 'main.js'), 'console.log("ok");');
48
+ fs.mkdirSync(path.join(pluginDir, 'media'));
49
+ fs.writeFileSync(path.join(pluginDir, 'media', 'icon.png'), 'png');
50
+ nearSiblingFile = path.join(wrapper, 'sibling.txt');
51
+ fs.writeFileSync(nearSiblingFile, 'near');
52
+ farSiblingFile = path.join(root, 'far-sibling.txt');
53
+ fs.writeFileSync(farSiblingFile, 'far');
54
+ });
55
+
56
+ it('serves a file inside the plugin directory', async () => {
57
+ expect(await reader.resolve(pluginDir, 'main.js')).to.equal(path.join(pluginDir, 'main.js'));
58
+ expect(await reader.resolve(pluginDir, 'media/icon.png')).to.equal(path.join(pluginDir, 'media', 'icon.png'));
59
+ });
60
+
61
+ it('resolves extensionless references with the .js fallback', async () => {
62
+ expect(await reader.resolve(pluginDir, 'main')).to.equal(path.join(pluginDir, 'main.js'));
63
+ });
64
+
65
+ it('returns undefined for a relative path pointing outside the plugin directory', async () => {
66
+ expect(await reader.resolve(pluginDir, '../sibling.txt')).to.be.undefined;
67
+ });
68
+
69
+ it('returns undefined for a relative path composed of parent-directory segments', async () => {
70
+ expect(await reader.resolve(pluginDir, '../../far-sibling.txt')).to.be.undefined;
71
+ });
72
+
73
+ it('returns undefined for an absolute path outside the plugin directory', async () => {
74
+ expect(await reader.resolve(pluginDir, nearSiblingFile)).to.be.undefined;
75
+ });
76
+
77
+ it('returns undefined for a missing file inside the plugin directory', async () => {
78
+ expect(await reader.resolve(pluginDir, 'does-not-exist.js')).to.be.undefined;
79
+ });
80
+ });
@@ -49,8 +49,7 @@ export class HostedPluginReader implements BackendApplicationContribution {
49
49
 
50
50
  const localPath = this.pluginsIdsFiles.get(pluginId);
51
51
  if (localPath) {
52
- const absolutePath = path.resolve(localPath, filePath);
53
- const resolvedFile = await this.resolveFile(absolutePath);
52
+ const resolvedFile = await this.resolveFile(localPath, filePath);
54
53
  if (!resolvedFile) {
55
54
  res.status(404).send(`No such file found in '${escape_html(pluginId)}' plugin.`);
56
55
  return;
@@ -79,13 +78,23 @@ export class HostedPluginReader implements BackendApplicationContribution {
79
78
  }
80
79
 
81
80
  /**
82
- * Resolves a plugin file path with fallback to .js and .cjs extensions.
83
- *
84
- * This handles cases where plugins reference modules without extensions,
85
- * which is common in Node.js/CommonJS environments.
81
+ * Resolves `filePath` under `localPath`, with fallback to `.js`, `.cjs` and `.mjs`
82
+ * extensions. Returns `undefined` if the resolved path is not under `localPath`
83
+ * or if no candidate exists on disk.
86
84
  *
85
+ * The extension fallback handles cases where plugins reference modules without
86
+ * extensions, which is common in Node.js/CommonJS environments.
87
87
  */
88
- protected async resolveFile(absolutePath: string): Promise<string | undefined> {
88
+ protected async resolveFile(localPath: string, filePath: string): Promise<string | undefined> {
89
+ const absolutePath = path.resolve(localPath, filePath);
90
+
91
+ // `path.relative` yields a path starting with '..' (or an absolute path on
92
+ // Windows when the drive differs) when `absolutePath` is not under `localPath`.
93
+ const relativePath = path.relative(localPath, absolutePath);
94
+ if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
95
+ return undefined;
96
+ }
97
+
89
98
  const candidates = [absolutePath];
90
99
  const pathExtension = path.extname(absolutePath).toLowerCase();
91
100