Skip to content

Commit b8bfe22

Browse files
authored
Merge pull request #7263 from damianpumar/fix/remove-proxy-function-7254
fix(core): store property descriptor handling
2 parents af8fd6d + 1c96674 commit b8bfe22

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

packages/qwik/src/core/state/store.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,20 @@ export class ReadWriteProxyHandler implements ProxyHandler<TargetType> {
237237
: a;
238238
});
239239
}
240-
241240
getOwnPropertyDescriptor(
242241
target: TargetType,
243242
prop: string | symbol
244243
): PropertyDescriptor | undefined {
244+
const descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
245+
245246
if (isArray(target) || typeof prop === 'symbol') {
246-
return Object.getOwnPropertyDescriptor(target, prop);
247+
return descriptor;
247248
}
249+
250+
if (descriptor && !descriptor.configurable) {
251+
return descriptor;
252+
}
253+
248254
return {
249255
enumerable: true,
250256
configurable: true,
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { component$, Resource, useResource$, useStore } from "@builder.io/qwik";
2+
3+
import { server$ } from "@builder.io/qwik-city";
4+
5+
export interface Hello {
6+
print: string;
7+
}
8+
9+
const hello = server$((hello: Hello) => {
10+
// Error: 'getOwnPropertyDescriptor' on proxy: trap returned descriptor for property 'print' that is incompatible with the existing property in the proxy target
11+
return helloBar(hello);
12+
});
13+
14+
const helloBar = server$(
15+
(hello: Hello): Promise<string> =>
16+
new Promise((res) => {
17+
setTimeout(() => {
18+
res(hello.print + " Bar");
19+
}, 200);
20+
}),
21+
);
22+
export default component$(() => {
23+
const helloStore = useStore<Hello>({ print: "hello" });
24+
const resource = useResource$(({ track }) => {
25+
track(() => helloStore.print);
26+
27+
return hello(helloStore);
28+
});
29+
30+
return (
31+
<>
32+
<Resource
33+
value={resource}
34+
onPending={() => <div>Loading...</div>}
35+
onRejected={(error) => <div>Error: {error.message}</div>}
36+
onResolved={(data) => <div>Data: {data}</div>}
37+
/>
38+
39+
<button
40+
onClick$={() => {
41+
helloStore.print = "Foo";
42+
}}
43+
>
44+
Reset
45+
</button>
46+
</>
47+
);
48+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { expect, test } from "@playwright/test";
2+
3+
test.describe("Resource", () => {
4+
test("should handle the resource correctly", async ({ page }) => {
5+
await page.goto("/qwikcity-test/issue7254/");
6+
7+
await page.getByText("Data: hello Bar");
8+
9+
await page.getByRole("button", { name: "Reset" }).click();
10+
11+
await expect(page.getByText("Data: Foo Bar")).toBeVisible();
12+
});
13+
});

0 commit comments

Comments
 (0)