From fe0af4cc30d420fa230ff2f72ae187d006fbe834 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 20 Dec 2022 15:27:34 -0800 Subject: [PATCH 1/3] Add tests for validation and completion --- .../src/complete.expressions.test.ts | 51 +++++++++++++++++++ .../src/validate.expressions.test.ts | 33 ++++++++++++ 2 files changed, 84 insertions(+) diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index 87692dd..78e1166 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -749,6 +749,57 @@ jobs: expect(result.map(x => x.label)).toEqual(["container", "services", "status"]); }); + it("job context is suggested within a job output", async () => { + const input = ` +on: push +jobs: + test: + runs-on: ubuntu-latest + outputs: + environment: \${{ | }} + steps: + - id: a + run: echo hi +`; + + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + expect(result.map(x => x.label)).toEqual([ + "env", + "github", + "inputs", + "job", + "needs", + "runner", + "secrets", + "steps", + "vars", + "contains", + "endsWith", + "format", + "fromJson", + "join", + "startsWith", + "toJson", + ]); + }); + + it("step context is suggested within a job output", async () => { + const input = ` +on: push +jobs: + test: + runs-on: ubuntu-latest + outputs: + environment: \${{ steps.| }} + steps: + - id: foo + run: echo hi +`; + + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + expect(result.map(x => x.label)).toEqual(["foo"]); + }); + it("container context is suggested within a job container", async () => { const input = ` on: push diff --git a/actions-languageservice/src/validate.expressions.test.ts b/actions-languageservice/src/validate.expressions.test.ts index f9777f7..5882796 100644 --- a/actions-languageservice/src/validate.expressions.test.ts +++ b/actions-languageservice/src/validate.expressions.test.ts @@ -190,6 +190,39 @@ jobs: ]); }); + it("reference of invalid step in job outputs", async () => { + const input = ` + on: push + jobs: + a: + outputs: + environment: \${{ steps.foo }} + runs-on: ubuntu-latest + steps: + - id: a + run: echo hello a + `; + + const result = await validate(createDocument("wf.yaml", input)); + + expect(result).toEqual([ + { + "message": "Context access might be invalid: foo", + "range": { + "end": { + "character": 41, + "line": 5, + }, + "start": { + "character": 25, + "line": 5, + }, + }, + "severity": 2, + }, + ]); + }); + it("invalid reference of generated step name", async () => { const input = ` on: push From f8e41ccbd9d7d9eba69717505688dd4ffa4a2054 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 20 Dec 2022 16:48:32 -0800 Subject: [PATCH 2/3] Update package-lock --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b1152f..3ff77de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -701,9 +701,9 @@ "link": true }, "node_modules/@github/actions-workflow-parser": { - "version": "0.0.36", - "resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.36/f27b908936efa949a105d7192dd3787a15094d71", - "integrity": "sha512-ATResf0PCT/bftJgs2ROAo0gDMIKQ1X0HcB4GejuYTcyHxWfvC44EqvFZmMpurV4Camht20bqK3LSY4NoJ0aVQ==", + "version": "0.0.39", + "resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.39/ba3e9e02e489175e0f284f0aebd9bde92ad4e935", + "integrity": "sha512-Iw8OkCUxdgFvXpJkg6dAIEpGQrS09o3TC1I0looCJ1lHMBDBD7aVXasE8zJzlQUTdgRTGMiptNMgZS2MnGC76Q==", "license": "MIT", "dependencies": { "@github/actions-expressions": "*", @@ -13539,9 +13539,9 @@ } }, "@github/actions-workflow-parser": { - "version": "0.0.36", - "resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.36/f27b908936efa949a105d7192dd3787a15094d71", - "integrity": "sha512-ATResf0PCT/bftJgs2ROAo0gDMIKQ1X0HcB4GejuYTcyHxWfvC44EqvFZmMpurV4Camht20bqK3LSY4NoJ0aVQ==", + "version": "0.0.39", + "resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.39/ba3e9e02e489175e0f284f0aebd9bde92ad4e935", + "integrity": "sha512-Iw8OkCUxdgFvXpJkg6dAIEpGQrS09o3TC1I0looCJ1lHMBDBD7aVXasE8zJzlQUTdgRTGMiptNMgZS2MnGC76Q==", "requires": { "@github/actions-expressions": "*", "yaml": "^2.0.0-8" From b739c98560e8b7c81664291ba1af16e228809ec3 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Wed, 4 Jan 2023 11:52:19 -0800 Subject: [PATCH 3/3] Use "job" instead of "job-id" --- .../src/context/workflow-context.ts | 2 +- .../src/utils/find-token.test.ts | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/actions-languageservice/src/context/workflow-context.ts b/actions-languageservice/src/context/workflow-context.ts index 1754ffc..6ba3f28 100644 --- a/actions-languageservice/src/context/workflow-context.ts +++ b/actions-languageservice/src/context/workflow-context.ts @@ -33,7 +33,7 @@ export function getWorkflowContext( // Iterate through the token path to find the job and step for (const token of tokenPath) { switch (token.definition?.key) { - case "job-id": { + case "job": { const jobID = (token as StringToken).value; context.job = template.jobs.find(job => job.id.value === jobID); break; diff --git a/actions-languageservice/src/utils/find-token.test.ts b/actions-languageservice/src/utils/find-token.test.ts index f79e561..bc9143f 100644 --- a/actions-languageservice/src/utils/find-token.test.ts +++ b/actions-languageservice/src/utils/find-token.test.ts @@ -145,7 +145,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping], ["runs-on", TokenType.String, "runs-on"], ["runs-on", TokenType.Sequence] @@ -180,7 +180,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping], ["runs-on", TokenType.String, "runs-on"] ], @@ -201,7 +201,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping] ], parent: ["job-factory", TokenType.Mapping], @@ -221,7 +221,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping] ], parent: ["job-factory", TokenType.Mapping], @@ -241,7 +241,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping] ], parent: ["job-factory", TokenType.Mapping], @@ -261,10 +261,10 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"] + ["job", TokenType.String, "build"] ], parent: ["jobs", TokenType.Mapping], - key: ["job-id", TokenType.String, "build"], + key: ["job", TokenType.String, "build"], token: [null, TokenType.String, "continue-on-error:foo"] }); }); @@ -280,7 +280,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping] ], parent: ["job-factory", TokenType.Mapping], @@ -300,7 +300,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping] ], parent: ["job-factory", TokenType.Mapping], @@ -320,10 +320,10 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"] + ["job", TokenType.String, "build"] ], parent: ["jobs", TokenType.Mapping], - key: ["job-id", TokenType.String, "build"], + key: ["job", TokenType.String, "build"], token: [null, TokenType.String, "runs-"] }); }); @@ -340,10 +340,10 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"] + ["job", TokenType.String, "build"] ], parent: ["jobs", TokenType.Mapping], - key: ["job-id", TokenType.String, "build"], + key: ["job", TokenType.String, "build"], token: [null, TokenType.String, "runs-"] }); }); @@ -360,7 +360,7 @@ jobs: ["workflow-root-strict", TokenType.Mapping], ["jobs", TokenType.String, "jobs"], ["jobs", TokenType.Mapping], - ["job-id", TokenType.String, "build"], + ["job", TokenType.String, "build"], ["job-factory", TokenType.Mapping], ["runs-on", TokenType.String, "runs-on"] ],