0.1.0 • Published 5 months ago

monaco-editor-component v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

Web component based on Monaco Editor. Support Vue and React.

NPM downloads

Installation

[npm|yarn|pnpm] install monaco-editor-component

OR

bun install monaco-editor-component

Usage

React

You can see the demo details.

// App.tsx
import { useState } from 'react'
import { MonacoEditor, MonacoDiffEditor } from 'monaco-editor-component/react'

const App = () => {
  const [code, setCode] = useState('console.log("Hello World")')

  return (
    <div>
      <MonacoEditor language='javascript' value={code} width='300' height='500' onChange={value => setCode(value)} />
      <MonacoDiffEditor language='javascript' originalValue='const a = 123;' value={code} onChange={value => setCode(value)} />
    </div>
  )
}

// main.tsx
import App from './App'
import { createRoot } from 'react-dom/client'
const app = document.getElementById('root')
createRoot(app).render(<App />)

Vue(3+)

You can see the demo details.

// App.vue
<script setup lang="ts">
import { ref } from 'vue'
import { MonacoEditor, MonacoDiffEditor } from 'monaco-editor-component/vue'

const input = ref('const a = 12356;')

</script>

<template>
  <div>
    <MonacoEditor v-model:value="input" language='javascript' width='300' height='500'  />
    <MonacoDiffEditor language='javascript' originalValue='const a = 123;' v-model:value='input' />
  </div>
</template>
// main.ts
import App from './App.vue'
const app = document.getElementById('root')
createApp(app).render(<App />)

Props

MonacoEditor

NameTypeDefaultDescription
languagestringjavascriptThe language of the editor.
valuestringnullThe value of the auto created model in the editor.
defaultValuestring""The default value of the auto created model in the editor.
themestringvs-darkThe theme of the editor.
optionsMonacoEditorOptions{}The options of the editor.
onChange(value: string, e: monaco.editor.IModelContentChangedEvent) => voidnoopAn event emitted when the content of the current model has changed.
widthstring | number100%The width of the editor.
heightstring | number100%The height of the editor.
classNamestring""The class name of the editor.
styleReact.CSSProperties{}The style of the editor.
onEditorDidMount(editor: MonacoCodeEditor, monaco: Monaco) => voidnoopAn event emitted when the editor has been mounted (similar to componentDidMount of React).
onEditorWillMount(monaco: Monaco) => voidnoopAn event emitted before the editor mounted (similar to componentWillMount of React).
onEditorWillUnmount(editor: MonacoCodeEditor, monaco: Monaco) => voidnoopAn event emitted when the editor will unmount (similar to componentWillUnmount of React).
modelUri(monaco: Monaco) => monaco.UriundefinedThe uri of the model.

For more options see monaco-editor

MonacoDiffEditor

MonacoDiffEditor is a diff editor.

MonacoDiffEditor extends MonacoEditor, so it has all the props of MonacoEditor but excludes the modelUri prop.

NameTypeDefaultDescription
originalValuestring""The original value of the auto created model in the editor, is a base value.
originalUri(monaco: Monaco) => monaco.UriundefinedThe uri of the original model.
modifiedUri(monaco: Monaco) => monaco.UriundefinedThe uri of the modified model.
valuestringnullThe modified value of the auto created model in the editor, is a modified value.

Use Editor Instance

// react
import { useRef } from 'react'
import type { MonacoEditorRef } from 'monaco-editor-component'
const editorRef = useRef<MonacoEditorRef>(null)

// vue
import { ref } from 'vue'
const monacoEditor = ref<MonacoCodeEditor | null>(null)
const updateMonacoEditor = (editor: MonacoCodeEditor, monaco: Monaco) => {
  monacoEditor.value = editor
}
<template>
  <MonacoEditor v-model:value="input" :onEditorDidMount="updateMonacoEditor" />
</template>

// usage
const model = editorRef.current.editor.current.getModel()

OR

const model = monacoEditor.value.getModel()

Integrating the ESM version of the Monaco Editor

For Vite, you only need to implement the getWorker function (NOT the getWorkerUrl) to use Vite's output.

Others like Webpack see monaco-editor worker

// Vite
// worker.ts file
import * as monaco from 'monaco-editor'
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
self.MonacoEnvironment = {
  getWorker(_: unknown, label: string) {
    if (label === 'json') {
      return new jsonWorker()
    }
    if (label === 'css' || label === 'scss' || label === 'less') {
      return new cssWorker()
    }
    if (label === 'html' || label === 'handlebars' || label === 'razor') {
      return new htmlWorker()
    }
    if (label === 'typescript' || label === 'javascript') {
      return new tsWorker()
    }
    return new editorWorker()
  },
}

// App.tsx
import { MonacoEditor } from 'monaco-editor-component/react'
import './worker'

// usage of MonacoEditor...

Vue usage is similar to React (when you use Vite).

License

MIT License

Copyright (c) 2023 Yugang Cao, see the LICENSE details.

0.1.0

5 months ago

0.0.9

5 months ago

0.0.8

5 months ago

0.0.7

6 months ago

0.0.6

6 months ago

0.0.5

6 months ago

0.0.4

6 months ago

0.0.3

6 months ago

0.0.2

6 months ago

0.0.1

6 months ago