From 9a8a94bd216ffaf85874100656c7f70af8886b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C4=9Fan?= Date: Thu, 16 Apr 2026 23:55:56 +0800 Subject: [PATCH] Add field_added and field_removed issue event types to workflows (#351) --- languageservice/src/complete.test.ts | 13 +++++++ languageservice/src/validate.test.ts | 37 +++++++++++++++++++ workflow-parser/src/workflow-v1.0.json | 6 ++- .../testdata/reader/events-mapping-all.yml | 6 ++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/languageservice/src/complete.test.ts b/languageservice/src/complete.test.ts index fcdf659..7b88015 100644 --- a/languageservice/src/complete.test.ts +++ b/languageservice/src/complete.test.ts @@ -112,6 +112,19 @@ jobs: ]); }); + it("issues activity type completion includes field_added and field_removed", async () => { + const input = `on: + issues: + types: + - |`; + const result = await complete(...getPositionFromCursor(input)); + const labels = result.map(x => x.label); + expect(labels).toContain("field_added"); + expect(labels).toContain("field_removed"); + expect(labels).toContain("opened"); + expect(labels).toContain("closed"); + }); + it("map keys filter out existing values", async () => { const input = `on: push jobs: diff --git a/languageservice/src/validate.test.ts b/languageservice/src/validate.test.ts index 82c69e2..425966c 100644 --- a/languageservice/src/validate.test.ts +++ b/languageservice/src/validate.test.ts @@ -165,6 +165,43 @@ jobs: } as Diagnostic); }); + it("issues event with field_added activity type", async () => { + const result = await validate( + createDocument( + "wf.yaml", + `on: + issues: + types: [field_added, field_removed] +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: echo` + ) + ); + + expect(result.length).toBe(0); + }); + + it("issues event with invalid activity type", async () => { + const result = await validate( + createDocument( + "wf.yaml", + `on: + issues: + types: [opened, not_a_real_type] +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: echo` + ) + ); + + expect(result.length).toBe(1); + expect(result[0]?.message).toBe("Unexpected value 'not_a_real_type'"); + }); + it("invalid cron string", async () => { const result = await validate( createDocument( diff --git a/workflow-parser/src/workflow-v1.0.json b/workflow-parser/src/workflow-v1.0.json index 8b8968a..8d27f75 100644 --- a/workflow-parser/src/workflow-v1.0.json +++ b/workflow-parser/src/workflow-v1.0.json @@ -539,7 +539,7 @@ } }, "issues-activity": { - "description": "The types of issue activity that trigger the workflow. Supported activity types: `opened`, `edited`, `deleted`, `transferred`, `pinned`, `unpinned`, `closed`, `reopened`, `assigned`, `unassigned`, `labeled`, `unlabeled`, `locked`, `unlocked`, `milestoned`, `demilestoned`.", + "description": "The types of issue activity that trigger the workflow. Supported activity types: `opened`, `edited`, `deleted`, `transferred`, `pinned`, `unpinned`, `closed`, `reopened`, `assigned`, `unassigned`, `labeled`, `unlabeled`, `locked`, `unlocked`, `milestoned`, `demilestoned`, `field_added`, `field_removed`.", "one-of": [ "issues-activity-type", "issues-activity-types" @@ -567,7 +567,9 @@ "locked", "unlocked", "milestoned", - "demilestoned" + "demilestoned", + "field_added", + "field_removed" ] }, "label-string": { diff --git a/workflow-parser/testdata/reader/events-mapping-all.yml b/workflow-parser/testdata/reader/events-mapping-all.yml index b144587..b81a26f 100644 --- a/workflow-parser/testdata/reader/events-mapping-all.yml +++ b/workflow-parser/testdata/reader/events-mapping-all.yml @@ -66,6 +66,8 @@ on: - unlocked - milestoned - demilestoned + - field_added + - field_removed label: types: - created @@ -316,7 +318,9 @@ jobs: "locked", "unlocked", "milestoned", - "demilestoned" + "demilestoned", + "field_added", + "field_removed" ] }, "label": {