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