@theia/plugin-ext-vscode 1.70.0-next.6 → 1.70.0-next.61

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.
@@ -1 +1 @@
1
- {"version":3,"file":"local-vsix-file-plugin-deployer-resolver.d.ts","sourceRoot":"","sources":["../../src/node/local-vsix-file-plugin-deployer-resolver.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0EAA0E,CAAC;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAI9E,qBACa,mCAAoC,SAAQ,2BAA2B;IAChF,MAAM,CAAC,UAAU,SAAgB;IACjC,MAAM,CAAC,cAAc,SAAW;IAEC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAEzF,SAAS,KAAK,eAAe,IAAI,MAAM,CAEtC;IAEQ,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC,oBAAoB,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWrH"}
1
+ {"version":3,"file":"local-vsix-file-plugin-deployer-resolver.d.ts","sourceRoot":"","sources":["../../src/node/local-vsix-file-plugin-deployer-resolver.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,6BAA6B,EAAqB,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,0EAA0E,CAAC;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAI9E,qBACa,mCAAoC,SAAQ,2BAA2B;IAChF,MAAM,CAAC,UAAU,SAAgB;IACjC,MAAM,CAAC,cAAc,SAAW;IAEC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAEzF,SAAS,KAAK,eAAe,IAAI,MAAM,CAEtC;IAEQ,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC,oBAAoB,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAqCrH"}
@@ -20,6 +20,7 @@ exports.LocalVSIXFilePluginDeployerResolver = void 0;
20
20
  const tslib_1 = require("tslib");
21
21
  const path = require("path");
22
22
  const inversify_1 = require("@theia/core/shared/inversify");
23
+ const plugin_ext_1 = require("@theia/plugin-ext");
23
24
  const local_plugin_deployer_resolver_1 = require("@theia/plugin-ext/lib/main/node/resolvers/local-plugin-deployer-resolver");
24
25
  const plugin_vscode_environment_1 = require("../common/plugin-vscode-environment");
25
26
  const plugin_vscode_file_handler_1 = require("./plugin-vscode-file-handler");
@@ -35,13 +36,33 @@ let LocalVSIXFilePluginDeployerResolver = class LocalVSIXFilePluginDeployerResol
35
36
  return super.accept(pluginId) && (0, plugin_vscode_file_handler_1.isVSCodePluginFile)(pluginId);
36
37
  }
37
38
  async resolveFromLocalPath(pluginResolverContext, localPath) {
38
- const extensionId = path.basename(localPath, LocalVSIXFilePluginDeployerResolver_1.FILE_EXTENSION);
39
- if (await (0, plugin_vscode_utils_1.existsInDeploymentDir)(this.environment, extensionId)) {
40
- console.log(`[${pluginResolverContext.getOriginId()}]: Target dir already exists in plugin deployment dir`);
39
+ // Extract the true extension identity from the VSIX package.json
40
+ // This prevents duplicate installations when the same extension is installed from VSIX files with different filenames
41
+ // See: https://github.com/eclipse-theia/theia/issues/16845
42
+ const components = await (0, plugin_vscode_utils_1.extractExtensionIdentityFromVsix)(localPath);
43
+ if (!components) {
44
+ // Fallback to filename-based ID if package.json cannot be read
45
+ // This maintains backward compatibility for edge cases
46
+ const fallbackId = path.basename(localPath, LocalVSIXFilePluginDeployerResolver_1.FILE_EXTENSION);
47
+ console.warn(`[${pluginResolverContext.getOriginId()}]: Could not read extension identity from VSIX, falling back to filename: ${fallbackId}`);
48
+ if (await (0, plugin_vscode_utils_1.existsInDeploymentDir)(this.environment, fallbackId)) {
49
+ console.log(`[${pluginResolverContext.getOriginId()}]: Target dir already exists in plugin deployment dir`);
50
+ return;
51
+ }
52
+ const fallbackDeploymentDir = await (0, plugin_vscode_utils_1.unpackToDeploymentDir)(this.environment, localPath, fallbackId);
53
+ pluginResolverContext.addPlugin(fallbackId, fallbackDeploymentDir);
41
54
  return;
42
55
  }
43
- const extensionDeploymentDir = await (0, plugin_vscode_utils_1.unpackToDeploymentDir)(this.environment, localPath, extensionId);
44
- pluginResolverContext.addPlugin(extensionId, extensionDeploymentDir);
56
+ const versionedId = plugin_ext_1.PluginIdentifiers.componentsToVersionedId(components);
57
+ // Check if the deployment directory already exists on disk
58
+ if (await (0, plugin_vscode_utils_1.existsInDeploymentDir)(this.environment, versionedId)) {
59
+ const unversionedId = plugin_ext_1.PluginIdentifiers.componentsToUnversionedId(components);
60
+ const error = new Error(`Extension ${unversionedId} is already installed (version: ${components.version}).`);
61
+ error.name = 'DuplicateExtensionError';
62
+ throw error;
63
+ }
64
+ const extensionDeploymentDir = await (0, plugin_vscode_utils_1.unpackToDeploymentDir)(this.environment, localPath, versionedId);
65
+ pluginResolverContext.addPlugin(versionedId, extensionDeploymentDir);
45
66
  }
46
67
  };
47
68
  exports.LocalVSIXFilePluginDeployerResolver = LocalVSIXFilePluginDeployerResolver;
@@ -1 +1 @@
1
- {"version":3,"file":"local-vsix-file-plugin-deployer-resolver.js","sourceRoot":"","sources":["../../src/node/local-vsix-file-plugin-deployer-resolver.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;AAEhF,6BAA6B;AAC7B,4DAAkE;AAElE,6HAAuH;AACvH,mFAA8E;AAC9E,6EAAkE;AAClE,+DAAqF;AAG9E,IAAM,mCAAmC,GAAzC,MAAM,mCAAoC,SAAQ,4DAA2B;;aACzE,eAAU,GAAG,YAAY,AAAf,CAAgB;aAC1B,mBAAc,GAAG,OAAO,AAAV,CAAW;IAIhC,IAAc,eAAe;QACzB,OAAO,qCAAmC,CAAC,UAAU,CAAC;IAC1D,CAAC;IAEQ,MAAM,CAAC,QAAgB;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAA,+CAAkB,EAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,qBAAoD,EAAE,SAAiB;QAC9F,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,qCAAmC,CAAC,cAAc,CAAC,CAAC;QAEjG,IAAI,MAAM,IAAA,2CAAqB,EAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,WAAW,EAAE,uDAAuD,CAAC,CAAC;YAC5G,OAAO;QACX,CAAC;QAED,MAAM,sBAAsB,GAAG,MAAM,IAAA,2CAAqB,EAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACrG,qBAAqB,CAAC,SAAS,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IACzE,CAAC;;AAxBQ,kFAAmC;AAIQ;IAAnD,IAAA,kBAAM,EAAC,mDAAuB,CAAC;sCAAiC,mDAAuB;wEAAC;8CAJhF,mCAAmC;IAD/C,IAAA,sBAAU,GAAE;GACA,mCAAmC,CAyB/C"}
1
+ {"version":3,"file":"local-vsix-file-plugin-deployer-resolver.js","sourceRoot":"","sources":["../../src/node/local-vsix-file-plugin-deployer-resolver.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;AAEhF,6BAA6B;AAC7B,4DAAkE;AAClE,kDAAqF;AACrF,6HAAuH;AACvH,mFAA8E;AAC9E,6EAAkE;AAClE,+DAAuH;AAGhH,IAAM,mCAAmC,GAAzC,MAAM,mCAAoC,SAAQ,4DAA2B;;aACzE,eAAU,GAAG,YAAY,AAAf,CAAgB;aAC1B,mBAAc,GAAG,OAAO,AAAV,CAAW;IAIhC,IAAc,eAAe;QACzB,OAAO,qCAAmC,CAAC,UAAU,CAAC;IAC1D,CAAC;IAEQ,MAAM,CAAC,QAAgB;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAA,+CAAkB,EAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,qBAAoD,EAAE,SAAiB;QAC9F,iEAAiE;QACjE,sHAAsH;QACtH,2DAA2D;QAC3D,MAAM,UAAU,GAAG,MAAM,IAAA,sDAAgC,EAAC,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,+DAA+D;YAC/D,uDAAuD;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,qCAAmC,CAAC,cAAc,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,WAAW,EAAE,6EAA6E,UAAU,EAAE,CAAC,CAAC;YAE/I,IAAI,MAAM,IAAA,2CAAqB,EAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,WAAW,EAAE,uDAAuD,CAAC,CAAC;gBAC5G,OAAO;YACX,CAAC;YAED,MAAM,qBAAqB,GAAG,MAAM,IAAA,2CAAqB,EAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACnG,qBAAqB,CAAC,SAAS,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;YACnE,OAAO;QACX,CAAC;QAED,MAAM,WAAW,GAAG,8BAAiB,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAE1E,2DAA2D;QAC3D,IAAI,MAAM,IAAA,2CAAqB,EAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;YAC7D,MAAM,aAAa,GAAG,8BAAiB,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,IAAI,KAAK,CACnB,aAAa,aAAa,mCAAmC,UAAU,CAAC,OAAO,IAAI,CACtF,CAAC;YACF,KAAK,CAAC,IAAI,GAAG,yBAAyB,CAAC;YACvC,MAAM,KAAK,CAAC;QAChB,CAAC;QAED,MAAM,sBAAsB,GAAG,MAAM,IAAA,2CAAqB,EAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACrG,qBAAqB,CAAC,SAAS,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IACzE,CAAC;;AAlDQ,kFAAmC;AAIQ;IAAnD,IAAA,kBAAM,EAAC,mDAAuB,CAAC;sCAAiC,mDAAuB;wEAAC;8CAJhF,mCAAmC;IAD/C,IAAA,sBAAU,GAAE;GACA,mCAAmC,CAmD/C"}
@@ -1,4 +1,15 @@
1
1
  import { PluginVSCodeEnvironment } from '../common/plugin-vscode-environment';
2
+ import { PluginIdentifiers } from '@theia/plugin-ext/lib/common/plugin-protocol';
3
+ /**
4
+ * Extracts extension identity from a VSIX file by reading its package.json.
5
+ *
6
+ * VSIX files are ZIP archives with the extension content in an `extension/` subdirectory.
7
+ * This function extracts only the `extension/package.json` file to read the extension metadata.
8
+ *
9
+ * @param vsixPath Path to the VSIX file
10
+ * @returns PluginIdentifiers.Components (publisher?, name, version), or undefined if the package.json cannot be read or is invalid
11
+ */
12
+ export declare function extractExtensionIdentityFromVsix(vsixPath: string): Promise<PluginIdentifiers.Components | undefined>;
2
13
  export declare function decompressExtension(sourcePath: string, destPath: string): Promise<boolean>;
3
14
  export declare function existsInDeploymentDir(env: PluginVSCodeEnvironment, extensionId: string): Promise<boolean>;
4
15
  export declare const TMP_DIR_PREFIX = "tmp-vscode-unpacked-";
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-vscode-utils.d.ts","sourceRoot":"","sources":["../../src/node/plugin-vscode-utils.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBhG;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/G;AAED,eAAO,MAAM,cAAc,yBAAyB,CAAC;AACrD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiClI;AAED,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlH;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9F"}
1
+ {"version":3,"file":"plugin-vscode-utils.d.ts","sourceRoot":"","sources":["../../src/node/plugin-vscode-utils.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAiB,MAAM,8CAA8C,CAAC;AAEhG;;;;;;;;GAQG;AACH,wBAAsB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,GAAG,SAAS,CAAC,CAgC1H;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBhG;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/G;AAED,eAAO,MAAM,cAAc,yBAAyB,CAAC;AACrD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiClI;AAED,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlH;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9F"}
@@ -16,6 +16,7 @@
16
16
  // *****************************************************************************
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.TMP_DIR_PREFIX = void 0;
19
+ exports.extractExtensionIdentityFromVsix = extractExtensionIdentityFromVsix;
19
20
  exports.decompressExtension = decompressExtension;
20
21
  exports.existsInDeploymentDir = existsInDeploymentDir;
21
22
  exports.unpackToDeploymentDir = unpackToDeploymentDir;
@@ -26,6 +27,44 @@ const path = require("path");
26
27
  const filenamify = require("filenamify");
27
28
  const node_1 = require("@theia/core/lib/node");
28
29
  const fs = require("@theia/core/shared/fs-extra");
30
+ /**
31
+ * Extracts extension identity from a VSIX file by reading its package.json.
32
+ *
33
+ * VSIX files are ZIP archives with the extension content in an `extension/` subdirectory.
34
+ * This function extracts only the `extension/package.json` file to read the extension metadata.
35
+ *
36
+ * @param vsixPath Path to the VSIX file
37
+ * @returns PluginIdentifiers.Components (publisher?, name, version), or undefined if the package.json cannot be read or is invalid
38
+ */
39
+ async function extractExtensionIdentityFromVsix(vsixPath) {
40
+ try {
41
+ // Extract only the package.json file from the VSIX
42
+ const files = await decompress(vsixPath, {
43
+ filter: file => file.path === 'extension/package.json'
44
+ });
45
+ if (files.length === 0) {
46
+ console.warn(`[${vsixPath}]: No extension/package.json found in VSIX`);
47
+ return undefined;
48
+ }
49
+ const packageJsonContent = files[0].data.toString('utf8');
50
+ const packageJson = JSON.parse(packageJsonContent);
51
+ // Validate required fields
52
+ if (!packageJson.name || !packageJson.version) {
53
+ console.warn(`[${vsixPath}]: Invalid package.json - missing name or version`);
54
+ return undefined;
55
+ }
56
+ const components = {
57
+ publisher: packageJson.publisher,
58
+ name: packageJson.name,
59
+ version: packageJson.version
60
+ };
61
+ return components;
62
+ }
63
+ catch (error) {
64
+ console.error(`[${vsixPath}]: Failed to extract extension identity from VSIX`, error);
65
+ return undefined;
66
+ }
67
+ }
29
68
  async function decompressExtension(sourcePath, destPath) {
30
69
  try {
31
70
  await decompress(sourcePath, destPath);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-vscode-utils.js","sourceRoot":"","sources":["../../src/node/plugin-vscode-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-vscode-utils.js","sourceRoot":"","sources":["../../src/node/plugin-vscode-utils.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAmBhF,4EAgCC;AAED,kDAgBC;AAED,sDAEC;AAGD,sDAiCC;AAED,8DAKC;AAED,gCAYC;AAhID,yCAAyC;AACzC,6BAA6B;AAC7B,yCAAyC;AACzC,+CAA+C;AAC/C,kDAAkD;AAIlD;;;;;;;;GAQG;AACI,KAAK,UAAU,gCAAgC,CAAC,QAAgB;IACnE,IAAI,CAAC;QACD,mDAAmD;QACnD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,wBAAwB;SACzD,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,4CAA4C,CAAC,CAAC;YACvE,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,WAAW,GAA2B,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAE3E,2BAA2B;QAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,mDAAmD,CAAC,CAAC;YAC9E,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,MAAM,UAAU,GAAiC;YAC7C,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,OAAO,EAAE,WAAW,CAAC,OAAO;SAC/B,CAAC;QAEF,OAAO,UAAU,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,mDAAmD,EAAE,KAAK,CAAC,CAAC;QACtF,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,UAAkB,EAAE,QAAgB;IAC1E,IAAI,CAAC;QACD,MAAM,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,sGAAsG;YACtG,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrD,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC;YAClF,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC7C,MAAM,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;YACtF,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,UAAU,OAAO,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,GAA4B,EAAE,WAAmB;IACzF,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,yBAAyB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;AAC5E,CAAC;AAEY,QAAA,cAAc,GAAG,sBAAsB,CAAC;AAC9C,KAAK,UAAU,qBAAqB,CAAC,GAA4B,EAAE,UAAkB,EAAE,WAAmB;IAC7G,MAAM,sBAAsB,GAAG,MAAM,yBAAyB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACjF,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,sBAAsB,sBAAsB,kBAAkB,CAAC,CAAC;QAC3F,OAAO,sBAAsB,CAAC;IAClC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,sBAAc,CAAC,CAAC;IACtD,IAAI,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,4BAA4B,UAAU,WAAW,OAAO,MAAM,CAAC,CAAC;QAC3F,IAAI,CAAC,MAAM,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;YAClD,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,WAAW,qBAAqB,UAAU,SAAS,OAAO,UAAU,CAAC;YACrF,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,WAAW,iCAAiC,UAAU,SAAS,OAAO,GAAG,CAAC;QAC1F,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,gCAAgC,OAAO,GAAG,CAAC,CAAC;IAEvE,IAAI,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,iCAAiC,sBAAsB,MAAM,CAAC,CAAC;QAC1F,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;QACjD,OAAO,sBAAsB,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,4BAA4B,OAAO,SAAS,sBAAsB,GAAG,EAAE,CAAC,CAAC,CAAC;QACvG,MAAM,CAAC,CAAC;IACZ,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,yBAAyB,CAAC,GAA4B,EAAE,WAAmB;IAC7F,MAAM,qBAAqB,GAAG,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC;IAC9D,MAAM,qBAAqB,GAAG,UAAU,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,MAAM,0BAA0B,GAAG,cAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACxG,OAAO,0BAA0B,CAAC;AACtC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,GAA4B,EAAE,MAAc;IACzE,MAAM,iBAAiB,GAAG,cAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,2BAA2B,iBAAiB,EAAE,CAAC,CAAC;YAC5D,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,iBAAiB,KAAK,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"scanner-vscode.d.ts","sourceRoot":"","sources":["../../src/node/scanner-vscode.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAwE,MAAM,mBAAmB,CAAC;AACnL,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAM9F,qBACa,mBAAoB,SAAQ,kBAAmB,YAAW,aAAa;IAEhF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IAEtD,IAAa,OAAO,IAAI,YAAY,CAEnC;IAEQ,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW;IA+CrD;;OAEG;IACM,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;IAiBvE,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe;CAWhE"}
1
+ {"version":3,"file":"scanner-vscode.d.ts","sourceRoot":"","sources":["../../src/node/scanner-vscode.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAwE,MAAM,mBAAmB,CAAC;AACnL,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAM9F,qBACa,mBAAoB,SAAQ,kBAAmB,YAAW,aAAa;IAEhF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IAEtD,IAAa,OAAO,IAAI,YAAY,CAEnC;IAEQ,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW;IAgDrD;;OAEG;IACM,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;IAiBvE,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe;CAWhE"}
@@ -73,6 +73,7 @@ let VsCodePluginScanner = class VsCodePluginScanner extends scanner_theia_1.Thei
73
73
  readmeUrl: this.getReadmeUrl(plugin),
74
74
  licenseUrl: this.getLicenseUrl(plugin)
75
75
  };
76
+ this.applyTrustExtraction(plugin, result);
76
77
  return result;
77
78
  }
78
79
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"scanner-vscode.js","sourceRoot":"","sources":["../../src/node/scanner-vscode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner-vscode.js","sourceRoot":"","sources":["../../src/node/scanner-vscode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scanner-vscode.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner-vscode.spec.d.ts","sourceRoot":"","sources":["../../src/node/scanner-vscode.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
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
+ /* eslint-disable @typescript-eslint/no-explicit-any */
19
+ const chai_1 = require("chai");
20
+ const os = require("os");
21
+ const path = require("path");
22
+ const fs = require("fs");
23
+ const scanner_vscode_1 = require("./scanner-vscode");
24
+ const uri_1 = require("@theia/core/lib/common/uri");
25
+ function createVsCodePluginPackage(capabilities, packagePath) {
26
+ return {
27
+ name: 'test-vscode-plugin',
28
+ publisher: 'test-publisher',
29
+ version: '1.0.0',
30
+ engines: { vscode: '^1.5.0' },
31
+ displayName: 'Test VSCode Plugin',
32
+ description: 'A test vscode plugin',
33
+ packagePath: packagePath ?? os.tmpdir(),
34
+ main: 'extension.js',
35
+ capabilities
36
+ };
37
+ }
38
+ describe('VsCodePluginScanner', () => {
39
+ let scanner;
40
+ let tmpDir;
41
+ before(() => {
42
+ scanner = new scanner_vscode_1.VsCodePluginScanner();
43
+ // Inject a mock pluginUriFactory
44
+ scanner.pluginUriFactory = {
45
+ createUri: (_pkg, _relativePath) => new uri_1.default('file:///dummy')
46
+ };
47
+ // Create a real temp directory so readdirSync in getLicenseUrl/getReadmeUrl works
48
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'scanner-vscode-test-'));
49
+ });
50
+ after(() => {
51
+ fs.rmSync(tmpDir, { recursive: true, force: true });
52
+ });
53
+ it('should set untrustedWorkspacesSupport to true when capabilities.untrustedWorkspaces.supported is true', () => {
54
+ const pkg = createVsCodePluginPackage({
55
+ untrustedWorkspaces: { supported: true }
56
+ }, tmpDir);
57
+ const model = scanner.getModel(pkg);
58
+ (0, chai_1.expect)(model.untrustedWorkspacesSupport).to.equal(true);
59
+ });
60
+ it('should set untrustedWorkspacesSupport to false when capabilities.untrustedWorkspaces.supported is false', () => {
61
+ const pkg = createVsCodePluginPackage({
62
+ untrustedWorkspaces: { supported: false }
63
+ }, tmpDir);
64
+ const model = scanner.getModel(pkg);
65
+ (0, chai_1.expect)(model.untrustedWorkspacesSupport).to.equal(false);
66
+ });
67
+ it('should set untrustedWorkspacesSupport to "limited" when capabilities.untrustedWorkspaces.supported is "limited"', () => {
68
+ const pkg = createVsCodePluginPackage({
69
+ untrustedWorkspaces: { supported: 'limited' }
70
+ }, tmpDir);
71
+ const model = scanner.getModel(pkg);
72
+ (0, chai_1.expect)(model.untrustedWorkspacesSupport).to.equal('limited');
73
+ });
74
+ it('should leave untrustedWorkspacesSupport undefined when no capabilities field is present', () => {
75
+ const pkg = createVsCodePluginPackage(undefined, tmpDir);
76
+ const model = scanner.getModel(pkg);
77
+ (0, chai_1.expect)(model.untrustedWorkspacesSupport).to.equal(undefined);
78
+ });
79
+ });
80
+ //# sourceMappingURL=scanner-vscode.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner-vscode.spec.js","sourceRoot":"","sources":["../../src/node/scanner-vscode.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "name": "@theia/plugin-ext-vscode",
3
- "version": "1.70.0-next.6+89cff0d43",
3
+ "version": "1.70.0-next.61+d13baea89",
4
4
  "description": "Theia - Plugin Extension for VsCode",
5
5
  "dependencies": {
6
- "@theia/callhierarchy": "1.70.0-next.6+89cff0d43",
7
- "@theia/core": "1.70.0-next.6+89cff0d43",
8
- "@theia/editor": "1.70.0-next.6+89cff0d43",
9
- "@theia/filesystem": "1.70.0-next.6+89cff0d43",
10
- "@theia/monaco": "1.70.0-next.6+89cff0d43",
11
- "@theia/monaco-editor-core": "1.96.302",
12
- "@theia/navigator": "1.70.0-next.6+89cff0d43",
13
- "@theia/outline-view": "1.70.0-next.6+89cff0d43",
14
- "@theia/plugin": "1.70.0-next.6+89cff0d43",
15
- "@theia/plugin-ext": "1.70.0-next.6+89cff0d43",
16
- "@theia/scm": "1.70.0-next.6+89cff0d43",
17
- "@theia/terminal": "1.70.0-next.6+89cff0d43",
18
- "@theia/typehierarchy": "1.70.0-next.6+89cff0d43",
19
- "@theia/userstorage": "1.70.0-next.6+89cff0d43",
20
- "@theia/workspace": "1.70.0-next.6+89cff0d43",
6
+ "@theia/callhierarchy": "1.70.0-next.61+d13baea89",
7
+ "@theia/core": "1.70.0-next.61+d13baea89",
8
+ "@theia/editor": "1.70.0-next.61+d13baea89",
9
+ "@theia/filesystem": "1.70.0-next.61+d13baea89",
10
+ "@theia/monaco": "1.70.0-next.61+d13baea89",
11
+ "@theia/monaco-editor-core": "1.108.201",
12
+ "@theia/navigator": "1.70.0-next.61+d13baea89",
13
+ "@theia/outline-view": "1.70.0-next.61+d13baea89",
14
+ "@theia/plugin": "1.70.0-next.61+d13baea89",
15
+ "@theia/plugin-ext": "1.70.0-next.61+d13baea89",
16
+ "@theia/scm": "1.70.0-next.61+d13baea89",
17
+ "@theia/terminal": "1.70.0-next.61+d13baea89",
18
+ "@theia/typehierarchy": "1.70.0-next.61+d13baea89",
19
+ "@theia/userstorage": "1.70.0-next.61+d13baea89",
20
+ "@theia/workspace": "1.70.0-next.61+d13baea89",
21
21
  "decompress": "^4.2.1",
22
22
  "filenamify": "^4.1.0",
23
23
  "tslib": "^2.6.2"
@@ -61,5 +61,5 @@
61
61
  "nyc": {
62
62
  "extends": "../../configs/nyc.json"
63
63
  },
64
- "gitHead": "89cff0d4360dbbdd37ee1245391a8f954df728e7"
64
+ "gitHead": "d13baea893dbdfe4c1df677a9b00b11289e71fa7"
65
65
  }
@@ -16,11 +16,11 @@
16
16
 
17
17
  import * as path from 'path';
18
18
  import { inject, injectable } from '@theia/core/shared/inversify';
19
- import { PluginDeployerResolverContext } from '@theia/plugin-ext';
19
+ import { PluginDeployerResolverContext, PluginIdentifiers } from '@theia/plugin-ext';
20
20
  import { LocalPluginDeployerResolver } from '@theia/plugin-ext/lib/main/node/resolvers/local-plugin-deployer-resolver';
21
21
  import { PluginVSCodeEnvironment } from '../common/plugin-vscode-environment';
22
22
  import { isVSCodePluginFile } from './plugin-vscode-file-handler';
23
- import { existsInDeploymentDir, unpackToDeploymentDir } from './plugin-vscode-utils';
23
+ import { existsInDeploymentDir, unpackToDeploymentDir, extractExtensionIdentityFromVsix } from './plugin-vscode-utils';
24
24
 
25
25
  @injectable()
26
26
  export class LocalVSIXFilePluginDeployerResolver extends LocalPluginDeployerResolver {
@@ -38,14 +38,40 @@ export class LocalVSIXFilePluginDeployerResolver extends LocalPluginDeployerReso
38
38
  }
39
39
 
40
40
  async resolveFromLocalPath(pluginResolverContext: PluginDeployerResolverContext, localPath: string): Promise<void> {
41
- const extensionId = path.basename(localPath, LocalVSIXFilePluginDeployerResolver.FILE_EXTENSION);
41
+ // Extract the true extension identity from the VSIX package.json
42
+ // This prevents duplicate installations when the same extension is installed from VSIX files with different filenames
43
+ // See: https://github.com/eclipse-theia/theia/issues/16845
44
+ const components = await extractExtensionIdentityFromVsix(localPath);
42
45
 
43
- if (await existsInDeploymentDir(this.environment, extensionId)) {
44
- console.log(`[${pluginResolverContext.getOriginId()}]: Target dir already exists in plugin deployment dir`);
46
+ if (!components) {
47
+ // Fallback to filename-based ID if package.json cannot be read
48
+ // This maintains backward compatibility for edge cases
49
+ const fallbackId = path.basename(localPath, LocalVSIXFilePluginDeployerResolver.FILE_EXTENSION);
50
+ console.warn(`[${pluginResolverContext.getOriginId()}]: Could not read extension identity from VSIX, falling back to filename: ${fallbackId}`);
51
+
52
+ if (await existsInDeploymentDir(this.environment, fallbackId)) {
53
+ console.log(`[${pluginResolverContext.getOriginId()}]: Target dir already exists in plugin deployment dir`);
54
+ return;
55
+ }
56
+
57
+ const fallbackDeploymentDir = await unpackToDeploymentDir(this.environment, localPath, fallbackId);
58
+ pluginResolverContext.addPlugin(fallbackId, fallbackDeploymentDir);
45
59
  return;
46
60
  }
47
61
 
48
- const extensionDeploymentDir = await unpackToDeploymentDir(this.environment, localPath, extensionId);
49
- pluginResolverContext.addPlugin(extensionId, extensionDeploymentDir);
62
+ const versionedId = PluginIdentifiers.componentsToVersionedId(components);
63
+
64
+ // Check if the deployment directory already exists on disk
65
+ if (await existsInDeploymentDir(this.environment, versionedId)) {
66
+ const unversionedId = PluginIdentifiers.componentsToUnversionedId(components);
67
+ const error = new Error(
68
+ `Extension ${unversionedId} is already installed (version: ${components.version}).`
69
+ );
70
+ error.name = 'DuplicateExtensionError';
71
+ throw error;
72
+ }
73
+
74
+ const extensionDeploymentDir = await unpackToDeploymentDir(this.environment, localPath, versionedId);
75
+ pluginResolverContext.addPlugin(versionedId, extensionDeploymentDir);
50
76
  }
51
77
  }
@@ -20,6 +20,50 @@ import * as filenamify from 'filenamify';
20
20
  import { FileUri } from '@theia/core/lib/node';
21
21
  import * as fs from '@theia/core/shared/fs-extra';
22
22
  import { PluginVSCodeEnvironment } from '../common/plugin-vscode-environment';
23
+ import { PluginIdentifiers, PluginPackage } from '@theia/plugin-ext/lib/common/plugin-protocol';
24
+
25
+ /**
26
+ * Extracts extension identity from a VSIX file by reading its package.json.
27
+ *
28
+ * VSIX files are ZIP archives with the extension content in an `extension/` subdirectory.
29
+ * This function extracts only the `extension/package.json` file to read the extension metadata.
30
+ *
31
+ * @param vsixPath Path to the VSIX file
32
+ * @returns PluginIdentifiers.Components (publisher?, name, version), or undefined if the package.json cannot be read or is invalid
33
+ */
34
+ export async function extractExtensionIdentityFromVsix(vsixPath: string): Promise<PluginIdentifiers.Components | undefined> {
35
+ try {
36
+ // Extract only the package.json file from the VSIX
37
+ const files = await decompress(vsixPath, {
38
+ filter: file => file.path === 'extension/package.json'
39
+ });
40
+
41
+ if (files.length === 0) {
42
+ console.warn(`[${vsixPath}]: No extension/package.json found in VSIX`);
43
+ return undefined;
44
+ }
45
+
46
+ const packageJsonContent = files[0].data.toString('utf8');
47
+ const packageJson: Partial<PluginPackage> = JSON.parse(packageJsonContent);
48
+
49
+ // Validate required fields
50
+ if (!packageJson.name || !packageJson.version) {
51
+ console.warn(`[${vsixPath}]: Invalid package.json - missing name or version`);
52
+ return undefined;
53
+ }
54
+
55
+ const components: PluginIdentifiers.Components = {
56
+ publisher: packageJson.publisher,
57
+ name: packageJson.name,
58
+ version: packageJson.version
59
+ };
60
+
61
+ return components;
62
+ } catch (error) {
63
+ console.error(`[${vsixPath}]: Failed to extract extension identity from VSIX`, error);
64
+ return undefined;
65
+ }
66
+ }
23
67
 
24
68
  export async function decompressExtension(sourcePath: string, destPath: string): Promise<boolean> {
25
69
  try {
@@ -0,0 +1,95 @@
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
+ /* eslint-disable @typescript-eslint/no-explicit-any */
18
+
19
+ import { expect } from 'chai';
20
+ import * as os from 'os';
21
+ import * as path from 'path';
22
+ import * as fs from 'fs';
23
+ import { VsCodePluginScanner } from './scanner-vscode';
24
+ import { PluginPackage } from '@theia/plugin-ext';
25
+ import URI from '@theia/core/lib/common/uri';
26
+
27
+ function createVsCodePluginPackage(
28
+ capabilities?: PluginPackage['capabilities'],
29
+ packagePath?: string
30
+ ): PluginPackage {
31
+ return {
32
+ name: 'test-vscode-plugin',
33
+ publisher: 'test-publisher',
34
+ version: '1.0.0',
35
+ engines: { vscode: '^1.5.0' },
36
+ displayName: 'Test VSCode Plugin',
37
+ description: 'A test vscode plugin',
38
+ packagePath: packagePath ?? os.tmpdir(),
39
+ main: 'extension.js',
40
+ capabilities
41
+ } as PluginPackage;
42
+ }
43
+
44
+ describe('VsCodePluginScanner', () => {
45
+ let scanner: VsCodePluginScanner;
46
+ let tmpDir: string;
47
+
48
+ before(() => {
49
+ scanner = new VsCodePluginScanner();
50
+ // Inject a mock pluginUriFactory
51
+ (scanner as any).pluginUriFactory = {
52
+ createUri: (_pkg: PluginPackage, _relativePath?: string) => new URI('file:///dummy')
53
+ };
54
+ // Create a real temp directory so readdirSync in getLicenseUrl/getReadmeUrl works
55
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'scanner-vscode-test-'));
56
+ });
57
+
58
+ after(() => {
59
+ fs.rmSync(tmpDir, { recursive: true, force: true });
60
+ });
61
+
62
+ it('should set untrustedWorkspacesSupport to true when capabilities.untrustedWorkspaces.supported is true', () => {
63
+ const pkg = createVsCodePluginPackage({
64
+ untrustedWorkspaces: { supported: true }
65
+ }, tmpDir);
66
+
67
+ const model = scanner.getModel(pkg);
68
+ expect(model.untrustedWorkspacesSupport).to.equal(true);
69
+ });
70
+
71
+ it('should set untrustedWorkspacesSupport to false when capabilities.untrustedWorkspaces.supported is false', () => {
72
+ const pkg = createVsCodePluginPackage({
73
+ untrustedWorkspaces: { supported: false }
74
+ }, tmpDir);
75
+
76
+ const model = scanner.getModel(pkg);
77
+ expect(model.untrustedWorkspacesSupport).to.equal(false);
78
+ });
79
+
80
+ it('should set untrustedWorkspacesSupport to "limited" when capabilities.untrustedWorkspaces.supported is "limited"', () => {
81
+ const pkg = createVsCodePluginPackage({
82
+ untrustedWorkspaces: { supported: 'limited' }
83
+ }, tmpDir);
84
+
85
+ const model = scanner.getModel(pkg);
86
+ expect(model.untrustedWorkspacesSupport).to.equal('limited');
87
+ });
88
+
89
+ it('should leave untrustedWorkspacesSupport undefined when no capabilities field is present', () => {
90
+ const pkg = createVsCodePluginPackage(undefined, tmpDir);
91
+
92
+ const model = scanner.getModel(pkg);
93
+ expect(model.untrustedWorkspacesSupport).to.equal(undefined);
94
+ });
95
+ });
@@ -76,6 +76,7 @@ export class VsCodePluginScanner extends TheiaPluginScanner implements PluginSca
76
76
  readmeUrl: this.getReadmeUrl(plugin),
77
77
  licenseUrl: this.getLicenseUrl(plugin)
78
78
  };
79
+ this.applyTrustExtraction(plugin, result);
79
80
  return result;
80
81
  }
81
82