diff --git a/docs/reference/@tanstack/namespaces/$internals/functions/$installDevtoolsBridge.md b/docs/reference/@tanstack/namespaces/$internals/functions/$installDevtoolsBridge.md new file mode 100644 index 00000000..bf5d4075 --- /dev/null +++ b/docs/reference/@tanstack/namespaces/$internals/functions/$installDevtoolsBridge.md @@ -0,0 +1,35 @@ +--- +id: $installDevtoolsBridge +title: $installDevtoolsBridge +--- + +# Function: $installDevtoolsBridge() + +```ts +function $installDevtoolsBridge(bridge): () => void; +``` + +Defined in: [devtoolsBridge.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/devtoolsBridge.ts#L23) + +Installs the active Devtools bridge for store lifecycle notifications. + +This is intentionally an internals-only API. Store Devtools calls it when the +Devtools panel/context is mounted, and core runtime code reads the active +bridge through `devtools()`. The returned cleanup removes this bridge only if +it is still the active bridge. + +## Parameters + +### bridge + +[`$StoreDevtoolsBridge`](../interfaces/$StoreDevtoolsBridge.md) + +## Returns + +```ts +(): void; +``` + +### Returns + +`void` diff --git a/docs/reference/@tanstack/namespaces/$internals/functions/$storeDevtools.md b/docs/reference/@tanstack/namespaces/$internals/functions/$storeDevtools.md new file mode 100644 index 00000000..7093b879 --- /dev/null +++ b/docs/reference/@tanstack/namespaces/$internals/functions/$storeDevtools.md @@ -0,0 +1,27 @@ +--- +id: $storeDevtools +title: $storeDevtools +--- + +# Function: $storeDevtools() + +```ts +function $storeDevtools(): $StoreDevtoolsBridge; +``` + +Defined in: [devtoolsBridge.ts:49](https://github.com/TanStack/store/blob/main/packages/store/src/devtoolsBridge.ts#L49) + +Returns the active bridge, or an empty bridge object when Devtools is absent. This is what +should be used throughout the core to emit events when necessary. + +## Returns + +[`$StoreDevtoolsBridge`](../interfaces/$StoreDevtoolsBridge.md) + +## Example + +```ts +mount() { + $storeDevtools().mountAtom?.(this) +} +``` diff --git a/docs/reference/@tanstack/namespaces/$internals/index.md b/docs/reference/@tanstack/namespaces/$internals/index.md new file mode 100644 index 00000000..0eea0129 --- /dev/null +++ b/docs/reference/@tanstack/namespaces/$internals/index.md @@ -0,0 +1,15 @@ +--- +id: $internals +title: $internals +--- + +# $internals + +## Interfaces + +- [$StoreDevtoolsBridge](interfaces/$StoreDevtoolsBridge.md) + +## Functions + +- [$installDevtoolsBridge](functions/$installDevtoolsBridge.md) +- [$storeDevtools](functions/$storeDevtools.md) diff --git a/docs/reference/@tanstack/namespaces/$internals/interfaces/$StoreDevtoolsBridge.md b/docs/reference/@tanstack/namespaces/$internals/interfaces/$StoreDevtoolsBridge.md new file mode 100644 index 00000000..22304c7a --- /dev/null +++ b/docs/reference/@tanstack/namespaces/$internals/interfaces/$StoreDevtoolsBridge.md @@ -0,0 +1,32 @@ +--- +id: $StoreDevtoolsBridge +title: $StoreDevtoolsBridge +--- + +# Interface: $StoreDevtoolsBridge + +Defined in: [devtoolsBridge.ts:4](https://github.com/TanStack/store/blob/main/packages/store/src/devtoolsBridge.ts#L4) + +## Properties + +### mountStore()? + +```ts +optional mountStore: (atom) => void; +``` + +Defined in: [devtoolsBridge.ts:10](https://github.com/TanStack/store/blob/main/packages/store/src/devtoolsBridge.ts#L10) + +Be descriptive here! It's important that the function call can be easily reasoned about when someone is confused. + +As far as parameters go, keep it vague. Core should do as little calculation as possible. + +#### Parameters + +##### atom + +[`InternalBaseAtom`](../../../../interfaces/InternalBaseAtom.md)\<`any`\> | [`InternalReadonlyAtom`](../../../../interfaces/InternalReadonlyAtom.md)\<`any`\> + +#### Returns + +`void` diff --git a/docs/reference/index.md b/docs/reference/index.md index afc8e5dd..860c0d0c 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -5,6 +5,10 @@ title: "@tanstack/store" # @tanstack/store +## Namespaces + +- [$internals](@tanstack/namespaces/$internals/index.md) + ## Classes - [ReadonlyStore](classes/ReadonlyStore.md) diff --git a/packages/react-store-devtools/eslint.config.js b/packages/react-store-devtools/eslint.config.js new file mode 100644 index 00000000..d6bf015b --- /dev/null +++ b/packages/react-store-devtools/eslint.config.js @@ -0,0 +1,26 @@ +// @ts-check + +import pluginReact from '@eslint-react/eslint-plugin' +import pluginReactCompiler from 'eslint-plugin-react-compiler' +import pluginReactHooks from 'eslint-plugin-react-hooks' +import rootConfig from '../../eslint.config.js' + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + ...pluginReact.configs.recommended, + }, + { + plugins: { + 'react-hooks': pluginReactHooks, + 'react-compiler': pluginReactCompiler, + }, + rules: { + 'react-compiler/react-compiler': 'error', + 'react-hooks/exhaustive-deps': 'error', + 'react-hooks/rules-of-hooks': 'error', + }, + }, +] diff --git a/packages/react-store-devtools/package.json b/packages/react-store-devtools/package.json new file mode 100644 index 00000000..c43daaaa --- /dev/null +++ b/packages/react-store-devtools/package.json @@ -0,0 +1,74 @@ +{ + "name": "@tanstack/react-store-devtools", + "version": "0.11.0", + "description": "TanStack Store devtools for React", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/store.git", + "directory": "packages/react-store" + }, + "homepage": "https://tanstack.com/store", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "react", + "tanstack", + "store", + "devtools" + ], + "scripts": { + "clean": "premove ./dist ./coverage", + "test:eslint": "eslint ./src ./tests", + "test:types": "tsc", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict", + "build": "tsdown" + }, + "type": "module", + "types": "./dist/index.d.cts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./production": { + "import": { + "types": "./dist/production.d.ts", + "default": "./dist/production.js" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "dependencies": { + "@tanstack/devtools": "^0.12.2", + "@tanstack/devtools-utils": "^0.5.0", + "@tanstack/store-devtools": "workspace:*" + }, + "devDependencies": { + "@testing-library/react": "^16.3.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@types/use-sync-external-store": "^1.5.0", + "@vitejs/plugin-react": "^6.0.1", + "react": "^19.2.5", + "react-dom": "^19.2.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } +} diff --git a/packages/react-store-devtools/src/StoreDevtools.tsx b/packages/react-store-devtools/src/StoreDevtools.tsx new file mode 100644 index 00000000..22fd2d7b --- /dev/null +++ b/packages/react-store-devtools/src/StoreDevtools.tsx @@ -0,0 +1,17 @@ +'use client' + +import { createReactPanel } from '@tanstack/devtools-utils/react' +import { StoreDevtoolsCore } from '@tanstack/store-devtools' + +import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/react' +import type { StoreDevtoolsInit } from '@tanstack/store-devtools' + +export interface StoreDevtoolsReactInit + extends DevtoolsPanelProps, StoreDevtoolsInit {} + +const [StoreDevtoolsPanel, StoreDevtoolsPanelNoOp] = createReactPanel< + StoreDevtoolsReactInit, + InstanceType +>(StoreDevtoolsCore) + +export { StoreDevtoolsPanel, StoreDevtoolsPanelNoOp } diff --git a/packages/react-store-devtools/src/index.ts b/packages/react-store-devtools/src/index.ts new file mode 100644 index 00000000..faaef278 --- /dev/null +++ b/packages/react-store-devtools/src/index.ts @@ -0,0 +1,16 @@ +'use client' + +import * as Devtools from './StoreDevtools' +import * as plugin from './plugin' + +export const StoreDevtoolsPanel = + process.env.NODE_ENV !== 'development' + ? Devtools.StoreDevtoolsPanelNoOp + : Devtools.StoreDevtoolsPanel + +export const storeDevtoolsPlugin = + process.env.NODE_ENV !== 'development' + ? plugin.storeDevtoolsNoOpPlugin + : plugin.storeDevtoolsPlugin + +export type { StoreDevtoolsReactInit } from './StoreDevtools' diff --git a/packages/react-store-devtools/src/plugin.tsx b/packages/react-store-devtools/src/plugin.tsx new file mode 100644 index 00000000..251e4007 --- /dev/null +++ b/packages/react-store-devtools/src/plugin.tsx @@ -0,0 +1,20 @@ +'use client' + +import { createReactPlugin } from '@tanstack/devtools-utils/react' +import { StoreDevtoolsPanel } from './StoreDevtools' +import type { ReactStoreDevtoolsPlugin } from './types' +import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/react' + +function ReactStoreDevtoolsPanel(props: DevtoolsPanelProps) { + return +} + +const [storeDevtoolsPlugin, storeDevtoolsNoOpPlugin]: readonly [ + ReactStoreDevtoolsPlugin, + ReactStoreDevtoolsPlugin, +] = createReactPlugin({ + name: 'TanStack Store', + Component: ReactStoreDevtoolsPanel, +}) + +export { storeDevtoolsNoOpPlugin, storeDevtoolsPlugin } diff --git a/packages/react-store-devtools/src/production.ts b/packages/react-store-devtools/src/production.ts new file mode 100644 index 00000000..aadd6f24 --- /dev/null +++ b/packages/react-store-devtools/src/production.ts @@ -0,0 +1,5 @@ +'use client' + +export { StoreDevtoolsPanel } from './production/StoreDevtools' +export type { StoreDevtoolsReactInit } from './production/StoreDevtools' +export { storeDevtoolsPlugin } from './production/plugin' diff --git a/packages/react-store-devtools/src/production/StoreDevtools.tsx b/packages/react-store-devtools/src/production/StoreDevtools.tsx new file mode 100644 index 00000000..ca7f6b22 --- /dev/null +++ b/packages/react-store-devtools/src/production/StoreDevtools.tsx @@ -0,0 +1,17 @@ +'use client' + +import { createReactPanel } from '@tanstack/devtools-utils/react' +import { StoreDevtoolsCore } from '@tanstack/store-devtools/production' + +import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/react' +import type { StoreDevtoolsInit } from '@tanstack/store-devtools/production' + +export interface StoreDevtoolsReactInit + extends DevtoolsPanelProps, StoreDevtoolsInit {} + +const [StoreDevtoolsPanel] = createReactPanel< + StoreDevtoolsReactInit, + InstanceType +>(StoreDevtoolsCore) + +export { StoreDevtoolsPanel } diff --git a/packages/react-store-devtools/src/production/plugin.tsx b/packages/react-store-devtools/src/production/plugin.tsx new file mode 100644 index 00000000..3faacc27 --- /dev/null +++ b/packages/react-store-devtools/src/production/plugin.tsx @@ -0,0 +1,20 @@ +'use client' + +import { createReactPlugin } from '@tanstack/devtools-utils/react' +import { StoreDevtoolsPanel } from './StoreDevtools' +import type { ReactStoreDevtoolsPlugin } from '../types' +import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/react' + +function ReactStoreDevtoolsPanel(props: DevtoolsPanelProps) { + return +} + +const [storeDevtoolsPlugin]: readonly [ + ReactStoreDevtoolsPlugin, + ReactStoreDevtoolsPlugin, +] = createReactPlugin({ + name: 'TanStack Store', + Component: ReactStoreDevtoolsPanel, +}) + +export { storeDevtoolsPlugin } diff --git a/packages/react-store-devtools/src/types.ts b/packages/react-store-devtools/src/types.ts new file mode 100644 index 00000000..4da4a587 --- /dev/null +++ b/packages/react-store-devtools/src/types.ts @@ -0,0 +1,10 @@ +import type { TanStackDevtoolsPluginProps } from '@tanstack/devtools' +import type { JSX } from 'react' +// TODO +// Type errors show up regarding portability. We should fix this, it's ugly. +export type ReactStoreDevtoolsPlugin = () => { + name: string + id?: string + defaultOpen?: boolean + render: (el: HTMLElement, props: TanStackDevtoolsPluginProps) => JSX.Element +} diff --git a/packages/react-store-devtools/tsconfig.json b/packages/react-store-devtools/tsconfig.json new file mode 100644 index 00000000..0dad637c --- /dev/null +++ b/packages/react-store-devtools/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "types": ["node"] + }, + "include": ["src", "vitest.config.ts", "tests"], + "exclude": ["eslint.config.js"] +} diff --git a/packages/react-store-devtools/tsdown.config.ts b/packages/react-store-devtools/tsdown.config.ts new file mode 100644 index 00000000..067e60d3 --- /dev/null +++ b/packages/react-store-devtools/tsdown.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig([ + { + entry: { index: 'src/index.ts' }, + format: ['esm'], + outDir: 'dist', + fixedExtension: false, + dts: true, + clean: true, + }, + { + entry: { production: 'src/production.ts' }, + format: ['esm'], + outDir: 'dist', + fixedExtension: false, + dts: true, + clean: false, + }, +]) diff --git a/packages/store-devtools/eslint.config.js b/packages/store-devtools/eslint.config.js new file mode 100644 index 00000000..c61c24df --- /dev/null +++ b/packages/store-devtools/eslint.config.js @@ -0,0 +1,11 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + ...rootConfig, + { + rules: {}, + }, +] diff --git a/packages/store-devtools/package.json b/packages/store-devtools/package.json new file mode 100644 index 00000000..1d8f34f2 --- /dev/null +++ b/packages/store-devtools/package.json @@ -0,0 +1,70 @@ +{ + "name": "@tanstack/store-devtools", + "version": "0.11.0", + "description": "Devtools for TanStack Store", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/store.git", + "directory": "packages/store-devtools" + }, + "homepage": "https://tanstack.com/store", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "solid", + "tanstack", + "store", + "devtools" + ], + "scripts": { + "dev": "vite build --watch", + "clean": "premove ./dist ./coverage", + "test:eslint": "eslint ./src ./tests", + "test:types": "tsc", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict", + "build": "tsdown" + }, + "type": "module", + "types": "./dist/index.d.cts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./production": { + "import": { + "types": "./dist/production.d.ts", + "default": "./dist/production.js" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "dependencies": { + "@tanstack/devtools-event-client": "^0.5.0", + "@tanstack/devtools-utils": "^0.5.0", + "@tanstack/store": "workspace:*" + }, + "devDependencies": { + "@solidjs/testing-library": "^0.8.10", + "solid-js": "^1.9.12", + "vite-plugin-solid": "^2.11.12" + }, + "peerDependencies": { + "solid-js": "^1.6.0" + } +} diff --git a/packages/store-devtools/src/components/index.tsx b/packages/store-devtools/src/components/index.tsx new file mode 100644 index 00000000..9db8fe47 --- /dev/null +++ b/packages/store-devtools/src/components/index.tsx @@ -0,0 +1,3 @@ +export default function App() { + return <>Store devtools template! +} diff --git a/packages/store-devtools/src/core.tsx b/packages/store-devtools/src/core.tsx new file mode 100644 index 00000000..37f273bc --- /dev/null +++ b/packages/store-devtools/src/core.tsx @@ -0,0 +1,11 @@ +import { constructCoreClass } from '@tanstack/devtools-utils/solid' + +export interface StoreDevtoolsInit { + adapterName?: string +} + +// TODO fix type inference error +export const [StoreDevtoolsCore, StoreDevtoolsCoreNoOp] = constructCoreClass( + () => import('./components'), + // TODO non portable type error report? Form-v2 isn't experiencing this, but I can't figure out why this would happen +) as [any, any] diff --git a/packages/store-devtools/src/devtoolsBridge.lib.ts b/packages/store-devtools/src/devtoolsBridge.lib.ts new file mode 100644 index 00000000..cba942ea --- /dev/null +++ b/packages/store-devtools/src/devtoolsBridge.lib.ts @@ -0,0 +1,11 @@ +import { $internals } from '@tanstack/store' + +function createBridge(): Required<$internals.$StoreDevtoolsBridge> { + return { + mountStore: (atom) => { + void atom._snapshot + }, + } +} + +$internals.$installDevtoolsBridge(createBridge()) diff --git a/packages/store-devtools/src/eventClient.lib.ts b/packages/store-devtools/src/eventClient.lib.ts new file mode 100644 index 00000000..8db98efa --- /dev/null +++ b/packages/store-devtools/src/eventClient.lib.ts @@ -0,0 +1,15 @@ +import { EventClient } from '@tanstack/devtools-event-client' + +export type StoreDevtoolsEventMap = { + // TODO implement with your own patterns. My recommendation: + // * NOUN-VERBED - Emitted during a specific time. + // * REQUEST-NOUN - Emitted from devtools, expect an action to happen on core + 'store-register-changed': { + foo?: undefined + } +} + +export const storeDevtoolsEventClient: EventClient = + new EventClient({ + pluginId: 'tanstack-store', + }) diff --git a/packages/store-devtools/src/index.ts b/packages/store-devtools/src/index.ts new file mode 100644 index 00000000..6ae7940a --- /dev/null +++ b/packages/store-devtools/src/index.ts @@ -0,0 +1,14 @@ +'use client' + +// TODO I don't think this is tree shaken. Then again, if it's unused, then it gets pruned, no? +import './devtoolsBridge.lib' +import * as Devtools from './core' + +import type { ClassType } from '@tanstack/devtools-utils/solid/class' + +export const StoreDevtoolsCore: ClassType = + process.env.NODE_ENV !== 'development' + ? Devtools.StoreDevtoolsCoreNoOp + : Devtools.StoreDevtoolsCore + +export type { StoreDevtoolsInit } from './core' diff --git a/packages/store-devtools/src/production.ts b/packages/store-devtools/src/production.ts new file mode 100644 index 00000000..84e1a918 --- /dev/null +++ b/packages/store-devtools/src/production.ts @@ -0,0 +1,4 @@ +'use client' + +export { StoreDevtoolsCore } from './core' +export type { StoreDevtoolsInit } from './core' diff --git a/packages/store-devtools/tsconfig.build.json b/packages/store-devtools/tsconfig.build.json new file mode 100644 index 00000000..110d6e81 --- /dev/null +++ b/packages/store-devtools/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "noEmit": false, + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src"], + "exclude": ["tests", "dist"] +} diff --git a/packages/store-devtools/tsconfig.json b/packages/store-devtools/tsconfig.json new file mode 100644 index 00000000..0506121b --- /dev/null +++ b/packages/store-devtools/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js", + "types": ["node"], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "tests", "vite.config.ts"], + "exclude": ["eslint.config.js"] +} diff --git a/packages/store-devtools/vitest.config.ts b/packages/store-devtools/vitest.config.ts new file mode 100644 index 00000000..4783c542 --- /dev/null +++ b/packages/store-devtools/vitest.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vitest/config' +import solid from 'vite-plugin-solid' +import packageJson from './package.json' + +export default defineConfig({ + plugins: [solid()], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/test-setup.ts'], + coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + typecheck: { enabled: true }, + }, +}) diff --git a/packages/store/src/devtoolsBridge.ts b/packages/store/src/devtoolsBridge.ts new file mode 100644 index 00000000..15276a45 --- /dev/null +++ b/packages/store/src/devtoolsBridge.ts @@ -0,0 +1,52 @@ +import type { InternalBaseAtom, InternalReadonlyAtom } from './types' + +// TODO fix template +export interface $StoreDevtoolsBridge { + /** + * Be descriptive here! It's important that the function call can be easily reasoned about when someone is confused. + * + * As far as parameters go, keep it vague. Core should do as little calculation as possible. + */ + mountStore?: (atom: InternalBaseAtom | InternalReadonlyAtom) => void +} + +let activeBridge: $StoreDevtoolsBridge | null = null + +/** + * Installs the active Devtools bridge for store lifecycle notifications. + * + * This is intentionally an internals-only API. Store Devtools calls it when the + * Devtools panel/context is mounted, and core runtime code reads the active + * bridge through `devtools()`. The returned cleanup removes this bridge only if + * it is still the active bridge. + */ +export function $installDevtoolsBridge( + bridge: $StoreDevtoolsBridge, +): () => void { + activeBridge = bridge + + let didUninstall = false + + return () => { + if (didUninstall) return + didUninstall = true + + if (activeBridge !== bridge) return + + activeBridge = null + } +} + +/** + * Returns the active bridge, or an empty bridge object when Devtools is absent. This is what + * should be used throughout the core to emit events when necessary. + * + * @example + * mount() { + * $storeDevtools().mountAtom?.(this) + * } + */ +export function $storeDevtools(): $StoreDevtoolsBridge { + // Double conditional chains are dumb, so I prefer this approach + return activeBridge ?? {} +} diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts index 71215a5e..e8f552ae 100644 --- a/packages/store/src/index.ts +++ b/packages/store/src/index.ts @@ -2,3 +2,4 @@ export * from './types' export * from './atom' export * from './store' export * from './shallow' +export * as $internals from './devtoolsBridge' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5cfedcb..50bd9767 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1058,6 +1058,40 @@ importers: specifier: ^19.2.5 version: 19.2.5(react@19.2.5) + packages/react-store-devtools: + dependencies: + '@tanstack/devtools': + specifier: ^0.12.2 + version: 0.12.5(csstype@3.2.3)(solid-js@1.9.12) + '@tanstack/devtools-utils': + specifier: ^0.5.0 + version: 0.5.1(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)(zone.js@0.16.1))(@types/react@19.2.14)(preact@10.29.1)(react@19.2.5)(solid-js@1.9.12)(vue@3.5.32(typescript@6.0.2)) + '@tanstack/store-devtools': + specifier: workspace:* + version: link:../store-devtools + devDependencies: + '@testing-library/react': + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@types/use-sync-external-store': + specifier: ^1.5.0 + version: 1.5.0 + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(vite@8.0.13(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + react: + specifier: ^19.2.5 + version: 19.2.5 + react-dom: + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) + packages/solid-store: dependencies: '@tanstack/store': @@ -1089,6 +1123,28 @@ importers: specifier: ^3.5.32 version: 3.5.32(typescript@6.0.2) + packages/store-devtools: + dependencies: + '@tanstack/devtools-event-client': + specifier: ^0.5.0 + version: 0.5.0 + '@tanstack/devtools-utils': + specifier: ^0.5.0 + version: 0.5.0(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)(zone.js@0.16.1))(@types/react@19.2.14)(preact@10.29.1)(react@19.2.5)(solid-js@1.9.12)(vue@3.5.32(typescript@6.0.2)) + '@tanstack/store': + specifier: workspace:* + version: link:../store + devDependencies: + '@solidjs/testing-library': + specifier: ^0.8.10 + version: 0.8.10(solid-js@1.9.12) + solid-js: + specifier: ^1.9.12 + version: 1.9.12 + vite-plugin-solid: + specifier: ^2.11.12 + version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.12)(vite@8.0.13(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + packages/svelte-store: dependencies: '@tanstack/store': @@ -4085,6 +4141,36 @@ packages: '@sinclair/typebox@0.34.49': resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + '@solid-primitives/event-listener@2.4.6': + resolution: {integrity: sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/keyboard@1.3.7': + resolution: {integrity: sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/resize-observer@2.2.0': + resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/rootless@1.5.4': + resolution: {integrity: sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/static-store@0.1.4': + resolution: {integrity: sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/utils@6.4.1': + resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} + peerDependencies: + solid-js: ^1.6.12 + '@solidjs/testing-library@0.8.10': resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==} engines: {node: '>= 14'} @@ -4127,6 +4213,82 @@ packages: resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} + '@tanstack/devtools-client@0.0.8': + resolution: {integrity: sha512-cG3iZkGWCwN330bLBKa8+9r4Of2AXNoz2zUqcsy/4XsD3105ghVBx78cGyvJj9fSclNomPxoqAnDGXXhg1WLvA==} + engines: {node: '>=18'} + + '@tanstack/devtools-event-bus@0.4.2': + resolution: {integrity: sha512-2LHzhwBFlKHCcklsQrGe8TeyjHd4XAF8nuCO6wHmva5fePUkJUULbu6CsCNAlGlCi0KkEsMXZSvRdR4HgMq4yA==} + engines: {node: '>=18'} + + '@tanstack/devtools-event-client@0.5.0': + resolution: {integrity: sha512-H+OH3zC6Vhu/K0NaVfQKknEKawc/+2PT+D3SB3Ox0V8SiMlTo0abbmH2rH0721R2aNYbjdMXA1oENOd8E2UVoA==} + engines: {node: '>=18'} + hasBin: true + + '@tanstack/devtools-ui@0.6.0': + resolution: {integrity: sha512-CVaM6rT6Nl5ijo83vJYFa2SjofvpuOl/uOvbYGhBrRgUhhelNHhx8zZX+hnZCHmIr0/lzM65hsocnZ72592Rvg==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + + '@tanstack/devtools-utils@0.5.0': + resolution: {integrity: sha512-5wRNVDun+y2Gn2OrSj4S73TljY0B3YCzgfIm540tGkqmI6MTu78i57WT/3YOuEUfIyxtZiANRWEnk7fiLNFBZg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@angular/core': '>=19.0.0' + '@types/react': '>=17.0.0' + preact: '>=10.0.0' + react: '>=17.0.0' + solid-js: '>=1.9.7' + vue: '>=3.2.0' + peerDependenciesMeta: + '@angular/core': + optional: true + '@types/react': + optional: true + preact: + optional: true + react: + optional: true + solid-js: + optional: true + vue: + optional: true + + '@tanstack/devtools-utils@0.5.1': + resolution: {integrity: sha512-yXw2PNY7cOjvx5sU03vNQoH4LG0TSTT7d/TpUpJTpjQQHoehTTjBHQyki8RGIAW6iHJ7K4/DVZgrRiP7hicInQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@angular/core': '>=19.0.0' + '@types/react': '>=17.0.0' + preact: '>=10.0.0' + react: '>=17.0.0' + solid-js: '>=1.9.7' + vue: '>=3.2.0' + peerDependenciesMeta: + '@angular/core': + optional: true + '@types/react': + optional: true + preact: + optional: true + react: + optional: true + solid-js: + optional: true + vue: + optional: true + + '@tanstack/devtools@0.12.5': + resolution: {integrity: sha512-JdxTSeVdjJheycgz4c7qbldNKDCEDWlWr1l9dZBhd9sOmRBT5Z70ka9Eb8mb+FUnalcOIB62IDSR/iSxAIUD8Q==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + solid-js: '>=1.9.7' + '@tanstack/eslint-config@0.4.0': resolution: {integrity: sha512-V+Cd81W/f65dqKJKpytbwTGx9R+IwxKAHsG/uJ3nSLYEh36hlAr54lRpstUhggQB8nf/cP733cIw8DuD2dzQUg==} engines: {node: '>=18'} @@ -5325,6 +5487,9 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -6121,6 +6286,11 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + goober@2.1.19: + resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==} + peerDependencies: + csstype: ^3.0.10 + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -9274,7 +9444,7 @@ snapshots: tree-kill: 1.2.2 tslib: 2.8.1 typescript: 6.0.2 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)) webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)) webpack-merge: 6.0.1 @@ -9312,7 +9482,7 @@ snapshots: dependencies: '@angular-devkit/architect': 0.2102.7(chokidar@5.0.0) rxjs: 7.8.2 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)) transitivePeerDependencies: - chokidar @@ -9438,7 +9608,7 @@ snapshots: less: 4.4.2 lmdb: 3.5.1 postcss: 8.5.6 - vitest: 4.1.4(@types/node@25.6.0)(@vitest/coverage-istanbul@4.1.4)(jsdom@29.0.2)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + vitest: 4.1.4(@types/node@25.6.0)(@vitest/coverage-istanbul@4.1.4)(jsdom@29.0.2)(vite@8.0.13(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -11281,7 +11451,7 @@ snapshots: dependencies: '@angular/compiler-cli': 21.2.8(@angular/compiler@21.2.8)(typescript@6.0.2) typescript: 6.0.2 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: @@ -12040,6 +12210,40 @@ snapshots: '@sinclair/typebox@0.34.49': {} + '@solid-primitives/event-listener@2.4.6(solid-js@1.9.12)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) + solid-js: 1.9.12 + + '@solid-primitives/keyboard@1.3.7(solid-js@1.9.12)': + dependencies: + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) + solid-js: 1.9.12 + + '@solid-primitives/resize-observer@2.2.0(solid-js@1.9.12)': + dependencies: + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.12) + '@solid-primitives/static-store': 0.1.4(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) + solid-js: 1.9.12 + + '@solid-primitives/rootless@1.5.4(solid-js@1.9.12)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) + solid-js: 1.9.12 + + '@solid-primitives/static-store@0.1.4(solid-js@1.9.12)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) + solid-js: 1.9.12 + + '@solid-primitives/utils@6.4.1(solid-js@1.9.12)': + dependencies: + solid-js: 1.9.12 + '@solidjs/testing-library@0.8.10(solid-js@1.9.12)': dependencies: '@testing-library/dom': 10.4.1 @@ -12088,6 +12292,62 @@ snapshots: transitivePeerDependencies: - encoding + '@tanstack/devtools-client@0.0.8': + dependencies: + '@tanstack/devtools-event-client': 0.5.0 + + '@tanstack/devtools-event-bus@0.4.2': + dependencies: + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@tanstack/devtools-event-client@0.5.0': {} + + '@tanstack/devtools-ui@0.6.0(csstype@3.2.3)(solid-js@1.9.12)': + dependencies: + clsx: 2.1.1 + dayjs: 1.11.21 + goober: 2.1.19(csstype@3.2.3) + solid-js: 1.9.12 + transitivePeerDependencies: + - csstype + + '@tanstack/devtools-utils@0.5.0(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)(zone.js@0.16.1))(@types/react@19.2.14)(preact@10.29.1)(react@19.2.5)(solid-js@1.9.12)(vue@3.5.32(typescript@6.0.2))': + optionalDependencies: + '@angular/core': 21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)(zone.js@0.16.1) + '@types/react': 19.2.14 + preact: 10.29.1 + react: 19.2.5 + solid-js: 1.9.12 + vue: 3.5.32(typescript@6.0.2) + + '@tanstack/devtools-utils@0.5.1(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)(zone.js@0.16.1))(@types/react@19.2.14)(preact@10.29.1)(react@19.2.5)(solid-js@1.9.12)(vue@3.5.32(typescript@6.0.2))': + optionalDependencies: + '@angular/core': 21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)(zone.js@0.16.1) + '@types/react': 19.2.14 + preact: 10.29.1 + react: 19.2.5 + solid-js: 1.9.12 + vue: 3.5.32(typescript@6.0.2) + + '@tanstack/devtools@0.12.5(csstype@3.2.3)(solid-js@1.9.12)': + dependencies: + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/keyboard': 1.3.7(solid-js@1.9.12) + '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.12) + '@tanstack/devtools-client': 0.0.8 + '@tanstack/devtools-event-bus': 0.4.2 + '@tanstack/devtools-ui': 0.6.0(csstype@3.2.3)(solid-js@1.9.12) + clsx: 2.1.1 + goober: 2.1.19(csstype@3.2.3) + solid-js: 1.9.12 + transitivePeerDependencies: + - bufferutil + - csstype + - utf-8-validate + '@tanstack/eslint-config@0.4.0(@typescript-eslint/utils@8.58.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint/js': 10.0.1(eslint@10.3.0(jiti@2.6.1)) @@ -12557,15 +12817,6 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': - dependencies: - '@vitest/spy': 4.1.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) - optional: true - '@vitest/mocker@4.1.4(vite@8.0.13(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.4 @@ -13025,7 +13276,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 find-up: 5.0.0 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) babel-plugin-jsx-dom-expressions@0.40.6(@babel/core@7.29.0): dependencies: @@ -13412,7 +13663,7 @@ snapshots: schema-utils: 4.3.3 serialize-javascript: 7.0.5 tinyglobby: 0.2.16 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) core-js-compat@3.49.0: dependencies: @@ -13451,7 +13702,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) css-select@5.2.2: dependencies: @@ -13511,6 +13762,8 @@ snapshots: dataloader@1.4.0: {} + dayjs@1.11.21: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -14584,6 +14837,10 @@ snapshots: globrex@0.1.2: {} + goober@2.1.19(csstype@3.2.3): + dependencies: + csstype: 3.2.3 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -15159,7 +15416,7 @@ snapshots: dependencies: less: 4.4.2 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) less@4.4.2: dependencies: @@ -15184,7 +15441,7 @@ snapshots: dependencies: webpack-sources: 3.3.4 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) lightningcss-android-arm64@1.32.0: optional: true @@ -15471,7 +15728,7 @@ snapshots: dependencies: schema-utils: 4.3.3 tapable: 2.3.2 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) minimalistic-assert@1.0.1: {} @@ -16089,7 +16346,7 @@ snapshots: postcss: 8.5.6 semver: 7.7.4 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) transitivePeerDependencies: - typescript @@ -16566,7 +16823,7 @@ snapshots: neo-async: 2.6.2 optionalDependencies: sass: 1.97.3 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) sass@1.97.3: dependencies: @@ -16856,7 +17113,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) source-map-support@0.5.21: dependencies: @@ -17104,15 +17361,15 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.4.0(esbuild@0.27.7)(webpack@5.105.2(esbuild@0.27.3)): + terser-webpack-plugin@5.4.0(esbuild@0.27.3)(webpack@5.105.2(esbuild@0.27.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.0 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) optionalDependencies: - esbuild: 0.27.7 + esbuild: 0.27.3 terser@5.46.0: dependencies: @@ -17484,36 +17741,6 @@ snapshots: optionalDependencies: vite: 8.0.13(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) - vitest@4.1.4(@types/node@25.6.0)(@vitest/coverage-istanbul@4.1.4)(jsdom@29.0.2)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.4 - '@vitest/runner': 4.1.4 - '@vitest/snapshot': 4.1.4 - '@vitest/spy': 4.1.4 - '@vitest/utils': 4.1.4 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.0.0 - tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.16 - tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 25.6.0 - '@vitest/coverage-istanbul': 4.1.4(vitest@4.1.4) - jsdom: 29.0.2 - transitivePeerDependencies: - - msw - optional: true - vitest@4.1.4(@types/node@25.6.0)(@vitest/coverage-istanbul@4.1.4)(jsdom@29.0.2)(vite@8.0.13(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.4 @@ -17623,7 +17850,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) transitivePeerDependencies: - tslib @@ -17658,7 +17885,7 @@ snapshots: webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)) ws: 8.20.0 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) transitivePeerDependencies: - bufferutil - debug @@ -17677,9 +17904,9 @@ snapshots: webpack-subresource-integrity@5.1.0(webpack@5.105.2(esbuild@0.27.3)): dependencies: typed-assert: 1.0.9 - webpack: 5.105.2(esbuild@0.27.7) + webpack: 5.105.2(esbuild@0.27.3) - webpack@5.105.2(esbuild@0.27.7): + webpack@5.105.2(esbuild@0.27.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 @@ -17703,7 +17930,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.2 - terser-webpack-plugin: 5.4.0(esbuild@0.27.7)(webpack@5.105.2(esbuild@0.27.3)) + terser-webpack-plugin: 5.4.0(esbuild@0.27.3)(webpack@5.105.2(esbuild@0.27.3)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: