| 90 | } |
| 91 | |
| 92 | function makeDeps( |
| 93 | harness: FakeHarness, |
| 94 | overrides: Partial<ProviderDeps> = {}, |
| 95 | ): { |
| 96 | deps: ProviderDeps; |
| 97 | stdout: string[]; |
| 98 | stderr: string[]; |
| 99 | exitCodes: number[]; |
| 100 | } { |
| 101 | const stdout: string[] = []; |
| 102 | const stderr: string[] = []; |
| 103 | const exitCodes: number[] = []; |
| 104 | const deps: ProviderDeps = { |
| 105 | getHarness: () => harness as unknown as ProviderDeps extends { getHarness: () => infer R } |
| 106 | ? R |
| 107 | : never, |
| 108 | stdout: { |
| 109 | write: (chunk: string) => { |
| 110 | stdout.push(chunk); |
| 111 | return true; |
| 112 | }, |
| 113 | }, |
| 114 | stderr: { |
| 115 | write: (chunk: string) => { |
| 116 | stderr.push(chunk); |
| 117 | return true; |
| 118 | }, |
| 119 | }, |
| 120 | env: {}, |
| 121 | exit: ((code: number) => { |
| 122 | exitCodes.push(code); |
| 123 | throw new ExitCalled(code); |
| 124 | }) as ProviderDeps['exit'], |
| 125 | ...overrides, |
| 126 | }; |
| 127 | return { deps, stdout, stderr, exitCodes }; |
| 128 | } |
| 129 | |
| 130 | async function tryRun<T>(fn: () => Promise<T>): Promise<T | undefined> { |
| 131 | try { |