Skip to content

Commit 7817286

Browse files
authored
Merge pull request #15 from sourcemeta-research/feature/clickable-schema-keywords
Make JSON Schema keywords clickable, linking to learnjsonschema.com
2 parents 7d5bc85 + 6552650 commit 7817286

5 files changed

Lines changed: 436 additions & 2 deletions

File tree

‎src/components/CustomDebugger/CustomDebugger.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { editor as MonacoEditor } from "monaco-editor";
44
import { AppContext } from "../../contexts/AppContext";
55
import { traceCustomSchema } from "../../api/one";
66
import { defineMonacoTheme, ONE_UI_EDITOR_FONT_OPTIONS, ONE_UI_MONACO_THEME } from "../../utils/monacoTheme";
7+
import { attachSchemaKeywordLinks } from "../../utils/learnJsonSchemaLinks";
78
import { getCollectedAnnotations, getDynamicScope, getOpenFrames } from "../../utils/traceStack";
89
import { computeJsonPositions } from "../../utils/jsonPointerPositions";
910
import type { SchemaPositions, TraceResult } from "../../types/one";
@@ -483,7 +484,10 @@ const CustomDebugger = ({ onClose }: { onClose: () => void }) => {
483484
? (value) => setSchemaText(value ?? "")
484485
: undefined
485486
}
486-
onMount={(editorInstance) => (schemaEditorRef.current = editorInstance)}
487+
onMount={(editorInstance, monaco) => {
488+
schemaEditorRef.current = editorInstance;
489+
attachSchemaKeywordLinks(editorInstance, monaco);
490+
}}
487491
options={{
488492
...ONE_UI_EDITOR_FONT_OPTIONS,
489493
readOnly: activeSchemaTab !== "local",

‎src/components/InstanceEditor.tsx‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { AppContext } from "../contexts/AppContext";
55
import MetadataTable from "./MetadataTable";
66
import DetailPanel from "./DetailPanel";
77
import { defineMonacoTheme, ONE_UI_EDITOR_FONT_OPTIONS, ONE_UI_MONACO_THEME } from "../utils/monacoTheme";
8+
import { attachSchemaKeywordLinks } from "../utils/learnJsonSchemaLinks";
89
import IdleState from "./IdleState";
910
import { getSchemaContent } from "../api/one";
1011

@@ -333,6 +334,9 @@ const InstanceEditor = () => {
333334
? (value) => setSchemaDraft(value ?? "")
334335
: (value) => setInstanceText(value ?? "")
335336
}
337+
onMount={
338+
activeTab === "schema" ? attachSchemaKeywordLinks : undefined
339+
}
336340
options={{
337341
...ONE_UI_EDITOR_FONT_OPTIONS,
338342
minimap: { enabled: false },

‎src/components/TraceDebugger/TraceDebugger.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { AppContext } from "../../contexts/AppContext";
55
import { getSchemaPositions } from "../../api/one";
66
import type { SchemaPositions } from "../../types/one";
77
import { defineMonacoTheme, ONE_UI_EDITOR_FONT_OPTIONS, ONE_UI_MONACO_THEME } from "../../utils/monacoTheme";
8+
import { attachSchemaKeywordLinks } from "../../utils/learnJsonSchemaLinks";
89
import { getCollectedAnnotations, getDynamicScope, getOpenFrames } from "../../utils/traceStack";
910
import StackVisualizer from "./StackVisualizer";
1011
import AnnotationsPanel from "../AnnotationsPanel";
@@ -168,8 +169,9 @@ const TraceDebugger = () => {
168169
instanceEditorRef.current = editorInstance;
169170
};
170171

171-
const handleSchemaMount = (editorInstance: MonacoEditor.IStandaloneCodeEditor) => {
172+
const handleSchemaMount = (editorInstance: MonacoEditor.IStandaloneCodeEditor, monaco: Monaco) => {
172173
schemaEditorRef.current = editorInstance;
174+
attachSchemaKeywordLinks(editorInstance, monaco);
173175
};
174176

175177
const beforeMount = (monaco: Monaco) => defineMonacoTheme(monaco);
Lines changed: 280 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,280 @@
1+
// Auto-derived from sourcemeta/learnjsonschema.com's content/ directory structure
2+
// (github.com/sourcemeta/learnjsonschema.com): for each dialect, every keyword's
3+
// containing vocabulary slug, used to build a direct link to its documentation
4+
// page. Regenerate by walking that repo's content/<dialect>/<vocab>/<Keyword>.markdown
5+
// tree if learnjsonschema.com reorganizes its URL scheme.
6+
export const LEARN_JSON_SCHEMA_KEYWORDS: Record<string, Record<string, string>> = {
7+
"2019-09": {
8+
"$anchor": "core",
9+
"$comment": "core",
10+
"$defs": "core",
11+
"$id": "core",
12+
"$recursiveAnchor": "core",
13+
"$recursiveRef": "core",
14+
"$ref": "core",
15+
"$schema": "core",
16+
"$vocabulary": "core",
17+
"additionalItems": "applicator",
18+
"additionalProperties": "applicator",
19+
"allOf": "applicator",
20+
"anyOf": "applicator",
21+
"const": "validation",
22+
"contains": "applicator",
23+
"contentEncoding": "content",
24+
"contentMediaType": "content",
25+
"contentSchema": "content",
26+
"default": "meta-data",
27+
"dependentRequired": "validation",
28+
"dependentSchemas": "applicator",
29+
"deprecated": "meta-data",
30+
"description": "meta-data",
31+
"else": "applicator",
32+
"enum": "validation",
33+
"examples": "meta-data",
34+
"exclusiveMaximum": "validation",
35+
"exclusiveMinimum": "validation",
36+
"format": "format",
37+
"if": "applicator",
38+
"items": "applicator",
39+
"maxContains": "validation",
40+
"maxItems": "validation",
41+
"maxLength": "validation",
42+
"maxProperties": "validation",
43+
"maximum": "validation",
44+
"minContains": "validation",
45+
"minItems": "validation",
46+
"minLength": "validation",
47+
"minProperties": "validation",
48+
"minimum": "validation",
49+
"multipleOf": "validation",
50+
"not": "applicator",
51+
"oneOf": "applicator",
52+
"pattern": "validation",
53+
"patternProperties": "applicator",
54+
"properties": "applicator",
55+
"propertyNames": "applicator",
56+
"readOnly": "meta-data",
57+
"required": "validation",
58+
"then": "applicator",
59+
"title": "meta-data",
60+
"type": "validation",
61+
"unevaluatedItems": "applicator",
62+
"unevaluatedProperties": "applicator",
63+
"uniqueItems": "validation",
64+
"writeOnly": "meta-data",
65+
},
66+
"2020-12": {
67+
"$anchor": "core",
68+
"$comment": "core",
69+
"$defs": "core",
70+
"$dynamicAnchor": "core",
71+
"$dynamicRef": "core",
72+
"$id": "core",
73+
"$ref": "core",
74+
"$schema": "core",
75+
"$vocabulary": "core",
76+
"additionalProperties": "applicator",
77+
"allOf": "applicator",
78+
"anyOf": "applicator",
79+
"const": "validation",
80+
"contains": "applicator",
81+
"contentEncoding": "content",
82+
"contentMediaType": "content",
83+
"contentSchema": "content",
84+
"default": "meta-data",
85+
"dependentRequired": "validation",
86+
"dependentSchemas": "applicator",
87+
"deprecated": "meta-data",
88+
"description": "meta-data",
89+
"else": "applicator",
90+
"enum": "validation",
91+
"examples": "meta-data",
92+
"exclusiveMaximum": "validation",
93+
"exclusiveMinimum": "validation",
94+
"format": "format-assertion",
95+
"if": "applicator",
96+
"items": "applicator",
97+
"maxContains": "validation",
98+
"maxItems": "validation",
99+
"maxLength": "validation",
100+
"maxProperties": "validation",
101+
"maximum": "validation",
102+
"minContains": "validation",
103+
"minItems": "validation",
104+
"minLength": "validation",
105+
"minProperties": "validation",
106+
"minimum": "validation",
107+
"multipleOf": "validation",
108+
"not": "applicator",
109+
"oneOf": "applicator",
110+
"pattern": "validation",
111+
"patternProperties": "applicator",
112+
"prefixItems": "applicator",
113+
"properties": "applicator",
114+
"propertyNames": "applicator",
115+
"readOnly": "meta-data",
116+
"required": "validation",
117+
"then": "applicator",
118+
"title": "meta-data",
119+
"type": "validation",
120+
"unevaluatedItems": "unevaluated",
121+
"unevaluatedProperties": "unevaluated",
122+
"uniqueItems": "validation",
123+
"writeOnly": "meta-data",
124+
},
125+
"draft3": {
126+
"$id": "core",
127+
"$ref": "core",
128+
"$schema": "core",
129+
"additionalItems": "core",
130+
"additionalProperties": "core",
131+
"default": "core",
132+
"dependencies": "core",
133+
"description": "core",
134+
"disallow": "core",
135+
"divisibleBy": "core",
136+
"enum": "core",
137+
"exclusiveMaximum": "core",
138+
"exclusiveMinimum": "core",
139+
"extends": "core",
140+
"format": "core",
141+
"items": "core",
142+
"maxItems": "core",
143+
"maxLength": "core",
144+
"maximum": "core",
145+
"minItems": "core",
146+
"minLength": "core",
147+
"minimum": "core",
148+
"pattern": "core",
149+
"patternProperties": "core",
150+
"properties": "core",
151+
"required": "core",
152+
"title": "core",
153+
"type": "core",
154+
"uniqueItems": "core",
155+
},
156+
"draft4": {
157+
"$id": "core",
158+
"$ref": "core",
159+
"$schema": "core",
160+
"additionalItems": "validation",
161+
"additionalProperties": "validation",
162+
"allOf": "validation",
163+
"anyOf": "validation",
164+
"default": "validation",
165+
"definitions": "validation",
166+
"dependencies": "validation",
167+
"description": "validation",
168+
"enum": "validation",
169+
"exclusiveMaximum": "validation",
170+
"exclusiveMinimum": "validation",
171+
"format": "validation",
172+
"items": "validation",
173+
"maxItems": "validation",
174+
"maxLength": "validation",
175+
"maxProperties": "validation",
176+
"maximum": "validation",
177+
"minItems": "validation",
178+
"minLength": "validation",
179+
"minProperties": "validation",
180+
"minimum": "validation",
181+
"multipleOf": "validation",
182+
"not": "validation",
183+
"oneOf": "validation",
184+
"pattern": "validation",
185+
"patternProperties": "validation",
186+
"properties": "validation",
187+
"required": "validation",
188+
"title": "validation",
189+
"type": "validation",
190+
"uniqueItems": "validation",
191+
},
192+
"draft6": {
193+
"$id": "core",
194+
"$ref": "core",
195+
"$schema": "core",
196+
"additionalItems": "validation",
197+
"additionalProperties": "validation",
198+
"allOf": "validation",
199+
"anyOf": "validation",
200+
"const": "validation",
201+
"contains": "validation",
202+
"default": "validation",
203+
"definitions": "validation",
204+
"dependencies": "validation",
205+
"description": "validation",
206+
"enum": "validation",
207+
"examples": "validation",
208+
"exclusiveMaximum": "validation",
209+
"exclusiveMinimum": "validation",
210+
"format": "validation",
211+
"items": "validation",
212+
"maxItems": "validation",
213+
"maxLength": "validation",
214+
"maxProperties": "validation",
215+
"maximum": "validation",
216+
"minItems": "validation",
217+
"minLength": "validation",
218+
"minProperties": "validation",
219+
"minimum": "validation",
220+
"multipleOf": "validation",
221+
"not": "validation",
222+
"oneOf": "validation",
223+
"pattern": "validation",
224+
"patternProperties": "validation",
225+
"properties": "validation",
226+
"propertyNames": "validation",
227+
"required": "validation",
228+
"title": "validation",
229+
"type": "validation",
230+
"uniqueItems": "validation",
231+
},
232+
"draft7": {
233+
"$comment": "core",
234+
"$id": "core",
235+
"$ref": "core",
236+
"$schema": "core",
237+
"additionalItems": "validation",
238+
"additionalProperties": "validation",
239+
"allOf": "validation",
240+
"anyOf": "validation",
241+
"const": "validation",
242+
"contains": "validation",
243+
"contentEncoding": "validation",
244+
"contentMediaType": "validation",
245+
"default": "validation",
246+
"definitions": "validation",
247+
"dependencies": "validation",
248+
"description": "validation",
249+
"else": "validation",
250+
"enum": "validation",
251+
"examples": "validation",
252+
"exclusiveMaximum": "validation",
253+
"exclusiveMinimum": "validation",
254+
"format": "validation",
255+
"if": "validation",
256+
"items": "validation",
257+
"maxItems": "validation",
258+
"maxLength": "validation",
259+
"maxProperties": "validation",
260+
"maximum": "validation",
261+
"minItems": "validation",
262+
"minLength": "validation",
263+
"minProperties": "validation",
264+
"minimum": "validation",
265+
"multipleOf": "validation",
266+
"not": "validation",
267+
"oneOf": "validation",
268+
"pattern": "validation",
269+
"patternProperties": "validation",
270+
"properties": "validation",
271+
"propertyNames": "validation",
272+
"readOnly": "validation",
273+
"required": "validation",
274+
"then": "validation",
275+
"title": "validation",
276+
"type": "validation",
277+
"uniqueItems": "validation",
278+
"writeOnly": "validation",
279+
},
280+
};

0 commit comments

Comments
 (0)