@@ -21,96 +21,168 @@ const defaultExtensions = fs.readdirSync(DEFAULT_EXTENSIONS_PATH, { withFileType
2121 . filter ( f => f . isDirectory ( ) && fs . existsSync ( path . resolve ( DEFAULT_EXTENSIONS_PATH , f . name , 'package.json' ) ) )
2222 . map ( f => f . name )
2323
24- export default rollup . defineConfig ( defaultExtensions . map ( name => ( < rollup . RollupOptions > {
25- input : path . resolve ( DEFAULT_EXTENSIONS_PATH , name ) ,
26- output : [ {
27- minifyInternalExports : false ,
28- assetFileNames : chunkInfo => {
29- if ( chunkInfo . name != null && chunkInfo . name . endsWith ( 'd.ts' ) ) {
24+ const languageGrammarExtensions : string [ ] = [ ]
25+ const languageFeatureExtensions : string [ ] = [ ]
26+ for ( const extension of defaultExtensions ) {
27+ const extensionPath = path . resolve ( DEFAULT_EXTENSIONS_PATH , extension , 'package.json' )
28+ const packageJson = JSON . parse ( fs . readFileSync ( extensionPath ) . toString ( ) )
29+ if ( ( packageJson . contributes ?. languages ?? [ ] ) . length > 0 ) {
30+ languageGrammarExtensions . push ( extension )
31+ }
32+ if ( extension . endsWith ( 'language-features' ) ) {
33+ languageFeatureExtensions . push ( extension )
34+ }
35+ }
36+
37+ export default rollup . defineConfig ( [
38+ ...defaultExtensions . map ( name => ( < rollup . RollupOptions > {
39+ input : path . resolve ( DEFAULT_EXTENSIONS_PATH , name ) ,
40+ output : [ {
41+ minifyInternalExports : false ,
42+ assetFileNames : chunkInfo => {
43+ if ( chunkInfo . name != null && chunkInfo . name . endsWith ( 'd.ts' ) ) {
3044 // append .txt at the end of d.ts files: those file are required by the typescript extension and are just expected to be loaded as simple text
31- return '[name][extname].txt'
32- }
33- return '[name][extname]'
34- } ,
35- format : 'esm' ,
36- dir : `dist/default-extension-${ name } ` ,
37- entryFileNames : 'index.js' ,
38- chunkFileNames : '[name].js' ,
39- hoistTransitiveImports : false
40- } ] ,
41- external ( source ) {
42- return source === 'vscode/extensions'
43- } ,
44- plugins : [
45- {
46- name : 'resolve-asset-url' ,
47- resolveFileUrl ( options ) {
48- let relativePath = options . relativePath
49- if ( ! relativePath . startsWith ( '.' ) ) {
50- relativePath = `./${ options . relativePath } `
45+ return '[name][extname].txt'
5146 }
52- return `'${ relativePath } '`
53- }
47+ return '[name][extname]'
48+ } ,
49+ format : 'esm' ,
50+ dir : `dist/default-extension-${ name } ` ,
51+ entryFileNames : 'index.js' ,
52+ chunkFileNames : '[name].js' ,
53+ hoistTransitiveImports : false
54+ } ] ,
55+ external ( source ) {
56+ return source === 'vscode/extensions'
5457 } ,
55- nodeResolve ( {
56- extensions : EXTENSIONS
57- } ) ,
58- importMetaAssets ( ) ,
59- {
60- name : 'dynamic-import-polyfill' ,
61- renderDynamicImport ( ) : { left : string , right : string } {
62- return {
63- left : 'import(' ,
64- right : ').then(module => module.default ?? module)'
58+ plugins : [
59+ {
60+ name : 'resolve-asset-url' ,
61+ resolveFileUrl ( options ) {
62+ let relativePath = options . relativePath
63+ if ( ! relativePath . startsWith ( '.' ) ) {
64+ relativePath = `./${ options . relativePath } `
65+ }
66+ return `'${ relativePath } '`
6567 }
66- }
67- } ,
68- extensionDirectoryPlugin ( {
69- include : `${ DEFAULT_EXTENSIONS_PATH } /**/*` ,
70- transformManifest ( manifest ) {
71- if ( manifest . name === 'configuration-editing' ) {
72- manifest = {
73- ...manifest ,
74- contributes : {
75- ...manifest . contributes ,
76- jsonValidation : manifest . contributes ! . jsonValidation ! . map ( validation => {
77- return {
78- fileMatch : ( validation . fileMatch as string ) . replaceAll ( '%APP_SETTINGS_HOME%' , 'user:' ) ,
79- url : validation . url
80- }
81- } )
68+ } ,
69+ nodeResolve ( {
70+ extensions : EXTENSIONS
71+ } ) ,
72+ importMetaAssets ( ) ,
73+ {
74+ name : 'dynamic-import-polyfill' ,
75+ renderDynamicImport ( ) : { left : string , right : string } {
76+ return {
77+ left : 'import(' ,
78+ right : ').then(module => module.default ?? module)'
79+ }
80+ }
81+ } ,
82+ extensionDirectoryPlugin ( {
83+ include : `${ DEFAULT_EXTENSIONS_PATH } /**/*` ,
84+ transformManifest ( manifest ) {
85+ if ( manifest . name === 'configuration-editing' ) {
86+ manifest = {
87+ ...manifest ,
88+ contributes : {
89+ ...manifest . contributes ,
90+ jsonValidation : manifest . contributes ! . jsonValidation ! . map ( validation => {
91+ return {
92+ fileMatch : ( validation . fileMatch as string ) . replaceAll ( '%APP_SETTINGS_HOME%' , 'user:' ) ,
93+ url : validation . url
94+ }
95+ } )
96+ }
8297 }
8398 }
99+ return {
100+ ...manifest ,
101+ main : undefined
102+ }
103+ } ,
104+ async getAdditionalResources ( manifest , directory ) {
105+ if ( manifest . name === 'typescript-language-features' ) {
106+ const files = ( await fsPromise . readdir ( path . resolve ( directory , 'dist/browser/typescript' ) , {
107+ withFileTypes : true
108+ } ) ) . filter ( f => f . isFile ( ) ) . map ( f => f . name )
109+ return files . map ( file => ( { path : path . join ( './dist/browser/typescript' , file ) , mimeType : 'text/plain' } ) )
110+ }
111+ return [ ]
84112 }
85- return {
86- ...manifest ,
87- main : undefined
113+ } ) ,
114+ metadataPlugin ( {
115+ handle ( _ , dependencies , entrypoints , options , bundle ) {
116+ const entrypoint = Object . values ( bundle ) . filter ( v => ( v as rollup . OutputChunk ) . isEntry ) [ 0 ] ! . fileName
117+ const packageJson : PackageJson = {
118+ name : `@codingame/monaco-vscode-${ name } -default-extension` ,
119+ ...Object . fromEntries ( Object . entries ( pkg ) . filter ( ( [ key ] ) => [ 'version' , 'keywords' , 'author' , 'license' , 'repository' , 'type' ] . includes ( key ) ) ) ,
120+ private : false ,
121+ description : `Default VSCode extension designed to be used with ${ pkg . name } ` ,
122+ main : entrypoint ,
123+ module : entrypoint ,
124+ dependencies : {
125+ vscode : `npm:${ pkg . name } @^${ pkg . version } ` ,
126+ ...Object . fromEntries ( Object . entries ( pkg . dependencies ) . filter ( ( [ key ] ) => dependencies . has ( key ) ) )
127+ }
128+ }
129+
130+ this . emitFile ( {
131+ fileName : 'package.json' ,
132+ needsCodeReference : false ,
133+ source : JSON . stringify ( packageJson , null , 2 ) ,
134+ type : 'asset'
135+ } )
88136 }
137+ } )
138+ ]
139+ } ) ) , ...[ {
140+ name : '@codingame/monaco-vscode-all-default-extensions' ,
141+ directory : 'default-extension-all' ,
142+ extensions : defaultExtensions
143+ } , {
144+ name : '@codingame/monaco-vscode-all-language-default-extensions' ,
145+ directory : 'default-extension-all-languages' ,
146+ extensions : languageGrammarExtensions
147+ } , {
148+ name : '@codingame/monaco-vscode-all-language-feature-default-extensions' ,
149+ directory : 'default-extension-all-language-features' ,
150+ extensions : languageFeatureExtensions
151+ } ] . map ( ( { name, directory, extensions } ) => ( < rollup . RollupOptions > {
152+ input : 'index.js' ,
153+ output : [ {
154+ format : 'esm' ,
155+ dir : 'dist/' + directory ,
156+ entryFileNames : 'index.js'
157+ } ] ,
158+ external ( ) {
159+ return true
160+ } ,
161+ plugins : [ {
162+ name : 'code-loader' ,
163+ resolveId ( ) {
164+ return 'index.js'
89165 } ,
90- async getAdditionalResources ( manifest , directory ) {
91- if ( manifest . name === 'typescript-language-features' ) {
92- const files = ( await fsPromise . readdir ( path . resolve ( directory , 'dist/browser/typescript' ) , {
93- withFileTypes : true
94- } ) ) . filter ( f => f . isFile ( ) ) . map ( f => f . name )
95- return files . map ( file => ( { path : path . join ( './dist/browser/typescript' , file ) , mimeType : 'text/plain' } ) )
96- }
97- return [ ]
166+ load ( ) {
167+ return `
168+ ${ extensions . map ( name => `import '@codingame/monaco-vscode-${ name } -default-extension'` ) . join ( '\n' ) }
169+ `
98170 }
99- } ) ,
171+ } ,
100172 metadataPlugin ( {
101173 handle ( _ , dependencies , entrypoints , options , bundle ) {
102174 const entrypoint = Object . values ( bundle ) . filter ( v => ( v as rollup . OutputChunk ) . isEntry ) [ 0 ] ! . fileName
103175 const packageJson : PackageJson = {
104- name : `@codingame/monaco-vscode- ${ name } -default-extension` ,
176+ name,
105177 ...Object . fromEntries ( Object . entries ( pkg ) . filter ( ( [ key ] ) => [ 'version' , 'keywords' , 'author' , 'license' , 'repository' , 'type' ] . includes ( key ) ) ) ,
106178 private : false ,
107- description : `Default VSCode extension designed to be used with ${ pkg . name } ` ,
179+ description : `Meta package including default VSCode extensions designed to be used with ${ pkg . name } ` ,
108180 main : entrypoint ,
109181 module : entrypoint ,
110- dependencies : {
111- vscode : `npm: ${ pkg . name } @^ ${ pkg . version } ` ,
112- ... Object . fromEntries ( Object . entries ( pkg . dependencies ) . filter ( ( [ key ] ) => dependencies . has ( key ) ) )
113- }
182+ dependencies : Object . fromEntries ( Array . from ( dependencies ) . map ( name => [
183+ name ,
184+ pkg . version
185+ ] ) )
114186 }
115187
116188 this . emitFile ( {
@@ -120,6 +192,5 @@ export default rollup.defineConfig(defaultExtensions.map(name => (<rollup.Rollup
120192 type : 'asset'
121193 } )
122194 }
123- } )
124- ]
125- } ) ) )
195+ } ) ]
196+ } ) ) ] )
0 commit comments