diff --git a/actions-languageservice/src/validate-action.ts b/actions-languageservice/src/validate-action.ts index 8a5d30d..b5c1931 100644 --- a/actions-languageservice/src/validate-action.ts +++ b/actions-languageservice/src/validate-action.ts @@ -25,6 +25,11 @@ export async function validateAction( const actionInputs = await config.getActionInputs(action); if (actionInputs === undefined) { + diagnostics.push({ + severity: DiagnosticSeverity.Error, + range: mapRange(step.uses.range), + message: `Unable to resolve action \`${step.uses.value}\`, repository or version not found` + }); return; } diff --git a/actions-languageservice/src/validate.actions.test.ts b/actions-languageservice/src/validate.actions.test.ts index b9be81b..05842bb 100644 --- a/actions-languageservice/src/validate.actions.test.ts +++ b/actions-languageservice/src/validate.actions.test.ts @@ -10,7 +10,7 @@ registerLogger(new TestLogger()); const validationConfig: ValidationConfig = { getActionInputs: async (ref: ActionReference) => { - let inputs: Record = {}; + let inputs: Record | undefined = undefined; switch (ref.owner + "/" + ref.name + "@" + ref.ref) { case "actions/checkout@v3": inputs = { @@ -58,6 +58,7 @@ const validationConfig: ValidationConfig = { return inputs; } }; + describe("validate action steps", () => { it("valid action reference", async () => { const input = ` @@ -73,6 +74,35 @@ jobs: expect(result).toEqual([]); }); + it("action does not exist", async () => { + const input = ` + on: push + jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/does-not-exist@v3 + `; + const result = await validate(createDocument("wf.yaml", input), validationConfig); + + expect(result).toEqual([ + { + message: "Unable to resolve action `actions/does-not-exist@v3`, repository or version not found", + range: { + end: { + character: 41, + line: 6 + }, + start: { + character: 16, + line: 6 + } + }, + severity: DiagnosticSeverity.Error + } + ]); + }); + it("invalid input", async () => { const input = ` on: push