From 1bb96d2d70f58b123396149b6f238bab94a6fe8c Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Mon, 17 Aug 2026 05:09:18 +0000 Subject: [PATCH] feat(devframe): expose utils/get-port, drop plugin deps on get-port-please Re-export get-port-please's getPort through devframe/utils/get-port so plugins resolve a free port without each declaring their own get-port-please dependency. get-port-please stays a devframe devDependency, already bundled into its node build. Updates all nine plugins (a11y, assets, code-server, data-inspector, git, inspect, messages, og, terminals) plus a11y's demo server to import from the new util and drops their now-unused get-port-please dependency entries. --- packages/devframe/package.json | 1 + packages/devframe/src/utils/get-port.ts | 6 +++++ packages/devframe/tsdown.config.ts | 1 + plugins/a11y/demo/server.mjs | 2 +- plugins/a11y/package.json | 1 - plugins/a11y/tests/_utils.ts | 2 +- plugins/assets/package.json | 1 - plugins/assets/test/_utils.ts | 2 +- plugins/code-server/package.json | 3 +-- plugins/code-server/src/node/supervisor.ts | 2 +- plugins/data-inspector/package.json | 1 - plugins/data-inspector/src/cli.ts | 2 +- plugins/data-inspector/src/inject/index.ts | 2 +- plugins/git/package.json | 1 - plugins/git/test/_utils.ts | 2 +- plugins/inspect/package.json | 1 - plugins/inspect/test/_utils.ts | 2 +- plugins/messages/package.json | 1 - plugins/messages/test/_utils.ts | 2 +- plugins/og/package.json | 1 - plugins/og/test/_utils.ts | 2 +- plugins/terminals/package.json | 1 - plugins/terminals/test/_utils.ts | 2 +- pnpm-lock.yaml | 27 ------------------- .../devframe/utils/get-port.snapshot.d.ts | 24 +++++++++++++++++ .../devframe/utils/get-port.snapshot.js | 6 +++++ 26 files changed, 50 insertions(+), 48 deletions(-) create mode 100644 packages/devframe/src/utils/get-port.ts create mode 100644 tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.d.ts create mode 100644 tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.js diff --git a/packages/devframe/package.json b/packages/devframe/package.json index 403011c6..deb33cbc 100644 --- a/packages/devframe/package.json +++ b/packages/devframe/package.json @@ -48,6 +48,7 @@ "./utils/colors": "./dist/utils/colors.mjs", "./utils/crypto-token": "./dist/utils/crypto-token.mjs", "./utils/events": "./dist/utils/events.mjs", + "./utils/get-port": "./dist/utils/get-port.mjs", "./utils/hash": "./dist/utils/hash.mjs", "./utils/launch-editor": "./dist/utils/launch-editor.mjs", "./utils/nanoid": "./dist/utils/nanoid.mjs", diff --git a/packages/devframe/src/utils/get-port.ts b/packages/devframe/src/utils/get-port.ts new file mode 100644 index 00000000..37a9628c --- /dev/null +++ b/packages/devframe/src/utils/get-port.ts @@ -0,0 +1,6 @@ +// Re-exported so plugins and other `devframe/*` consumers can resolve a +// free port without taking their own dependency on `get-port-please` — it +// travels as a `devframe` devDependency instead, bundled into this +// package's node build (see `tsdown.config.ts`'s `deps.onlyBundle`). +export { getPort } from 'get-port-please' +export type { GetPortInput, GetPortOptions } from 'get-port-please' diff --git a/packages/devframe/tsdown.config.ts b/packages/devframe/tsdown.config.ts index 68e88616..cc4a01e7 100644 --- a/packages/devframe/tsdown.config.ts +++ b/packages/devframe/tsdown.config.ts @@ -102,6 +102,7 @@ const serverEntries = { 'node/auth': 'src/node/auth/index.ts', 'node/hub-internals': 'src/node/hub-internals/index.ts', 'internal/index': 'src/internal/index.ts', + 'utils/get-port': 'src/utils/get-port.ts', 'utils/launch-editor': 'src/utils/launch-editor.ts', 'utils/nostics': 'src/utils/nostics.ts', 'utils/open': 'src/utils/open.ts', diff --git a/plugins/a11y/demo/server.mjs b/plugins/a11y/demo/server.mjs index 1e608de1..a16165ac 100644 --- a/plugins/a11y/demo/server.mjs +++ b/plugins/a11y/demo/server.mjs @@ -23,8 +23,8 @@ import { createServer } from 'node:http' import process from 'node:process' import { fileURLToPath } from 'node:url' import { initDevframe } from 'devframe/initiate' +import { getPort } from 'devframe/utils/get-port' import { mountStaticHandler } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import { H3, toNodeHandler } from 'h3' import { resolve } from 'pathe' import createA11yDevframe from '../src/index.ts' diff --git a/plugins/a11y/package.json b/plugins/a11y/package.json index 069dd161..8f2865f3 100644 --- a/plugins/a11y/package.json +++ b/plugins/a11y/package.json @@ -73,7 +73,6 @@ "axe-core": "catalog:frontend", "colorjs.io": "catalog:frontend", "devframe": "workspace:*", - "get-port-please": "catalog:deps", "h3": "catalog:deps", "solid-js": "catalog:frontend", "storybook": "catalog:storybook", diff --git a/plugins/a11y/tests/_utils.ts b/plugins/a11y/tests/_utils.ts index 594d251f..756626be 100644 --- a/plugins/a11y/tests/_utils.ts +++ b/plugins/a11y/tests/_utils.ts @@ -6,9 +6,9 @@ import process from 'node:process' import { DEVFRAME_CONNECTION_META_FILENAME } from 'devframe/constants' import { createH3DevframeHost } from 'devframe/internal' import { createHostContext } from 'devframe/node' +import { getPort } from 'devframe/utils/get-port' import { resolveStaticAssetsSource } from 'devframe/utils/remote-assets' import { mountStaticHandler } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import { H3 } from 'h3' import { resolve } from 'pathe' import { serveTestContext } from '../../../tests/helpers/serve-test-context' diff --git a/plugins/assets/package.json b/plugins/assets/package.json index fc79f008..65633d34 100644 --- a/plugins/assets/package.json +++ b/plugins/assets/package.json @@ -81,7 +81,6 @@ "colorjs.io": "catalog:frontend", "devframe": "workspace:*", "floating-vue": "catalog:frontend", - "get-port-please": "catalog:deps", "h3": "catalog:deps", "reka-ui": "catalog:frontend", "storybook": "catalog:storybook", diff --git a/plugins/assets/test/_utils.ts b/plugins/assets/test/_utils.ts index a1be1c14..86367879 100644 --- a/plugins/assets/test/_utils.ts +++ b/plugins/assets/test/_utils.ts @@ -10,8 +10,8 @@ import { createH3DevframeHost } from 'devframe/internal' import { createHostContext } from 'devframe/node' import { createRpcClient } from 'devframe/rpc/client' import { createWsRpcChannel } from 'devframe/rpc/transports/ws-client' +import { getPort } from 'devframe/utils/get-port' import { mountStaticHandler } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import { H3 } from 'h3' import { serveTestContext } from '../../../tests/helpers/serve-test-context' import { createAssetsDevframe } from '../src/index' diff --git a/plugins/code-server/package.json b/plugins/code-server/package.json index 41a6aa79..62e2a69f 100644 --- a/plugins/code-server/package.json +++ b/plugins/code-server/package.json @@ -64,8 +64,7 @@ }, "dependencies": { "@devframes/vite": "workspace:*", - "cac": "catalog:deps", - "get-port-please": "catalog:deps" + "cac": "catalog:deps" }, "devDependencies": { "@antfu/design": "catalog:frontend", diff --git a/plugins/code-server/src/node/supervisor.ts b/plugins/code-server/src/node/supervisor.ts index cca27696..ab481480 100644 --- a/plugins/code-server/src/node/supervisor.ts +++ b/plugins/code-server/src/node/supervisor.ts @@ -21,7 +21,7 @@ import { randomBytes } from 'node:crypto' import { request as httpRequest } from 'node:http' import { hostname } from 'node:os' import process from 'node:process' -import { getPort } from 'get-port-please' +import { getPort } from 'devframe/utils/get-port' import { DEFAULT_CODE_SERVER_PORT, DEFAULT_START_TIMEOUT, diff --git a/plugins/data-inspector/package.json b/plugins/data-inspector/package.json index ad512e89..76d1116d 100644 --- a/plugins/data-inspector/package.json +++ b/plugins/data-inspector/package.json @@ -63,7 +63,6 @@ }, "dependencies": { "cac": "catalog:deps", - "get-port-please": "catalog:deps", "jora": "catalog:deps" }, "devDependencies": { diff --git a/plugins/data-inspector/src/cli.ts b/plugins/data-inspector/src/cli.ts index 85ae668c..ac016b1a 100644 --- a/plugins/data-inspector/src/cli.ts +++ b/plugins/data-inspector/src/cli.ts @@ -18,8 +18,8 @@ import { fileURLToPath } from 'node:url' import { cac } from 'cac' import { createDevServer } from 'devframe/adapters/dev' import { DEVFRAME_AUTH_TOKEN_QUERY_PARAM, DEVFRAME_CONNECTION_META_FILENAME } from 'devframe/constants' +import { getPort } from 'devframe/utils/get-port' import { serveStaticNodeMiddleware } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import pkg from '../package.json' with { type: 'json' } import { createDataInspectorDevframe } from './index' import { AGENT_DISCOVERY_FILE } from './inject/index' diff --git a/plugins/data-inspector/src/inject/index.ts b/plugins/data-inspector/src/inject/index.ts index 40d5132f..f3d3c68c 100644 --- a/plugins/data-inspector/src/inject/index.ts +++ b/plugins/data-inspector/src/inject/index.ts @@ -48,7 +48,7 @@ import { createHostContext } from 'devframe/node' import { createInteractiveAuth } from 'devframe/recipes/interactive-auth' import { attachWsRpcTransport } from 'devframe/rpc/transports/ws-server' import { randomToken } from 'devframe/utils/crypto-token' -import { getPort } from 'get-port-please' +import { getPort } from 'devframe/utils/get-port' /** Discovery file path, relative to the target process's cwd. */ export const AGENT_DISCOVERY_FILE = 'node_modules/.data-inspector/agent.json' diff --git a/plugins/git/package.json b/plugins/git/package.json index 32097713..27646d96 100644 --- a/plugins/git/package.json +++ b/plugins/git/package.json @@ -76,7 +76,6 @@ "@vitejs/plugin-react-oxc": "catalog:storybook", "clsx": "catalog:frontend", "colorjs.io": "catalog:frontend", - "get-port-please": "catalog:deps", "h3": "catalog:deps", "next": "catalog:frontend", "react": "catalog:frontend", diff --git a/plugins/git/test/_utils.ts b/plugins/git/test/_utils.ts index 034a3ad5..867c2507 100644 --- a/plugins/git/test/_utils.ts +++ b/plugins/git/test/_utils.ts @@ -5,9 +5,9 @@ import { tmpdir } from 'node:os' import { DEVFRAME_CONNECTION_META_FILENAME } from 'devframe/constants' import { createH3DevframeHost } from 'devframe/internal' import { createHostContext } from 'devframe/node' +import { getPort } from 'devframe/utils/get-port' import { resolveStaticAssetsSource } from 'devframe/utils/remote-assets' import { mountStaticHandler } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import { H3 } from 'h3' import { resolve } from 'pathe' import { serveTestContext } from '../../../tests/helpers/serve-test-context' diff --git a/plugins/inspect/package.json b/plugins/inspect/package.json index 297d5227..14777b2a 100644 --- a/plugins/inspect/package.json +++ b/plugins/inspect/package.json @@ -75,7 +75,6 @@ "colorjs.io": "catalog:frontend", "devframe": "workspace:*", "floating-vue": "catalog:frontend", - "get-port-please": "catalog:deps", "h3": "catalog:deps", "reka-ui": "catalog:frontend", "storybook": "catalog:storybook", diff --git a/plugins/inspect/test/_utils.ts b/plugins/inspect/test/_utils.ts index 9d36bb87..a6153e7d 100644 --- a/plugins/inspect/test/_utils.ts +++ b/plugins/inspect/test/_utils.ts @@ -11,9 +11,9 @@ import { DEVFRAME_CONNECTION_META_FILENAME } from 'devframe/constants' import { createH3DevframeHost } from 'devframe/internal' import { createHostContext } from 'devframe/node' import { resolveBasePath } from 'devframe/node/hub-internals' +import { getPort } from 'devframe/utils/get-port' import { resolveStaticAssetsSource } from 'devframe/utils/remote-assets' import { mountStaticHandler } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import { H3 } from 'h3' import { serveTestContext } from '../../../tests/helpers/serve-test-context' diff --git a/plugins/messages/package.json b/plugins/messages/package.json index 3ae2ddaf..76324c6c 100644 --- a/plugins/messages/package.json +++ b/plugins/messages/package.json @@ -79,7 +79,6 @@ "colorjs.io": "catalog:frontend", "devframe": "workspace:*", "floating-vue": "catalog:frontend", - "get-port-please": "catalog:deps", "h3": "catalog:deps", "storybook": "catalog:storybook", "tsdown": "catalog:build", diff --git a/plugins/messages/test/_utils.ts b/plugins/messages/test/_utils.ts index 0da1381f..4347de58 100644 --- a/plugins/messages/test/_utils.ts +++ b/plugins/messages/test/_utils.ts @@ -12,9 +12,9 @@ import { DEVFRAME_CONNECTION_META_FILENAME } from 'devframe/constants' import { createH3DevframeHost } from 'devframe/internal' import { createHostContext } from 'devframe/node' import { resolveBasePath } from 'devframe/node/hub-internals' +import { getPort } from 'devframe/utils/get-port' import { resolveStaticAssetsSource } from 'devframe/utils/remote-assets' import { mountStaticHandler } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import { H3 } from 'h3' import { serveTestContext } from '../../../tests/helpers/serve-test-context' diff --git a/plugins/og/package.json b/plugins/og/package.json index d9432aec..5964bbc1 100644 --- a/plugins/og/package.json +++ b/plugins/og/package.json @@ -74,7 +74,6 @@ "@types/node": "catalog:types", "@vitejs/plugin-vue": "catalog:build", "devframe": "workspace:*", - "get-port-please": "catalog:deps", "h3": "catalog:deps", "storybook": "catalog:storybook", "tsdown": "catalog:build", diff --git a/plugins/og/test/_utils.ts b/plugins/og/test/_utils.ts index 90798297..8720c50e 100644 --- a/plugins/og/test/_utils.ts +++ b/plugins/og/test/_utils.ts @@ -8,9 +8,9 @@ import { DEVFRAME_CONNECTION_META_FILENAME } from 'devframe/constants' import { createH3DevframeHost } from 'devframe/internal' import { createHostContext } from 'devframe/node' import { resolveBasePath } from 'devframe/node/hub-internals' +import { getPort } from 'devframe/utils/get-port' import { resolveStaticAssetsSource } from 'devframe/utils/remote-assets' import { mountStaticHandler } from 'devframe/utils/serve-static' -import { getPort } from 'get-port-please' import { H3 } from 'h3' import { serveTestContext } from '../../../tests/helpers/serve-test-context' diff --git a/plugins/terminals/package.json b/plugins/terminals/package.json index 2f348fb5..f659561b 100644 --- a/plugins/terminals/package.json +++ b/plugins/terminals/package.json @@ -78,7 +78,6 @@ "@xterm/xterm": "catalog:frontend", "colorjs.io": "catalog:frontend", "devframe": "workspace:*", - "get-port-please": "catalog:deps", "h3": "catalog:deps", "storybook": "catalog:storybook", "svelte": "catalog:frontend", diff --git a/plugins/terminals/test/_utils.ts b/plugins/terminals/test/_utils.ts index 710f104c..6a69ae75 100644 --- a/plugins/terminals/test/_utils.ts +++ b/plugins/terminals/test/_utils.ts @@ -8,7 +8,7 @@ import { createHostContext } from 'devframe/node' import { createRpcClient } from 'devframe/rpc/client' import { createWsRpcChannel } from 'devframe/rpc/transports/ws-client' import { createEventEmitter } from 'devframe/utils/events' -import { getPort } from 'get-port-please' +import { getPort } from 'devframe/utils/get-port' import { H3 } from 'h3' import { serveTestContext } from '../../../tests/helpers/serve-test-context' import { createTerminalsDevframe } from '../src/index' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad32ad35..ecc5af87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1509,9 +1509,6 @@ importers: devframe: specifier: workspace:* version: link:../../packages/devframe - get-port-please: - specifier: catalog:deps - version: 3.2.0 h3: specifier: catalog:deps version: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.4)) @@ -1605,9 +1602,6 @@ importers: floating-vue: specifier: catalog:frontend version: 5.2.2(vue@3.5.41(typescript@6.0.3)) - get-port-please: - specifier: catalog:deps - version: 3.2.0 h3: specifier: catalog:deps version: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.4)) @@ -1643,9 +1637,6 @@ importers: cac: specifier: catalog:deps version: 7.0.0 - get-port-please: - specifier: catalog:deps - version: 3.2.0 devDependencies: '@antfu/design': specifier: catalog:frontend @@ -1700,9 +1691,6 @@ importers: cac: specifier: catalog:deps version: 7.0.0 - get-port-please: - specifier: catalog:deps - version: 3.2.0 jora: specifier: catalog:deps version: 1.0.0-beta.16 @@ -1833,9 +1821,6 @@ importers: colorjs.io: specifier: catalog:frontend version: 0.7.1 - get-port-please: - specifier: catalog:deps - version: 3.2.0 h3: specifier: catalog:deps version: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.4)) @@ -1914,9 +1899,6 @@ importers: floating-vue: specifier: catalog:frontend version: 5.2.2(vue@3.5.41(typescript@6.0.3)) - get-port-please: - specifier: catalog:deps - version: 3.2.0 h3: specifier: catalog:deps version: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.4)) @@ -1992,9 +1974,6 @@ importers: floating-vue: specifier: catalog:frontend version: 5.2.2(vue@3.5.41(typescript@6.0.3)) - get-port-please: - specifier: catalog:deps - version: 3.2.0 h3: specifier: catalog:deps version: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.4)) @@ -2061,9 +2040,6 @@ importers: devframe: specifier: workspace:* version: link:../../packages/devframe - get-port-please: - specifier: catalog:deps - version: 3.2.0 h3: specifier: catalog:deps version: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.4)) @@ -2133,9 +2109,6 @@ importers: devframe: specifier: workspace:* version: link:../../packages/devframe - get-port-please: - specifier: catalog:deps - version: 3.2.0 h3: specifier: catalog:deps version: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.4)) diff --git a/tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.d.ts b/tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.d.ts new file mode 100644 index 00000000..2bbc763a --- /dev/null +++ b/tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.d.ts @@ -0,0 +1,24 @@ +/** + * Generated by tsnapi — public API snapshot of `devframe/utils/get-port` + */ +// #region Interfaces +export interface GetPortOptions { + name: string; + random: boolean; + port: number; + ports: number[]; + portRange: [fromInclusive: number, toInclusive: number]; + alternativePortRange: [fromInclusive: number, toInclusive: number]; + host: string; + verbose?: boolean; + public?: boolean; +} +// #endregion + +// #region Types +export type GetPortInput = Partial | number | string; +// #endregion + +// #region Functions +export declare function getPort(_?: GetPortInput): Promise; +// #endregion \ No newline at end of file diff --git a/tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.js b/tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.js new file mode 100644 index 00000000..a8874a83 --- /dev/null +++ b/tests/__snapshots__/tsnapi/devframe/utils/get-port.snapshot.js @@ -0,0 +1,6 @@ +/** + * Generated by tsnapi — public API snapshot of `devframe/utils/get-port` + */ +// #region Other +export { getPort } +// #endregion \ No newline at end of file