diff --git a/src/languageserver/handlers/schemaSelectionHandlers.ts b/src/languageserver/handlers/schemaSelectionHandlers.ts index ac8d756eb..67a21c729 100644 --- a/src/languageserver/handlers/schemaSelectionHandlers.ts +++ b/src/languageserver/handlers/schemaSelectionHandlers.ts @@ -32,6 +32,7 @@ export class JSONSchemaSelection { name: val[1].title, uri: val[0], description: val[1].description, + versions: val[1].versions, }; }); @@ -71,6 +72,7 @@ export class JSONSchemaSelection { usedForCurrentFile: true, name: val[1].title, description: val[1].description, + versions: val[1].versions, }; }); const result = []; diff --git a/src/languageserver/handlers/settingsHandlers.ts b/src/languageserver/handlers/settingsHandlers.ts index 005bbbd97..b01860168 100644 --- a/src/languageserver/handlers/settingsHandlers.ts +++ b/src/languageserver/handlers/settingsHandlers.ts @@ -210,6 +210,7 @@ export class SettingsHandler { priority: SchemaPriority.SchemaStore, name: schema.name, description: schema.description, + versions: schema.versions, }); } } diff --git a/src/languageservice/jsonSchema.ts b/src/languageservice/jsonSchema.ts index 1e738f565..2486f76f7 100644 --- a/src/languageservice/jsonSchema.ts +++ b/src/languageservice/jsonSchema.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { CompletionItemKind } from 'vscode-json-languageservice'; +import { SchemaVersions } from './yamlTypes'; export type JSONSchemaRef = JSONSchema | boolean; @@ -15,6 +16,7 @@ export interface JSONSchema { type?: string | string[]; title?: string; closestTitle?: string; + versions?: SchemaVersions; // eslint-disable-next-line @typescript-eslint/no-explicit-any default?: any; definitions?: { [name: string]: JSONSchema }; diff --git a/src/languageservice/services/yamlSchemaService.ts b/src/languageservice/services/yamlSchemaService.ts index a28a92376..dd85a75e5 100644 --- a/src/languageservice/services/yamlSchemaService.ts +++ b/src/languageservice/services/yamlSchemaService.ts @@ -26,6 +26,7 @@ import { parse } from 'yaml'; import * as path from 'path'; import { getSchemaFromModeline } from './modelineUtil'; import { JSONSchemaDescriptionExt } from '../../requestTypes'; +import { SchemaVersions } from '../yamlTypes'; const localize = nls.loadMessageBundle(); @@ -84,7 +85,11 @@ export class FilePatternAssociation { return this.schemas; } } - +interface SchemaStoreSchema { + name: string; + description: string; + versions?: SchemaVersions; +} export class YAMLSchemaService extends JSONSchemaService { // To allow to use schemasById from super. // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -96,7 +101,7 @@ export class YAMLSchemaService extends JSONSchemaService { private requestService: SchemaRequestService; public schemaPriorityMapping: Map>; - private schemaUriToNameAndDescription = new Map(); + private schemaUriToNameAndDescription = new Map(); constructor( requestService: SchemaRequestService, @@ -129,10 +134,11 @@ export class YAMLSchemaService extends JSONSchemaService { }; if (this.schemaUriToNameAndDescription.has(schemaUri)) { - const [name, description] = this.schemaUriToNameAndDescription.get(schemaUri); + const { name, description, versions } = this.schemaUriToNameAndDescription.get(schemaUri); schemaHandle.name = name; schemaHandle.description = description; schemaHandle.fromStore = true; + schemaHandle.versions = versions; } result.push(schemaHandle); } @@ -653,9 +659,10 @@ export class YAMLSchemaService extends JSONSchemaService { } unresolvedJsonSchema.uri = schemaUri; if (this.schemaUriToNameAndDescription.has(schemaUri)) { - const [name, description] = this.schemaUriToNameAndDescription.get(schemaUri); + const { name, description, versions } = this.schemaUriToNameAndDescription.get(schemaUri); unresolvedJsonSchema.schema.title = name ?? unresolvedJsonSchema.schema.title; unresolvedJsonSchema.schema.description = description ?? unresolvedJsonSchema.schema.description; + unresolvedJsonSchema.schema.versions = versions ?? unresolvedJsonSchema.schema.versions; } return unresolvedJsonSchema; }); @@ -666,10 +673,11 @@ export class YAMLSchemaService extends JSONSchemaService { filePatterns?: string[], unresolvedSchema?: JSONSchema, name?: string, - description?: string + description?: string, + versions?: SchemaVersions ): SchemaHandle { if (name || description) { - this.schemaUriToNameAndDescription.set(uri, [name, description]); + this.schemaUriToNameAndDescription.set(uri, { name, description, versions }); } return super.registerExternalSchema(uri, filePatterns, unresolvedSchema); } diff --git a/src/languageservice/yamlLanguageService.ts b/src/languageservice/yamlLanguageService.ts index dcb6e4aef..377c189c5 100644 --- a/src/languageservice/yamlLanguageService.ts +++ b/src/languageservice/yamlLanguageService.ts @@ -42,7 +42,7 @@ import { } from 'vscode-languageserver/node'; import { TextDocument } from 'vscode-languageserver-textdocument'; import { getFoldingRanges } from './services/yamlFolding'; -import { FoldingRangesContext } from './yamlTypes'; +import { FoldingRangesContext, SchemaVersions } from './yamlTypes'; import { YamlCodeActions } from './services/yamlCodeActions'; import { commandExecutor } from '../languageserver/commandExecutor'; import { doDocumentOnTypeFormatting } from './services/yamlOnTypeFormatting'; @@ -70,6 +70,7 @@ export interface SchemasSettings { uri: string; name?: string; description?: string; + versions?: SchemaVersions; } export interface LanguageSettings { @@ -198,7 +199,8 @@ export function getLanguageService( settings.fileMatch, settings.schema, settings.name, - settings.description + settings.description, + settings.versions ); }); } diff --git a/src/languageservice/yamlTypes.ts b/src/languageservice/yamlTypes.ts index 01c10f4f3..a620753d8 100644 --- a/src/languageservice/yamlTypes.ts +++ b/src/languageservice/yamlTypes.ts @@ -18,3 +18,5 @@ export interface FoldingRangesContext { */ lineFoldingOnly?: boolean; } + +export type SchemaVersions = { [version: string]: string }; diff --git a/src/requestTypes.ts b/src/requestTypes.ts index 2708f88cc..f3a234bfc 100644 --- a/src/requestTypes.ts +++ b/src/requestTypes.ts @@ -3,6 +3,7 @@ import { NotificationType, RequestType } from 'vscode-languageserver'; import { SchemaAdditions, SchemaDeletions } from './languageservice/services/yamlSchemaService'; import { SchemaConfiguration } from './languageservice/yamlLanguageService'; +import { SchemaVersions } from './languageservice/yamlTypes'; export type ISchemaAssociations = Record; @@ -30,6 +31,8 @@ export interface JSONSchemaDescriptionExt extends JSONSchemaDescription { * Is schema from schema store */ fromStore: boolean; + + versions?: SchemaVersions; } export namespace SchemaAssociationNotification { diff --git a/test/schemaSelectionHandlers.test.ts b/test/schemaSelectionHandlers.test.ts index 8e13f7ec3..ede5e6581 100644 --- a/test/schemaSelectionHandlers.test.ts +++ b/test/schemaSelectionHandlers.test.ts @@ -56,6 +56,7 @@ describe('Schema Selection Handlers', () => { usedForCurrentFile: false, name: 'Schema name', description: 'Schema description', + versions: undefined, }); }); @@ -72,10 +73,11 @@ describe('Schema Selection Handlers', () => { expect(result).length(1); expect(result[0]).to.be.eqls({ uri: 'https://some.com/some.json', - fromStore: false, - usedForCurrentFile: true, name: 'Schema name', description: 'Schema description', + fromStore: false, + usedForCurrentFile: true, + versions: undefined, }); }); @@ -94,6 +96,7 @@ describe('Schema Selection Handlers', () => { uri: 'https://some.com/some.json', name: 'Schema name', description: 'Schema description', + versions: undefined, }); }); diff --git a/test/settingsHandlers.test.ts b/test/settingsHandlers.test.ts index e1067c2e8..6b637f292 100644 --- a/test/settingsHandlers.test.ts +++ b/test/settingsHandlers.test.ts @@ -106,6 +106,7 @@ describe('Settings Handlers Tests', () => { priority: SchemaPriority.SchemaStore, name: '.adonisrc.json', description: 'AdonisJS configuration file', + versions: undefined, }); });