diff --git a/.changeset/dns-scripts-package-manager.md b/.changeset/dns-scripts-package-manager.md new file mode 100644 index 00000000..0fcc6503 --- /dev/null +++ b/.changeset/dns-scripts-package-manager.md @@ -0,0 +1,5 @@ +--- +"@bunny.net/cli": patch +--- + +fix(dns): `dns scripts init` detects and uses any installed package manager (bun, pnpm, yarn, npm) instead of assuming bun, and warns clearly when none is on PATH diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ba04cdec..4d07be1c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,6 +39,7 @@ jobs: cli-version: ${{ steps.check-cli.outputs.version }} database-shell-version: ${{ steps.check-database-shell.outputs.version }} openapi-client-version: ${{ steps.check-openapi-client.outputs.version }} + scriptable-dns-types-version: ${{ steps.check-scriptable-dns-types.outputs.version }} steps: - uses: actions/checkout@v5 - name: Check openapi-client version @@ -52,6 +53,17 @@ jobs: else echo "No version change: $VERSION" fi + - name: Check scriptable-dns-types version + id: check-scriptable-dns-types + run: | + VERSION=$(node -p "require('./packages/scriptable-dns-types/package.json').version") + PUBLISHED=$(npm view @bunny.net/scriptable-dns-types version 2>/dev/null || echo "0.0.0") + if [ "$VERSION" != "$PUBLISHED" ]; then + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "New version detected: $VERSION (published: $PUBLISHED)" + else + echo "No version change: $VERSION" + fi - name: Check CLI version id: check-cli run: | @@ -415,3 +427,23 @@ jobs: npm publish --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + publish-scriptable-dns-types: + name: Publish scriptable-dns-types + runs-on: ubuntu-latest + needs: version + if: needs.version.outputs.scriptable-dns-types-version + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-node@v5 + with: + node-version: "22" + registry-url: "https://registry.npmjs.org" + + - name: Publish @bunny.net/scriptable-dns-types + run: | + cd packages/scriptable-dns-types + npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/packages/cli/src/commands/dns/scripts/init.ts b/packages/cli/src/commands/dns/scripts/init.ts index 505b1631..e41f5cec 100644 --- a/packages/cli/src/commands/dns/scripts/init.ts +++ b/packages/cli/src/commands/dns/scripts/init.ts @@ -8,6 +8,7 @@ import { defineCommand } from "../../../core/define-command.ts"; import { UserError } from "../../../core/errors.ts"; import { logger } from "../../../core/logger.ts"; import { saveManifestAt } from "../../../core/manifest.ts"; +import { pickPackageManager } from "../../../core/package-manager.ts"; import { confirm, spinner } from "../../../core/ui.ts"; import { createDnsScript } from "./api.ts"; import { @@ -157,29 +158,36 @@ export const dnsScriptsInitCommand = defineCommand({ if (args[ARG_SKIP_INSTALL] !== true) { const install = interactive - ? await confirm("Install editor type dependencies with bun?") + ? await confirm("Install editor type dependencies?") : false; if (install) { - const spin = spinner("Installing dependencies (bun)..."); - spin.start(); - let code = 1; - try { - const proc = Bun.spawn(["bun", "install"], { - cwd: dirPath, - stdout: "ignore", - stderr: "ignore", - }); - code = await proc.exited; - } catch { - // bun missing or vanished; warn below. - } - spin.stop(); - if (code === 0) { - logger.success("Dependencies installed."); - } else { + const pm = await pickPackageManager(dirPath); + if (!pm) { logger.warn( - "Could not install dependencies. Run `bun install` later.", + "No package manager found on PATH. Install bun, npm, pnpm, or yarn, then install dependencies in the new project.", ); + } else { + const spin = spinner(`Installing dependencies (${pm})...`); + spin.start(); + let code = 1; + try { + const proc = Bun.spawn([pm, "install"], { + cwd: dirPath, + stdout: "ignore", + stderr: "ignore", + }); + code = await proc.exited; + } catch { + // Binary vanished between detection and spawn; warn below. + } + spin.stop(); + if (code === 0) { + logger.success("Dependencies installed."); + } else { + logger.warn( + `Could not install dependencies. Run \`${pm} install\` later.`, + ); + } } } } diff --git a/packages/cli/src/commands/scripts/init.ts b/packages/cli/src/commands/scripts/init.ts index 072fa556..671fd107 100644 --- a/packages/cli/src/commands/scripts/init.ts +++ b/packages/cli/src/commands/scripts/init.ts @@ -6,6 +6,10 @@ import { UserError } from "../../core/errors.ts"; import { normalizeHostname } from "../../core/hostnames/index.ts"; import { logger } from "../../core/logger.ts"; import { saveManifestAt } from "../../core/manifest.ts"; +import { + detectFromLockfile, + pickPackageManager, +} from "../../core/package-manager.ts"; import { confirm, spinner } from "../../core/ui.ts"; import { promptOpenInBrowser } from "./api.ts"; import { @@ -18,7 +22,6 @@ import { type Template, } from "./constants.ts"; import { createScript, setupCustomDomain } from "./create.ts"; -import { detectFromLockfile, pickPackageManager } from "./package-manager.ts"; const COMMAND = "init"; const DESCRIPTION = "Create a new Edge Script project."; @@ -308,7 +311,7 @@ export const scriptsInitCommand = defineCommand({ const pm = await pickPackageManager(dirPath); if (!pm) { logger.warn( - "No package manager found on PATH. Install bun, npm, pnpm, or yarn, then run ` install` in the new project.", + "No package manager found on PATH. Install bun, npm, pnpm, or yarn, then install dependencies in the new project.", ); } else { const lockfilePm = detectFromLockfile(dirPath); diff --git a/packages/cli/src/commands/scripts/package-manager.test.ts b/packages/cli/src/core/package-manager.test.ts similarity index 96% rename from packages/cli/src/commands/scripts/package-manager.test.ts rename to packages/cli/src/core/package-manager.test.ts index ea6f58e9..990f5b51 100644 --- a/packages/cli/src/commands/scripts/package-manager.test.ts +++ b/packages/cli/src/core/package-manager.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test"; import { writeFileSync } from "node:fs"; import { join } from "node:path"; -import { useTempDir } from "../../test-utils/temp-dir.ts"; +import { useTempDir } from "../test-utils/temp-dir.ts"; import { detectFromLockfile, detectFromUserAgent } from "./package-manager.ts"; describe("detectFromLockfile", () => { diff --git a/packages/cli/src/commands/scripts/package-manager.ts b/packages/cli/src/core/package-manager.ts similarity index 100% rename from packages/cli/src/commands/scripts/package-manager.ts rename to packages/cli/src/core/package-manager.ts