takos-actions-engine 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +3477 -0
- package/coverage/coverage-final.json +20 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +176 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/context/base.ts.html +1792 -0
- package/coverage/src/context/env.ts.html +1243 -0
- package/coverage/src/context/index.html +161 -0
- package/coverage/src/context/index.ts.html +229 -0
- package/coverage/src/context/secrets.ts.html +1276 -0
- package/coverage/src/index.html +131 -0
- package/coverage/src/index.ts.html +502 -0
- package/coverage/src/parser/expression.ts.html +2854 -0
- package/coverage/src/parser/index.html +161 -0
- package/coverage/src/parser/index.ts.html +163 -0
- package/coverage/src/parser/validator.ts.html +1588 -0
- package/coverage/src/parser/workflow.ts.html +616 -0
- package/coverage/src/scheduler/dependency.ts.html +1138 -0
- package/coverage/src/scheduler/index.html +221 -0
- package/coverage/src/scheduler/index.ts.html +214 -0
- package/coverage/src/scheduler/job-context.ts.html +265 -0
- package/coverage/src/scheduler/job-policy.ts.html +559 -0
- package/coverage/src/scheduler/job.ts.html +1816 -0
- package/coverage/src/scheduler/listener-registry.ts.html +199 -0
- package/coverage/src/scheduler/step.ts.html +2206 -0
- package/coverage/src/scheduler/steps-context.ts.html +217 -0
- package/coverage/src/types.ts.html +1897 -0
- package/coverage/src/utils/index.html +116 -0
- package/coverage/src/utils/needs.ts.html +127 -0
- package/dist/__tests__/context/env.test.d.ts +2 -0
- package/dist/__tests__/context/env.test.d.ts.map +1 -0
- package/dist/__tests__/context/env.test.js +28 -0
- package/dist/__tests__/context/env.test.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +50 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/__tests__/parser/expression.test.d.ts +2 -0
- package/dist/__tests__/parser/expression.test.d.ts.map +1 -0
- package/dist/__tests__/parser/expression.test.js +116 -0
- package/dist/__tests__/parser/expression.test.js.map +1 -0
- package/dist/__tests__/parser/workflow.test.d.ts +2 -0
- package/dist/__tests__/parser/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/parser/workflow.test.js +134 -0
- package/dist/__tests__/parser/workflow.test.js.map +1 -0
- package/dist/__tests__/scheduler/dependency.test.d.ts +2 -0
- package/dist/__tests__/scheduler/dependency.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/dependency.test.js +41 -0
- package/dist/__tests__/scheduler/dependency.test.js.map +1 -0
- package/dist/__tests__/scheduler/job-context.test.d.ts +2 -0
- package/dist/__tests__/scheduler/job-context.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/job-context.test.js +108 -0
- package/dist/__tests__/scheduler/job-context.test.js.map +1 -0
- package/dist/__tests__/scheduler/job-policy.test.d.ts +2 -0
- package/dist/__tests__/scheduler/job-policy.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/job-policy.test.js +159 -0
- package/dist/__tests__/scheduler/job-policy.test.js.map +1 -0
- package/dist/__tests__/scheduler/job.test.d.ts +2 -0
- package/dist/__tests__/scheduler/job.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/job.test.js +826 -0
- package/dist/__tests__/scheduler/job.test.js.map +1 -0
- package/dist/__tests__/scheduler/listener-registry.test.d.ts +2 -0
- package/dist/__tests__/scheduler/listener-registry.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/listener-registry.test.js +79 -0
- package/dist/__tests__/scheduler/listener-registry.test.js.map +1 -0
- package/dist/__tests__/scheduler/step.test.d.ts +2 -0
- package/dist/__tests__/scheduler/step.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/step.test.js +209 -0
- package/dist/__tests__/scheduler/step.test.js.map +1 -0
- package/dist/__tests__/scheduler/steps-context.test.d.ts +2 -0
- package/dist/__tests__/scheduler/steps-context.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/steps-context.test.js +43 -0
- package/dist/__tests__/scheduler/steps-context.test.js.map +1 -0
- package/dist/constants.d.ts +47 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +53 -0
- package/dist/constants.js.map +1 -0
- package/dist/context.d.ts +37 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +105 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/evaluator-builtins.d.ts +14 -0
- package/dist/parser/evaluator-builtins.d.ts.map +1 -0
- package/dist/parser/evaluator-builtins.js +258 -0
- package/dist/parser/evaluator-builtins.js.map +1 -0
- package/dist/parser/evaluator.d.ts +38 -0
- package/dist/parser/evaluator.d.ts.map +1 -0
- package/dist/parser/evaluator.js +257 -0
- package/dist/parser/evaluator.js.map +1 -0
- package/dist/parser/expression.d.ts +20 -0
- package/dist/parser/expression.d.ts.map +1 -0
- package/dist/parser/expression.js +128 -0
- package/dist/parser/expression.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +26 -0
- package/dist/parser/tokenizer.d.ts.map +1 -0
- package/dist/parser/tokenizer.js +162 -0
- package/dist/parser/tokenizer.js.map +1 -0
- package/dist/parser/validator.d.ts +13 -0
- package/dist/parser/validator.d.ts.map +1 -0
- package/dist/parser/validator.js +383 -0
- package/dist/parser/validator.js.map +1 -0
- package/dist/parser/workflow.d.ts +30 -0
- package/dist/parser/workflow.d.ts.map +1 -0
- package/dist/parser/workflow.js +152 -0
- package/dist/parser/workflow.js.map +1 -0
- package/dist/scheduler/dependency.d.ts +37 -0
- package/dist/scheduler/dependency.d.ts.map +1 -0
- package/dist/scheduler/dependency.js +133 -0
- package/dist/scheduler/dependency.js.map +1 -0
- package/dist/scheduler/job-policy.d.ts +23 -0
- package/dist/scheduler/job-policy.d.ts.map +1 -0
- package/dist/scheduler/job-policy.js +117 -0
- package/dist/scheduler/job-policy.js.map +1 -0
- package/dist/scheduler/job.d.ts +151 -0
- package/dist/scheduler/job.d.ts.map +1 -0
- package/dist/scheduler/job.js +348 -0
- package/dist/scheduler/job.js.map +1 -0
- package/dist/scheduler/step-output-parser.d.ts +14 -0
- package/dist/scheduler/step-output-parser.d.ts.map +1 -0
- package/dist/scheduler/step-output-parser.js +70 -0
- package/dist/scheduler/step-output-parser.js.map +1 -0
- package/dist/scheduler/step.d.ts +74 -0
- package/dist/scheduler/step.d.ts.map +1 -0
- package/dist/scheduler/step.js +387 -0
- package/dist/scheduler/step.js.map +1 -0
- package/dist/types.d.ts +499 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-models.d.ts +504 -0
- package/dist/workflow-models.d.ts.map +1 -0
- package/dist/workflow-models.js +5 -0
- package/dist/workflow-models.js.map +1 -0
- package/package.json +29 -0
- package/src/__tests__/context/env.test.ts +38 -0
- package/src/__tests__/index.test.ts +55 -0
- package/src/__tests__/parser/expression.test.ts +151 -0
- package/src/__tests__/parser/workflow.test.ts +151 -0
- package/src/__tests__/scheduler/dependency.test.ts +51 -0
- package/src/__tests__/scheduler/job-context.test.ts +119 -0
- package/src/__tests__/scheduler/job-policy.test.ts +195 -0
- package/src/__tests__/scheduler/job.test.ts +1014 -0
- package/src/__tests__/scheduler/listener-registry.test.ts +95 -0
- package/src/__tests__/scheduler/step.test.ts +258 -0
- package/src/__tests__/scheduler/steps-context.test.ts +49 -0
- package/src/constants.ts +61 -0
- package/src/context.ts +153 -0
- package/src/index.ts +64 -0
- package/src/parser/evaluator-builtins.ts +315 -0
- package/src/parser/evaluator.ts +333 -0
- package/src/parser/expression.ts +154 -0
- package/src/parser/tokenizer.ts +191 -0
- package/src/parser/validator.ts +444 -0
- package/src/parser/workflow.ts +176 -0
- package/src/scheduler/dependency.ts +180 -0
- package/src/scheduler/job-policy.ts +198 -0
- package/src/scheduler/job.ts +523 -0
- package/src/scheduler/step-output-parser.ts +94 -0
- package/src/scheduler/step.ts +543 -0
- package/src/workflow-models.ts +593 -0
- package/tsconfig.json +14 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow schema validation using Zod
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { buildDependencyGraph, detectCycle, DependencyError } from '../scheduler/dependency.js';
|
|
6
|
+
import { normalizeNeedsInput } from '../scheduler/job.js';
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Zod Schemas
|
|
9
|
+
// =============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Branch filter schema
|
|
12
|
+
*/
|
|
13
|
+
const branchFilterSchema = z.object({
|
|
14
|
+
branches: z.array(z.string()).optional(),
|
|
15
|
+
'branches-ignore': z.array(z.string()).optional(),
|
|
16
|
+
tags: z.array(z.string()).optional(),
|
|
17
|
+
'tags-ignore': z.array(z.string()).optional(),
|
|
18
|
+
paths: z.array(z.string()).optional(),
|
|
19
|
+
'paths-ignore': z.array(z.string()).optional(),
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Push trigger schema
|
|
23
|
+
*/
|
|
24
|
+
const pushTriggerSchema = branchFilterSchema.nullable();
|
|
25
|
+
/**
|
|
26
|
+
* Pull request trigger schema
|
|
27
|
+
*/
|
|
28
|
+
const pullRequestTriggerSchema = branchFilterSchema
|
|
29
|
+
.extend({
|
|
30
|
+
types: z.array(z.string()).optional(),
|
|
31
|
+
})
|
|
32
|
+
.nullable();
|
|
33
|
+
/**
|
|
34
|
+
* Workflow dispatch input schema
|
|
35
|
+
*/
|
|
36
|
+
const workflowDispatchInputSchema = z.object({
|
|
37
|
+
description: z.string().optional(),
|
|
38
|
+
required: z.boolean().optional(),
|
|
39
|
+
default: z.string().optional(),
|
|
40
|
+
type: z.enum(['string', 'boolean', 'choice', 'environment']).optional(),
|
|
41
|
+
options: z.array(z.string()).optional(),
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Workflow dispatch trigger schema
|
|
45
|
+
*/
|
|
46
|
+
const workflowDispatchSchema = z
|
|
47
|
+
.object({
|
|
48
|
+
inputs: z.record(workflowDispatchInputSchema).optional(),
|
|
49
|
+
})
|
|
50
|
+
.nullable();
|
|
51
|
+
/**
|
|
52
|
+
* Schedule trigger schema
|
|
53
|
+
*/
|
|
54
|
+
const scheduleTriggerSchema = z.object({
|
|
55
|
+
cron: z.string(),
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* Workflow call input schema
|
|
59
|
+
*/
|
|
60
|
+
const workflowCallInputSchema = z.object({
|
|
61
|
+
description: z.string().optional(),
|
|
62
|
+
required: z.boolean().optional(),
|
|
63
|
+
default: z.union([z.string(), z.boolean(), z.number()]).optional(),
|
|
64
|
+
type: z.enum(['string', 'boolean', 'number']),
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* Workflow call output schema
|
|
68
|
+
*/
|
|
69
|
+
const workflowCallOutputSchema = z.object({
|
|
70
|
+
description: z.string().optional(),
|
|
71
|
+
value: z.string(),
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* Workflow call secret schema
|
|
75
|
+
*/
|
|
76
|
+
const workflowCallSecretSchema = z.object({
|
|
77
|
+
description: z.string().optional(),
|
|
78
|
+
required: z.boolean().optional(),
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* Workflow call trigger schema
|
|
82
|
+
*/
|
|
83
|
+
const workflowCallSchema = z
|
|
84
|
+
.object({
|
|
85
|
+
inputs: z.record(workflowCallInputSchema).optional(),
|
|
86
|
+
outputs: z.record(workflowCallOutputSchema).optional(),
|
|
87
|
+
secrets: z.record(workflowCallSecretSchema).optional(),
|
|
88
|
+
})
|
|
89
|
+
.nullable();
|
|
90
|
+
/**
|
|
91
|
+
* Workflow trigger schema
|
|
92
|
+
*/
|
|
93
|
+
const workflowTriggerSchema = z.object({
|
|
94
|
+
push: pushTriggerSchema.optional(),
|
|
95
|
+
pull_request: pullRequestTriggerSchema.optional(),
|
|
96
|
+
pull_request_target: pullRequestTriggerSchema.optional(),
|
|
97
|
+
workflow_dispatch: workflowDispatchSchema.optional(),
|
|
98
|
+
workflow_call: workflowCallSchema.optional(),
|
|
99
|
+
schedule: z.array(scheduleTriggerSchema).optional(),
|
|
100
|
+
repository_dispatch: z
|
|
101
|
+
.object({
|
|
102
|
+
types: z.array(z.string()).optional(),
|
|
103
|
+
})
|
|
104
|
+
.nullable()
|
|
105
|
+
.optional(),
|
|
106
|
+
issues: z
|
|
107
|
+
.object({
|
|
108
|
+
types: z.array(z.string()).optional(),
|
|
109
|
+
})
|
|
110
|
+
.nullable()
|
|
111
|
+
.optional(),
|
|
112
|
+
issue_comment: z
|
|
113
|
+
.object({
|
|
114
|
+
types: z.array(z.string()).optional(),
|
|
115
|
+
})
|
|
116
|
+
.nullable()
|
|
117
|
+
.optional(),
|
|
118
|
+
release: z
|
|
119
|
+
.object({
|
|
120
|
+
types: z.array(z.string()).optional(),
|
|
121
|
+
})
|
|
122
|
+
.nullable()
|
|
123
|
+
.optional(),
|
|
124
|
+
create: z.null().optional(),
|
|
125
|
+
delete: z.null().optional(),
|
|
126
|
+
fork: z.null().optional(),
|
|
127
|
+
watch: z
|
|
128
|
+
.object({
|
|
129
|
+
types: z.array(z.string()).optional(),
|
|
130
|
+
})
|
|
131
|
+
.nullable()
|
|
132
|
+
.optional(),
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Step schema
|
|
136
|
+
*/
|
|
137
|
+
const stepSchema = z
|
|
138
|
+
.object({
|
|
139
|
+
id: z.string().optional(),
|
|
140
|
+
name: z.string().optional(),
|
|
141
|
+
uses: z.string().optional(),
|
|
142
|
+
run: z.string().optional(),
|
|
143
|
+
'working-directory': z.string().optional(),
|
|
144
|
+
shell: z.enum(['bash', 'pwsh', 'python', 'sh', 'cmd', 'powershell']).optional(),
|
|
145
|
+
with: z.record(z.unknown()).optional(),
|
|
146
|
+
env: z.record(z.string()).optional(),
|
|
147
|
+
if: z.string().optional(),
|
|
148
|
+
'continue-on-error': z.boolean().optional(),
|
|
149
|
+
'timeout-minutes': z.number().positive().optional(),
|
|
150
|
+
})
|
|
151
|
+
.refine((step) => step.uses !== undefined || step.run !== undefined, {
|
|
152
|
+
message: 'Step must have either "uses" or "run"',
|
|
153
|
+
})
|
|
154
|
+
.refine((step) => !(step.uses !== undefined && step.run !== undefined), {
|
|
155
|
+
message: 'Step cannot have both "uses" and "run"',
|
|
156
|
+
});
|
|
157
|
+
/**
|
|
158
|
+
* Matrix config schema
|
|
159
|
+
*/
|
|
160
|
+
const matrixConfigSchema = z
|
|
161
|
+
.record(z.unknown())
|
|
162
|
+
.refine((obj) => {
|
|
163
|
+
// Allow 'include' and 'exclude' as special keys
|
|
164
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
165
|
+
if (key === 'include' || key === 'exclude') {
|
|
166
|
+
if (!Array.isArray(value))
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
else if (!Array.isArray(value)) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
}, {
|
|
175
|
+
message: 'Matrix values must be arrays (except include/exclude)',
|
|
176
|
+
});
|
|
177
|
+
/**
|
|
178
|
+
* Job strategy schema
|
|
179
|
+
*/
|
|
180
|
+
const jobStrategySchema = z.object({
|
|
181
|
+
matrix: matrixConfigSchema.optional(),
|
|
182
|
+
'fail-fast': z.boolean().optional(),
|
|
183
|
+
'max-parallel': z.number().positive().optional(),
|
|
184
|
+
});
|
|
185
|
+
/**
|
|
186
|
+
* Container config schema
|
|
187
|
+
*/
|
|
188
|
+
const containerConfigSchema = z.union([
|
|
189
|
+
z.string(),
|
|
190
|
+
z.object({
|
|
191
|
+
image: z.string(),
|
|
192
|
+
credentials: z
|
|
193
|
+
.object({
|
|
194
|
+
username: z.string(),
|
|
195
|
+
password: z.string(),
|
|
196
|
+
})
|
|
197
|
+
.optional(),
|
|
198
|
+
env: z.record(z.string()).optional(),
|
|
199
|
+
ports: z.array(z.union([z.number(), z.string()])).optional(),
|
|
200
|
+
volumes: z.array(z.string()).optional(),
|
|
201
|
+
options: z.string().optional(),
|
|
202
|
+
}),
|
|
203
|
+
]);
|
|
204
|
+
/**
|
|
205
|
+
* Permissions schema
|
|
206
|
+
*/
|
|
207
|
+
const permissionsSchema = z.union([
|
|
208
|
+
z.literal('read-all'),
|
|
209
|
+
z.literal('write-all'),
|
|
210
|
+
z.record(z.enum(['read', 'write', 'none'])),
|
|
211
|
+
]);
|
|
212
|
+
/**
|
|
213
|
+
* Concurrency schema
|
|
214
|
+
*/
|
|
215
|
+
const concurrencySchema = z.union([
|
|
216
|
+
z.string(),
|
|
217
|
+
z.object({
|
|
218
|
+
group: z.string(),
|
|
219
|
+
'cancel-in-progress': z.boolean().optional(),
|
|
220
|
+
}),
|
|
221
|
+
]);
|
|
222
|
+
/**
|
|
223
|
+
* Environment schema
|
|
224
|
+
*/
|
|
225
|
+
const environmentSchema = z.union([
|
|
226
|
+
z.string(),
|
|
227
|
+
z.object({
|
|
228
|
+
name: z.string(),
|
|
229
|
+
url: z.string().optional(),
|
|
230
|
+
}),
|
|
231
|
+
]);
|
|
232
|
+
/**
|
|
233
|
+
* Job defaults schema
|
|
234
|
+
*/
|
|
235
|
+
const jobDefaultsSchema = z.object({
|
|
236
|
+
run: z
|
|
237
|
+
.object({
|
|
238
|
+
shell: z.string().optional(),
|
|
239
|
+
'working-directory': z.string().optional(),
|
|
240
|
+
})
|
|
241
|
+
.optional(),
|
|
242
|
+
});
|
|
243
|
+
/**
|
|
244
|
+
* Job schema
|
|
245
|
+
*/
|
|
246
|
+
const jobSchema = z.object({
|
|
247
|
+
name: z.string().optional(),
|
|
248
|
+
'runs-on': z.union([z.string(), z.array(z.string())]),
|
|
249
|
+
needs: z.union([z.string(), z.array(z.string())]).optional(),
|
|
250
|
+
if: z.string().optional(),
|
|
251
|
+
env: z.record(z.string()).optional(),
|
|
252
|
+
steps: z.array(stepSchema).min(1, 'Job must have at least one step'),
|
|
253
|
+
outputs: z.record(z.string()).optional(),
|
|
254
|
+
strategy: jobStrategySchema.optional(),
|
|
255
|
+
container: containerConfigSchema.optional(),
|
|
256
|
+
services: z.record(containerConfigSchema).optional(),
|
|
257
|
+
'timeout-minutes': z.number().positive().optional(),
|
|
258
|
+
'continue-on-error': z.boolean().optional(),
|
|
259
|
+
permissions: permissionsSchema.optional(),
|
|
260
|
+
concurrency: concurrencySchema.optional(),
|
|
261
|
+
defaults: jobDefaultsSchema.optional(),
|
|
262
|
+
environment: environmentSchema.optional(),
|
|
263
|
+
});
|
|
264
|
+
/**
|
|
265
|
+
* Complete workflow schema
|
|
266
|
+
*/
|
|
267
|
+
const workflowSchema = z.object({
|
|
268
|
+
name: z.string().optional(),
|
|
269
|
+
on: z.union([
|
|
270
|
+
workflowTriggerSchema,
|
|
271
|
+
z.string(),
|
|
272
|
+
z.array(z.string()),
|
|
273
|
+
]),
|
|
274
|
+
env: z.record(z.string()).optional(),
|
|
275
|
+
jobs: z
|
|
276
|
+
.record(jobSchema)
|
|
277
|
+
.refine((jobs) => Object.keys(jobs).length > 0, {
|
|
278
|
+
message: 'Workflow must have at least one job',
|
|
279
|
+
}),
|
|
280
|
+
permissions: permissionsSchema.optional(),
|
|
281
|
+
concurrency: concurrencySchema.optional(),
|
|
282
|
+
defaults: jobDefaultsSchema.optional(),
|
|
283
|
+
});
|
|
284
|
+
/**
|
|
285
|
+
* Collect Zod issues as workflow diagnostics
|
|
286
|
+
*/
|
|
287
|
+
function collectSchemaDiagnostics(schema, input, diagnostics, formatPath) {
|
|
288
|
+
const result = schema.safeParse(input);
|
|
289
|
+
if (result.success) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
for (const issue of result.error.issues) {
|
|
293
|
+
diagnostics.push({
|
|
294
|
+
severity: 'error',
|
|
295
|
+
message: issue.message,
|
|
296
|
+
path: formatPath(issue.path),
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Build validation result from diagnostics
|
|
302
|
+
*/
|
|
303
|
+
function buildValidationResult(diagnostics) {
|
|
304
|
+
return {
|
|
305
|
+
valid: !diagnostics.some((d) => d.severity === 'error'),
|
|
306
|
+
diagnostics,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Validate workflow against schema
|
|
311
|
+
*/
|
|
312
|
+
export function validateWorkflow(workflow) {
|
|
313
|
+
const diagnostics = [];
|
|
314
|
+
// Schema validation
|
|
315
|
+
collectSchemaDiagnostics(workflowSchema, workflow, diagnostics, (issuePath) => issuePath.join('.'));
|
|
316
|
+
// Additional semantic validation
|
|
317
|
+
const semanticDiagnostics = validateSemantics(workflow);
|
|
318
|
+
diagnostics.push(...semanticDiagnostics);
|
|
319
|
+
return buildValidationResult(diagnostics);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Perform semantic validation
|
|
323
|
+
*/
|
|
324
|
+
function validateSemantics(workflow) {
|
|
325
|
+
const diagnostics = [];
|
|
326
|
+
// Validate job dependencies
|
|
327
|
+
const jobNames = new Set(Object.keys(workflow.jobs));
|
|
328
|
+
for (const [jobId, job] of Object.entries(workflow.jobs)) {
|
|
329
|
+
const needs = normalizeNeedsInput(job.needs);
|
|
330
|
+
for (const need of needs) {
|
|
331
|
+
if (!jobNames.has(need)) {
|
|
332
|
+
diagnostics.push({
|
|
333
|
+
severity: 'error',
|
|
334
|
+
message: `Job "${jobId}" references unknown job "${need}" in needs`,
|
|
335
|
+
path: `jobs.${jobId}.needs`,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
if (need === jobId) {
|
|
339
|
+
diagnostics.push({
|
|
340
|
+
severity: 'error',
|
|
341
|
+
message: `Job "${jobId}" cannot depend on itself`,
|
|
342
|
+
path: `jobs.${jobId}.needs`,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Validate step IDs are unique
|
|
347
|
+
const stepIds = new Set();
|
|
348
|
+
for (let i = 0; i < job.steps.length; i++) {
|
|
349
|
+
const step = job.steps[i];
|
|
350
|
+
if (step.id) {
|
|
351
|
+
if (stepIds.has(step.id)) {
|
|
352
|
+
diagnostics.push({
|
|
353
|
+
severity: 'error',
|
|
354
|
+
message: `Duplicate step ID "${step.id}" in job "${jobId}"`,
|
|
355
|
+
path: `jobs.${jobId}.steps[${i}].id`,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
stepIds.add(step.id);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// Check for circular dependencies using the shared dependency graph
|
|
363
|
+
try {
|
|
364
|
+
const graph = buildDependencyGraph(workflow);
|
|
365
|
+
const cycle = detectCycle(graph);
|
|
366
|
+
if (cycle.length > 0) {
|
|
367
|
+
diagnostics.push({
|
|
368
|
+
severity: 'error',
|
|
369
|
+
message: `Circular dependency detected: ${cycle.join(' -> ')}`,
|
|
370
|
+
path: 'jobs',
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch (e) {
|
|
375
|
+
// buildDependencyGraph throws DependencyError for unknown job references,
|
|
376
|
+
// which are already reported by the needs-validation above.
|
|
377
|
+
if (!(e instanceof DependencyError)) {
|
|
378
|
+
throw e;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return diagnostics;
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/parser/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Workflow, ParsedWorkflow, WorkflowDiagnostic } from '../workflow-models.js';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when workflow parsing fails
|
|
4
|
+
*/
|
|
5
|
+
export declare class WorkflowParseError extends Error {
|
|
6
|
+
readonly diagnostics: WorkflowDiagnostic[];
|
|
7
|
+
constructor(message: string, diagnostics: WorkflowDiagnostic[]);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse YAML workflow content
|
|
11
|
+
*
|
|
12
|
+
* @param content - YAML content string
|
|
13
|
+
* @returns Parsed workflow with diagnostics
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseWorkflow(content: string): ParsedWorkflow;
|
|
16
|
+
/**
|
|
17
|
+
* Parse workflow from file path (for Node.js environments)
|
|
18
|
+
*
|
|
19
|
+
* @param filePath - Path to workflow file
|
|
20
|
+
* @returns Parsed workflow
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseWorkflowFile(filePath: string): Promise<ParsedWorkflow>;
|
|
23
|
+
/**
|
|
24
|
+
* Stringify workflow back to YAML
|
|
25
|
+
*
|
|
26
|
+
* @param workflow - Workflow object
|
|
27
|
+
* @returns YAML string
|
|
28
|
+
*/
|
|
29
|
+
export declare function stringifyWorkflow(workflow: Workflow): string;
|
|
30
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/parser/workflow.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,kBAAkB,EAEnB,MAAM,uBAAuB,CAAC;AAG/B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,WAAW,EAAE,kBAAkB,EAAE;gBADjD,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,kBAAkB,EAAE;CAKpD;AA+ED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAuC7D;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAKzB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAK5D"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML workflow parser
|
|
3
|
+
*/
|
|
4
|
+
import { parse as parseYaml, stringify as stringifyYaml, YAMLParseError } from 'yaml';
|
|
5
|
+
import { normalizeNeedsInput } from '../scheduler/job.js';
|
|
6
|
+
/**
|
|
7
|
+
* Error thrown when workflow parsing fails
|
|
8
|
+
*/
|
|
9
|
+
export class WorkflowParseError extends Error {
|
|
10
|
+
diagnostics;
|
|
11
|
+
constructor(message, diagnostics) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.diagnostics = diagnostics;
|
|
14
|
+
this.name = 'WorkflowParseError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Normalize workflow trigger from various formats
|
|
19
|
+
*/
|
|
20
|
+
function normalizeTrigger(on) {
|
|
21
|
+
// String format: on: push
|
|
22
|
+
if (typeof on === 'string') {
|
|
23
|
+
return { [on]: null };
|
|
24
|
+
}
|
|
25
|
+
// Array format: on: [push, pull_request]
|
|
26
|
+
if (Array.isArray(on)) {
|
|
27
|
+
const trigger = {};
|
|
28
|
+
for (const event of on) {
|
|
29
|
+
if (typeof event === 'string') {
|
|
30
|
+
trigger[event] = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return trigger;
|
|
34
|
+
}
|
|
35
|
+
// Object format: on: { push: { branches: [...] } }
|
|
36
|
+
if (typeof on === 'object' && on !== null) {
|
|
37
|
+
return on;
|
|
38
|
+
}
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Normalize workflow structure
|
|
43
|
+
*/
|
|
44
|
+
function normalizeWorkflow(raw) {
|
|
45
|
+
if (typeof raw !== 'object' || raw === null) {
|
|
46
|
+
throw new WorkflowParseError('Workflow must be an object', [
|
|
47
|
+
{ severity: 'error', message: 'Workflow must be an object' },
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
const obj = raw;
|
|
51
|
+
// Normalize 'on' trigger
|
|
52
|
+
const on = normalizeTrigger(obj.on);
|
|
53
|
+
// Normalize jobs
|
|
54
|
+
const jobs = {};
|
|
55
|
+
const rawJobs = obj.jobs;
|
|
56
|
+
if (typeof rawJobs === 'object' && rawJobs !== null) {
|
|
57
|
+
for (const [jobId, job] of Object.entries(rawJobs)) {
|
|
58
|
+
if (typeof job !== 'object' || job === null) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const jobObj = job;
|
|
62
|
+
const normalizedNeeds = normalizeNeedsInput(jobObj.needs);
|
|
63
|
+
jobs[jobId] = {
|
|
64
|
+
...jobObj,
|
|
65
|
+
needs: normalizedNeeds.length > 0 ? normalizedNeeds : undefined,
|
|
66
|
+
steps: Array.isArray(jobObj.steps) ? jobObj.steps : [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
name: typeof obj.name === 'string' ? obj.name : undefined,
|
|
72
|
+
on,
|
|
73
|
+
env: typeof obj.env === 'object' && obj.env !== null
|
|
74
|
+
? obj.env
|
|
75
|
+
: undefined,
|
|
76
|
+
jobs,
|
|
77
|
+
permissions: obj.permissions,
|
|
78
|
+
concurrency: obj.concurrency,
|
|
79
|
+
defaults: obj.defaults,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Parse YAML workflow content
|
|
84
|
+
*
|
|
85
|
+
* @param content - YAML content string
|
|
86
|
+
* @returns Parsed workflow with diagnostics
|
|
87
|
+
*/
|
|
88
|
+
export function parseWorkflow(content) {
|
|
89
|
+
const diagnostics = [];
|
|
90
|
+
try {
|
|
91
|
+
const parsed = parseYaml(content, {
|
|
92
|
+
strict: false,
|
|
93
|
+
uniqueKeys: true,
|
|
94
|
+
});
|
|
95
|
+
const workflow = normalizeWorkflow(parsed);
|
|
96
|
+
return {
|
|
97
|
+
workflow,
|
|
98
|
+
diagnostics,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error instanceof YAMLParseError) {
|
|
103
|
+
diagnostics.push({
|
|
104
|
+
severity: 'error',
|
|
105
|
+
message: error.message,
|
|
106
|
+
line: error.linePos?.[0]?.line,
|
|
107
|
+
column: error.linePos?.[0]?.col,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else if (error instanceof WorkflowParseError) {
|
|
111
|
+
diagnostics.push(...error.diagnostics);
|
|
112
|
+
}
|
|
113
|
+
else if (error instanceof Error) {
|
|
114
|
+
diagnostics.push({
|
|
115
|
+
severity: 'error',
|
|
116
|
+
message: error.message,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
diagnostics.push({
|
|
121
|
+
severity: 'error',
|
|
122
|
+
message: 'Unknown parse error',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
throw new WorkflowParseError('Failed to parse workflow', diagnostics);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Parse workflow from file path (for Node.js environments)
|
|
130
|
+
*
|
|
131
|
+
* @param filePath - Path to workflow file
|
|
132
|
+
* @returns Parsed workflow
|
|
133
|
+
*/
|
|
134
|
+
export async function parseWorkflowFile(filePath) {
|
|
135
|
+
// Dynamic import for Node.js fs
|
|
136
|
+
const { readFile } = await import('node:fs/promises');
|
|
137
|
+
const content = await readFile(filePath, 'utf-8');
|
|
138
|
+
return parseWorkflow(content);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Stringify workflow back to YAML
|
|
142
|
+
*
|
|
143
|
+
* @param workflow - Workflow object
|
|
144
|
+
* @returns YAML string
|
|
145
|
+
*/
|
|
146
|
+
export function stringifyWorkflow(workflow) {
|
|
147
|
+
return stringifyYaml(workflow, {
|
|
148
|
+
indent: 2,
|
|
149
|
+
lineWidth: 0,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/parser/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency resolution using DAG (Directed Acyclic Graph)
|
|
3
|
+
*/
|
|
4
|
+
import type { Workflow } from '../workflow-models.js';
|
|
5
|
+
/**
|
|
6
|
+
* Error thrown when dependency resolution fails
|
|
7
|
+
*/
|
|
8
|
+
export declare class DependencyError extends Error {
|
|
9
|
+
readonly jobs?: string[] | undefined;
|
|
10
|
+
constructor(message: string, jobs?: string[] | undefined);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Dependency graph representation
|
|
14
|
+
*/
|
|
15
|
+
export interface DependencyGraph {
|
|
16
|
+
/** All nodes (job IDs) */
|
|
17
|
+
nodes: Set<string>;
|
|
18
|
+
/** Edges: key depends on values */
|
|
19
|
+
edges: Map<string, Set<string>>;
|
|
20
|
+
/** Reverse edges: key is required by values */
|
|
21
|
+
reverseEdges: Map<string, Set<string>>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build dependency graph from workflow
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildDependencyGraph(workflow: Workflow): DependencyGraph;
|
|
27
|
+
/**
|
|
28
|
+
* Detect circular dependencies in graph
|
|
29
|
+
* Returns the cycle path if found, empty array otherwise
|
|
30
|
+
*/
|
|
31
|
+
export declare function detectCycle(graph: DependencyGraph): string[];
|
|
32
|
+
/**
|
|
33
|
+
* Group jobs into parallel execution phases
|
|
34
|
+
* Jobs in the same phase can run in parallel
|
|
35
|
+
*/
|
|
36
|
+
export declare function groupIntoPhases(graph: DependencyGraph): string[][];
|
|
37
|
+
//# sourceMappingURL=dependency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../../src/scheduler/dependency.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,IAAI,CAAC,EAAE,MAAM,EAAE;gBAD/B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAA;CAKlC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,mCAAmC;IACnC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,+CAA+C;IAC/C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACxC;AAkBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CA4BxE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,CAmC5D;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,EAAE,CA2ClE"}
|