scripts/service.ts (56 lines of code) (raw):

/*! * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT */ import { Diagnostic, DiagnosticSeverity, getLanguageService as getLanguageServiceVscode, JSONSchema, LanguageService, LanguageServiceParams, } from 'vscode-json-languageservice' import aslSchema from './json-schema/bundled.json' import { ASLOptions, ASTTree, isObjectNode } from './utils/astUtilityFunctions' import completeAsl from './completion/completeAsl' import { LANGUAGE_IDS } from './constants/constants' import validateStates, { RootType } from './validation/validateStates' export * from 'vscode-json-languageservice' export * from './yaml/yamlLanguageService' export interface ASLLanguageServiceParams extends LanguageServiceParams { aslOptions?: ASLOptions } export const ASL_SCHEMA = aslSchema as JSONSchema export const doCompleteAsl = completeAsl export const getLanguageService = function (params: ASLLanguageServiceParams): LanguageService { const builtInParams = {} const languageService = getLanguageServiceVscode({ ...params, ...builtInParams }) const doValidation = languageService.doValidation.bind(languageService) as typeof languageService.doValidation const doComplete = languageService.doComplete.bind(languageService) as typeof languageService.doComplete languageService.configure({ validate: true, allowComments: false, schemas: [ { uri: LANGUAGE_IDS.JSON, fileMatch: ['*'], schema: aslSchema as JSONSchema, }, ], }) languageService.doValidation = async function (document, jsonDocument, documentSettings) { // vscode-json-languageservice will always set severity as warning for JSONSchema validation // there is no option to configure this behavior so severity needs to be overwritten as error const diagnostics = (await doValidation(document, jsonDocument, documentSettings)).map((diagnostic) => { // Non JSON Schema validation will have source: 'asl' if (diagnostic.source !== LANGUAGE_IDS.JSON) { return { ...diagnostic, severity: DiagnosticSeverity.Error } } return diagnostic }) as Diagnostic[] const rootNode = (jsonDocument as ASTTree).root if (rootNode && isObjectNode(rootNode)) { const aslDiagnostics = validateStates(rootNode, document, RootType.Root, params.aslOptions) return diagnostics.concat(aslDiagnostics) } return diagnostics } languageService.doComplete = async function (document, position, doc) { const jsonCompletions = await doComplete(document, position, doc) return completeAsl(document, position, doc, jsonCompletions, params.aslOptions) } return languageService }