Compare commits

..

52 Commits

Author SHA1 Message Date
Yanli 盐粒
3969520f33 merge: resolve origin/main conflicts 2026-03-02 23:58:29 +08:00
Yanli 盐粒
217f402da4 Revert "fix: validate node config ids and document compatibility defaults"
This reverts commit 465f36e691.
2026-03-01 18:34:42 +08:00
Yanli 盐粒
465f36e691 fix: validate node config ids and document compatibility defaults 2026-03-01 18:16:41 +08:00
Yanli 盐粒
93e4c108f8 docs: document node data type fallback in initializer 2026-03-01 17:58:49 +08:00
Yanli 盐粒
13d45769d7 fix: address PR feedback on node config validation 2026-03-01 17:54:11 +08:00
Yanli 盐粒
94b31b101e fix: resolve basedpyright config type mismatches 2026-03-01 17:28:17 +08:00
Yanli 盐粒
262a720673 refactor: remove unused _hydrate_node_data in Node 2026-03-01 17:18:48 +08:00
Yanli 盐粒
b3d074f04e chore: normalize webhook import ordering 2026-03-01 17:11:46 +08:00
Yanli 盐粒
af7c2ca5e9 merge: resolve origin/main conflicts 2026-03-01 17:11:15 +08:00
Yanli 盐粒
834a7bedf6 Merge remote-tracking branch 'origin/main' into yanli/pydantic-model-node-config-data 2026-02-12 11:18:44 +08:00
Yanli 盐粒
03fb284031 make ruff happy 2026-02-12 11:06:26 +08:00
Yanli 盐粒
994402b510 merge main 2026-02-12 11:05:38 +08:00
autofix-ci[bot]
c5ed658c1e [autofix.ci] apply automated fixes 2026-02-09 12:29:56 +00:00
盐粒 Yanli
d15502d7ac Merge branch 'main' into yanli/pydantic-model-node-config-data 2026-02-09 20:28:04 +08:00
autofix-ci[bot]
747badbccd [autofix.ci] apply automated fixes 2026-02-06 10:23:49 +00:00
盐粒 Yanli
93cbaac910 Merge branch 'main' into yanli/pydantic-model-node-config-data 2026-02-06 18:21:41 +08:00
盐粒 Yanli
b98e71e52a Merge branch 'main' into yanli/pydantic-model-node-config-data 2026-02-05 15:39:15 +08:00
Yanli 盐粒
1575c0db02 skip the no title test in test_webhook_data_validation_errors 2026-02-03 18:25:35 +08:00
Yanli 盐粒
98fc3cda3c make BaseNodeData.title have a default value 2026-02-03 18:17:43 +08:00
Yanli 盐粒
4e18718dc8 again update the Node.__init__ interface 2026-02-03 18:16:35 +08:00
Yanli 盐粒
b6bdd9996a update MockNodeFactory 2026-02-03 18:04:38 +08:00
Yanli 盐粒
f1a1791954 fix create_node interface 2026-02-03 18:04:16 +08:00
Yanli 盐粒
3ae27377ec fix Node.__init__ interface again 2026-02-03 18:04:06 +08:00
Yanli 盐粒
4aefb98711 ruff 2026-02-03 17:28:28 +08:00
Yanli 盐粒
e8b8320a3d fix the Node.__init__ interface 2026-02-03 17:28:20 +08:00
Yanli 盐粒
4ab0f3c1d3 ruff 2026-02-03 17:22:39 +08:00
Yanli 盐粒
1c242800b0 fix test_workflow_entry 2026-02-03 17:22:29 +08:00
Yanli 盐粒
2b4e4905bf ruff 2026-02-03 16:45:16 +08:00
Yanli 盐粒
4fdd621e1b revert the title to be required 2026-02-03 16:45:01 +08:00
Yanli 盐粒
afadf54a2b resolve conflict 2026-02-03 16:34:12 +08:00
盐粒 Yanli
59c729c376 Merge branch 'main' into yanli/pydantic-model-node-config-data 2026-02-03 16:26:08 +08:00
Yanli 盐粒
36996d44a4 make type checker happy 2026-02-03 16:15:23 +08:00
Yanli 盐粒
07eb7504e3 add default value of type for every core.workflow.nodes.*.entities 2026-02-03 15:43:11 +08:00
Yanli 盐粒
4a6798790d add type ignore comment 2026-02-03 15:42:21 +08:00
Yanli 盐粒
c0e3cf6f18 update import linter rule 2026-02-03 14:58:59 +08:00
autofix-ci[bot]
3b82ef08f1 [autofix.ci] apply automated fixes 2026-02-03 06:57:32 +00:00
Yanli 盐粒
da26cd1c12 fix import lints by moving BaseNodeData from core.workflow.nodes to core.workflow.entities 2026-02-03 14:53:21 +08:00
Yanli 盐粒
b17ddd0ea7 fix the default_factory for BaseNodeData 2026-02-03 14:21:40 +08:00
Yanli 盐粒
4f6f110014 test: fix integration webhook/http node data usage 2026-02-03 14:15:43 +08:00
Yanli 盐粒
98f302c720 test: make dify config tests ignore .env 2026-02-03 14:15:43 +08:00
Yanli 盐粒
3f957f7c0f chore: minor update 2026-02-03 14:15:43 +08:00
Yanli 盐粒
1a8b9ee1aa chore: apply ruff auto-fixes 2026-02-03 14:15:43 +08:00
Yanli 盐粒
ae65f0909c Fix workflow node data type requirement (follow #31723) 2026-02-03 14:15:43 +08:00
Yanli 盐粒
f3c6ca4a6f lint 2026-02-03 14:15:43 +08:00
Yanli 盐粒
f1b6c70893 use typed model (WebhookData and SegmentType) for the webhook service 2026-02-03 14:15:43 +08:00
Yanli 盐粒
c3bf1ac541 update the schedule trigger with typed model 2026-02-03 14:15:43 +08:00
Yanli 盐粒
1b1c1424ae make lint happy 2026-02-03 14:15:18 +08:00
Yanli 盐粒
05b109841d solve conflicts 2026-02-03 14:14:28 +08:00
Yanli 盐粒
23e00c1397 make lint happy 2026-02-03 14:06:44 +08:00
Yanli 盐粒
fdff4b15bb enhance the dynamic NodeData type inference and validation process. 2026-02-03 14:06:44 +08:00
Yanli 盐粒
4809ad9bf1 more trival updates 2026-02-03 14:06:44 +08:00
Yanli 盐粒
8d85f51a3a Refactor node configuration handling to use NodeConfigDict and improve type safety 2026-02-03 14:06:44 +08:00
13 changed files with 176 additions and 88 deletions

View File

@@ -234,7 +234,7 @@ class Workflow(Base): # bug
def get_node_config_by_id(self, node_id: str) -> NodeConfigDict:
"""Extract a node configuration from the workflow graph by node ID.
A node configuration is a dictionary containing the node's properties, including
the node's id, title, and its data as a dict.
the node's id and its validated `data` payload as a `BaseNodeData` model.
"""
workflow_graph = self.graph_dict
@@ -252,12 +252,9 @@ class Workflow(Base): # bug
return NodeConfigDictAdapter.validate_python(node_config)
@staticmethod
def get_node_type_from_node_config(node_config: Mapping[str, Any]) -> NodeType:
def get_node_type_from_node_config(node_config: NodeConfigDict) -> NodeType:
"""Extract type of a node from the node configuration returned by `get_node_config_by_id`."""
node_config_data = node_config.get("data", {})
# Get node class
node_type = NodeType(node_config_data.get("type"))
return node_type
return node_config["data"].type
@staticmethod
def get_enclosing_node_type_and_id(

View File

@@ -172,7 +172,7 @@ class TestWebhookService:
assert workflow.app_id == test_data["app"].id
assert node_config is not None
assert node_config["id"] == "webhook_node"
assert node_config["data"]["title"] == "Test Webhook"
assert node_config["data"].title == "Test Webhook"
def test_get_webhook_trigger_and_workflow_not_found(self, flask_app_with_containers):
"""Test webhook trigger not found scenario."""

View File

@@ -25,7 +25,8 @@ def test_dify_config(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setenv("HTTP_REQUEST_MAX_READ_TIMEOUT", "300") # Custom value for testing
# load dotenv file with pydantic-settings
config = DifyConfig()
# Disable `.env` loading to ensure test stability across environments
config = DifyConfig(_env_file=None)
# constant values
assert config.COMMIT_SHA == ""
@@ -59,7 +60,8 @@ def test_http_timeout_defaults(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setenv("DB_PORT", "5432")
monkeypatch.setenv("DB_DATABASE", "dify")
config = DifyConfig()
# Disable `.env` loading to ensure test stability across environments
config = DifyConfig(_env_file=None)
# Verify default timeout values
assert config.HTTP_REQUEST_MAX_CONNECT_TIMEOUT == 10
@@ -86,7 +88,8 @@ def test_flask_configs(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setenv("WEB_API_CORS_ALLOW_ORIGINS", "http://127.0.0.1:3000,*")
monkeypatch.setenv("CODE_EXECUTION_ENDPOINT", "http://127.0.0.1:8194/")
flask_app.config.from_mapping(DifyConfig().model_dump()) # pyright: ignore
# Disable `.env` loading to ensure test stability across environments
flask_app.config.from_mapping(DifyConfig(_env_file=None).model_dump()) # pyright: ignore
config = flask_app.config
# configs read from pydantic-settings

View File

@@ -126,6 +126,33 @@ def test_graph_initialization_runs_default_validators(
assert "answer" in graph.nodes
def test_graph_initialization_filters_custom_note_nodes_before_validation(
graph_init_dependencies: tuple[_SimpleNodeFactory, dict[str, object]],
):
node_factory, graph_config = graph_init_dependencies
graph_config["nodes"] = [
{
"id": "note",
"type": "custom-note",
"data": {
"type": "",
"title": "",
"text": "UI-only note node",
},
},
{"id": "start", "data": {"type": NodeType.START, "title": "Start", "execution_type": NodeExecutionType.ROOT}},
{"id": "answer", "data": {"type": NodeType.ANSWER, "title": "Answer"}},
]
graph_config["edges"] = [
{"source": "start", "target": "answer", "sourceHandle": "success"},
]
graph = Graph.init(graph_config=graph_config, node_factory=node_factory)
assert "note" not in graph.nodes
assert graph.root_node.id == "start"
def test_graph_validation_fails_for_unknown_edge_targets(
graph_init_dependencies: tuple[_SimpleNodeFactory, dict[str, object]],
) -> None:

View File

@@ -49,7 +49,7 @@ def test_node_hydrates_data_during_initialization():
node = _SampleNode(
id="node-1",
config={"id": "node-1", "data": {"title": "Sample", "foo": "bar"}},
config={"id": "node-1", "data": {"type": NodeType.ANSWER, "title": "Sample", "foo": "bar"}},
graph_init_params=init_params,
graph_runtime_state=runtime_state,
)
@@ -58,6 +58,20 @@ def test_node_hydrates_data_during_initialization():
assert node.title == "Sample"
def test_node_initialization_falls_back_to_node_type_when_data_type_is_missing():
graph_config: dict[str, object] = {}
init_params, runtime_state = _build_context(graph_config)
node = _SampleNode(
id="node-1",
config={"id": "node-1", "data": {"title": "Sample", "foo": "bar"}},
graph_init_params=init_params,
graph_runtime_state=runtime_state,
)
assert node.node_data.type == NodeType.ANSWER
def test_missing_generic_argument_raises_type_error():
graph_config: dict[str, object] = {}

View File

@@ -210,9 +210,6 @@ def test_webhook_data_model_dump_with_alias():
def test_webhook_data_validation_errors():
"""Test WebhookData validation errors."""
# Title is required (inherited from BaseNodeData)
with pytest.raises(ValidationError):
WebhookData()
# Invalid method
with pytest.raises(ValidationError):

View File

@@ -1,15 +1,21 @@
import Script from 'next/script'
'use client'
import { lazy, Suspense } from 'react'
import { IS_DEV } from '@/config'
export function ReactScanLoader() {
const ReactScan = lazy(() =>
import('./scan').then(module => ({
default: module.ReactScan,
})),
)
export const ReactScanLoader = () => {
if (!IS_DEV)
return null
return (
<Script
src="//unpkg.com/react-scan/dist/auto.global.js"
crossOrigin="anonymous"
strategy="beforeInteractive"
/>
<Suspense fallback={null}>
<ReactScan />
</Suspense>
)
}

View File

@@ -0,0 +1,22 @@
'use client'
import { useEffect } from 'react'
import { scan } from 'react-scan'
import { IS_DEV } from '@/config'
export function ReactScan() {
useEffect(() => {
if (IS_DEV) {
scan({
enabled: true,
// HACK: react-scan's getIsProduction() incorrectly detects Next.js dev as production
// because Next.js devtools overlay uses production React build
// Issue: https://github.com/aidenybai/react-scan/issues/402
// TODO: remove this option after upstream fix
dangerouslyForceRunInProduction: true,
})
}
}, [])
return null
}

View File

@@ -37,10 +37,6 @@ export async function HydrateQueryClient({
children: React.ReactNode
}) {
const dehydratedState = await getDehydratedState(searchParams)
// TODO: vinext do not handle hydration boundary well for now.
if (!dehydratedState) {
return <>{children}</>
}
return (
<HydrationBoundary state={dehydratedState}>
{children}

View File

@@ -55,8 +55,6 @@ const LocaleLayout = async ({
<link rel="icon" type="image/png" sizes="16x16" href="/icon-192x192.png" />
<meta name="msapplication-TileColor" content="#1C64F2" />
<meta name="msapplication-config" content="/browserconfig.xml" />
<ReactScanLoader />
</head>
<body
className="h-full select-auto"
@@ -64,6 +62,7 @@ const LocaleLayout = async ({
>
<div className="isolate h-full">
<PWAProvider>
<ReactScanLoader />
<JotaiProvider>
<ThemeProvider
attribute="data-theme"

View File

@@ -1,3 +1,4 @@
/// <reference no-default-lib="true" />
/// <reference lib="esnext" />
/// <reference lib="webworker" />

View File

@@ -237,7 +237,7 @@
"nock": "14.0.10",
"postcss": "8.5.6",
"postcss-js": "5.0.3",
"react-scan": "0.5.3",
"react-scan": "0.4.3",
"react-server-dom-webpack": "19.2.4",
"sass": "1.93.2",
"serwist": "9.5.4",
@@ -246,7 +246,7 @@
"tsx": "4.21.0",
"typescript": "5.9.3",
"uglify-js": "3.19.3",
"vinext": "https://pkg.pr.new/hyoban/vinext@cfae669",
"vinext": "https://pkg.pr.new/hyoban/vinext@e283197",
"vite": "7.3.1",
"vite-tsconfig-paths": "6.1.1",
"vitest": "4.0.18",

144
web/pnpm-lock.yaml generated
View File

@@ -578,8 +578,8 @@ importers:
specifier: 5.0.3
version: 5.0.3(postcss@8.5.6)
react-scan:
specifier: 0.5.3
version: 0.5.3(@types/react@19.2.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.56.0)
specifier: 0.4.3
version: 0.4.3(@types/react@19.2.9)(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.56.0)
react-server-dom-webpack:
specifier: 19.2.4
version: 19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.104.1(esbuild@0.27.2)(uglify-js@3.19.3))
@@ -605,8 +605,8 @@ importers:
specifier: 3.19.3
version: 3.19.3
vinext:
specifier: https://pkg.pr.new/hyoban/vinext@cfae669
version: https://pkg.pr.new/hyoban/vinext@cfae669(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.2)(uglify-js@3.19.3))
specifier: https://pkg.pr.new/hyoban/vinext@e283197
version: https://pkg.pr.new/hyoban/vinext@e283197(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.2)(uglify-js@3.19.3))
vite:
specifier: 7.3.1
version: 7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
@@ -2160,6 +2160,12 @@ packages:
resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
engines: {node: '>= 10.0.0'}
'@pivanov/utils@0.0.2':
resolution: {integrity: sha512-q9CN0bFWxWgMY5hVVYyBgez1jGiLBa6I+LkG37ycylPhFvEGOOeaADGtUSu46CaZasPnlY8fCdVJZmrgKb1EPA==}
peerDependencies:
react: '>=18'
react-dom: '>=18'
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -3882,8 +3888,8 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
bippy@0.5.30:
resolution: {integrity: sha512-8CFmJAHD3gmTLDOCDHuWhjm1nxHSFZdlGoWtak9r53Uxn36ynOjxBLyxXHh/7h/XiKLyPvfdXa0gXWcD9o9lLQ==}
bippy@0.3.34:
resolution: {integrity: sha512-vmptmU/20UdIWHHhq7qCSHhHzK7Ro3YJ1utU0fBG7ujUc58LEfTtilKxcF0IOgSjT5XLcm7CBzDjbv4lcKApGQ==}
peerDependencies:
react: '>=17.0.1'
@@ -4127,10 +4133,6 @@ packages:
resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
engines: {node: '>=18'}
commander@14.0.3:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -5120,6 +5122,11 @@ packages:
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -5642,8 +5649,8 @@ packages:
khroma@2.1.0:
resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
kleur@3.0.3:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
kleur@4.1.5:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
knip@5.78.0:
@@ -6082,6 +6089,10 @@ packages:
moo-color@1.0.3:
resolution: {integrity: sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==}
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -6370,6 +6381,16 @@ packages:
pkg-types@2.3.0:
resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
playwright-core@1.58.0:
resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==}
engines: {node: '>=18'}
hasBin: true
playwright@1.58.0:
resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==}
engines: {node: '>=18'}
hasBin: true
pluralize@8.0.0:
resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
engines: {node: '>=4'}
@@ -6477,10 +6498,6 @@ packages:
resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
engines: {node: '>=6'}
prompts@2.4.2:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
@@ -6652,12 +6669,25 @@ packages:
react: '>=16.3.0'
react-dom: '>=16.3.0'
react-scan@0.5.3:
resolution: {integrity: sha512-qde9PupmUf0L3MU1H6bjmoukZNbCXdMyTEwP4Gh8RQ4rZPd2GGNBgEKWszwLm96E8k+sGtMpc0B9P0KyFDP6Bw==}
react-scan@0.4.3:
resolution: {integrity: sha512-jhAQuQ1nja6HUYrSpbmNFHqZPsRCXk8Yqu0lHoRIw9eb8N96uTfXCpVyQhTTnJ/nWqnwuvxbpKVG/oWZT8+iTQ==}
hasBin: true
peerDependencies:
'@remix-run/react': '>=1.0.0'
next: '>=13.0.0'
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
react-router: ^5.0.0 || ^6.0.0 || ^7.0.0
react-router-dom: ^5.0.0 || ^6.0.0 || ^7.0.0
peerDependenciesMeta:
'@remix-run/react':
optional: true
next:
optional: true
react-router:
optional: true
react-router-dom:
optional: true
react-server-dom-webpack@19.2.4:
resolution: {integrity: sha512-zEhkWv6RhXDctC2N7yEUHg3751nvFg81ydHj8LTTZuukF/IF1gcOKqqAL6Ds+kS5HtDVACYPik0IvzkgYXPhlQ==}
@@ -7534,8 +7564,8 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
vinext@https://pkg.pr.new/hyoban/vinext@cfae669:
resolution: {integrity: sha512-4SRm/Dkou0Ib0UYexP8xg0G83jIM17XPUC32uXwLHt5lO47AisblMpDZXTh84fhN058FEHtPaAGtoFThaoZLIw==, tarball: https://pkg.pr.new/hyoban/vinext@cfae669}
vinext@https://pkg.pr.new/hyoban/vinext@e283197:
resolution: {tarball: https://pkg.pr.new/hyoban/vinext@e283197}
version: 0.0.5
engines: {node: '>=22'}
hasBin: true
@@ -7544,12 +7574,6 @@ packages:
react-dom: '>=19.2.0'
vite: ^7.0.0
vite-plugin-commonjs@0.10.4:
resolution: {integrity: sha512-eWQuvQKCcx0QYB5e5xfxBNjQKyrjEWZIR9UOkOV6JAgxVhtbZvCOF+FNC2ZijBJ3U3Px04ZMMyyMyFBVWIJ5+g==}
vite-plugin-dynamic-import@1.6.0:
resolution: {integrity: sha512-TM0sz70wfzTIo9YCxVFwS8OA9lNREsh+0vMHGSkWDTZ7bgd1Yjs5RV8EgB634l/91IsXJReg0xtmuQqP0mf+rg==}
vite-plugin-storybook-nextjs@3.2.2:
resolution: {integrity: sha512-ZJXCrhi9mW4jEJTKhJ5sUtpBe84mylU40me2aMuLSgIJo4gE/Rc559hZvMYLFTWta1gX7Rm8Co5EEHakPct+wA==}
peerDependencies:
@@ -9651,6 +9675,11 @@ snapshots:
'@parcel/watcher-win32-x64': 2.5.6
optional: true
'@pivanov/utils@0.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
'@pkgjs/parseargs@0.11.0':
optional: true
@@ -11518,7 +11547,7 @@ snapshots:
binary-extensions@2.3.0: {}
bippy@0.5.30(@types/react@19.2.9)(react@19.2.4):
bippy@0.3.34(@types/react@19.2.9)(react@19.2.4):
dependencies:
'@types/react-reconciler': 0.28.9(@types/react@19.2.9)
react: 19.2.4
@@ -11771,8 +11800,6 @@ snapshots:
commander@13.1.0: {}
commander@14.0.3: {}
commander@2.20.3: {}
commander@4.1.1: {}
@@ -12971,6 +12998,9 @@ snapshots:
fs-constants@1.0.0:
optional: true
fsevents@2.3.2:
optional: true
fsevents@2.3.3:
optional: true
@@ -13518,7 +13548,7 @@ snapshots:
khroma@2.1.0: {}
kleur@3.0.3: {}
kleur@4.1.5: {}
knip@5.78.0(@types/node@24.10.12)(typescript@5.9.3):
dependencies:
@@ -14271,6 +14301,8 @@ snapshots:
dependencies:
color-name: 1.1.4
mri@1.2.0: {}
ms@2.1.3: {}
mz@2.7.0:
@@ -14559,6 +14591,14 @@ snapshots:
exsolve: 1.0.8
pathe: 2.0.3
playwright-core@1.58.0: {}
playwright@1.58.0:
dependencies:
playwright-core: 1.58.0
optionalDependencies:
fsevents: 2.3.2
pluralize@8.0.0: {}
pnpm-workspace-yaml@1.6.0:
@@ -14668,11 +14708,6 @@ snapshots:
prismjs@1.30.0: {}
prompts@2.4.2:
dependencies:
kleur: 3.0.3
sisteransi: 1.0.5
prop-types@15.8.1:
dependencies:
loose-envify: 1.4.0
@@ -14859,24 +14894,29 @@ snapshots:
react-draggable: 4.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
tslib: 2.6.2
react-scan@0.5.3(@types/react@19.2.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.56.0):
react-scan@0.4.3(@types/react@19.2.9)(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.56.0):
dependencies:
'@babel/core': 7.29.0
'@babel/generator': 7.29.1
'@babel/types': 7.29.0
'@babel/core': 7.28.6
'@babel/generator': 7.28.6
'@babel/types': 7.28.6
'@clack/core': 0.3.5
'@clack/prompts': 0.8.2
'@pivanov/utils': 0.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@preact/signals': 1.3.2(preact@10.28.2)
'@rollup/pluginutils': 5.3.0(rollup@4.56.0)
'@types/node': 20.19.30
bippy: 0.5.30(@types/react@19.2.9)(react@19.2.4)
commander: 14.0.3
bippy: 0.3.34(@types/react@19.2.9)(react@19.2.4)
esbuild: 0.27.2
estree-walker: 3.0.3
picocolors: 1.1.1
kleur: 4.1.5
mri: 1.2.0
playwright: 1.58.0
preact: 10.28.2
prompts: 2.4.2
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
tsx: 4.21.0
optionalDependencies:
next: 16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2)
unplugin: 2.1.0
transitivePeerDependencies:
- '@types/react'
@@ -15818,7 +15858,7 @@ snapshots:
unplugin@2.1.0:
dependencies:
acorn: 8.16.0
acorn: 8.15.0
webpack-virtual-modules: 0.6.2
optional: true
@@ -15909,7 +15949,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
vinext@https://pkg.pr.new/hyoban/vinext@cfae669(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.2)(uglify-js@3.19.3)):
vinext@https://pkg.pr.new/hyoban/vinext@e283197(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.2)(uglify-js@3.19.3)):
dependencies:
'@unpic/react': 1.0.2(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@vercel/og': 0.8.6
@@ -15920,7 +15960,6 @@ snapshots:
react-server-dom-webpack: 19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.104.1(esbuild@0.27.2)(uglify-js@3.19.3))
rsc-html-stream: 0.0.7
vite: 7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite-plugin-commonjs: 0.10.4
vite-tsconfig-paths: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
transitivePeerDependencies:
- next
@@ -15928,19 +15967,6 @@ snapshots:
- typescript
- webpack
vite-plugin-commonjs@0.10.4:
dependencies:
acorn: 8.16.0
magic-string: 0.30.21
vite-plugin-dynamic-import: 1.6.0
vite-plugin-dynamic-import@1.6.0:
dependencies:
acorn: 8.16.0
es-module-lexer: 1.7.0
fast-glob: 3.3.3
magic-string: 0.30.21
vite-plugin-storybook-nextjs@3.2.2(next@16.1.5(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(storybook@10.2.13(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.12)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
'@next/env': 16.0.0