tangled
alpha
login
or
join now
tylur.dev
/
prototypey
prototypey.org - atproto lexicon typescript toolkit - mirror https://github.com/tylersayshi/prototypey
1
fork
atom
overview
issues
pulls
pipelines
tests passing
Tyler
3 months ago
305a208f
2a836c01
+98
-17
7 changed files
expand all
collapse all
unified
split
packages
site
src
components
Editor.tsx
tests
components
Editor.test.tsx
Playground.test.tsx
mocks
monaco-editor.ts
worker.ts
setup.ts
vitest.config.ts
+19
-15
packages/site/src/components/Editor.tsx
···
5
5
import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
6
6
import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";
7
7
8
8
-
// Configure loader to use local monaco-editor 0.52.0 instead of CDN 0.54.0
9
9
-
self.MonacoEnvironment = {
10
10
-
getWorker(_: string, label: string) {
11
11
-
if (label === "json") {
12
12
-
return new jsonWorker();
13
13
-
}
14
14
-
if (label === "typescript" || label === "javascript") {
15
15
-
return new tsWorker();
16
16
-
}
17
17
-
return new editorWorker();
18
18
-
},
19
19
-
};
8
8
+
// Configure Monaco Environment for web workers
9
9
+
if (typeof self !== "undefined") {
10
10
+
self.MonacoEnvironment = {
11
11
+
getWorker(_: string, label: string) {
12
12
+
if (label === "json") {
13
13
+
return new jsonWorker();
14
14
+
}
15
15
+
if (label === "typescript" || label === "javascript") {
16
16
+
return new tsWorker();
17
17
+
}
18
18
+
return new editorWorker();
19
19
+
},
20
20
+
};
21
21
+
}
20
22
21
21
-
loader.config({ monaco });
23
23
+
// Configure loader to use local monaco-editor 0.52.0 instead of CDN 0.54.0
24
24
+
if (loader?.config) {
25
25
+
loader.config({ monaco });
26
26
+
}
22
27
23
28
interface EditorProps {
24
29
value: string;
···
36
41
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
37
42
target: monaco.languages.typescript.ScriptTarget.ES2020,
38
43
allowNonTsExtensions: true,
39
39
-
moduleResolution:
40
40
-
monaco.languages.typescript.ModuleResolutionKind.NodeJs,
44
44
+
moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
41
45
module: monaco.languages.typescript.ModuleKind.ESNext,
42
46
noEmit: true,
43
47
esModuleInterop: true,
+15
packages/site/tests/components/Editor.test.tsx
···
11
11
onChange={(e) => onChange(e.target.value)}
12
12
/>
13
13
),
14
14
+
useMonaco: () => ({
15
15
+
languages: {
16
16
+
typescript: {
17
17
+
typescriptDefaults: {
18
18
+
setCompilerOptions: vi.fn(),
19
19
+
setDiagnosticsOptions: vi.fn(),
20
20
+
addExtraLib: vi.fn(),
21
21
+
},
22
22
+
ScriptTarget: { ES2020: 7 },
23
23
+
ModuleResolutionKind: { NodeJs: 2 },
24
24
+
ModuleKind: { ESNext: 99 },
25
25
+
},
26
26
+
},
27
27
+
}),
14
28
loader: {
29
29
+
config: vi.fn(),
15
30
init: vi.fn(() =>
16
31
Promise.resolve({
17
32
languages: {
+15
-1
packages/site/tests/components/Playground.test.tsx
···
10
10
onChange={(e) => onChange(e.target.value)}
11
11
/>
12
12
),
13
13
-
useMonaco: () => null,
13
13
+
useMonaco: () => ({
14
14
+
languages: {
15
15
+
typescript: {
16
16
+
typescriptDefaults: {
17
17
+
setCompilerOptions: vi.fn(),
18
18
+
setDiagnosticsOptions: vi.fn(),
19
19
+
addExtraLib: vi.fn(),
20
20
+
},
21
21
+
ScriptTarget: { ES2020: 7 },
22
22
+
ModuleResolutionKind: { NodeJs: 2 },
23
23
+
ModuleKind: { ESNext: 99 },
24
24
+
},
25
25
+
},
26
26
+
}),
14
27
loader: {
28
28
+
config: vi.fn(),
15
29
init: vi.fn(() =>
16
30
Promise.resolve({
17
31
languages: {
+2
packages/site/tests/mocks/monaco-editor.ts
···
1
1
+
// Mock monaco-editor for tests
2
2
+
export default {};
+2
packages/site/tests/mocks/worker.ts
···
1
1
+
// Mock worker for tests
2
2
+
export default class MockWorker {}
+15
packages/site/tests/setup.ts
···
1
1
import { vi } from "vitest";
2
2
import "@testing-library/jest-dom/vitest";
3
3
4
4
+
// Mock @monaco-editor/react BEFORE any imports
5
5
+
vi.mock("@monaco-editor/react", () => ({
6
6
+
default: vi.fn(() => null),
7
7
+
useMonaco: vi.fn(() => null),
8
8
+
loader: {
9
9
+
config: vi.fn(),
10
10
+
init: vi.fn(() => Promise.resolve({})),
11
11
+
},
12
12
+
}));
13
13
+
4
14
global.fetch = vi.fn(
5
15
() =>
6
16
Promise.resolve({
7
17
text: () => Promise.resolve(""),
8
18
}) as any,
9
19
);
20
20
+
21
21
+
// Mock MonacoEnvironment
22
22
+
(global as any).MonacoEnvironment = {
23
23
+
getWorker: () => ({}) as any,
24
24
+
};
+30
-1
packages/site/vitest.config.ts
···
1
1
import { defineConfig } from "vitest/config";
2
2
import react from "@vitejs/plugin-react";
3
3
4
4
+
// Plugin to mock monaco-editor workers in tests
5
5
+
function mockMonacoWorkers() {
6
6
+
return {
7
7
+
name: "mock-monaco-workers",
8
8
+
resolveId(id: string) {
9
9
+
if (id.includes("monaco-editor") && id.includes("?worker")) {
10
10
+
return id;
11
11
+
}
12
12
+
},
13
13
+
load(id: string) {
14
14
+
if (id.includes("monaco-editor") && id.includes("?worker")) {
15
15
+
return "export default class MockWorker {}";
16
16
+
}
17
17
+
},
18
18
+
};
19
19
+
}
20
20
+
4
21
export default defineConfig({
5
5
-
plugins: [react()],
22
22
+
plugins: [
23
23
+
react({
24
24
+
babel: {
25
25
+
plugins: [],
26
26
+
},
27
27
+
}),
28
28
+
mockMonacoWorkers(),
29
29
+
],
6
30
test: {
7
31
environment: "jsdom",
8
32
globals: true,
9
33
setupFiles: ["./tests/setup.ts"],
34
34
+
},
35
35
+
resolve: {
36
36
+
alias: {
37
37
+
"monaco-editor": "/Users/tyler/gitspace/prototypey/packages/site/tests/mocks/monaco-editor.ts",
38
38
+
},
10
39
},
11
40
});