diff --git a/code/core/package.json b/code/core/package.json index 92f9a5da4761..86cccc7c7bc3 100644 --- a/code/core/package.json +++ b/code/core/package.json @@ -234,7 +234,6 @@ "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/spy": "3.2.4", - "better-opn": "^3.0.2", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", "recast": "^0.23.5", "semver": "^7.6.2", @@ -324,7 +323,7 @@ "memoizerific": "^1.11.3", "nanoid": "^4.0.2", "npmlog": "^7.0.0", - "open": "^8.4.0", + "open": "^10.2.0", "p-limit": "^6.2.0", "package-manager-detector": "^1.1.0", "picocolors": "^1.1.0", diff --git a/code/core/src/core-server/dev-server.ts b/code/core/src/core-server/dev-server.ts index f79251d221a3..bff1906cd5f8 100644 --- a/code/core/src/core-server/dev-server.ts +++ b/code/core/src/core-server/dev-server.ts @@ -121,7 +121,9 @@ export async function storybookDevServer(options: Options) { await Promise.all([initializedStoryIndexGenerator, listening]).then(async ([indexGenerator]) => { if (indexGenerator && !options.ci && !options.smokeTest && options.open) { const url = host ? networkAddress : address; - openInBrowser(options.previewOnly ? `${url}iframe.html?navigator=true` : url); + openInBrowser(options.previewOnly ? `${url}iframe.html?navigator=true` : url).catch(() => { + // the browser window could not be opened, this is non-critical, we just ignore the error + }); } }); if (indexError) { diff --git a/code/core/src/core-server/typings.d.ts b/code/core/src/core-server/typings.d.ts index 3f3cb6881312..e20ddb71c073 100644 --- a/code/core/src/core-server/typings.d.ts +++ b/code/core/src/core-server/typings.d.ts @@ -1,7 +1,5 @@ declare module 'lazy-universal-dotenv'; declare module 'pnp-webpack-plugin'; -declare module 'better-opn'; -declare module 'open'; declare module '@aw-web-design/x-default-browser'; declare module '@discoveryjs/json-ext'; declare module 'watchpack'; diff --git a/code/core/src/core-server/utils/open-in-browser.ts b/code/core/src/core-server/utils/open-in-browser.ts index 2a8789171f49..a0f95a70c590 100644 --- a/code/core/src/core-server/utils/open-in-browser.ts +++ b/code/core/src/core-server/utils/open-in-browser.ts @@ -1,42 +1,16 @@ import { logger } from 'storybook/internal/node-logger'; -import getDefaultBrowser from '@aw-web-design/x-default-browser'; -import betterOpn from 'better-opn'; -// betterOpn alias used because also loading open import open from 'open'; import { dedent } from 'ts-dedent'; -export function openInBrowser(address: string) { - const browserEnvVar = process.env.BROWSER; - const userBrowserIsChrome = - browserEnvVar === 'chrome' || - browserEnvVar === 'chromium' || - browserEnvVar === 'brave' || - browserEnvVar === 'com.brave.browser'; - - const openOptions = browserEnvVar ? { app: { name: browserEnvVar } } : {}; - - getDefaultBrowser(async (err: any, res: any) => { - try { - if ( - res && - (res.isChrome || - res.isChromium || - res.identity === 'com.brave.browser' || - userBrowserIsChrome) - ) { - // We use betterOpn for Chrome because it is better at handling which chrome tab - // or window the preview loads in. - await betterOpn(address); - } else { - await open(address, openOptions); - } - } catch (error) { - logger.error(dedent` +export async function openInBrowser(address: string) { + try { + await open(address); + } catch (error) { + logger.error(dedent` Could not open ${address} inside a browser. If you're running this command inside a docker container or on a CI, you need to pass the '--ci' flag to prevent opening a browser by default. `); - } - }); + } } diff --git a/code/core/src/typings.d.ts b/code/core/src/typings.d.ts index 9184576d9808..cba197e782fe 100644 --- a/code/core/src/typings.d.ts +++ b/code/core/src/typings.d.ts @@ -26,9 +26,7 @@ declare var __STORYBOOK_VITEST_MOCKER__: any; declare module '@aw-web-design/x-default-browser'; declare module 'ansi-to-html'; -declare module 'better-opn'; declare module 'lazy-universal-dotenv'; -declare module 'open'; declare module 'pnp-webpack-plugin'; declare module 'react-inspector'; diff --git a/code/yarn.lock b/code/yarn.lock index 4c21e8ac58f7..b7e37492ef6c 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -199,7 +199,7 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/core@npm:19.2.16": +"@angular-devkit/core@npm:19.2.16, @angular-devkit/core@npm:^19.1.1": version: 19.2.16 resolution: "@angular-devkit/core@npm:19.2.16" dependencies: @@ -218,25 +218,6 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/core@npm:^19.1.1": - version: 19.2.9 - resolution: "@angular-devkit/core@npm:19.2.9" - dependencies: - ajv: "npm:8.17.1" - ajv-formats: "npm:3.0.1" - jsonc-parser: "npm:3.3.1" - picomatch: "npm:4.0.2" - rxjs: "npm:7.8.1" - source-map: "npm:0.7.4" - peerDependencies: - chokidar: ^4.0.0 - peerDependenciesMeta: - chokidar: - optional: true - checksum: 10c0/c1a7fde1d7346ffdf32ad0b8030ad00d2ce5a41abd51f468454fecb23e1590d1fd32272c553d7677501228767181ddc36833a60888464137cfefcc918342c780 - languageName: node - linkType: hard - "@angular/animations@npm:^19.1.1": version: 19.2.15 resolution: "@angular/animations@npm:19.2.15" @@ -1099,18 +1080,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.9, @babel/plugin-transform-block-scoping@npm:^7.8.3": - version: 7.27.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/15a604fac04151a795ff3213c73ece06bda7cd5f7c8cb7a3b29563ab243f0b3f7cba9e6facfc9d70e3e63b21af32f9d26bd10ccc58e1c425c7801186014b5ce4 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoping@npm:^7.28.0": +"@babel/plugin-transform-block-scoping@npm:^7.25.9, @babel/plugin-transform-block-scoping@npm:^7.28.0, @babel/plugin-transform-block-scoping@npm:^7.8.3": version: 7.28.4 resolution: "@babel/plugin-transform-block-scoping@npm:7.28.4" dependencies: @@ -10010,7 +9980,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.12.1": +"axios@npm:^1.12.1, axios@npm:^1.8.3": version: 1.12.2 resolution: "axios@npm:1.12.2" dependencies: @@ -10021,17 +9991,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.8.3": - version: 1.9.0 - resolution: "axios@npm:1.9.0" - dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/9371a56886c2e43e4ff5647b5c2c3c046ed0a3d13482ef1d0135b994a628c41fbad459796f101c655e62f0c161d03883454474d2e435b2e021b1924d9f24994c - languageName: node - linkType: hard - "axobject-query@npm:^4.1.0": version: 4.1.0 resolution: "axobject-query@npm:4.1.0" @@ -10318,15 +10277,6 @@ __metadata: languageName: node linkType: hard -"better-opn@npm:^3.0.2": - version: 3.0.2 - resolution: "better-opn@npm:3.0.2" - dependencies: - open: "npm:^8.0.4" - checksum: 10c0/911ef25d44da75aabfd2444ce7a4294a8000ebcac73068c04a60298b0f7c7506b60421aa4cd02ac82502fb42baaff7e4892234b51e6923eded44c5a11185f2f5 - languageName: node - linkType: hard - "big-integer@npm:^1.6.44": version: 1.6.52 resolution: "big-integer@npm:1.6.52" @@ -13250,17 +13200,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.7.0": - version: 5.18.1 - resolution: "enhanced-resolve@npm:5.18.1" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.17.3": +"enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.17.3, enhanced-resolve@npm:^5.7.0": version: 5.18.3 resolution: "enhanced-resolve@npm:5.18.3" dependencies: @@ -14847,18 +14787,6 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.4": - version: 6.4.6 - resolution: "fdir@npm:6.4.6" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9 - languageName: node - linkType: hard - "fetch-retry@npm:^6.0.0": version: 6.0.0 resolution: "fetch-retry@npm:6.0.0" @@ -15202,18 +15130,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.2 - resolution: "form-data@npm:4.0.2" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - es-set-tostringtag: "npm:^2.1.0" - mime-types: "npm:^2.1.12" - checksum: 10c0/e534b0cf025c831a0929bf4b9bbe1a9a6b03e273a8161f9947286b9b13bf8fb279c6944aae0070c4c311100c6d6dbb815cd955dc217728caf73fad8dc5b8ee9c - languageName: node - linkType: hard - "form-data@npm:^4.0.4": version: 4.0.4 resolution: "form-data@npm:4.0.4" @@ -16705,20 +16621,13 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0": +"ignore@npm:^7.0.0, ignore@npm:^7.0.3": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d languageName: node linkType: hard -"ignore@npm:^7.0.3": - version: 7.0.4 - resolution: "ignore@npm:7.0.4" - checksum: 10c0/90e1f69ce352b9555caecd9cbfd07abe7626d312a6f90efbbb52c7edca6ea8df065d66303863b30154ab1502afb2da8bc59d5b04e1719a52ef75bbf675c488eb - languageName: node - linkType: hard - "image-size@npm:^2.0.0, image-size@npm:^2.0.2": version: 2.0.2 resolution: "image-size@npm:2.0.2" @@ -20601,7 +20510,7 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.4, open@npm:^8.4.0": +"open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" dependencies: @@ -23939,19 +23848,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - bin: - sha.js: ./bin.js - checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 - languageName: node - linkType: hard - -"sha.js@npm:^2.4.11": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": version: 2.4.12 resolution: "sha.js@npm:2.4.12" dependencies: @@ -24610,7 +24507,6 @@ __metadata: "@yarnpkg/fslib": "npm:2.10.3" "@yarnpkg/libzip": "npm:2.3.0" ansi-to-html: "npm:^0.7.2" - better-opn: "npm:^3.0.2" boxen: "npm:^8.0.1" browser-dtector: "npm:^3.4.0" bundle-require: "npm:^5.1.0" @@ -24648,7 +24544,7 @@ __metadata: memoizerific: "npm:^1.11.3" nanoid: "npm:^4.0.2" npmlog: "npm:^7.0.0" - open: "npm:^8.4.0" + open: "npm:^10.2.0" p-limit: "npm:^6.2.0" package-manager-detector: "npm:^1.1.0" picocolors: "npm:^1.1.0" @@ -25428,17 +25324,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.9": - version: 0.2.14 - resolution: "tinyglobby@npm:0.2.14" - dependencies: - fdir: "npm:^6.4.4" - picomatch: "npm:^4.0.2" - checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.15": +"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.9": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" dependencies: