summaryrefslogtreecommitdiff
path: root/packages/create-astro/src
diff options
context:
space:
mode:
authorGravatar Nate Moore <natemoo-re@users.noreply.github.com> 2023-08-14 14:23:14 -0500
committerGravatar GitHub <noreply@github.com> 2023-08-14 14:23:14 -0500
commit44cf30a25209b331e6e8a95a4b40a768ede3604a (patch)
tree66c4abd963c863da7793327e44b86f287278ec81 /packages/create-astro/src
parenta34a48826cbbcf749f05ba19ce0edaa701437e62 (diff)
downloadastro-44cf30a25209b331e6e8a95a4b40a768ede3604a.tar.gz
astro-44cf30a25209b331e6e8a95a4b40a768ede3604a.tar.zst
astro-44cf30a25209b331e6e8a95a4b40a768ede3604a.zip
chore: slim create-astro deps (#8077)
Diffstat (limited to '')
-rw-r--r--packages/create-astro/src/actions/dependencies.ts9
-rw-r--r--packages/create-astro/src/actions/git.ts8
-rw-r--r--packages/create-astro/src/messages.ts4
-rw-r--r--packages/create-astro/src/shell.ts44
4 files changed, 52 insertions, 13 deletions
diff --git a/packages/create-astro/src/actions/dependencies.ts b/packages/create-astro/src/actions/dependencies.ts
index 2949e784d..bf46d5d5f 100644
--- a/packages/create-astro/src/actions/dependencies.ts
+++ b/packages/create-astro/src/actions/dependencies.ts
@@ -1,5 +1,5 @@
import { color } from '@astrojs/cli-kit';
-import { execa } from 'execa';
+import { shell } from '../shell.js';
import fs from 'node:fs';
import path from 'node:path';
import { error, info, spinner, title } from '../messages.js';
@@ -49,12 +49,7 @@ export async function dependencies(
async function install({ pkgManager, cwd }: { pkgManager: string; cwd: string }) {
if (pkgManager === 'yarn') await ensureYarnLock({ cwd });
- const installExec = execa(pkgManager, ['install'], { cwd });
- return new Promise<void>((resolve, reject) => {
- setTimeout(() => reject(`Request timed out after 1m 30s`), 90_000);
- installExec.on('error', (e) => reject(e));
- installExec.on('close', () => resolve());
- });
+ return shell(pkgManager, ['install'], { cwd, timeout: 90_000, stdio: 'ignore' });
}
async function ensureYarnLock({ cwd }: { cwd: string }) {
diff --git a/packages/create-astro/src/actions/git.ts b/packages/create-astro/src/actions/git.ts
index 00c42dae5..9711387b4 100644
--- a/packages/create-astro/src/actions/git.ts
+++ b/packages/create-astro/src/actions/git.ts
@@ -3,7 +3,7 @@ import path from 'node:path';
import type { Context } from './context';
import { color } from '@astrojs/cli-kit';
-import { execa } from 'execa';
+import { shell } from '../shell.js';
import { error, info, spinner, title } from '../messages.js';
export async function git(ctx: Pick<Context, 'cwd' | 'git' | 'yes' | 'prompt' | 'dryRun'>) {
@@ -45,9 +45,9 @@ export async function git(ctx: Pick<Context, 'cwd' | 'git' | 'yes' | 'prompt' |
async function init({ cwd }: { cwd: string }) {
try {
- await execa('git', ['init'], { cwd, stdio: 'ignore' });
- await execa('git', ['add', '-A'], { cwd, stdio: 'ignore' });
- await execa(
+ await shell('git', ['init'], { cwd, stdio: 'ignore' });
+ await shell('git', ['add', '-A'], { cwd, stdio: 'ignore' });
+ await shell(
'git',
[
'commit',
diff --git a/packages/create-astro/src/messages.ts b/packages/create-astro/src/messages.ts
index ee67f3b19..da2c08f1d 100644
--- a/packages/create-astro/src/messages.ts
+++ b/packages/create-astro/src/messages.ts
@@ -1,7 +1,7 @@
/* eslint no-console: 'off' */
import { color, say as houston, label, spinner as load } from '@astrojs/cli-kit';
import { align, sleep } from '@astrojs/cli-kit/utils';
-import { execa } from 'execa';
+import { shell } from './shell.js';
import fetch from 'node-fetch-native';
import { exec } from 'node:child_process';
import stripAnsi from 'strip-ansi';
@@ -14,7 +14,7 @@ import detectPackageManager from 'which-pm-runs';
async function getRegistry(): Promise<string> {
const packageManager = detectPackageManager()?.name || 'npm';
try {
- const { stdout } = await execa(packageManager, ['config', 'get', 'registry']);
+ const { stdout } = await shell(packageManager, ['config', 'get', 'registry']);
return stdout?.trim()?.replace(/\/$/, '') || 'https://registry.npmjs.org';
} catch (e) {
return 'https://registry.npmjs.org';
diff --git a/packages/create-astro/src/shell.ts b/packages/create-astro/src/shell.ts
new file mode 100644
index 000000000..4941d788c
--- /dev/null
+++ b/packages/create-astro/src/shell.ts
@@ -0,0 +1,44 @@
+// 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 { Readable } from 'node:stream';
+
+import { text as textFromStream } from 'node:stream/consumers';
+import { spawn } from 'node:child_process';
+import { setTimeout as sleep } from 'node:timers/promises';
+
+export interface ExecaOptions {
+ cwd?: string | URL;
+ stdio?: StdioOptions;
+ timeout?: number;
+}
+export interface Output {
+ stdout: string;
+ stderr: string;
+ exitCode: number;
+}
+const text = (stream: NodeJS.ReadableStream | Readable | null) => stream ? textFromStream(stream).then(t => t.trimEnd()) : '';
+
+export async function shell(command: string, 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 }
+ })
+ }
+ await new Promise((resolve) => child.on('exit', resolve))
+ const { exitCode } = child;
+ if (exitCode !== 0) {
+ throw { stdout, stderr, exitCode };
+ }
+ return { stdout, stderr, exitCode }
+}