11import 'monaco-editor/esm/vs/language/json/monaco.contribution'
22import * as monaco from 'monaco-editor'
33import { getJsonSchemas , onDidChangeJsonSchema } from 'vscode/monaco'
4+ import { Disposable } from 'vscode'
45import { registerWorkerLoader } from '../worker'
56
7+ type Unpacked < T > = T extends ( infer U ) [ ] ? U : T
8+ type Schema = Unpacked < NonNullable < monaco . languages . json . DiagnosticsOptions [ 'schemas' ] > >
9+
10+ const customSchemas : Schema [ ] = [ ]
611function updateDiagnosticsOptions ( ) {
712 monaco . languages . json . jsonDefaults . setDiagnosticsOptions ( {
813 comments : 'ignore' ,
@@ -16,7 +21,8 @@ function updateDiagnosticsOptions () {
1621 {
1722 uri : 'https://json-schema.org/draft/2019-09/schema' ,
1823 fileMatch : [ '*.schema.json' ]
19- }
24+ } ,
25+ ...customSchemas
2026 ]
2127 } )
2228}
@@ -26,3 +32,15 @@ onDidChangeJsonSchema(updateDiagnosticsOptions)
2632
2733const workerLoader = async ( ) => ( await import ( /* webpackChunkName: "MonacoJsonWorker" */ 'monaco-editor/esm/vs/language/json/json.worker?worker' ) ) . default
2834registerWorkerLoader ( 'json' , workerLoader )
35+
36+ export function addJsonSchema ( schema : Unpacked < NonNullable < monaco . languages . json . DiagnosticsOptions [ 'schemas' ] > > ) : Disposable {
37+ customSchemas . push ( schema )
38+ updateDiagnosticsOptions ( )
39+ return new Disposable ( ( ) => {
40+ const index = customSchemas . indexOf ( schema )
41+ if ( index >= 0 ) {
42+ customSchemas . splice ( index , 1 )
43+ updateDiagnosticsOptions ( )
44+ }
45+ } )
46+ }
0 commit comments