diff --git a/package.json b/package.json index 58d4ad1b4c..624c1ee1c5 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "jiti": "^2.6.1", "ofetch": "^2.0.0-alpha.3", "ohash": "^2.0.11", + "open": "^11.0.0", "oxc-minify": "^0.102.0", "oxc-transform": "^0.102.0", "srvx": "^0.9.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f99a1a8e0e..fc60405b3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,9 @@ importers: ohash: specifier: ^2.0.11 version: 2.0.11 + open: + specifier: ^11.0.0 + version: 11.0.0 oxc-minify: specifier: ^0.102.0 version: 0.102.0 @@ -4838,6 +4841,10 @@ packages: engines: {node: '>=18'} hasBin: true + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -5602,6 +5609,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -5775,6 +5786,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + preact-render-to-string@6.6.4: resolution: {integrity: sha512-Bn6eQZ5SQ5loVEcC/mZmKT7HzO5Z/+vYzxfE/W2N468oSoNMJVdFGApF0GyXq0lDthuyXKTmtZ8k20NpYjr6Rw==} peerDependencies: @@ -7030,6 +7045,10 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + wsl-utils@0.3.0: + resolution: {integrity: sha512-3sFIGLiaDP7rTO4xh3g+b3AzhYDIUGGywE/WsmqzJWDxus5aJXVnPTNC/6L+r2WzrwXqVOdD262OaO+cEyPMSQ==} + engines: {node: '>=20'} + xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -11569,6 +11588,8 @@ snapshots: is-in-ci@1.0.0: {} + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -12470,6 +12491,15 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + open@11.0.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -12706,6 +12736,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.1.0: {} + preact-render-to-string@6.6.4(preact@10.28.0): dependencies: preact: 10.28.0 @@ -14015,6 +14047,11 @@ snapshots: dependencies: is-wsl: 3.1.0 + wsl-utils@0.3.0: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 + xdg-basedir@5.1.0: {} xml2js@0.6.2: diff --git a/src/cli/commands/dev.ts b/src/cli/commands/dev.ts index f7dc7503d9..56a6529f15 100644 --- a/src/cli/commands/dev.ts +++ b/src/cli/commands/dev.ts @@ -5,6 +5,7 @@ import { build, createNitro, prepare } from "nitro/builder"; import { resolve } from "pathe"; import { commonArgs } from "../common.ts"; import { NitroDevServer } from "../../dev/server.ts"; +import open from "open"; const hmrKeyRe = /^runtimeConfig\.|routeRules\./; @@ -15,6 +16,10 @@ export default defineCommand({ }, args: { ...commonArgs, + open: { + type: "boolean", + description: "open dev server in default browser", + }, port: { type: "string", description: "specify port" }, host: { type: "string", description: "specify hostname " }, }, @@ -60,10 +65,15 @@ export default defineCommand({ nitro.hooks.hookOnce("restart", reload); const server = new NitroDevServer(nitro); - await server.listen({ - port: args.port, - hostname: args.host, - }); + const url = ( + await server.listen({ + port: args.port, + hostname: args.host, + }) + ).url; + + if (args.open && url) open(url); + await prepare(nitro); await build(nitro); };