123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import { UnresolvedSchema } from './jsonSchemaService';
- import { ErrorCode, Diagnostic, DiagnosticSeverity, Range } from '../jsonLanguageTypes';
- import * as nls from 'vscode-nls';
- import { isBoolean } from '../utils/objects';
- var localize = nls.loadMessageBundle();
- var JSONValidation = /** @class */ (function () {
- function JSONValidation(jsonSchemaService, promiseConstructor) {
- this.jsonSchemaService = jsonSchemaService;
- this.promise = promiseConstructor;
- this.validationEnabled = true;
- }
- JSONValidation.prototype.configure = function (raw) {
- if (raw) {
- this.validationEnabled = raw.validate !== false;
- this.commentSeverity = raw.allowComments ? undefined : DiagnosticSeverity.Error;
- }
- };
- JSONValidation.prototype.doValidation = function (textDocument, jsonDocument, documentSettings, schema) {
- var _this = this;
- if (!this.validationEnabled) {
- return this.promise.resolve([]);
- }
- var diagnostics = [];
- var added = {};
- var addProblem = function (problem) {
- // remove duplicated messages
- var signature = problem.range.start.line + ' ' + problem.range.start.character + ' ' + problem.message;
- if (!added[signature]) {
- added[signature] = true;
- diagnostics.push(problem);
- }
- };
- var getDiagnostics = function (schema) {
- var trailingCommaSeverity = (documentSettings === null || documentSettings === void 0 ? void 0 : documentSettings.trailingCommas) ? toDiagnosticSeverity(documentSettings.trailingCommas) : DiagnosticSeverity.Error;
- var commentSeverity = (documentSettings === null || documentSettings === void 0 ? void 0 : documentSettings.comments) ? toDiagnosticSeverity(documentSettings.comments) : _this.commentSeverity;
- var schemaValidation = (documentSettings === null || documentSettings === void 0 ? void 0 : documentSettings.schemaValidation) ? toDiagnosticSeverity(documentSettings.schemaValidation) : DiagnosticSeverity.Warning;
- var schemaRequest = (documentSettings === null || documentSettings === void 0 ? void 0 : documentSettings.schemaRequest) ? toDiagnosticSeverity(documentSettings.schemaRequest) : DiagnosticSeverity.Warning;
- if (schema) {
- if (schema.errors.length && jsonDocument.root && schemaRequest) {
- var astRoot = jsonDocument.root;
- var property = astRoot.type === 'object' ? astRoot.properties[0] : undefined;
- if (property && property.keyNode.value === '$schema') {
- var node = property.valueNode || property;
- var range = Range.create(textDocument.positionAt(node.offset), textDocument.positionAt(node.offset + node.length));
- addProblem(Diagnostic.create(range, schema.errors[0], schemaRequest, ErrorCode.SchemaResolveError));
- }
- else {
- var range = Range.create(textDocument.positionAt(astRoot.offset), textDocument.positionAt(astRoot.offset + 1));
- addProblem(Diagnostic.create(range, schema.errors[0], schemaRequest, ErrorCode.SchemaResolveError));
- }
- }
- else if (schemaValidation) {
- var semanticErrors = jsonDocument.validate(textDocument, schema.schema, schemaValidation);
- if (semanticErrors) {
- semanticErrors.forEach(addProblem);
- }
- }
- if (schemaAllowsComments(schema.schema)) {
- commentSeverity = undefined;
- }
- if (schemaAllowsTrailingCommas(schema.schema)) {
- trailingCommaSeverity = undefined;
- }
- }
- for (var _i = 0, _a = jsonDocument.syntaxErrors; _i < _a.length; _i++) {
- var p = _a[_i];
- if (p.code === ErrorCode.TrailingComma) {
- if (typeof trailingCommaSeverity !== 'number') {
- continue;
- }
- p.severity = trailingCommaSeverity;
- }
- addProblem(p);
- }
- if (typeof commentSeverity === 'number') {
- var message_1 = localize('InvalidCommentToken', 'Comments are not permitted in JSON.');
- jsonDocument.comments.forEach(function (c) {
- addProblem(Diagnostic.create(c, message_1, commentSeverity, ErrorCode.CommentNotPermitted));
- });
- }
- return diagnostics;
- };
- if (schema) {
- var id = schema.id || ('schemaservice://untitled/' + idCounter++);
- return this.jsonSchemaService.resolveSchemaContent(new UnresolvedSchema(schema), id, {}).then(function (resolvedSchema) {
- return getDiagnostics(resolvedSchema);
- });
- }
- return this.jsonSchemaService.getSchemaForResource(textDocument.uri, jsonDocument).then(function (schema) {
- return getDiagnostics(schema);
- });
- };
- return JSONValidation;
- }());
- export { JSONValidation };
- var idCounter = 0;
- function schemaAllowsComments(schemaRef) {
- if (schemaRef && typeof schemaRef === 'object') {
- if (isBoolean(schemaRef.allowComments)) {
- return schemaRef.allowComments;
- }
- if (schemaRef.allOf) {
- for (var _i = 0, _a = schemaRef.allOf; _i < _a.length; _i++) {
- var schema = _a[_i];
- var allow = schemaAllowsComments(schema);
- if (isBoolean(allow)) {
- return allow;
- }
- }
- }
- }
- return undefined;
- }
- function schemaAllowsTrailingCommas(schemaRef) {
- if (schemaRef && typeof schemaRef === 'object') {
- if (isBoolean(schemaRef.allowTrailingCommas)) {
- return schemaRef.allowTrailingCommas;
- }
- var deprSchemaRef = schemaRef;
- if (isBoolean(deprSchemaRef['allowsTrailingCommas'])) { // deprecated
- return deprSchemaRef['allowsTrailingCommas'];
- }
- if (schemaRef.allOf) {
- for (var _i = 0, _a = schemaRef.allOf; _i < _a.length; _i++) {
- var schema = _a[_i];
- var allow = schemaAllowsTrailingCommas(schema);
- if (isBoolean(allow)) {
- return allow;
- }
- }
- }
- }
- return undefined;
- }
- function toDiagnosticSeverity(severityLevel) {
- switch (severityLevel) {
- case 'error': return DiagnosticSeverity.Error;
- case 'warning': return DiagnosticSeverity.Warning;
- case 'ignore': return undefined;
- }
- return undefined;
- }
|