@@ -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
809812function 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
849868export class WebExtensionProcessor extends BaseProcessor {
0 commit comments