From a8e3aa6916cfeb3cba60f3ab597434d04a0345e6 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 8 Dec 2015 10:45:58 +0100 Subject: [PATCH] jsonSchema contribution point --- src/vs/languages/json/common/json.ts | 2 +- .../json/common/jsonSchemaService.ts | 2 +- src/vs/languages/json/common/jsonWorker.ts | 2 +- .../common/configurationRegistry.ts | 2 +- .../common/jsonContributionRegistry.ts | 0 .../common/jsonValidationExtensionPoint.ts | 80 +++++++++++++++++++ .../plugins/common/pluginsRegistry.ts | 2 +- src/vs/workbench/electron-browser/shell.ts | 2 + .../debug/node/debugConfigurationManager.ts | 2 +- .../electron-browser/snippets.contribution.ts | 2 +- .../electron-browser/task.contribution.ts | 2 +- .../keybinding/browser/keybindingService.ts | 2 +- 12 files changed, 91 insertions(+), 9 deletions(-) rename src/vs/{languages/json => platform/jsonschemas}/common/jsonContributionRegistry.ts (100%) create mode 100644 src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.ts diff --git a/src/vs/languages/json/common/json.ts b/src/vs/languages/json/common/json.ts index 518b89a36ca..5a7b0c0f1db 100644 --- a/src/vs/languages/json/common/json.ts +++ b/src/vs/languages/json/common/json.ts @@ -20,7 +20,7 @@ import {OneWorkerAttr, AllWorkersAttr} from 'vs/platform/thread/common/threadSer import {IThreadService, IThreadSynchronizableObject} from 'vs/platform/thread/common/thread'; import {AsyncDescriptor2, createAsyncDescriptor2} from 'vs/platform/instantiation/common/descriptors'; import {OnEnterSupport} from 'vs/editor/common/modes/supports/onEnter'; -import {IJSONContributionRegistry, Extensions, ISchemaContributions} from 'vs/languages/json/common/jsonContributionRegistry'; +import {IJSONContributionRegistry, Extensions, ISchemaContributions} from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; export class JSONMode extends AbstractMode implements Modes.IExtraInfoSupport, Modes.IOutlineSupport, IThreadSynchronizableObject { diff --git a/src/vs/languages/json/common/jsonSchemaService.ts b/src/vs/languages/json/common/jsonSchemaService.ts index 24be1adce97..23eec18d4cb 100644 --- a/src/vs/languages/json/common/jsonSchemaService.ts +++ b/src/vs/languages/json/common/jsonSchemaService.ts @@ -17,7 +17,7 @@ import EventEmitter = require('vs/base/common/eventEmitter'); import {IResourceService, ResourceEvents, IResourceChangedEvent} from 'vs/editor/common/services/resourceService'; import {IRequestService} from 'vs/platform/request/common/request'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; -import {ISchemaContributions} from 'vs/languages/json/common/jsonContributionRegistry'; +import {ISchemaContributions} from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; 'use strict'; diff --git a/src/vs/languages/json/common/jsonWorker.ts b/src/vs/languages/json/common/jsonWorker.ts index f146d2e62bf..e811948f91f 100644 --- a/src/vs/languages/json/common/jsonWorker.ts +++ b/src/vs/languages/json/common/jsonWorker.ts @@ -29,7 +29,7 @@ import errors = require('vs/base/common/errors'); import {IMarkerService, IMarkerData} from 'vs/platform/markers/common/markers'; import {IRequestService} from 'vs/platform/request/common/request'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; -import {ISchemaContributions} from 'vs/languages/json/common/jsonContributionRegistry'; +import {ISchemaContributions} from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import {IResourceService} from 'vs/editor/common/services/resourceService'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 04344f928b3..9d27ad2b769 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -12,7 +12,7 @@ import objects = require('vs/base/common/objects'); import strings = require('vs/base/common/strings'); import {IPluginDescription} from 'vs/platform/plugins/common/plugins'; import {PluginsRegistry} from 'vs/platform/plugins/common/pluginsRegistry'; -import JSONContributionRegistry = require('vs/languages/json/common/jsonContributionRegistry'); +import JSONContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry'); export var Extensions = { diff --git a/src/vs/languages/json/common/jsonContributionRegistry.ts b/src/vs/platform/jsonschemas/common/jsonContributionRegistry.ts similarity index 100% rename from src/vs/languages/json/common/jsonContributionRegistry.ts rename to src/vs/platform/jsonschemas/common/jsonContributionRegistry.ts diff --git a/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.ts b/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.ts new file mode 100644 index 00000000000..2656753177f --- /dev/null +++ b/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.ts @@ -0,0 +1,80 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import nls = require('vs/nls'); +import {IJSONSchema} from 'vs/base/common/jsonSchema'; +import {PluginsRegistry} from 'vs/platform/plugins/common/pluginsRegistry'; +import {Registry} from 'vs/platform/platform'; +import JSONContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry'); +import strings = require('vs/base/common/strings'); +import paths = require('vs/base/common/paths'); +import {INullService} from 'vs/platform/instantiation/common/instantiation'; + +interface IJSONValidationExtensionPoint { + fileMatch: string, + url: string +} + +let schemaRegistry = Registry.as(JSONContributionRegistry.Extensions.JSONContribution); + +let configurationExtPoint = PluginsRegistry.registerExtensionPoint('jsonValidation', { + description: nls.localize('contributes.jsonValidation', 'Contributes json schema configuration.'), + type: 'array', + default: [ { fileMatch: "{{file.json}}", url: "{{url}}" } ], + items: { + type: 'object', + default: { fileMatch: "{{file.json}}", url: "{{url}}" }, + properties: { + fileMatch: { + type: 'string', + description: nls.localize('contributes.jsonValidation.fileMatch', 'The file pattern to match, for example "package.json" or "*.launch".'), + }, + url: { + description: nls.localize('contributes.jsonValidation.url', 'A schema URL (\'http:\', \'https:\') or relative path to the extension folder (\'./\').'), + type: 'string' + } + } + } +}); + +export class JSONValidationExtensionPoint { + + constructor( + @INullService modeService: INullService + ) { + configurationExtPoint.setHandler((extensions) => { + for (var i = 0; i < extensions.length; i++) { + var extensionValue = extensions[i].value; + var collector = extensions[i].collector; + var extensionPath = extensions[i].description.extensionFolderPath; + + if (!extensionValue || !Array.isArray(extensionValue)) { + collector.error(nls.localize('invalid.jsonValidation', "'configuration.jsonValidation' must be a array")); + return; + } + extensionValue.forEach(extension => { + if (typeof extension.fileMatch !== 'string') { + collector.error(nls.localize('invalid.fileMatch', "'configuration.jsonValidation.fileMatch' must be defined")); + return; + } + var uri = extension.url; + if (typeof extension.url !== 'string') { + collector.error(nls.localize('invalid.url', "'configuration.jsonValidation.url' must be a URL or relative path")); + return; + } + if (strings.startsWith(uri, './')) { + uri = paths.normalize(paths.join(extensionPath, uri)); + } else if (!strings.startsWith(uri, 'https:/') && strings.startsWith(uri, 'https:/')) { + collector.error(nls.localize('invalid.url.schema', "'configuration.jsonValidation.url' must start with 'http:', 'https:' or './' to reference schemas located in the extension")); + return; + } + schemaRegistry.addSchemaFileAssociation(extension.fileMatch, uri); + }); + } + }); + } + +} diff --git a/src/vs/platform/plugins/common/pluginsRegistry.ts b/src/vs/platform/plugins/common/pluginsRegistry.ts index 2b4e5ad1b67..137b4793d32 100644 --- a/src/vs/platform/plugins/common/pluginsRegistry.ts +++ b/src/vs/platform/plugins/common/pluginsRegistry.ts @@ -8,7 +8,7 @@ import {IPluginDescription, IPointListener, IActivationEventListener, IMessage} import {Registry} from 'vs/platform/platform'; import Errors = require('vs/base/common/errors'); import env = require('vs/base/common/flags'); -import * as JSONContributionRegistry from 'vs/languages/json/common/jsonContributionRegistry'; +import * as JSONContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import {IJSONSchema} from 'vs/base/common/jsonSchema'; import nls = require('vs/nls'); import paths = require('vs/base/common/paths'); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 449b1d5ca66..76ad3678219 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -55,6 +55,7 @@ import {MainProcessPluginService} from 'vs/platform/plugins/common/nativePluginS import {MainThreadDocuments} from 'vs/workbench/api/common/pluginHostDocuments'; import {MainProcessTextMateSyntax} from 'vs/editor/node/textMate/TMSyntax'; import {MainProcessTextMateSnippet} from 'vs/editor/node/textMate/TMSnippets'; +import {JSONValidationExtensionPoint} from 'vs/platform/jsonschemas/common/jsonValidationExtensionPoint'; import {LanguageConfigurationFileHandler} from 'vs/editor/node/languageConfiguration'; import {MainThreadFileSystemEventService} from 'vs/workbench/api/common/pluginHostFileSystemEventService'; import {MainThreadQuickOpen} from 'vs/workbench/api/browser/pluginHostQuickOpen'; @@ -355,6 +356,7 @@ export class WorkbenchShell { this.threadService.getRemotable(RemoteTelemetryServiceHelper); this.workbench.getInstantiationService().createInstance(MainProcessTextMateSyntax); this.workbench.getInstantiationService().createInstance(MainProcessTextMateSnippet); + this.workbench.getInstantiationService().createInstance(JSONValidationExtensionPoint); this.workbench.getInstantiationService().createInstance(LanguageConfigurationFileHandler); this.threadService.getRemotable(MainThreadConfiguration); this.threadService.getRemotable(MainThreadQuickOpen); diff --git a/src/vs/workbench/parts/debug/node/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/node/debugConfigurationManager.ts index 09816a07189..2984969f2d8 100644 --- a/src/vs/workbench/parts/debug/node/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/node/debugConfigurationManager.ts @@ -13,7 +13,7 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; import platform = require('vs/platform/platform'); import pluginsRegistry = require('vs/platform/plugins/common/pluginsRegistry'); import editor = require('vs/editor/common/editorCommon'); -import jsonContributionRegistry = require('vs/languages/json/common/jsonContributionRegistry'); +import jsonContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry'); import debug = require('vs/workbench/parts/debug/common/debug'); import { SystemVariables } from 'vs/workbench/parts/lib/node/systemVariables'; import { Adapter } from 'vs/workbench/parts/debug/node/debugAdapter'; diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts b/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts index b6e1e4b45b0..1867cd089a9 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts @@ -17,7 +17,7 @@ import modesExtensions = require('vs/editor/common/modes/modesRegistry'); import errors = require('vs/base/common/errors'); import {IQuickOpenService, IPickOpenEntry} from 'vs/workbench/services/quickopen/browser/quickOpenService'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; -import * as JSONContributionRegistry from 'vs/languages/json/common/jsonContributionRegistry'; +import * as JSONContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import {IJSONSchema} from 'vs/base/common/jsonSchema'; import ipc = require('ipc'); diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 4c2094e4d03..5c2078677cc 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -48,7 +48,7 @@ import { IModel } from 'vs/editor/common/editorCommon'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IModelService } from 'vs/editor/common/services/modelService'; -import jsonContributionRegistry = require('vs/languages/json/common/jsonContributionRegistry'); +import jsonContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry'); import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 4c7de277b5e..2babf7f4924 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -13,7 +13,7 @@ import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IKeybindingItem, IUserFriendlyKeybinding} from 'vs/platform/keybinding/common/keybindingService'; import {IOSupport} from 'vs/platform/keybinding/common/commonKeybindingResolver'; -import * as JSONContributionRegistry from 'vs/languages/json/common/jsonContributionRegistry'; +import * as JSONContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import {IJSONSchema} from 'vs/base/common/jsonSchema'; export abstract class WorkbenchKeybindingService extends KeybindingService { -- GitLab