diff --git a/languageserver/src/value-providers.ts b/languageserver/src/value-providers.ts index 3180431..f8245e0 100644 --- a/languageserver/src/value-providers.ts +++ b/languageserver/src/value-providers.ts @@ -20,10 +20,12 @@ export function valueProviders( return { "job-environment": { kind: ValueProviderKind.AllowedValues, + caseInsensitive: true, get: (_: WorkflowContext) => getEnvironments(client, cache, repo.owner, repo.name) }, "job-environment-name": { kind: ValueProviderKind.AllowedValues, + caseInsensitive: true, get: (_: WorkflowContext) => getEnvironments(client, cache, repo.owner, repo.name) }, "runs-on": { diff --git a/languageservice/src/validate.test.ts b/languageservice/src/validate.test.ts index ae54e4c..a583239 100644 --- a/languageservice/src/validate.test.ts +++ b/languageservice/src/validate.test.ts @@ -3,6 +3,7 @@ import {createDocument} from "./test-utils/document"; import {validate} from "./validate"; import {defaultValueProviders} from "./value-providers/default"; import {clearCache} from "./utils/workflow-cache"; +import {ValueProvider, ValueProviderConfig, ValueProviderKind} from "./value-providers/config"; beforeEach(() => { clearCache(); @@ -193,4 +194,65 @@ jobs: } } as Diagnostic); }); + + describe("value provider case sensitivity", () => { + it("value with a different case and case sensitive provider", async () => { + const workflow = ` + on: push + jobs: + build: + runs-on: ubuntu-latest + environment: TEST + steps: + - run: echo + `; + const valueProviderConfig: ValueProviderConfig = { + "job-environment": { + kind: ValueProviderKind.AllowedValues, + get: async () => [{label: "test"}], + caseInsensitive: false + } + }; + + const result = await validate(createDocument("wf.yaml", workflow), {valueProviderConfig}); + expect(result).toEqual([ + { + message: "Value 'TEST' is not valid", + severity: DiagnosticSeverity.Error, + range: { + start: { + line: 5, + character: 19 + }, + end: { + line: 5, + character: 23 + } + } + } + ]); + }); + + it("value with a different case and case insensitive provider", async () => { + const workflow = ` + on: push + jobs: + build: + runs-on: ubuntu-latest + environment: TEST + steps: + - run: echo + `; + const valueProviderConfig: ValueProviderConfig = { + "job-environment": { + kind: ValueProviderKind.AllowedValues, + get: async () => [{label: "test"}], + caseInsensitive: true + } + }; + + const result = await validate(createDocument("wf.yaml", workflow), {valueProviderConfig}); + expect(result).toEqual([]); + }); + }); }); diff --git a/languageservice/src/validate.ts b/languageservice/src/validate.ts index 8161e42..bf1c025 100644 --- a/languageservice/src/validate.ts +++ b/languageservice/src/validate.ts @@ -130,10 +130,11 @@ async function additionalValidations( if (valueProvider) { const customValues = await valueProvider.get(getProviderContext(documentUri, template, root, token)); - const customValuesMap = new Set(customValues.map(x => x.label)); + const caseInsensitive = valueProvider.caseInsensitive ?? false; + const customValuesMap = new Set(customValues.map(x => (caseInsensitive ? x.label.toLowerCase() : x.label))); if (isString(token)) { - if (!customValuesMap.has(token.value)) { + if (!customValuesMap.has(caseInsensitive ? token.value.toLowerCase() : token.value)) { invalidValue(diagnostics, token, valueProvider.kind); } } diff --git a/languageservice/src/value-providers/config.ts b/languageservice/src/value-providers/config.ts index 8531651..c8f90dd 100644 --- a/languageservice/src/value-providers/config.ts +++ b/languageservice/src/value-providers/config.ts @@ -21,6 +21,7 @@ export enum ValueProviderKind { export type ValueProvider = { kind: ValueProviderKind; + caseInsensitive?: boolean; get: (context: WorkflowContext, existingValues?: Set) => Promise; };