diff --git a/.changeset/swingset-auto-port.md b/.changeset/swingset-auto-port.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/swingset-auto-port.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/swingset/CLAUDE.md b/packages/swingset/CLAUDE.md index da4b8e4ba62..fff87489c40 100644 --- a/packages/swingset/CLAUDE.md +++ b/packages/swingset/CLAUDE.md @@ -9,7 +9,7 @@ This file provides guidance to Coding Agents when working with code in this repo Run from the monorepo root or scope with `--filter @clerk/swingset`: ``` -pnpm run dev:swingset # next dev on port 6006 +pnpm run dev:swingset # next dev on $PORT (default 6006), or the next free port pnpm build --filter @clerk/swingset # next build pnpm format --filter @clerk/swingset # format-package.mjs (--check for CI) ``` diff --git a/packages/swingset/README.md b/packages/swingset/README.md index 9fe2095cfec..8f7cb7a0000 100644 --- a/packages/swingset/README.md +++ b/packages/swingset/README.md @@ -1,6 +1,6 @@ # Swingset -Component explorer for the Mosaic design system. Runs at http://localhost:6006. +Component explorer for the Mosaic design system. Runs at http://localhost:6006, or the next free port if 6006 is taken. ## Dev diff --git a/packages/swingset/package.json b/packages/swingset/package.json index dec1eefe6b9..72d455974e8 100644 --- a/packages/swingset/package.json +++ b/packages/swingset/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "build": "next build", - "dev": "next dev --port 6006", + "dev": "node scripts/dev.mjs", "format": "node ../../scripts/format-package.mjs", "format:check": "node ../../scripts/format-package.mjs --check" }, @@ -42,6 +42,7 @@ "@tailwindcss/postcss": "^4.0.0", "@types/react": "catalog:react", "@types/react-dom": "catalog:react", + "get-port": "^5.1.1", "rehype-slug": "^6.0.0", "remark-gfm": "^4.0.0", "shadcn": "^4.10.0", diff --git a/packages/swingset/scripts/dev.mjs b/packages/swingset/scripts/dev.mjs new file mode 100644 index 00000000000..00ef69ba0f8 --- /dev/null +++ b/packages/swingset/scripts/dev.mjs @@ -0,0 +1,21 @@ +import { spawn } from 'node:child_process'; + +import getPort from 'get-port'; + +const start = Number(process.env.PORT) || 6006; +const port = await getPort({ port: getPort.makeRange(start, start + 100) }); + +const child = spawn('next', ['dev', '--port', String(port), ...process.argv.slice(2)], { stdio: 'inherit' }); + +for (const signal of ['SIGINT', 'SIGTERM']) { + process.on(signal, () => child.kill(signal)); +} + +child.on('exit', (code, signal) => { + if (signal) { + process.removeAllListeners(signal); + process.kill(process.pid, signal); + } else { + process.exit(code ?? 0); + } +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 707a0c331b4..bd809f40daa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1205,6 +1205,9 @@ importers: '@types/react-dom': specifier: catalog:react version: 18.3.7(@types/react@18.3.28) + get-port: + specifier: ^5.1.1 + version: 5.1.1 rehype-slug: specifier: ^6.0.0 version: 6.0.0