Skip to content

Commit 8fe8717

Browse files
authored
Merge pull request #13 from actions/felipesu19-fix-workflow-token
Felipesu19 fix workflow token
2 parents febac16 + 709d0d7 commit 8fe8717

File tree

3 files changed

+104
-7
lines changed

3 files changed

+104
-7
lines changed

workflow-parser/src/model/converter/events.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,24 @@ export function convertOn(context: TemplateContext, token: TemplateToken): Event
5959

6060
// All other events are defined as mappings. During schema validation we already ensure that events
6161
// receive only known keys, so here we can focus on the values and whether they are valid.
62+
6263
const eventToken = item.value.assertMapping(`event ${eventName}`);
64+
if (eventName === "workflow_call") {
65+
result.workflow_call = convertEventWorkflowCall(context, eventToken);
66+
continue;
67+
}
68+
69+
if (eventName === "workflow_dispatch") {
70+
result.workflow_dispatch = convertEventWorkflowDispatchInputs(context, eventToken);
71+
continue;
72+
}
6373

6474
result[eventName] = {
6575
...convertPatternFilter("branches", eventToken),
6676
...convertPatternFilter("tags", eventToken),
6777
...convertPatternFilter("paths", eventToken),
6878
...convertFilter("types", eventToken),
69-
...convertFilter("workflows", eventToken),
70-
// workflow_call and workflow_dispatch share input parsing
71-
...convertEventWorkflowDispatchInputs(context, eventToken),
72-
...convertEventWorkflowCall(context, eventToken)
79+
...convertFilter("workflows", eventToken)
7380
};
7481
}
7582

workflow-parser/src/model/converter/workflow-call.ts

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import {TemplateContext} from "../../templates/template-context";
22
import {MappingToken, TemplateToken} from "../../templates/tokens";
33
import {isMapping} from "../../templates/tokens/type-guards";
4-
import {SecretConfig, WorkflowCallConfig} from "../workflow-template";
4+
import {SecretConfig, WorkflowCallConfig, InputConfig, InputType} from "../workflow-template";
5+
import {convertStringList} from "./string-list";
6+
import {ScalarToken} from "../../templates/tokens/scalar-token";
57

68
export function convertEventWorkflowCall(context: TemplateContext, token: MappingToken): WorkflowCallConfig {
79
const result: WorkflowCallConfig = {};
@@ -11,7 +13,7 @@ export function convertEventWorkflowCall(context: TemplateContext, token: Mappin
1113

1214
switch (key.value) {
1315
case "inputs":
14-
// Ignore, these are handled by convertEventWorkflowDispatchInputs
16+
result.inputs = convertWorkflowInputs(context, item.value.assertMapping("workflow dispatch inputs"));
1517
break;
1618

1719
case "secrets":
@@ -27,6 +29,94 @@ export function convertEventWorkflowCall(context: TemplateContext, token: Mappin
2729
return result;
2830
}
2931

32+
export function convertWorkflowInputs(
33+
context: TemplateContext,
34+
token: MappingToken
35+
): {
36+
[inputName: string]: InputConfig;
37+
} {
38+
const result: {[inputName: string]: InputConfig} = {};
39+
40+
for (const item of token) {
41+
const inputName = item.key.assertString("input name");
42+
const inputMapping = item.value.assertMapping("input configuration");
43+
44+
result[inputName.value] = convertWorkflowInput(context, inputMapping);
45+
}
46+
47+
return result;
48+
}
49+
50+
export function convertWorkflowInput(context: TemplateContext, token: MappingToken): InputConfig {
51+
const result: InputConfig = {
52+
type: InputType.string // Default to string
53+
};
54+
55+
let defaultValue: undefined | ScalarToken;
56+
57+
for (const item of token) {
58+
const key = item.key.assertString("workflow dispatch input key");
59+
60+
switch (key.value) {
61+
case "description":
62+
result.description = item.value.assertString("input description").value;
63+
break;
64+
65+
case "required":
66+
result.required = item.value.assertBoolean("input required").value;
67+
break;
68+
69+
case "default":
70+
defaultValue = item.value.assertScalar("input default");
71+
break;
72+
73+
case "type":
74+
result.type = InputType[item.value.assertString("input type").value as keyof typeof InputType];
75+
break;
76+
77+
case "options":
78+
result.options = convertStringList("input options", item.value.assertSequence("input options"));
79+
break;
80+
81+
default:
82+
context.error(item.key, `Invalid key '${key.value}'`);
83+
}
84+
}
85+
86+
// Validate default value
87+
if (defaultValue !== undefined && !defaultValue.isExpression) {
88+
try {
89+
switch (result.type) {
90+
case InputType.boolean:
91+
result.default = defaultValue.assertBoolean("input default").value;
92+
93+
break;
94+
95+
case InputType.string:
96+
case InputType.choice:
97+
case InputType.environment:
98+
result.default = defaultValue.assertString("input default").value;
99+
break;
100+
}
101+
} catch (e) {
102+
context.error(defaultValue, e);
103+
}
104+
}
105+
106+
// Validate `options` for `choice` type
107+
if (result.type === InputType.choice) {
108+
if (result.options === undefined || result.options.length === 0) {
109+
context.error(token, "Missing 'options' for choice input");
110+
}
111+
} else {
112+
if (result.options !== undefined) {
113+
context.error(token, "Input type is not 'choice', but 'options' is defined");
114+
}
115+
}
116+
117+
return result;
118+
}
119+
30120
function convertWorkflowCallSecrets(
31121
context: TemplateContext,
32122
token: MappingToken

workflow-parser/src/model/workflow-template.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ export type WorkflowDispatchConfig = {
158158
};
159159

160160
export type WorkflowCallConfig = {
161-
inputs?: {[inputName: string]: InputConfig};
161+
inputs?: {[inputName: string]: InputConfig & {default?: string | boolean | number | ScalarToken}};
162162
secrets?: {[secretName: string]: SecretConfig};
163163
// TODO - these are supported in C# and Go but not in TS yet
164164
// outputs: { [outputName: string]: OutputConfig }

0 commit comments

Comments
 (0)