(step, args)
| 7 | import retryStep from './retry.js' |
| 8 | import { fixErrorStack } from '../utils/typescript.js' |
| 9 | function recordStep(step, args) { |
| 10 | step.status = 'queued' |
| 11 | |
| 12 | // apply step configuration |
| 13 | const lastArg = args[args.length - 1] |
| 14 | if (StepConfig.isStepConfig(lastArg)) { |
| 15 | const stepConfig = args.pop() |
| 16 | const { opts, timeout, retry } = stepConfig.getConfig() |
| 17 | |
| 18 | if (opts) { |
| 19 | output.debug(`Step ${step.title}: options applied ${JSON.stringify(opts)}`) |
| 20 | store.stepOptions = opts |
| 21 | step.opts = opts |
| 22 | } |
| 23 | if (timeout) { |
| 24 | output.debug(`Step ${step.title} timeout ${timeout}s`) |
| 25 | step.setTimeout(timeout * 1000, TIMEOUT_ORDER.codeLimitTime) |
| 26 | } |
| 27 | if (retry) retryStep(retry) |
| 28 | } |
| 29 | |
| 30 | step.setArguments(args) |
| 31 | // run async before step hooks |
| 32 | event.emit(event.step.before, step) |
| 33 | |
| 34 | const task = `${step.title}: ${step.humanizeArgs()}` |
| 35 | let val |
| 36 | |
| 37 | // run step inside promise |
| 38 | recorder.add( |
| 39 | task, |
| 40 | () => { |
| 41 | if (!step.startTime) { |
| 42 | // step can be retries |
| 43 | event.emit(event.step.started, step) |
| 44 | step.startTime = +Date.now() |
| 45 | } |
| 46 | return (val = step.run(...args)) |
| 47 | }, |
| 48 | false, |
| 49 | undefined, |
| 50 | step.timeout, |
| 51 | ) |
| 52 | |
| 53 | event.emit(event.step.after, step) |
| 54 | |
| 55 | recorder.add('step passed', () => { |
| 56 | step.endTime = +Date.now() |
| 57 | event.emit(event.step.passed, step, val) |
| 58 | event.emit(event.step.finished, step) |
| 59 | }) |
| 60 | |
| 61 | recorder.catch(err => { |
| 62 | step.status = 'failed' |
| 63 | step.endTime = +Date.now() |
| 64 | |
| 65 | // Fix error stack to point to original .ts files (lazy import to avoid circular dependency) |
| 66 | const fileMapping = store.tsFileMapping |
no test coverage detected