Skip to content

Commit e415984

Browse files
authored
Merge pull request #37 from CodinGame/register-json-configuration-schema
Register json configuration schema
2 parents 6135f54 + d7faa2f commit e415984

11 files changed

Lines changed: 121 additions & 47 deletions

File tree

rollup/rollup.config.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,12 +265,6 @@ export default (args: Record<string, string>): rollup.RollupOptions[] => {
265265
return null
266266
}
267267
}
268-
// Remove schemaRegistry.registerSchema calls
269-
if (name != null && name.endsWith('registerSchema')) {
270-
if (['/keybindingService', '/tokenClassificationRegistry'].every(file => id.includes(file))) {
271-
return null
272-
}
273-
}
274268
}
275269
} else if (node.callee.type === 'Identifier' && PURE_FUNCTIONS.has(node.callee.name)) {
276270
path.replace(addComment(node))
@@ -297,7 +291,17 @@ export default (args: Record<string, string>): rollup.RollupOptions[] => {
297291
}, replace({
298292
VSCODE_VERSION: JSON.stringify(vscodeVersion),
299293
preventAssignment: true
300-
})
294+
}),
295+
{
296+
name: 'dynamic-import-polyfill',
297+
renderDynamicImport (): { left: string, right: string } {
298+
// dynamic imports of vscode-oniguruma and vscode-textmate aren't working without it on vite
299+
return {
300+
left: 'import(',
301+
right: ').then(module => module.default ?? module)'
302+
}
303+
}
304+
}
301305
]
302306
}, {
303307
// 2nd pass to improve treeshaking

scripts/vscode.patch

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,16 @@ index a82ae60c449..143a208b867 100644
4646
return await backend.createProcess(shellLaunchConfig, initialCwd, cols, rows, this._configHelper.config.unicodeVersion, env, options, shouldPersist);
4747
}
4848

