From 2eb633fdf575fa04ac168ce18ec5e55ff26c6019 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 14 Mar 2023 11:43:28 -0400 Subject: [PATCH] Fix caching for invalid YAML files --- languageservice/src/utils/workflow-cache.ts | 12 +++---- languageservice/src/validate.test.ts | 35 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/languageservice/src/utils/workflow-cache.ts b/languageservice/src/utils/workflow-cache.ts index d3fe14a..7979c2c 100644 --- a/languageservice/src/utils/workflow-cache.ts +++ b/languageservice/src/utils/workflow-cache.ts @@ -20,14 +20,12 @@ export function clearCache() { } export function fetchOrParseWorkflow(file: File, uri: string): ParseWorkflowResult | undefined { - let result = parsedWorkflowCache.get(uri); - if (!result?.value) { - result = parseWorkflow(file, nullTrace); - if (!result.value) { - return undefined; - } - parsedWorkflowCache.set(uri, result); + const cachedResult = parsedWorkflowCache.get(uri); + if (cachedResult) { + return cachedResult; } + const result = parseWorkflow(file, nullTrace); + parsedWorkflowCache.set(uri, result); return result; } diff --git a/languageservice/src/validate.test.ts b/languageservice/src/validate.test.ts index a583239..bcc4358 100644 --- a/languageservice/src/validate.test.ts +++ b/languageservice/src/validate.test.ts @@ -195,6 +195,41 @@ jobs: } as Diagnostic); }); + it("invalid YAML", async () => { + // This YAML has some mismatched single-quotes, which causes the string to be terminated early + // within the fromJSON() expression. + // Using double-quotes would make it valid: + // "Run a \${{ inputs.test }} one-line script \${{ fromJSON('test') == inputs.name }}" + const workflow = ` + on: push + jobs: + build: + runs-on: ubuntu-latest + environment: TEST + steps: + - name: 'Run a \${{ inputs.test }} one-line script \${{ fromJSON('test') == inputs.name }}' + run: echo + `; + const result = await validate(createDocument("wf.yaml", workflow), {valueProviderConfig: defaultValueProviders}); + + expect(result).toEqual([ + { + message: + "Unexpected scalar at node end at line 8, column 73:\n\n…un a ${{ inputs.test }} one-line script ${{ fromJSON('test') == inputs.name }}'\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n", + range: { + start: { + line: 7, + character: 72 + }, + end: { + line: 7, + character: 97 + } + } + } + ]); + }); + describe("value provider case sensitivity", () => { it("value with a different case and case sensitive provider", async () => { const workflow = `