Skip to content

Commit

Permalink
fix(create-astro): update install step (#8089)
Browse files Browse the repository at this point in the history
  • Loading branch information
natemoo-re committed Aug 15, 2023
1 parent 709f405 commit 04755e8
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 17 deletions.
5 changes: 5 additions & 0 deletions .changeset/angry-balloons-argue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'create-astro': patch
---

Fix install step to avoid unscrutable errors
36 changes: 19 additions & 17 deletions packages/create-astro/src/shell.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
// This is an extremely simplified version of [`execa`](https://github.com/sindresorhus/execa)
// intended to keep our dependency size down
import type { StdioOptions } from 'node:child_process';
import type { ChildProcess, StdioOptions } from 'node:child_process';
import type { Readable } from 'node:stream';

import { spawn } from 'node:child_process';
import { text as textFromStream } from 'node:stream/consumers';
import { setTimeout as sleep } from 'node:timers/promises';

export interface ExecaOptions {
cwd?: string | URL;
Expand All @@ -25,25 +24,28 @@ export async function shell(
flags: string[],
opts: ExecaOptions = {}
): Promise<Output> {
const controller = opts.timeout ? new AbortController() : undefined;
const child = spawn(command, flags, {
cwd: opts.cwd,
shell: true,
stdio: opts.stdio,
signal: controller?.signal,
});
const stdout = await text(child.stdout);
const stderr = await text(child.stderr);
if (opts.timeout) {
sleep(opts.timeout).then(() => {
controller!.abort();
throw { stdout, stderr, exitCode: 1 };
let child: ChildProcess;
let stdout = '';
let stderr = '';
try {
child = spawn(command, flags, {
cwd: opts.cwd,
shell: true,
stdio: opts.stdio,
timeout: opts.timeout,
});
const done = new Promise((resolve) => child.on('close', resolve));
([stdout, stderr] = await Promise.all([text(child.stdout), text(child.stderr)]));
await done;
} catch (e) {
throw { stdout, stderr, exitCode: 1 };
}
await new Promise((resolve) => child.on('exit', resolve));
const { exitCode } = child;
if (exitCode === null) {
throw new Error('Timeout');
}
if (exitCode !== 0) {
throw { stdout, stderr, exitCode };
throw new Error(stderr);
}
return { stdout, stderr, exitCode };
}

0 comments on commit 04755e8

Please sign in to comment.