Skip to content

Commit 247c460

Browse files
author
Loïc Mangeonjean
committed
feat: generate meta-package pulling default extension sets
1 parent bc9d05c commit 247c460

File tree

3 files changed

+156
-75
lines changed

3 files changed

+156
-75
lines changed

release.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ async function publishNpm (version: string) {
145145
if (packageJson.dependencies?.vscode != null) {
146146
packageJson.dependencies.vscode = `npm:@codingame/monaco-vscode-api@${version}`
147147
}
148+
for (const dependency in packageJson.dependencies) {
149+
if (dependency.startsWith('@codingame/monaco-vscode-')) {
150+
packageJson.dependencies[dependency] = version
151+
}
152+
}
148153
await fs.writeFile(packageJsonFile, JSON.stringify(packageJson, null, 2))
149154

150155
$.cwd = libDir

releaseNext.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ async function publishNpm (version: string) {
6767
if (packageJson.dependencies?.vscode != null) {
6868
packageJson.dependencies.vscode = `npm:@codingame/monaco-vscode-api@${version}`
6969
}
70+
for (const dependency in packageJson.dependencies) {
71+
if (dependency.startsWith('@codingame/monaco-vscode-')) {
72+
packageJson.dependencies[dependency] = version
73+
}
74+
}
7075
await fs.writeFile(packageJsonFile, JSON.stringify(packageJson, null, 2))
7176

7277
$.cwd = libDir

rollup/rollup.default-extensions.ts

Lines changed: 146 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)