diff --git a/.changeset/friendly-clocks-act.md b/.changeset/friendly-clocks-act.md new file mode 100644 index 000000000000..43c6948804d0 --- /dev/null +++ b/.changeset/friendly-clocks-act.md @@ -0,0 +1,6 @@ +--- +'create-astro': patch +'astro': patch +--- + +Support detecting Bun when logging messages with package manager information. diff --git a/packages/astro/package.json b/packages/astro/package.json index 528f27d287f5..a2cddd217b49 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -156,7 +156,7 @@ "ora": "^7.0.1", "p-limit": "^4.0.0", "path-to-regexp": "^6.2.1", - "preferred-pm": "^3.0.3", + "preferred-pm": "^3.1.2", "prompts": "^2.4.2", "rehype": "^12.0.1", "resolve": "^1.22.4", @@ -172,7 +172,7 @@ "vfile": "^5.3.7", "vite": "^4.4.9", "vitefu": "^0.2.4", - "which-pm": "^2.0.0", + "which-pm": "^2.1.1", "yargs-parser": "^21.1.1", "zod": "3.21.1" }, diff --git a/packages/astro/src/cli/add/index.ts b/packages/astro/src/cli/add/index.ts index 07fc7b1a83a6..62cec7a7193e 100644 --- a/packages/astro/src/cli/add/index.ts +++ b/packages/astro/src/cli/add/index.ts @@ -620,6 +620,8 @@ async function getInstallIntegrationsCommand({ return { pm: 'yarn', command: 'add', flags: [], dependencies }; case 'pnpm': return { pm: 'pnpm', command: 'add', flags: [], dependencies }; + case 'bun': + return { pm: 'bun', command: 'add', flags: [], dependencies }; default: return null; } diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts index f6af1d346c9f..689f81e3e879 100644 --- a/packages/astro/src/cli/install-package.ts +++ b/packages/astro/src/cli/install-package.ts @@ -67,6 +67,8 @@ function getInstallCommand(packages: string[], packageManager: string) { return { pm: 'yarn', command: 'add', flags: [], dependencies: packages }; case 'pnpm': return { pm: 'pnpm', command: 'add', flags: [], dependencies: packages }; + case 'bun': + return { pm: 'bun', command: 'add', flags: [], dependencies: packages }; default: return null; } diff --git a/packages/astro/src/cli/telemetry/index.ts b/packages/astro/src/cli/telemetry/index.ts index b702a5baad18..a6ebd09c3b2f 100644 --- a/packages/astro/src/cli/telemetry/index.ts +++ b/packages/astro/src/cli/telemetry/index.ts @@ -2,14 +2,17 @@ import type yargs from 'yargs-parser'; import * as msg from '../../core/messages.js'; import { telemetry } from '../../events/index.js'; +import whichPm from 'which-pm'; interface TelemetryOptions { flags: yargs.Arguments; } + export async function notify() { + const packageManager = (await whichPm(process.cwd())).name ?? 'npm'; await telemetry.notify(() => { - console.log(msg.telemetryNotice() + '\n'); + console.log(msg.telemetryNotice(packageManager) + '\n'); return true; }); } diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index 974bf79bf402..758f5e5813c4 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -105,10 +105,10 @@ export function serverStart({ .join('\n'); } -export function telemetryNotice() { +export function telemetryNotice(packageManager = 'npm') { const headline = `${cyan('◆')} Astro collects completely anonymous usage data.`; const why = dim(' This optional program helps shape our roadmap.'); - const disable = dim(' Run `npm run astro telemetry disable` to opt-out.'); + const disable = dim(` Run \`${packageManager} run astro telemetry disable\` to opt-out.`); const details = ` Details: ${underline('https://astro.build/telemetry')}`; return [headline, why, disable, details].map((v) => ' ' + v).join('\n'); } diff --git a/packages/create-astro/src/actions/context.ts b/packages/create-astro/src/actions/context.ts index 5c2c0e9c05c8..c91a0caae48c 100644 --- a/packages/create-astro/src/actions/context.ts +++ b/packages/create-astro/src/actions/context.ts @@ -9,7 +9,7 @@ export interface Context { help: boolean; prompt: typeof prompt; cwd: string; - pkgManager: string; + packageManager: string; username: string; version: string; skipHouston: boolean; @@ -51,7 +51,7 @@ export async function getContext(argv: string[]): Promise { { argv, permissive: true } ); - const pkgManager = detectPackageManager()?.name ?? 'npm'; + const packageManager = detectPackageManager()?.name ?? 'npm'; const [username, version] = await Promise.all([getName(), getVersion()]); let cwd = flags['_'][0]; let { @@ -85,7 +85,7 @@ export async function getContext(argv: string[]): Promise { const context: Context = { help, prompt, - pkgManager, + packageManager, username, version, skipHouston, diff --git a/packages/create-astro/src/actions/dependencies.ts b/packages/create-astro/src/actions/dependencies.ts index 339e3379f6ac..f05e9e93ae02 100644 --- a/packages/create-astro/src/actions/dependencies.ts +++ b/packages/create-astro/src/actions/dependencies.ts @@ -6,7 +6,7 @@ import { shell } from '../shell.js'; import type { Context } from './context'; export async function dependencies( - ctx: Pick + ctx: Pick ) { let deps = ctx.install ?? ctx.yes; if (deps === undefined) { @@ -25,15 +25,15 @@ export async function dependencies( await info('--dry-run', `Skipping dependency installation`); } else if (deps) { await spinner({ - start: `Installing dependencies with ${ctx.pkgManager}...`, + start: `Installing dependencies with ${ctx.packageManager}...`, end: 'Dependencies installed', while: () => { - return install({ pkgManager: ctx.pkgManager, cwd: ctx.cwd }).catch((e) => { + return install({ packageManager: ctx.packageManager, cwd: ctx.cwd }).catch((e) => { error('error', e); error( 'error', `Dependencies failed to install, please run ${color.bold( - ctx.pkgManager + ' install' + ctx.packageManager + ' install' )} to install them manually after setup.` ); }); @@ -47,9 +47,9 @@ export async function dependencies( } } -async function install({ pkgManager, cwd }: { pkgManager: string; cwd: string }) { - if (pkgManager === 'yarn') await ensureYarnLock({ cwd }); - return shell(pkgManager, ['install'], { cwd, timeout: 90_000, stdio: 'ignore' }); +async function install({ packageManager, cwd }: { packageManager: string; cwd: string }) { + if (packageManager === 'yarn') await ensureYarnLock({ cwd }); + return shell(packageManager, ['install'], { cwd, timeout: 90_000, stdio: 'ignore' }); } async function ensureYarnLock({ cwd }: { cwd: string }) { diff --git a/packages/create-astro/src/actions/next-steps.ts b/packages/create-astro/src/actions/next-steps.ts index 01c1963d9826..c79a80525428 100644 --- a/packages/create-astro/src/actions/next-steps.ts +++ b/packages/create-astro/src/actions/next-steps.ts @@ -3,14 +3,17 @@ import type { Context } from './context'; import { nextSteps, say } from '../messages.js'; -export async function next(ctx: Pick) { +export async function next(ctx: Pick) { let projectDir = path.relative(process.cwd(), ctx.cwd); - const devCmd = - ctx.pkgManager === 'npm' - ? 'npm run dev' - : ctx.pkgManager === 'bun' - ? 'bun run dev' - : `${ctx.pkgManager} dev`; + + const commandMap: { [key: string]: string } = { + npm: 'npm run dev', + bun: 'bun run dev', + yarn: 'yarn dev', + pnpm: 'pnpm dev', + }; + + const devCmd = commandMap[ctx.packageManager as keyof typeof commandMap] || 'npm run dev'; await nextSteps({ projectDir, devCmd }); if (!ctx.skipHouston) { diff --git a/packages/create-astro/test/dependencies.test.js b/packages/create-astro/test/dependencies.test.js index 88e43597bb71..705cf8354741 100644 --- a/packages/create-astro/test/dependencies.test.js +++ b/packages/create-astro/test/dependencies.test.js @@ -10,7 +10,7 @@ describe('dependencies', () => { const context = { cwd: '', yes: true, - pkgManager: 'npm', + packageManager: 'npm', dryRun: true, prompt: () => ({ deps: true }), }; @@ -21,7 +21,7 @@ describe('dependencies', () => { it('prompt yes', async () => { const context = { cwd: '', - pkgManager: 'npm', + packageManager: 'npm', dryRun: true, prompt: () => ({ deps: true }), install: undefined, @@ -34,7 +34,7 @@ describe('dependencies', () => { it('prompt no', async () => { const context = { cwd: '', - pkgManager: 'npm', + packageManager: 'npm', dryRun: true, prompt: () => ({ deps: false }), install: undefined, @@ -48,7 +48,7 @@ describe('dependencies', () => { const context = { cwd: '', install: true, - pkgManager: 'npm', + packageManager: 'npm', dryRun: true, prompt: () => ({ deps: false }), }; @@ -61,7 +61,7 @@ describe('dependencies', () => { const context = { cwd: '', install: false, - pkgManager: 'npm', + packageManager: 'npm', dryRun: true, prompt: () => ({ deps: false }), }; diff --git a/packages/create-astro/test/next.test.js b/packages/create-astro/test/next.test.js index efc0e6728b26..07de90d50edb 100644 --- a/packages/create-astro/test/next.test.js +++ b/packages/create-astro/test/next.test.js @@ -7,14 +7,14 @@ describe('next steps', () => { const fixture = setup(); it('no arguments', async () => { - await next({ skipHouston: false, cwd: './it/fixtures/not-empty', pkgManager: 'npm' }); + await next({ skipHouston: false, cwd: './it/fixtures/not-empty', packageManager: 'npm' }); expect(fixture.hasMessage('Liftoff confirmed.')).to.be.true; expect(fixture.hasMessage('npm run dev')).to.be.true; expect(fixture.hasMessage('Good luck out there, astronaut!')).to.be.true; }); it('--skip-houston', async () => { - await next({ skipHouston: true, cwd: './it/fixtures/not-empty', pkgManager: 'npm' }); + await next({ skipHouston: true, cwd: './it/fixtures/not-empty', packageManager: 'npm' }); expect(fixture.hasMessage('Good luck out there, astronaut!')).to.be.false; }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9efde990009f..9f7f4fcd4d3a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -594,8 +594,8 @@ importers: specifier: ^6.2.1 version: 6.2.1 preferred-pm: - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.1.2 + version: 3.1.2 prompts: specifier: ^2.4.2 version: 2.4.2 @@ -642,8 +642,8 @@ importers: specifier: ^0.2.4 version: 0.2.4(vite@4.4.9) which-pm: - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.1.1 + version: 2.1.1 yargs-parser: specifier: ^21.1.1 version: 21.1.1 @@ -6795,7 +6795,7 @@ packages: meow: 6.1.1 outdent: 0.5.0 p-limit: 2.3.0 - preferred-pm: 3.0.3 + preferred-pm: 3.1.2 resolve-from: 5.0.0 semver: 7.5.4 spawndamnit: 2.0.0 @@ -15145,8 +15145,8 @@ packages: tar-fs: 2.1.1 tunnel-agent: 0.6.0 - /preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} engines: {node: '>=10'} dependencies: find-up: 5.0.0 @@ -17839,6 +17839,14 @@ packages: load-yaml-file: 0.2.0 path-exists: 4.0.0 + /which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + /which-typed-array@1.1.11: resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} engines: {node: '>= 0.4'}