diff --git a/bun.lock b/bun.lock index 2c18cf96..6704f4df 100644 --- a/bun.lock +++ b/bun.lock @@ -268,7 +268,7 @@ }, "packages/cli": { "name": "@wrnexus/cli", - "version": "0.8.20", + "version": "0.8.21", "bin": { "wrnexus": "src/index.ts", }, @@ -317,7 +317,7 @@ }, "packages/csr": { "name": "@wrnexus/csr", - "version": "0.8.17", + "version": "0.8.18", "dependencies": { "@wrnexus/core": "workspace:*", }, @@ -332,7 +332,7 @@ }, "packages/dev-server": { "name": "@wrnexus/dev-server", - "version": "0.8.19", + "version": "0.8.20", "dependencies": { "@wrnexus/authz": "workspace:*", "@wrnexus/cache": "workspace:*", diff --git a/packages/cli/package.json b/packages/cli/package.json index e097fd2b..fa854257 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/cli", - "version": "0.8.20", + "version": "0.8.21", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/csr/package.json b/packages/csr/package.json index dc3a1f38..40aaef52 100644 --- a/packages/csr/package.json +++ b/packages/csr/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/csr", - "version": "0.8.17", + "version": "0.8.18", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/csr/src/reactive-runtime.ts b/packages/csr/src/reactive-runtime.ts index 3c98818e..4a328e58 100644 --- a/packages/csr/src/reactive-runtime.ts +++ b/packages/csr/src/reactive-runtime.ts @@ -1062,10 +1062,10 @@ export const REACTIVE_RUNTIME = String.raw` }; }, }); - var componentHydrationTarget = componentEventTarget.closest("[data-wrn-hydration]"); - var componentRpcIdentity = componentEventTarget.getAttribute("data-wrn-component") || - (componentHydrationTarget && componentHydrationTarget.getAttribute("data-wrn-hydration")) || + var componentRpcIdentity = el.getAttribute("data-wrn-component") || el.getAttribute("data-wrn-hydration") || + componentEventTarget.getAttribute("data-wrn-component") || + componentEventTarget.getAttribute("data-wrn-hydration") || "component"; var componentRpcName = String(componentRpcIdentity).split(":", 1)[0] || "component"; var serverProxy = new Proxy({}, { diff --git a/packages/csr/test/reactive.test.ts b/packages/csr/test/reactive.test.ts index a066ca05..121324d9 100644 --- a/packages/csr/test/reactive.test.ts +++ b/packages/csr/test/reactive.test.ts @@ -851,6 +851,31 @@ test("component server calls use the nearest hydration component identity", asyn expect(payload?.component).toBe("CButton"); }); +test("a parent scope does not inherit a child component RPC identity", async () => { + const win = mount( + `
` + + `
` + + `
` + + `` + + `
`, + ); + let payload: { component?: string } | undefined; + const globals = globalThis as Record; + const originalFetch = globals.fetch; + globals.fetch = async (_input: RequestInfo | URL, init?: RequestInit) => { + payload = JSON.parse(String(init?.body)); + return Response.json({ ok: true }); + }; + try { + (win.document.querySelector("#parent-action") as unknown as HTMLElement).click(); + await new Promise((resolve) => setTimeout(resolve, 0)); + } finally { + globals.fetch = originalFetch; + } + + expect(payload?.component).toBe("Home"); +}); + test("component server calls prefer the rendered CSRF token over stale cookies", async () => { const win = mount( `` + diff --git a/packages/dev-server/package.json b/packages/dev-server/package.json index 27758b42..fecad351 100644 --- a/packages/dev-server/package.json +++ b/packages/dev-server/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/dev-server", - "version": "0.8.19", + "version": "0.8.20", "type": "module", "main": "src/index.ts", "exports": {