Skip to content

Commit ef21ead

Browse files
committed
Improve extension kind computation rules
1 parent 96ee64d commit ef21ead

File tree

1 file changed

+28
-9
lines changed

1 file changed

+28
-9
lines changed

src/package.ts

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -804,18 +804,35 @@ export function isWebKind(manifest: Manifest): boolean {
804804
return extensionKind.some(kind => kind === 'web');
805805
}
806806

807-
const workspaceExtensionPoints: string[] = ['terminal', 'debuggers', 'jsonValidation'];
807+
const extensionPointExtensionKindsMap = new Map<string, ExtensionKind[]>();
808+
extensionPointExtensionKindsMap.set('jsonValidation', ['workspace', 'web']);
809+
extensionPointExtensionKindsMap.set('debuggers', ['workspace']);
810+
extensionPointExtensionKindsMap.set('terminal', ['workspace']);
808811

809812
function getExtensionKind(manifest: Manifest): ExtensionKind[] {
813+
814+
const deducedExtensionKind = deduceExtensionKind(manifest);
815+
810816
// check the manifest
811817
if (manifest.extensionKind) {
812-
return Array.isArray(manifest.extensionKind)
818+
const result: ExtensionKind[] = Array.isArray(manifest.extensionKind)
813819
? manifest.extensionKind
814820
: manifest.extensionKind === 'ui'
815821
? ['ui', 'workspace']
816-
: [manifest.extensionKind];
822+
: [manifest.extensionKind];
823+
824+
// Add web kind if the extension can run as web extension
825+
if (deducedExtensionKind.indexOf('web') !== -1 && result.indexOf('web') === -1) {
826+
result.push('web');
827+
}
828+
829+
return result;
817830
}
818831

832+
return deducedExtensionKind;
833+
}
834+
835+
function deduceExtensionKind(manifest: Manifest): ExtensionKind[] {
819836
// Not an UI extension if it has main
820837
if (manifest.main) {
821838
if (manifest.browser) {
@@ -828,22 +845,24 @@ function getExtensionKind(manifest: Manifest): ExtensionKind[] {
828845
return ['web'];
829846
}
830847

848+
let result: ExtensionKind[] = ['ui', 'workspace', 'web'];
849+
831850
const isNonEmptyArray = obj => Array.isArray(obj) && obj.length > 0;
832-
// Not an UI nor web extension if it has dependencies or an extension pack
851+
// Not an UI extension if extension has dependencies or an extension pack
833852
if (isNonEmptyArray(manifest.extensionDependencies) || isNonEmptyArray(manifest.extensionPack)) {
834-
return ['workspace'];
853+
result = ['workspace', 'web'];
835854
}
836855

837856
if (manifest.contributes) {
838-
// Not an UI nor web extension if it has workspace contributions
839857
for (const contribution of Object.keys(manifest.contributes)) {
840-
if (workspaceExtensionPoints.indexOf(contribution) !== -1) {
841-
return ['workspace'];
858+
const supportedExtensionKinds = extensionPointExtensionKindsMap.get(contribution);
859+
if (supportedExtensionKinds) {
860+
result = result.filter(extensionKind => supportedExtensionKinds.indexOf(extensionKind) !== -1);
842861
}
843862
}
844863
}
845864

846-
return ['ui', 'workspace', 'web'];
865+
return result;
847866
}
848867

849868
export class WebExtensionProcessor extends BaseProcessor {

0 commit comments

Comments
 (0)