49+
diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts
50+
index a1245856684..55bb8224f51 100644
51+
--- a/src/vs/workbench/services/configuration/browser/configurationService.ts
52+
+++ b/src/vs/workbench/services/configuration/browser/configurationService.ts
53+
@@ -1106,7 +1106,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
54+
}
55+
}
56+
57+
-class RegisterConfigurationSchemasContribution extends Disposable implements IWorkbenchContribution {
58+
+export class RegisterConfigurationSchemasContribution extends Disposable implements IWorkbenchContribution {
59+
constructor(
60+
@IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService,
61+
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,

src/monaco.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@ import { Registry } from 'vs/platform/registry/common/platform'
1616
import { IJSONContributionRegistry, Extensions as JsonExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'
1717
import { CommandsRegistry } from 'vs/platform/commands/common/commands'
1818
import { IJSONSchema } from 'vs/base/common/jsonSchema'
19-
import { allSettings } from 'vs/platform/configuration/common/configurationRegistry'
19+
import { Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'
2020
import { EditorOptionsUtil } from 'vs/editor/browser/config/editorConfiguration'
21+
import * as monaco from 'monaco-editor'
22+
import { Event } from 'vs/base/common/event'
23+
import { registerColor } from 'vs/platform/theme/common/colorRegistry'
2124
import { createInjectedClass } from './tools/injection'
2225

2326
function computeConfiguration (configuration: IEditorConfiguration, isDiffEditor: boolean, overrides?: Readonly<IEditorOptions>): IEditorOptions {
@@ -117,9 +120,27 @@ export const createConfiguredDiffEditor: typeof createDiffEditor = (domElement,
117120
}
118121

119122
const Extensions = {
120-
...JsonExtensions
123+
...JsonExtensions,
124+
...ConfigurationExtensions
121125
}
122126

127+
const registry = Registry.as<IJSONContributionRegistry>(Extensions.JSONContribution)
128+
type FileMatch = Partial<Record<string, string[]>>
129+
function getJsonSchemas (fileMatchs: FileMatch = {}): monaco.languages.json.DiagnosticsOptions['schemas'] {
130+
return Object.entries(registry.getSchemaContributions().schemas)
131+
.filter(([uri]) => uri !== 'vscode://schemas/vscode-extensions') // remove it because for some reason it makes the json worker message fail
132+
.map(([uri, schema]) => {
133+
const path = monaco.Uri.parse(uri).path
134+
const schemaName = path.slice(1) // Remove leading "/"
135+
return {
136+
uri,
137+
schema,
138+
fileMatch: schemaName != null ? fileMatchs[schemaName] : undefined
139+
}
140+
})
141+
}
142+
const onDidChangeJsonSchema: Event<string> = registry.onDidChangeSchema
143+
123144
export {
124145
errorHandler,
125146
DisposableStore,
@@ -134,5 +155,8 @@ export {
134155
IJSONContributionRegistry,
135156
IJSONSchema,
136157

137-
allSettings
158+
getJsonSchemas,
159+
onDidChangeJsonSchema,
160+
161+
registerColor
138162
}

src/service-override/configuration.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import { Configuration } from 'vs/platform/configuration/common/configurationMod
1515
import { IColorCustomizations, IThemeScopedColorCustomizations } from 'vs/workbench/services/themes/common/workbenchThemeService'
1616
import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'
1717
import { IPolicyService } from 'vs/platform/policy/common/policy'
18+
import { RegisterConfigurationSchemasContribution } from 'vs/workbench/services/configuration/browser/configurationService'
19+
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'
20+
import getWorkspaceContextServiceOverride from './workspaceContext'
1821
import getFileServiceOverride from './files'
22+
import { onServicesInitialized } from './tools'
1923

2024
function updateUserConfiguration (configurationJson: string): void {
2125
const userDataProfilesService: IUserDataProfilesService = StandaloneServices.get(IUserDataProfilesService)
@@ -55,9 +59,15 @@ class InjectedConfigurationService extends ConfigurationService {
5559
}
5660
}
5761

62+
function initialize (instantiationService: IInstantiationService) {
63+
instantiationService.createInstance(RegisterConfigurationSchemasContribution)
64+
}
65+
5866
export default function getServiceOverride (): IEditorOverrideServices {
67+
onServicesInitialized(initialize)
5968
return {
6069
...getFileServiceOverride(),
70+
...getWorkspaceContextServiceOverride(),
6171
[IConfigurationService.toString()]: new SyncDescriptor(InjectedConfigurationService),
6272
[ITextResourceConfigurationService.toString()]: new SyncDescriptor(TextResourceConfigurationService)
6373
}

src/service-override/languageConfiguration.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
import '../polyfill'
22
import '../vscode-services/missing-services'
3-
import { IEditorOverrideServices, StandaloneServices } from 'vs/editor/standalone/browser/standaloneServices'
3+
import { IEditorOverrideServices } from 'vs/editor/standalone/browser/standaloneServices'
44
import { LanguageConfigurationFileHandler } from 'vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint'
5-
import { URI } from 'vs/base/common/uri'
5+
import { joinPath } from 'vs/base/common/resources'
66
import getFileServiceOverride, { registerExtensionFile } from './files'
7+
import { onServicesInitialized } from './tools'
78
import { IInstantiationService, Services } from '../services'
89
import { DEFAULT_EXTENSION } from '../vscode-services/extHost'
910

10-
function setLanguageConfiguration (resource: URI, getConfiguration: () => Promise<string>): void {
11+
function setLanguageConfiguration (path: string, getConfiguration: () => Promise<string>): void {
1112
const extension = Services.get().extension ?? DEFAULT_EXTENSION
12-
if (resource.scheme !== extension.extensionLocation.scheme) {
13-
throw new Error(`The provided resource url should have the ${extension.extensionLocation.scheme} scheme`)
14-
}
15-
16-
registerExtensionFile(resource, getConfiguration)
13+
registerExtensionFile(joinPath(extension.extensionLocation, path), getConfiguration)
1714
}
1815

19-
function initialize () {
20-
const instantiationService = StandaloneServices.get(IInstantiationService)
16+
function initialize (instantiationService: IInstantiationService) {
2117
instantiationService.createInstance(LanguageConfigurationFileHandler)
2218
}
2319

2420
export default function getServiceOverride (): IEditorOverrideServices {
25-
setTimeout(initialize)
21+
onServicesInitialized(initialize)
2622
return {
2723
...getFileServiceOverride()
2824
}

src/service-override/messages.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'
1313
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'
1414
import { ILayoutService } from 'vs/platform/layout/browser/layoutService'
1515
import getLayoutServiceOverride from './layout'
16+
import { onServicesInitialized } from './tools'
1617
import { unsupported } from '../tools'
1718

18-
function register () {
19+
function initialize (instantiationService: IInstantiationService) {
1920
const container = StandaloneServices.get(ILayoutService).container
2021
container.classList.add('monaco-workbench')
2122

22-
const model = (StandaloneServices.get(INotificationService) as NotificationService).model
23-
const instantiationService = StandaloneServices.get(IInstantiationService)
23+
const model = (instantiationService.invokeFunction((accessor) => accessor.get(INotificationService)) as NotificationService).model
2424

2525
const notificationsToasts = instantiationService.createInstance(NotificationsToasts, container, model)
2626
notificationsToasts.layout(dom.getClientArea(container))
@@ -40,11 +40,11 @@ function register () {
4040

4141
registerNotificationCommands(notificationsCenter, notificationsToasts, model)
4242

43-
StandaloneServices.get(IInstantiationService).createInstance(DialogHandlerContribution)
43+
instantiationService.createInstance(DialogHandlerContribution)
4444
}
4545

4646
export default function getServiceOverride (container?: HTMLElement): IEditorOverrideServices {
47-
setTimeout(() => register())
47+
onServicesInitialized(initialize)
4848

4949
return {
5050
[IDialogService.toString()]: new SyncDescriptor(DialogService),

src/service-override/snippets.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import { SnippetsService } from 'vs/workbench/contrib/snippets/browser/snippetsS
77
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'
88
import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry'
99
import { joinPath } from 'vs/base/common/resources'
10-
import { consoleExtensionMessageHandler, getExtensionPoint } from './tools'
10+
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'
11+
import { consoleExtensionMessageHandler, getExtensionPoint, onServicesInitialized } from './tools'
1112
import { registerExtensionFile } from './files'
1213
import getWorkspaceContextServiceOverride from './workspaceContext'
1314
import { DEFAULT_EXTENSION } from '../vscode-services/extHost'
1415
import { Services } from '../services'
16+
1517
interface ISnippetsExtensionPoint {
1618
language: string
1719
path: string
@@ -31,7 +33,13 @@ function setSnippets (snippets: ISnippetsExtensionPoint[], getContent: (snippet:
3133
}
3234
}
3335

36+
function initialize (instantiationService: IInstantiationService) {
37+
// Force load the service
38+
instantiationService.invokeFunction((accessor) => accessor.get(ISnippetsService))
39+
}
40+
3441
export default function getServiceOverride (): IEditorOverrideServices {
42+
onServicesInitialized(initialize)
3543
return {
3644
...getWorkspaceContextServiceOverride(),
3745
[ISnippetsService.toString()]: new SyncDescriptor(SnippetsService)

src/service-override/textmate.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import '../polyfill'
22
import '../vscode-services/missing-services'
3-
import { StandaloneServices, IEditorOverrideServices } from 'vs/editor/standalone/browser/standaloneServices'
3+
import { IEditorOverrideServices } from 'vs/editor/standalone/browser/standaloneServices'
44
import { ITextMateService } from 'vs/workbench/services/textMate/browser/textMate'
55
import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry'
66
import { ITMSyntaxExtensionPoint } from 'vs/workbench/services/textMate/common/TMGrammars'
@@ -10,7 +10,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
1010
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'
1111
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'
1212
import getFileServiceOverride, { registerExtensionFile } from './files'
13-
import { consoleExtensionMessageHandler, getExtensionPoint } from './tools'
13+
import { consoleExtensionMessageHandler, getExtensionPoint, onServicesInitialized } from './tools'
1414
import { Services } from '../services'
1515
import { DEFAULT_EXTENSION } from '../vscode-services/extHost'
1616
import { createInjectedClass } from '../tools/injection'
@@ -28,9 +28,10 @@ class TextMateService extends createInjectedClass(AbstractTextMateService) {
2828
}
2929
}
3030

31-
const extensionPoint = getExtensionPoint<ITMSyntaxExtensionPoint[]>('grammars')
31+
type PartialITMSyntaxExtensionPoint = Partial<ITMSyntaxExtensionPoint> & Pick<ITMSyntaxExtensionPoint, 'path' | 'scopeName'>
32+
const extensionPoint = getExtensionPoint<PartialITMSyntaxExtensionPoint[]>('grammars')
3233

33-
export function setGrammars<T extends ITMSyntaxExtensionPoint> (grammars: T[], getContent: (grammar: T) => Promise<string>, extension: IExtensionDescription = Services.get().extension ?? DEFAULT_EXTENSION): void {
34+
export function setGrammars<T extends PartialITMSyntaxExtensionPoint> (grammars: T[], getContent: (grammar: T) => Promise<string>, extension: IExtensionDescription = Services.get().extension ?? DEFAULT_EXTENSION): void {
3435
extensionPoint.acceptUsers([{
3536
description: extension,
3637
value: grammars,
@@ -42,14 +43,13 @@ export function setGrammars<T extends ITMSyntaxExtensionPoint> (grammars: T[], g
4243
}
4344
}
4445

45-
function initialize () {
46-
// LanguageConfigurationFileHandler
46+
function initialize (instantiationService: IInstantiationService) {
4747
// Force load the service
48-
StandaloneServices.get(ITextMateService)
48+
instantiationService.invokeFunction((accessor) => accessor.get(ITextMateService))
4949
}
5050

5151
export default function getServiceOverride (getOnigLib: () => Promise<Response | ArrayBuffer>): IEditorOverrideServices {
52-
setTimeout(initialize)
52+
onServicesInitialized(initialize)
5353
return {
5454
...getFileServiceOverride(),
5555
[ITextMateService.toString()]: new SyncDescriptor(TextMateService, [getOnigLib])
@@ -58,5 +58,5 @@ export default function getServiceOverride (getOnigLib: () => Promise<Response |
5858

5959
export {
6060
ITextMateService,
61-
ITMSyntaxExtensionPoint
61+
PartialITMSyntaxExtensionPoint as ITMSyntaxExtensionPoint
6262
}

src/service-override/theme.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ const DEFAULT_THEME_EXTENSION: IExtensionDescription = {
5151
targetPlatform: TargetPlatform.WEB
5252
}
5353

54-
const extensionPoint: ExtensionPoint<IThemeExtensionPoint[]> = ExtensionsRegistry.getExtensionPoints().find(ep => ep.name === 'themes')!
54+
type PartialIThemeExtensionPoint = Partial<IThemeExtensionPoint> & Pick<IThemeExtensionPoint, 'id' | 'path'>
55+
const extensionPoint: ExtensionPoint<PartialIThemeExtensionPoint[]> = ExtensionsRegistry.getExtensionPoints().find(ep => ep.name === 'themes')!
5556

56-
let defaultThemes: IThemeExtensionPoint[] = []
57-
let themes: IThemeExtensionPoint[] = []
57+
let defaultThemes: PartialIThemeExtensionPoint[] = []
58+
let themes: PartialIThemeExtensionPoint[] = []
5859
function updateThemes () {
5960
extensionPoint.acceptUsers([{
6061
description: DEFAULT_THEME_EXTENSION,
@@ -67,7 +68,7 @@ function updateThemes () {
6768
}])
6869
}
6970

70-
export function setThemes<T extends IThemeExtensionPoint> (_themes: T[], getContent: (theme: T) => Promise<string>): void {
71+
export function setThemes<T extends PartialIThemeExtensionPoint> (_themes: T[], getContent: (theme: T) => Promise<string>): void {
7172
const extension = Services.get().extension ?? DEFAULT_EXTENSION
7273
themes = _themes
7374
for (const theme of _themes) {
@@ -76,7 +77,7 @@ export function setThemes<T extends IThemeExtensionPoint> (_themes: T[], getCont
7677
updateThemes()
7778
}
7879

79-
export function setDefaultThemes<T extends IThemeExtensionPoint> (_themes: T[], getContent: (theme: T) => Promise<string>): void {
80+
export function setDefaultThemes<T extends PartialIThemeExtensionPoint> (_themes: T[], getContent: (theme: T) => Promise<string>): void {
8081
defaultThemes = _themes
8182
for (const theme of _themes) {
8283
registerExtensionFile(joinPath(DEFAULT_THEME_EXTENSION.extensionLocation, theme.path), () => getContent(theme))
@@ -92,5 +93,5 @@ export default function getServiceOverride (): IEditorOverrideServices {
9293
}
9394

9495
export {
95-
IThemeExtensionPoint
96+
PartialIThemeExtensionPoint as IThemeExtensionPoint
9697
}

src/service-override/tokenClassification.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import '../polyfill'
22
import '../vscode-services/missing-services'
3-
import { IEditorOverrideServices, StandaloneServices } from 'vs/editor/standalone/browser/standaloneServices'
3+
import { IEditorOverrideServices } from 'vs/editor/standalone/browser/standaloneServices'
44
import { TokenClassificationExtensionPoints } from 'vs/workbench/services/themes/common/tokenClassificationExtensionPoint'
55
import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry'
66
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'
7-
import { consoleExtensionMessageHandler, getExtensionPoint } from './tools'
7+
import { consoleExtensionMessageHandler, getExtensionPoint, onServicesInitialized } from './tools'
88
import { IInstantiationService, Services } from '../services'
99
import { DEFAULT_EXTENSION } from '../vscode-services/extHost'
1010

@@ -53,12 +53,12 @@ function setTokenStyleDefaults (tokenStyleDefaults: ITokenStyleDefaultExtensionP
5353
}])
5454
}
5555

56-
function register () {
57-
StandaloneServices.get(IInstantiationService).createInstance(TokenClassificationExtensionPoints)
56+
function initialize (instantiationService: IInstantiationService) {
57+
instantiationService.createInstance(TokenClassificationExtensionPoints)
5858
}
5959

6060
export default function getServiceOverride (): IEditorOverrideServices {
61-
setTimeout(register)
61+
onServicesInitialized(initialize)
6262
return {}
6363
}
6464

0 commit comments

Comments
 (0)