Skip to content

Commit d6e56e1

Browse files
committed
refactor(monaco): package monaco editor
1 parent 84359f5 commit d6e56e1

File tree

7 files changed

+73
-41
lines changed

7 files changed

+73
-41
lines changed

index.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
<script>
2929
window.OPENLIST_CONFIG = {
3030
cdn: undefined,
31-
monaco_cdn: undefined,
3231
base_path: undefined,
3332
api: undefined,
3433
main_color: undefined,

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"lightgallery": "^2.8.3",
8585
"mark.js": "^8.11.1",
8686
"mitt": "^3.0.1",
87+
"monaco-editor": "^0.52.2",
8788
"mpegts.js": "^1.8.0",
8889
"pdfjs-dist": "^5.3.31",
8990
"qrcode": "^1.5.4",

pnpm-lock.yaml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/MonacoEditor.tsx

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,82 @@
11
import { Box } from "@hope-ui/solid"
2-
import { createEffect, createSignal, onCleanup, onMount } from "solid-js"
3-
import { MaybeLoading } from "./FullLoading"
4-
import loader from "@monaco-editor/loader"
5-
import { monaco_cdn } from "~/utils"
2+
import { createEffect, onCleanup, onMount, splitProps } from "solid-js"
3+
import * as monaco from "monaco-editor"
64

7-
loader.config({
8-
paths: {
9-
vs: monaco_cdn,
5+
// Configure worker for Monaco Editor
6+
import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker"
7+
import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker"
8+
import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"
9+
import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker"
10+
import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker"
11+
12+
self.MonacoEnvironment = {
13+
getWorker(_, label) {
14+
if (label === "json") {
15+
return new jsonWorker()
16+
}
17+
if (label === "css" || label === "scss" || label === "less") {
18+
return new cssWorker()
19+
}
20+
if (label === "html" || label === "handlebars" || label === "razor") {
21+
return new htmlWorker()
22+
}
23+
if (label === "typescript" || label === "javascript") {
24+
return new tsWorker()
25+
}
26+
return new editorWorker()
1027
},
11-
})
12-
export interface MonacoEditorProps {
28+
}
29+
export interface MonacoEditorProps
30+
extends monaco.editor.IStandaloneEditorConstructionOptions {
1331
value: string
1432
onChange?: (value: string) => void
15-
theme: "vs" | "vs-dark"
33+
theme?: "vs" | "vs-dark" | "hc-black" | "hc-light"
1634
path?: string
1735
language?: string
1836
}
19-
let monaco: any
20-
21-
export const MonacoEditorLoader = (props: MonacoEditorProps) => {
22-
const [loading, setLoading] = createSignal(true)
23-
loader.init().then((m) => {
24-
monaco = m
25-
setLoading(false)
26-
})
27-
return (
28-
<MaybeLoading loading={loading()}>
29-
<MonacoEditor {...props} />
30-
</MaybeLoading>
31-
)
32-
}
3337

3438
export const MonacoEditor = (props: MonacoEditorProps) => {
3539
let monacoEditorDiv: HTMLDivElement
36-
let monacoEditor: any /*monaco.editor.IStandaloneCodeEditor*/
37-
let model: any /*monaco.editor.ITextModel*/
40+
let monacoEditor: monaco.editor.IStandaloneCodeEditor
41+
let model: monaco.editor.ITextModel
42+
43+
// Separate custom properties and Monaco options
44+
const [customProps, monacoOptions] = splitProps(props, ["onChange", "path"])
45+
3846
onMount(() => {
3947
monacoEditor = monaco.editor.create(monacoEditorDiv!, {
40-
value: props.value,
41-
theme: props.theme,
48+
automaticLayout: true,
49+
...monacoOptions,
4250
})
51+
4352
model = monaco.editor.createModel(
4453
props.value,
4554
props.language,
46-
props.path ? monaco.Uri.parse(props.path) : undefined,
55+
customProps.path ? monaco.Uri.parse(customProps.path) : undefined,
4756
)
4857
monacoEditor.setModel(model)
58+
4959
monacoEditor.onDidChangeModelContent(() => {
50-
props.onChange?.(monacoEditor.getValue())
60+
customProps.onChange?.(monacoEditor.getValue())
5161
})
5262
})
63+
5364
createEffect(() => {
54-
monacoEditor.setValue(props.value)
65+
if (monacoEditor && props.value !== monacoEditor.getValue()) {
66+
monacoEditor.setValue(props.value)
67+
}
5568
})
5669

5770
createEffect(() => {
58-
monaco.editor.setTheme(props.theme)
71+
if (monacoEditor && props.theme) {
72+
monaco.editor.setTheme(props.theme)
73+
}
5974
})
75+
6076
onCleanup(() => {
61-
model && model.dispose()
62-
monacoEditor && monacoEditor.dispose()
77+
model?.dispose()
78+
monacoEditor?.dispose()
6379
})
80+
6481
return <Box w="$full" h="70vh" ref={monacoEditorDiv!} />
6582
}

src/pages/home/previews/text-editor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Button, useColorMode, VStack } from "@hope-ui/solid"
22
import { createEffect, createMemo, createSignal, on, Show } from "solid-js"
33
import { EncodingSelect, MaybeLoading } from "~/components"
4-
import { MonacoEditorLoader } from "~/components/MonacoEditor"
4+
import { MonacoEditor } from "~/components/MonacoEditor"
55
import { useFetch, useFetchText, useParseText, useRouter, useT } from "~/hooks"
66
import { objStore, userCan } from "~/store"
77
import { PEmptyResp } from "~/types"
@@ -51,7 +51,7 @@ function Editor(props: { data?: string | ArrayBuffer; contentType?: string }) {
5151
referenceText={props.data}
5252
/>
5353
</Show>
54-
<MonacoEditorLoader
54+
<MonacoEditor
5555
value={text(encoding())}
5656
theme={theme()}
5757
path={objStore.obj.name}

src/utils/config.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,3 @@ if (api === "/") {
2424
if (api.endsWith("/")) {
2525
api = api.slice(0, -1)
2626
}
27-
28-
export const monaco_cdn =
29-
window.OPENLIST_CONFIG.monaco_cdn ||
30-
"https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/monaco-editor/0.33.0-dev.20220228/min/vs"

vite.config.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ export default defineConfig({
2929
build: {
3030
// target: "es2015", //next
3131
// polyfillDynamicImport: false,
32+
rollupOptions: {
33+
output: {
34+
manualChunks: {
35+
jsonWorker: ["monaco-editor/esm/vs/language/json/json.worker"],
36+
cssWorker: ["monaco-editor/esm/vs/language/css/css.worker"],
37+
htmlWorker: ["monaco-editor/esm/vs/language/html/html.worker"],
38+
tsWorker: ["monaco-editor/esm/vs/language/typescript/ts.worker"],
39+
editorWorker: ["monaco-editor/esm/vs/editor/editor.worker"],
40+
},
41+
},
42+
},
3243
},
3344
// experimental: {
3445
// renderBuiltUrl: (filename, { type, hostId, hostType }) => {

0 commit comments

Comments
 (0)