Skip to content
This repository was archived by the owner on Sep 2, 2025. It is now read-only.

Commit f3287a8

Browse files
authored
feat!: standardize workflow job parameters (#176)
* feat!: post/preSteps now expected as parameters * fixup: fix test * fix: conditionally add when parameter
1 parent 898897c commit f3287a8

File tree

6 files changed

+45
-58
lines changed

6 files changed

+45
-58
lines changed

src/lib/Components/Workflow/exports/Workflow.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Generable } from '../..';
22
import { GenerableType } from '../../../Config/exports/Mapping';
3-
import { Command } from '../../Commands/types/Command.types';
43
import { Job } from '../../Job';
54
import { When } from '../../Logic';
65
import { Conditional } from '../../Logic/exports/Conditional';
@@ -72,22 +71,20 @@ export class Workflow implements Generable, Conditional {
7271

7372
const generatedWhen = this.when?.generate();
7473

75-
return {
76-
when: generatedWhen,
74+
const workflowContents: WorkflowContentsShape = {
7775
jobs: generatedWorkflowJobs,
7876
};
77+
78+
generatedWhen ? (workflowContents.when = generatedWhen) : null;
79+
80+
return workflowContents;
7981
}
8082

8183
/**
8284
* Add a Job to the current Workflow. Chainable
8385
*/
84-
addJob(
85-
job: Job,
86-
parameters?: WorkflowJobParameters,
87-
pre_steps?: Command[],
88-
post_steps?: Command[],
89-
): this {
90-
this.jobs.push(new WorkflowJob(job, parameters, pre_steps, post_steps));
86+
addJob(job: Job, parameters?: WorkflowJobParameters): this {
87+
this.jobs.push(new WorkflowJob(job, parameters));
9188
return this;
9289
}
9390

src/lib/Components/Workflow/exports/WorkflowJob.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { OrbRef } from '../../../Orb/exports/OrbRef';
2-
import { AnyCommandShape } from '../../Commands/types/Command.types';
32
import { Job } from '../../Job';
4-
import { StepsParameter } from '../../Parameters/types';
53
import { JobParameterLiteral } from '../../Parameters/types/CustomParameterLiterals.types';
64
import {
75
WorkflowJobContentsShape,
@@ -18,26 +16,18 @@ import { WorkflowJobAbstract } from './WorkflowJobAbstract';
1816
*/
1917
export class WorkflowJob extends WorkflowJobAbstract {
2018
job: Job | OrbRef<JobParameterLiteral>;
21-
pre_steps?: StepsParameter;
22-
post_steps?: StepsParameter;
2319

2420
constructor(
2521
job: Job | OrbRef<JobParameterLiteral>,
2622
parameters?: Exclude<WorkflowJobParameters, 'type'>,
27-
pre_steps?: StepsParameter,
28-
post_steps?: StepsParameter,
2923
) {
3024
super(parameters);
3125
this.job = job;
32-
this.pre_steps = pre_steps;
33-
this.post_steps = post_steps;
3426
}
3527

3628
generateContents(flatten?: boolean): WorkflowJobContentsShape {
3729
return {
3830
...super.generateContents(flatten),
39-
'pre-steps': this.generateSteps(this.pre_steps, flatten),
40-
'post-steps': this.generateSteps(this.post_steps, flatten),
4131
};
4232
}
4333

@@ -54,11 +44,4 @@ export class WorkflowJob extends WorkflowJobAbstract {
5444
get name(): string {
5545
return this.job.name;
5646
}
57-
58-
private generateSteps(
59-
steps?: StepsParameter,
60-
flatten?: boolean,
61-
): AnyCommandShape[] | undefined {
62-
return steps?.map((step) => step.generate(flatten));
63-
}
6447
}

src/lib/Components/Workflow/exports/WorkflowJobAbstract.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { GenerableType } from '../../../Config/exports/Mapping';
2+
import { AnyCommandShape } from '../../Commands/types/Command.types';
23
import { Generable } from '../../index';
4+
import { StepsParameter } from '../../Parameters/types';
35
import {
46
WorkflowJobContentsShape,
57
WorkflowJobParameters,
@@ -25,14 +27,21 @@ export abstract class WorkflowJobAbstract implements Generable {
2527
let parameters: WorkflowJobParametersShape | undefined;
2628

2729
if (this.parameters) {
28-
const { matrix, ...jobParameters } = this.parameters;
30+
const { matrix, preSteps, postSteps, ...jobParameters } = this.parameters;
2931
parameters = jobParameters;
3032

3133
if (matrix) {
3234
parameters.matrix = {
3335
parameters: matrix,
3436
};
3537
}
38+
39+
if (preSteps) {
40+
parameters['pre-steps'] = this.generateSteps(preSteps, flatten);
41+
}
42+
if (postSteps) {
43+
parameters['post-steps'] = this.generateSteps(postSteps, flatten);
44+
}
3645
}
3746

3847
return parameters;
@@ -42,6 +51,13 @@ export abstract class WorkflowJobAbstract implements Generable {
4251
return GenerableType.WORKFLOW_JOB;
4352
}
4453

54+
private generateSteps(
55+
steps?: StepsParameter,
56+
flatten?: boolean,
57+
): AnyCommandShape[] | undefined {
58+
return steps?.map((step) => step.generate(flatten));
59+
}
60+
4561
abstract get name(): string;
4662
abstract generate(flatten?: boolean): WorkflowJobShape;
4763
}

src/lib/Components/Workflow/types/Workflow.types.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import { WorkflowJobShape } from './WorkflowJob.types';
44

55
export type WorkflowsShape = {
66
[workflowName: string]: {
7-
when: AnyConditionShape;
7+
when?: AnyConditionShape;
88
jobs: WorkflowJobShape[];
99
};
1010
};
1111

1212
export type WorkflowContentsShape = {
13-
when: AnyConditionShape;
13+
when?: AnyConditionShape;
1414
jobs: WorkflowJobShape[];
1515
};
1616

@@ -23,8 +23,6 @@ export type UnknownWorkflowJobShape = {
2323
parameters?: { [key: string]: unknown };
2424
name?: string;
2525
type?: 'approval';
26-
// 'pre-steps'?: { [key: string]: unknown }[];
27-
// 'post-steps'?: { [key: string]: unknown }[];
2826
};
2927

3028
export type WorkflowDependencies = {

src/lib/Components/Workflow/types/WorkflowJob.types.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export interface WorkflowJobParameters
2323
requires?: ListParameter;
2424
name?: StringParameter;
2525
context?: ListParameter;
26+
preSteps?: StepsParameter;
27+
postSteps?: StepsParameter;
2628
/**
2729
* {@link https://circleci.com/docs/2.0/configuration-reference/#filters} Filter workflow job's execution by branch or git tag.
2830
*/
@@ -35,9 +37,6 @@ export interface WorkflowJobParameters
3537
* An "approval" type job is a special job which pauses the workflow. This "job" is not defined outside of the workflow, you may enter any potential name for the job name. As long as the parameter of "type" is present and equal to "approval" this job will act as a placeholder that awaits user input to continue.
3638
*/
3739
type?: approval;
38-
39-
pre_steps?: StepsParameter;
40-
post_steps?: StepsParameter;
4140
}
4241

4342
export type approval = 'approval';
@@ -62,8 +61,6 @@ export interface WorkflowJobParametersShape {
6261
type?: approval;
6362
filters?: FilterParameter;
6463
matrix?: WorkflowMatrixShape;
65-
'pre-steps'?: AnyCommandShape[];
66-
'post-steps'?: AnyCommandShape[];
6764
[key: string]:
6865
| JobParameterTypes
6966
| WorkflowMatrixShape

tests/Workflow.test.ts

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as CircleCI from '../src/index';
2+
import * as YAML from 'yaml';
23

34
describe('Instantiate Workflow', () => {
45
const docker = new CircleCI.executors.DockerExecutor('cimg/node:lts');
@@ -289,28 +290,23 @@ describe('Add pre/post steps to workflow', () => {
289290
});
290291
const job = new CircleCI.Job('my-job', docker, [helloWorld]);
291292
const myWorkflow = new CircleCI.Workflow('my-workflow');
292-
myWorkflow.addJob(
293-
job,
294-
{
295-
name: 'custom-name',
296-
},
297-
[helloWorld],
298-
[helloWorld],
299-
);
293+
myWorkflow.addJob(job, {
294+
name: 'custom-name',
295+
preSteps: [helloWorld],
296+
postSteps: [helloWorld],
297+
});
300298
it('Should match the expected output', () => {
301-
const expected = {
302-
'my-workflow': {
303-
jobs: [
304-
{
305-
'my-job': {
306-
name: 'custom-name',
307-
'post-steps': [{ run: 'echo hello world' }],
308-
'pre-steps': [{ run: 'echo hello world' }],
309-
},
310-
},
311-
],
312-
},
313-
};
299+
const expectedYaml = `my-workflow:
300+
jobs:
301+
- my-job:
302+
name: custom-name
303+
pre-steps:
304+
- run: echo hello world
305+
post-steps:
306+
- run: echo hello world
307+
`;
308+
const expected = YAML.parse(expectedYaml);
309+
314310
const generatedWorkflow = myWorkflow.generate(true);
315311
expect(generatedWorkflow).toEqual(expected);
316312
});

0 commit comments

Comments
 (0)