Skip to content

Commit a348c2e

Browse files
committed
create models at root
1 parent 0055290 commit a348c2e

File tree

4 files changed

+70
-31
lines changed

4 files changed

+70
-31
lines changed

jsconfig.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
"forceConsistentCasingInFileNames": true,
88
"lib": ["es2020", "DOM"],
99
"moduleResolution": "node",
10-
"module": "es2020",
10+
"module": "es2022",
1111
"resolveJsonModule": true,
1212
"skipLibCheck": true,
1313
"sourceMap": true,
1414
"strict": true,
15-
"target": "es2020"
15+
"target": "es2022"
1616
}
1717
}

src/lib/client/monaco/monaco.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { browser } from '$app/env';
2+
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
3+
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
4+
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
5+
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
6+
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
7+
8+
/** @type {import('monaco-editor')} */
9+
let monaco;
10+
11+
if (browser) {
12+
monaco = await import('monaco-editor');
13+
14+
// @ts-expect-error
15+
window.monacoEnvironment = {
16+
/**
17+
* @param {string} _moduleId
18+
* @param {string} label
19+
*/
20+
getWorker: function (_moduleId, label) {
21+
switch (label) {
22+
case 'json':
23+
return new jsonWorker();
24+
case 'css':
25+
case 'scss':
26+
case 'less':
27+
return new cssWorker();
28+
case 'html':
29+
return new htmlWorker();
30+
case 'javascript':
31+
case 'typescript':
32+
return new tsWorker();
33+
default:
34+
return new editorWorker();
35+
}
36+
}
37+
};
38+
}
39+
40+
export { monaco };

src/lib/client/viewer/Editor.svelte

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@
2020
/** @type {import('monaco-editor').editor.IStandaloneCodeEditor}*/
2121
let editor;
2222
23-
/** @type {import('monaco-editor').editor.ITextModel}*/
24-
let model;
25-
26-
/** @type {import('$lib/types').File | null} */
27-
let active;
28-
2923
onMount(() => {
3024
let destroyed = false;
3125
@@ -67,29 +61,6 @@
6761
destroyed = true;
6862
};
6963
});
70-
71-
$: if (editor && file) {
72-
if (file === active) {
73-
// model.setValue(file.contents);
74-
} else {
75-
const type = file.basename.split('.').pop();
76-
77-
model = monaco.editor.createModel(
78-
file.contents,
79-
type === 'svelte' ? 'html' : type, // TODO figure out how to do Svelte files with monaco.languages.register
80-
new monaco.Uri().with({ path: file.name })
81-
);
82-
83-
model.onDidChangeContent(() => {
84-
dispatch('change', {
85-
value: model.getValue()
86-
});
87-
});
88-
89-
editor.setModel(model);
90-
active = file;
91-
}
92-
}
9364
</script>
9465

9566
<div bind:this={container} />

src/routes/tutorial/[slug]/index.svelte

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import { writable } from 'svelte/store';
1717
import Viewer from '$lib/client/viewer/Viewer.svelte';
1818
import TableOfContents from './_/TableOfContents.svelte';
19+
import { monaco } from '$lib/client/monaco/monaco.js';
1920
2021
/** @type {import('$lib/types').SectionIndex} */
2122
export let index;
@@ -33,6 +34,9 @@
3334
/** @type {import('svelte/store').Writable<Array<import('$lib/types').File | import('$lib/types').Directory>>} */
3435
const files = writable([]);
3536
37+
/** @type {import('svelte/store').Writable<import('monaco-editor').editor.ITextModel[]>} */
38+
const models = writable([]);
39+
3640
/** @type {import('svelte/store').Writable<import('$lib/types').File | null>} */
3741
const selected = writable(null);
3842
@@ -50,6 +54,8 @@
5054
5155
files,
5256
57+
models,
58+
5359
selected,
5460
5561
started,
@@ -112,6 +118,28 @@
112118
113119
files.set(data);
114120
121+
for (const model of $models) model.dispose();
122+
$models = [];
123+
124+
data.forEach((file) => {
125+
if (file.type === 'file') {
126+
const type = file.basename.split('.').pop();
127+
const model = monaco.editor.createModel(
128+
file.contents,
129+
type,
130+
new monaco.Uri().with({ path: file.name })
131+
);
132+
133+
model.onDidChangeContent(() => {
134+
const value = model.getValue();
135+
file.contents = value;
136+
adapter.update([file]);
137+
});
138+
139+
$models.push(model);
140+
}
141+
});
142+
115143
selected.set(
116144
/** @type {import('$lib/types').File} */ (
117145
data.find((file) => file.name === section.chapter.focus)

0 commit comments

Comments
 (0)