Skip to content

Commit

Permalink
Merge pull request #374 from CodinGame/monaco-languages
Browse files Browse the repository at this point in the history
Monaco languages
  • Loading branch information
CGNonofr committed Mar 20, 2024
2 parents b623acb + d5bdedb commit 9cea7ff
Show file tree
Hide file tree
Showing 14 changed files with 1,121 additions and 686 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
node_modules/
vscode/
vscode-loc/
monaco-editor/
vscode-default-extensions/
vscode-default-extensions-node/
dist/
2 changes: 1 addition & 1 deletion demo/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export default defineConfig({

// These 2 lines prevent vite from reloading the whole page when starting a worker (so 2 times in a row after cleaning the vite cache - for the editor then the textmate workers)
// it's mainly empirical and probably not the best way, fix me if you find a better way
'vscode-textmate', 'vscode-oniguruma', '@vscode/vscode-languagedetection', 'vscode-semver', 'vscode-marked'
'vscode-textmate', 'vscode-oniguruma', '@vscode/vscode-languagedetection'
],
exclude: [],
esbuildOptions: {
Expand Down
1 change: 1 addition & 0 deletions docs/vscode_monaco_upgrade.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
## monaco-vscode-api repository

- Update the `package.json` to set `config.vscode.ref` to the new VSCode tag from above
- Update the `package.json` to set `config.monaco.ref` to the new version of monaco-editor
- Run `npm install` which will trigger the vscode install script
- Wait for the new vscode version to be downloaded and built
- Run `npm run update-vscode-dependencies` to update the vscode dependencies we use to the same versions as VSCode
Expand Down
1,536 changes: 886 additions & 650 deletions package-lock.json

Large diffs are not rendered by default.

41 changes: 23 additions & 18 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@
},
"type": "module",
"scripts": {
"build": "npm run clean && npm run lint && npm run compile && npm run compile-rollup-plugins && npm run generate-types && npm run compile-server && npm run compile-default-extensions && npm run compile-language-packs",
"build": "npm run clean && npm run lint && npm run compile && npm run compile-rollup-plugins && npm run generate-types && npm run compile-server && npm run compile-default-extensions && npm run compile-language-packs && npm run compile-monaco-languages",
"compile": "NODE_OPTIONS=--max_old_space_size=16384 rollup --config rollup/rollup.config.ts --configPlugin 'typescript={tsconfig: `tsconfig.rollup-config.json`}' --vscode-version ${npm_package_config_vscode_version} --vscode-ref ${npm_package_config_vscode_ref}",
"compile-default-extensions": "NODE_OPTIONS=--max_old_space_size=16384 rollup --config rollup/rollup.default-extensions.ts --configPlugin 'typescript={tsconfig: `tsconfig.rollup-config-default-extensions.json`}'",
"compile-language-packs": "NODE_OPTIONS=--max_old_space_size=16384 rollup --config rollup/rollup.language-packs.ts --configPlugin 'typescript={tsconfig: `tsconfig.rollup-config-language-packs.json`}'",
"compile-monaco-languages": "NODE_OPTIONS=--max_old_space_size=16384 rollup --config rollup/rollup.monaco.ts --configPlugin 'typescript={tsconfig: `tsconfig.rollup-config-monaco.json`}'",
"clean": "rm -rf dist/",
"compile-server": "rollup --config rollup/rollup.server.config.ts --configPlugin 'typescript={tsconfig: `tsconfig.rollup-config-server.json`, include: [`./rollup/rollup.server.config.ts`, `./rollup/rollup-metadata-plugin.ts`, `./rollup/rollup-asset-glob-meta-url-plugin.ts`]}' --vscode-version ${npm_package_config_vscode_version} --vscode-ref ${npm_package_config_vscode_ref}",
"compile-rollup-plugins": "rollup --config rollup/rollup.rollup-plugins.config.ts --configPlugin 'typescript={tsconfig: `tsconfig.rollup-config-plugins.json`, include: [`./rollup/rollup.rollup-plugins.config.ts`, `./rollup/rollup-metadata-plugin.ts`]}'",
Expand All @@ -33,19 +34,23 @@
"vscode": {
"version": "1.87.2",
"ref": "1.87.2"
},
"monaco": {
"ref": "v0.47.0",
"version": "0.47.0"
}
},
"devDependencies": {
"@babel/core": "^7.24.0",
"@babel/core": "^7.24.3",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-decorators": "^7.24.0",
"@babel/preset-env": "^7.24.0",
"@babel/preset-typescript": "^7.23.3",
"@babel/plugin-proposal-decorators": "^7.24.1",
"@babel/preset-env": "^7.24.3",
"@babel/preset-typescript": "^7.24.1",
"@codingame/commitlint-config-codingame": "^1.0.10",
"@codingame/eslint-config": "^1.1.10",
"@codingame/semantic-release-config-github": "^1.0.0",
"@codingame/tsconfig": "^1.1.1",
"@commitlint/cli": "^19.0.3",
"@commitlint/cli": "^19.2.1",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-dynamic-import-vars": "^2.1.2",
"@rollup/plugin-json": "^6.1.0",
Expand All @@ -60,8 +65,8 @@
"@types/vscode-semver": "npm:@types/semver@=5.5.0",
"@types/yargs": "^17.0.32",
"@types/yauzl": "^2.10.3",
"@typescript-eslint/eslint-plugin": "^7.1.1",
"@typescript-eslint/parser": "^7.1.1",
"@typescript-eslint/eslint-plugin": "^7.3.1",
"@typescript-eslint/parser": "^7.3.1",
"@vscode/iconv-lite-umd": "^0.7.0",
"@web/rollup-plugin-import-meta-assets": "^2.2.1",
"change-package-name": "^1.0.5",
Expand All @@ -75,22 +80,24 @@
"graceful-fs": "^4.2.11",
"is-builtin-module": "^3.2.1",
"js-cleanup": "^1.2.0",
"jschardet": "^3.0.0",
"jschardet": "^3.1.0",
"package-json": "^10.0.0",
"param-case": "^3.0.4",
"pascal-case": "^3.1.2",
"patch-package": "^8.0.0",
"recast": "^0.23.5",
"rollup": "^4.12.0",
"recast": "^0.23.6",
"rollup": "^4.13.0",
"rollup-plugin-copy": "^3.5.0",
"rollup-plugin-dts": "^6.1.0",
"rollup-plugin-styles": "^4.0.0",
"semantic-release": "23.0.2",
"semantic-release": "23.0.5",
"semver": "^7.6.0",
"ts-morph": "^21.0.1",
"ts-morph": "^22.0.0",
"ts-node": "^10.9.2",
"type-fest": "^4.11.1",
"typescript": "5.3.3",
"type-fest": "^4.13.1",
"typescript": "5.4.2",
"vscode-marked": "npm:marked@=3.0.2",
"vscode-semver": "npm:semver@=5.5.0",
"yargs": "^17.7.2",
"zx": "^7.2.3"
},
Expand All @@ -116,13 +123,11 @@
"css-url-parser": "^1.1.3",
"kerberos": "^2.0.1",
"keytar": "^7.9.0",
"memfs": "^4.7.7",
"memfs": "^4.8.0",
"mime-types": "^2.1.35",
"node-pty": "1.1.0-beta6",
"vscode-marked": "npm:marked@=3.0.2",
"vscode-oniguruma": "1.7.0",
"vscode-regexpp": "^3.1.0",
"vscode-semver": "npm:semver@=5.5.0",
"vscode-textmate": "9.0.0",
"yauzl": "^2.9.2",
"yazl": "^2.4.3"
Expand Down
3 changes: 3 additions & 0 deletions release.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ async function publishNpm (version: string, tag: string) {
if (packageJson.dependencies?.vscode != null) {
packageJson.dependencies.vscode = `npm:@codingame/monaco-vscode-api@${version}`
}
if (packageJson.dependencies?.['monaco-editor'] != null) {
packageJson.dependencies['monaco-editor'] = `npm:@codingame/monaco-vscode-editor-api@${version}`
}
for (const dependency in packageJson.dependencies) {
if (dependency.startsWith('@codingame/monaco-vscode-')) {
packageJson.dependencies[dependency] = version
Expand Down
13 changes: 9 additions & 4 deletions rollup/rollup.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,6 @@ const workerGroups: Record<string, string> = {

const externals = Object.keys({ ...pkg.dependencies })
const external: rollup.ExternalOption = (source) => {
if (source === 'semver' || source.startsWith('semver')) return true
if (source.includes('tas-client-umd')) return true
return externals.some(external => source === external || source.startsWith(`${external}/`))
}
Expand Down Expand Up @@ -451,7 +450,9 @@ export default (args: Record<string, string>): rollup.RollupOptions[] => {
// assets are externals and this plugin is not able to ignore external assets
exclude: ['**/service-override/textmate.ts', '**/service-override/languageDetectionWorker.ts']
}),
commonjs(),
commonjs({
include: '**/vscode-semver/**/*'
}),
{
name: 'resolve-vscode',
resolveId: (importeeUrl, importer) => {
Expand Down Expand Up @@ -639,7 +640,11 @@ export default (args: Record<string, string>): rollup.RollupOptions[] => {
}
}, {
name: 'improve-treeshaking',
transform (code) {
transform (code, id) {
if (id.includes('semver')) {
// ignore semver because it's commonjs code and rollup commonjs code generate IIFEs that this plugin will remove
return
}
const ast = recast.parse(code, {
parser: babylonParser
})
Expand Down Expand Up @@ -934,7 +939,7 @@ export default (args: Record<string, string>): rollup.RollupOptions[] => {
this.emitFile({
fileName: 'esm/vs/editor/editor.worker.js',
needsCodeReference: false,
source: "import 'vscode/workers/editor.worker'",
source: "export * from 'vscode/workers/editor.worker'",
type: 'asset'
})
}
Expand Down
154 changes: 154 additions & 0 deletions rollup/rollup.monaco.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import nodeResolve from '@rollup/plugin-node-resolve'
import * as rollup from 'rollup'
import { PackageJson } from 'type-fest'
import replace from '@rollup/plugin-replace'
import glob from 'fast-glob'
import * as path from 'path'
import { fileURLToPath } from 'url'
import pkg from '../package.json' assert { type: 'json' }

const __dirname = path.dirname(fileURLToPath(import.meta.url))

const EXTENSIONS = ['', '.ts', '.js']

const BASE_DIR = path.resolve(__dirname, '..')
const MONACO_EDITOR_DIR = path.resolve(BASE_DIR, 'monaco-editor')
const BASIC_LANGUAGE_DIR = path.resolve(MONACO_EDITOR_DIR, 'basic-languages')
const LANGUAGE_FEATURE_DIR = path.resolve(MONACO_EDITOR_DIR, 'language')

const monacoContributions = (await glob('**/monaco.contribution.js', {
cwd: LANGUAGE_FEATURE_DIR,
onlyFiles: true
})).map(fileName => path.resolve(LANGUAGE_FEATURE_DIR, fileName))

export default rollup.defineConfig([
...await Promise.all(monacoContributions.map(async contributionFile => {
const dirname = path.dirname(contributionFile)
const language = path.basename(dirname)
return (<rollup.RollupOptions>{
input: {
index: contributionFile,
worker: path.resolve(dirname, (await glob('*.worker.js', {
cwd: path.dirname(contributionFile)
}))[0]!)
},
output: {
minifyInternalExports: false,
preserveModules: true,
assetFileNames: '[name][extname]',
format: 'esm',
dir: `dist/standalone-language-feature-${language}`,
entryFileNames: '[name].js',
hoistTransitiveImports: false
},
plugins: [
replace({
AMD: false,
preventAssignment: true
}),
{
name: 'loader',
resolveId (source) {
if (source.endsWith('editor/editor.api.js')) {
return {
id: 'monaco-editor',
external: true
}
}
if (source.endsWith('editor/editor.worker.js')) {
return {
id: 'monaco-editor/esm/vs/editor/editor.worker.js',
external: true
}
}
return undefined
},
generateBundle () {
const packageJson: PackageJson = {
name: `@codingame/monaco-vscode-standalone-${language}-language-features`,
...Object.fromEntries(Object.entries(pkg).filter(([key]) => ['version', 'keywords', 'author', 'license', 'repository', 'type'].includes(key))),
private: false,
description: `monaco-editor ${language} language features bundled to work with ${pkg.name}`,
exports: {
'.': {
default: './index.js'
},
'./worker': {
default: './worker.js'
}
},
main: 'index.js',
module: 'index.js',
dependencies: {
'monaco-editor': `npm:@codingame/monaco-vscode-editor-api@^${pkg.version}`
}
}
this.emitFile({
fileName: 'package.json',
needsCodeReference: false,
source: JSON.stringify(packageJson, null, 2),
type: 'asset'
})
}
},
nodeResolve({
extensions: EXTENSIONS
})
]
})
})),
{
input: {
index: path.resolve(BASIC_LANGUAGE_DIR, 'monaco.contribution.js')
},
output: {
minifyInternalExports: false,
preserveModules: true,
assetFileNames: '[name][extname]',
format: 'esm',
dir: 'dist/monarch-basic-languages',
entryFileNames: '[name].js',
hoistTransitiveImports: false
},
plugins: [
replace({
AMD: false,
preventAssignment: true
}),
{
name: 'loader',
resolveId (source) {
if (source.endsWith('editor/editor.api.js')) {
return {
id: 'monaco-editor',
external: true
}
}
return undefined
},
generateBundle () {
const packageJson: PackageJson = {
name: '@codingame/monaco-vscode-standalone-languages',
...Object.fromEntries(Object.entries(pkg).filter(([key]) => ['version', 'keywords', 'author', 'license', 'repository', 'type'].includes(key))),
private: false,
description: `monaco-editor default language bundled to work with ${pkg.name}`,
main: 'index.js',
module: 'index.js',
types: 'index.d.ts',
dependencies: {
'monaco-editor': `npm:@codingame/monaco-vscode-editor-api@^${pkg.version}`
}
}
this.emitFile({
fileName: 'package.json',
needsCodeReference: false,
source: JSON.stringify(packageJson, null, 2),
type: 'asset'
})
}
},
nodeResolve({
extensions: EXTENSIONS
})
]
}])
15 changes: 7 additions & 8 deletions rollup/rollup.types.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export default rollup.defineConfig((<{input: Record<string, string>, output: str
'rollup-extension-directory-plugin.d': './dist/types/src/rollup-extension-directory-plugin.d.ts'
},
output: 'dist/rollup-extension-directory-plugin'
}]).map(({ input, output, preserveModulesRoot = TYPES_SRC_DIR, main = false }) => (<rollup.RollupOptions>{
}]).map(({ input, output, preserveModulesRoot = TYPES_SRC_DIR }) => (<rollup.RollupOptions>{
input,
treeshake: false,
output: {
Expand Down Expand Up @@ -268,6 +268,12 @@ export default rollup.defineConfig((<{input: Record<string, string>, output: str
return `/// <reference path="./${importPath}" />\n\n${code}`
}
return undefined
},
async generateBundle (options, bundle) {
const editorTypesChunk = bundle['vscode/src/vs/editor/editor.api.d.ts'] as rollup.OutputChunk | undefined
if (editorTypesChunk != null) {
editorTypesChunk.code = (await fs.promises.readFile(path.resolve(PROJECT_ROOT, 'monaco-editor/editor.api.d.ts'))).toString('utf-8')
}
}
},
{
Expand All @@ -285,13 +291,6 @@ export default rollup.defineConfig((<{input: Record<string, string>, output: str
return undefined
}
},
{
name: 'fix-editor-api-types',
renderChunk (code) {
// rollup-plugin-dts is not able to transform "declare module" syntaxes
return code.replaceAll("declare module 'vs/editor/editor.api'", "declare module 'vscode/vscode/vs/editor/editor.api'")
}
},
dts({
respectExternal: true
})
Expand Down
Loading

0 comments on commit 9cea7ff

Please sign in to comment.