Skip to content

Commit

Permalink
Make Monaco integration functional
Browse files Browse the repository at this point in the history
  • Loading branch information
remcohaszing committed Aug 5, 2023
1 parent 81e33e9 commit 4c93383
Show file tree
Hide file tree
Showing 11 changed files with 58 additions and 899 deletions.
2 changes: 2 additions & 0 deletions demo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
},
"dependencies": {
"@mdx-js/monaco": "*",
"@types/node": "^18.0.0",
"@types/webpack-env": "^1.0.0",
"css-loader": "^6.0.0",
"html-webpack-plugin": "^5.0.0",
"mini-css-extract-plugin": "^2.0.0",
"monaco-editor": "^0.41.0",
"path-browserify": "^1.0.0",
"remark-frontmatter": "^4.0.0",
"remark-gfm": "^3.0.0",
"webpack": "^5.0.0",
Expand Down
6 changes: 4 additions & 2 deletions demo/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ window.MonacoEnvironment = {
}

case 'mdx': {
return new Worker(new URL('mdx.worker.js', import.meta.url))
return new Worker(
new URL('@mdx-js/monaco/mdx.worker.js', import.meta.url)
)
}

default: {
Expand All @@ -60,7 +62,7 @@ monaco.languages.register({
})

// This is where we actually configure the MDX integration.
initializeMonacoMdx(monaco, {
await initializeMonacoMdx(monaco, {
createData: {
compilerOptions: {
checkJs: true
Expand Down
12 changes: 10 additions & 2 deletions demo/webpack.config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import {createRequire} from 'node:module'
import HtmlWebPackPlugin from 'html-webpack-plugin'
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import webpack from 'webpack'

const require = createRequire(import.meta.url)

/**
* @type {import('webpack').Configuration}
Expand All @@ -8,7 +12,10 @@ const config = {
devtool: 'source-map',
entry: './src/index.js',
resolve: {
conditionNames: ['worker']
conditionNames: ['worker'],
alias: {
path: require.resolve('path-browserify')
}
},
module: {
exprContextRegExp: /$^/,
Expand All @@ -34,7 +41,8 @@ const config = {
},
plugins: [
new HtmlWebPackPlugin(),
new MiniCssExtractPlugin({filename: '[contenthash].css'})
new MiniCssExtractPlugin({filename: '[contenthash].css'}),
new webpack.IgnorePlugin({resourceRegExp: /perf_hooks/})
]
}

Expand Down
59 changes: 0 additions & 59 deletions packages/language-service/lib/error.js

This file was deleted.

51 changes: 0 additions & 51 deletions packages/language-service/lib/markdown.js

This file was deleted.

88 changes: 0 additions & 88 deletions packages/language-service/lib/outline.js

This file was deleted.

79 changes: 10 additions & 69 deletions packages/monaco/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,7 @@
* Options to pass to the MDX worker.
*/

import {registerMarkerDataProvider} from 'monaco-marker-data-provider'
import {
createCompletionItemProvider,
createDefinitionProvider,
createHoverProvider,
createMarkerDataProvider,
createReferenceProvider
} from './lib/language-features.js'
import * as volar from '@volar/monaco'

/**
* Initialize MDX IntelliSense for MDX.
Expand All @@ -28,73 +21,21 @@ import {
* The Monaco editor module.
* @param {InitializeMonacoMdxOptions} [options]
* Additional options for MDX IntelliSense.
* @returns {IDisposable}
* @returns {Promise<IDisposable>}
* A disposable.
*/
export function initializeMonacoMdx(monaco, options) {
const worker = /** @type {MonacoWebWorker} */ (
monaco.editor.createWebWorker({
moduleId: '@mdx-js/monaco',
label: 'mdx',
keepIdleModels: true,
createData: /** @type {CreateData} */ ({
compilerOptions: options?.createData?.compilerOptions || {},
extraLibs: options?.createData?.extraLibs || {},
inlayHintsOptions: options?.createData?.inlayHintsOptions || {}
})
})
)

/**
* @param {Uri[]} resources
*/
const getProxy = (...resources) => worker.withSyncedResources(resources)

/**
* Synchronize all MDX, JavaScript, and TypeScript files with the web worker.
*
* @param {ITextModel} model
*/
const synchronize = (model) => {
const languageId = model.getLanguageId()
if (
languageId === 'mdx' ||
languageId === 'javascript' ||
languageId === 'javascriptreact' ||
languageId === 'typescript' ||
languageId === 'typescriptreact'
) {
getProxy(model.uri)
}
}

monaco.editor.onDidChangeModelLanguage(({model}) => {
synchronize(model)
export async function initializeMonacoMdx(monaco, options) {

Check failure on line 27 in packages/monaco/index.js

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest, 18)

'options' is defined but never used. Allowed unused args must match /^_/u.
const worker = monaco.editor.createWebWorker({
moduleId: '@mdx-js/monaco/mdx.worker.js',
label: 'mdx'
})

const disposables = [
worker,
monaco.editor.onDidCreateModel(synchronize),
monaco.languages.registerCompletionItemProvider(
'mdx',
createCompletionItemProvider(monaco, getProxy)
),
monaco.languages.registerDefinitionProvider(
'mdx',
createDefinitionProvider(monaco, getProxy)
),
monaco.languages.registerHoverProvider(
'mdx',
createHoverProvider(monaco, getProxy)
),
monaco.languages.registerReferenceProvider(
'mdx',
createReferenceProvider(monaco, getProxy)
),
registerMarkerDataProvider(
monaco,
await volar.languages.registerProvides(
worker,
'mdx',
createMarkerDataProvider(monaco, getProxy)
() => monaco.editor.getModels().map((model) => model.uri),
monaco.languages
)
]

Expand Down
Loading

0 comments on commit 4c93383

Please sign in to comment.