From cbabc20f803642957ec8c3a991d5f46721551e31 Mon Sep 17 00:00:00 2001 From: dangreen Date: Wed, 21 Oct 2026 18:41:07 +0400 Subject: [PATCH] fix(devtools): depend on the stable nanoviews and keep the panel off with a production core The 2.0.0 panel pinned a nanoviews prerelease that brings its own kida prerelease, so an app got a second kida and its build failed on the missing `text` export. `nanoviews` and the `@nanoviews/*` packages are taken at `^1.0.0` now. With a production core, as in a production build that calls `devtools()` unguarded, the page hung: such a core marks no node of the panel, `onSignal` handed the registry every node the panel created for its records, and the panel recorded itself without end. `devtools()` now checks that the core marks a node created inside `uninspected`, and otherwise warns and stays off. --- packages/devtools/package.json | 8 ++-- packages/devtools/src/devtools.ts | 8 ++++ pnpm-lock.yaml | 66 ++++++++++++++----------------- pnpm-workspace.yaml | 2 +- 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 09e1bc7d..ec128601 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -62,12 +62,12 @@ "dependencies": { "@nano_kit/platform-web": "workspace:^", "@nano_kit/store": "workspace:^", - "nanoviews": "1.0.0-prerelease.20260923175652" + "nanoviews": "^1.0.0" }, "devDependencies": { - "@nanoviews/storybook": "1.0.0-prerelease.20260923175652", - "@nanoviews/storybook-vite": "1.0.0-prerelease.20260923175652", - "@nanoviews/testing-library": "1.0.0-prerelease.20260923175652", + "@nanoviews/storybook": "^1.0.0", + "@nanoviews/storybook-vite": "^1.0.0", + "@nanoviews/testing-library": "^1.0.0", "@testing-library/dom": "catalog:", "@types/svg-sprite": "^0.0.39", "@vitest/coverage-v8": "catalog:", diff --git a/packages/devtools/src/devtools.ts b/packages/devtools/src/devtools.ts index 77cb9f02..9c931f11 100644 --- a/packages/devtools/src/devtools.ts +++ b/packages/devtools/src/devtools.ts @@ -1,7 +1,9 @@ import { InjectionContext, + UninspectedMode, inject, provide, + signal, uninspected, start } from '@nano_kit/store' @@ -59,6 +61,12 @@ export interface DevtoolsOptions { * ``` */ export function devtools({ library }: DevtoolsOptions = {}) { + // A production core marks no node of the panel: the panel would hear its own nodes without end + if (!(uninspected(() => signal()).node.modes & UninspectedMode)) { + console.warn('[nano_kit/devtools] The core is a production build, which reports nothing to the panel: call devtools() in development alone, with the `development` condition resolved for @nano_kit/store') + return + } + // Whatever the DevTools create is theirs and never shows among the nodes of the application uninspected(() => { const context = new InjectionContext(library && [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c111c52..d7c04848 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1402,18 +1402,18 @@ importers: specifier: workspace:^ version: link:../store nanoviews: - specifier: 1.0.0-prerelease.20260923175652 - version: 1.0.0-prerelease.20260923175652(csstype@3.2.3) + specifier: ^1.0.0 + version: 1.0.0 devDependencies: '@nanoviews/storybook': - specifier: 1.0.0-prerelease.20260923175652 - version: 1.0.0-prerelease.20260923175652(nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3))(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8)) + specifier: ^1.0.0 + version: 1.0.0(nanoviews@1.0.0)(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8)) '@nanoviews/storybook-vite': - specifier: 1.0.0-prerelease.20260923175652 - version: 1.0.0-prerelease.20260923175652(nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3))(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8))(vite@8.2.1(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + specifier: ^1.0.0 + version: 1.0.0(nanoviews@1.0.0)(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8))(vite@8.2.1(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) '@nanoviews/testing-library': - specifier: 1.0.0-prerelease.20260923175652 - version: 1.0.0-prerelease.20260923175652(@testing-library/dom@10.4.1)(nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3))(vitest@5.0.0) + specifier: ^1.0.0 + version: 1.0.0(@testing-library/dom@10.4.1)(nanoviews@1.0.0)(vitest@5.0.0) '@testing-library/dom': specifier: 'catalog:' version: 10.4.1 @@ -3435,26 +3435,26 @@ packages: nanostores: '>=0.9.0 <2.0.0' solid-js: ^1.6.0 - '@nanoviews/storybook-vite@1.0.0-prerelease.20260923175652': - resolution: {integrity: sha512-MoDkQB1iy4KDEBkJk6pZuRqGa4Y1KKnXz6sqyunHsWL7/IoohYnVwWAfwKiNg+KViKBDsUPmlzwcEOVzoape5w==} - engines: {node: '>=20.6'} + '@nanoviews/storybook-vite@1.0.0': + resolution: {integrity: sha512-qgy97hV0dhTAi3cJdIS1x5iaW5lLXSBxFdamg3KXYt8VqJa+kgEYOcRxgb405q/WQiDvfExWzLvpPmYtJ8V0Gw==} + engines: {node: '>=24'} peerDependencies: storybook: ^10.5.10 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@nanoviews/storybook@1.0.0-prerelease.20260923175652': - resolution: {integrity: sha512-+vwJ0CMWRbahRuHfF+dEWCQ2pkosfx69gDyiPMSO76MUlmxXNNlgN40cFkIPo20i7naZKpqWLrkKIZkoZ9nCdw==} - engines: {node: '>=20.6'} + '@nanoviews/storybook@1.0.0': + resolution: {integrity: sha512-k7oPKqW5SwaZ9Z+7Jbeqbvnq15h4teuBTjqig/Wufvl356pno7heJCTTM1NB3c7o4ZNRnIIyFoyo1vvoAcYwjw==} + engines: {node: '>=24'} peerDependencies: - nanoviews: ^1.0.0-prerelease.20260923175652 + nanoviews: ^1.0.0 storybook: ^10.5.10 - '@nanoviews/testing-library@1.0.0-prerelease.20260923175652': - resolution: {integrity: sha512-s29EAo54YKdIBXTHXaZzh54miLefiy8+gj2HbB+OlcPzKy5MJY+QMl6uVzg/AJ6mbYgI+e5o7JAiF0kiJgu6XA==} - engines: {node: '>=20'} + '@nanoviews/testing-library@1.0.0': + resolution: {integrity: sha512-y5o/XXwIfJC3cJnZCc7XTV34V7jaXrwqfoQrhrx0YJX9grDeQjpN8i8CpRHKmP6Y74Ry/BV7humxf62C6F6NaQ==} + engines: {node: '>=24'} peerDependencies: '@testing-library/dom': '>=7' - nanoviews: ^1.0.0-prerelease.20260923175652 + nanoviews: ^1.0.0 vitest: '>=1' peerDependenciesMeta: vitest: @@ -7135,14 +7135,9 @@ packages: resolution: {integrity: sha512-PGd3uPojJB9Z07d5NX3Db/SOSBbyy3wLMUGq0GpnEEJfVzY9mq7daPMAZ3jObV5D3Jn+YKND636eI5ULg7F80Q==} engines: {node: ^20.0.0 || >=22.0.0} - nanoviews@1.0.0-prerelease.20260923175652: - resolution: {integrity: sha512-yiPJgvc3vw7cdA9lP6M8jAXf+jiygVjMhh6CLdx8rQQCEYZYucAOgqf8r5/og/f0rkDIV5HlEcdraLl46asdcg==} - engines: {node: '>=20'} - peerDependencies: - csstype: ^3.1.3 - peerDependenciesMeta: - csstype: - optional: true + nanoviews@1.0.0: + resolution: {integrity: sha512-tIRzlI4ff+RtTZ1PZ1bwLfGN4FS3KyyHb47O2z1iS4STAPZ5qFzqPrgaquSYwMROP1pp4ygWqFoz20gLzIYdNg==} + engines: {node: '>=24'} neotraverse@1.0.1: resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} @@ -9902,25 +9897,25 @@ snapshots: nanostores: 1.4.1 solid-js: 1.9.14 - '@nanoviews/storybook-vite@1.0.0-prerelease.20260923175652(nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3))(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8))(vite@8.2.1(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': + '@nanoviews/storybook-vite@1.0.0(nanoviews@1.0.0)(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8))(vite@8.2.1(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: - '@nanoviews/storybook': 1.0.0-prerelease.20260923175652(nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3))(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8)) + '@nanoviews/storybook': 1.0.0(nanoviews@1.0.0)(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8)) '@storybook/builder-vite': 10.6.0(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8))(vite@8.2.1(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) storybook: 10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8) vite: 8.2.1(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - nanoviews - '@nanoviews/storybook@1.0.0-prerelease.20260923175652(nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3))(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8))': + '@nanoviews/storybook@1.0.0(nanoviews@1.0.0)(storybook@10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8))': dependencies: - nanoviews: 1.0.0-prerelease.20260923175652(csstype@3.2.3) + nanoviews: 1.0.0 storybook: 10.6.0(@types/react@19.2.17)(prettier@3.8.1)(react@19.2.8) type-fest: 5.9.0 - '@nanoviews/testing-library@1.0.0-prerelease.20260923175652(@testing-library/dom@10.4.1)(nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3))(vitest@5.0.0)': + '@nanoviews/testing-library@1.0.0(@testing-library/dom@10.4.1)(nanoviews@1.0.0)(vitest@5.0.0)': dependencies: '@testing-library/dom': 10.4.1 - nanoviews: 1.0.0-prerelease.20260923175652(csstype@3.2.3) + nanoviews: 1.0.0 optionalDependencies: vitest: 5.0.0(@types/node@24.13.2)(@vitest/browser-playwright@5.0.0)(@vitest/coverage-v8@5.0.0)(@vitest/ui@5.0.0)(happy-dom@21.0.1)(vite@8.2.1(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) @@ -13705,11 +13700,10 @@ snapshots: nanostores@1.4.1: {} - nanoviews@1.0.0-prerelease.20260923175652(csstype@3.2.3): + nanoviews@1.0.0: dependencies: - kida: link:packages/kida - optionalDependencies: csstype: 3.2.3 + kida: link:packages/kida neotraverse@1.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 82c6637c..c18cccbd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -41,7 +41,7 @@ minimumReleaseAgeExclude: - '@nanoviews/*' - '@trigen/*' overrides: - # nanoviews depends on published kida snapshots; the workspace core is the one instance every graph shares + # nanoviews depends on the published kida; the workspace core is the one instance every graph shares agera: workspace:^ kida: workspace:^ '@nano_kit/devtools@*': workspace:^