diff --git a/examples/angular-vite-pwa/package.json b/examples/angular-vite-pwa/package.json index 774a82ff4..4d0716a84 100644 --- a/examples/angular-vite-pwa/package.json +++ b/examples/angular-vite-pwa/package.json @@ -11,8 +11,8 @@ "dependencies": { "@angular/core": "^21.1.0", "@angular/platform-browser": "^21.1.0", - "@evolu/common": "latest", - "@evolu/web": "latest" + "@evolu/common": "workspace:*", + "@evolu/web": "workspace:*" }, "devDependencies": { "@analogjs/vite-plugin-angular": "^2.2.2", diff --git a/examples/react-electron/package.json b/examples/react-electron/package.json index 3f013008a..650211b76 100644 --- a/examples/react-electron/package.json +++ b/examples/react-electron/package.json @@ -10,9 +10,9 @@ "preview": "vite preview" }, "dependencies": { - "@evolu/common": "latest", - "@evolu/react": "latest", - "@evolu/react-web": "latest", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", "react": "19.2.4", "react-dom": "19.2.4" }, diff --git a/examples/react-expo/package.json b/examples/react-expo/package.json index 9128bde79..9ddb083ef 100644 --- a/examples/react-expo/package.json +++ b/examples/react-expo/package.json @@ -18,9 +18,9 @@ }, "dependencies": { "@blazejkustra/react-native-alert": "^1.0.0", - "@evolu/common": "latest", - "@evolu/react": "latest", - "@evolu/react-native": "latest", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-native": "workspace:*", "@expo/metro-runtime": "^6.1.2", "@expo/vector-icons": "^15.0.3", "abort-signal-polyfill": "^1.0.0", diff --git a/examples/react-nextjs/package.json b/examples/react-nextjs/package.json index e99031c0b..d2e69feb4 100644 --- a/examples/react-nextjs/package.json +++ b/examples/react-nextjs/package.json @@ -9,9 +9,9 @@ "dev": "next dev --webpack" }, "dependencies": { - "@evolu/common": "latest", - "@evolu/react": "latest", - "@evolu/react-web": "latest", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", "@tabler/icons-react": "^3.36.1", "clsx": "^2.1.1", "next": "^16.1.3", diff --git a/examples/react-vite-pwa/package.json b/examples/react-vite-pwa/package.json index 861e58c60..0567a3d14 100644 --- a/examples/react-vite-pwa/package.json +++ b/examples/react-vite-pwa/package.json @@ -11,9 +11,9 @@ "preview": "vite preview" }, "dependencies": { - "@evolu/common": "latest", - "@evolu/react": "latest", - "@evolu/react-web": "latest", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", "@tabler/icons-react": "^3.36.1", "clsx": "^2.1.1", "react": "19.2.4", diff --git a/examples/vue-vite-pwa/package.json b/examples/vue-vite-pwa/package.json index e18afc781..68bcca28f 100644 --- a/examples/vue-vite-pwa/package.json +++ b/examples/vue-vite-pwa/package.json @@ -11,9 +11,9 @@ "preview": "vite preview" }, "dependencies": { - "@evolu/common": "latest", - "@evolu/vue": "latest", - "@evolu/web": "latest", + "@evolu/common": "workspace:*", + "@evolu/vue": "workspace:*", + "@evolu/web": "workspace:*", "vue": "^3.5.26", "workbox-window": "^7.4.0" }, diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 25e9478a0..ecc3fe996 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -21,26 +21,26 @@ "exports": { ".": { "types": "./dist/src/index.d.ts", - "default": "./dist/src/index.js", - "react-native": "./dist/src/index.js" + "react-native": "./dist/src/index.js", + "default": "./dist/src/index.js" }, "./expo-sqlite": { "types": "./dist/src/exports/expo-sqlite.d.ts", - "default": "./dist/src/exports/expo-sqlite.js", "react-native": "./dist/src/exports/expo-sqlite.js", - "browser": "./dist/src/web.js" + "browser": "./dist/src/web.js", + "default": "./dist/src/exports/expo-sqlite.js" }, "./expo-op-sqlite": { "types": "./dist/src/exports/expo-op-sqlite.d.ts", - "default": "./dist/src/exports/expo-op-sqlite.js", "react-native": "./dist/src/exports/expo-op-sqlite.js", - "browser": "./dist/src/web.js" + "browser": "./dist/src/web.js", + "default": "./dist/src/exports/expo-op-sqlite.js" }, "./bare-op-sqlite": { "types": "./dist/src/exports/bare-op-sqlite.d.ts", - "default": "./dist/src/exports/bare-op-sqlite.js", "react-native": "./dist/src/exports/bare-op-sqlite.js", - "browser": "./dist/src/web.js" + "browser": "./dist/src/web.js", + "default": "./dist/src/exports/bare-op-sqlite.js" } }, "typesVersions": { diff --git a/packages/react-native/test/Task.test.ts b/packages/react-native/test/Task.test.ts index a4871272b..d379b7619 100644 --- a/packages/react-native/test/Task.test.ts +++ b/packages/react-native/test/Task.test.ts @@ -91,7 +91,8 @@ describe("createRunner", () => { const previousHandler = vi.fn(); mockErrorUtils.getGlobalHandler.mockReturnValue(previousHandler); - await using _run = createRunner(); + const console = testCreateConsole(); + await using _run = createRunner({ console }); // Get the handler that was registered const handler = mockErrorUtils.setGlobalHandler.mock.calls[0][0]; diff --git a/packages/web/test/Task.test.ts b/packages/web/test/Task.test.ts index e7d3f5bee..06bfd276b 100644 --- a/packages/web/test/Task.test.ts +++ b/packages/web/test/Task.test.ts @@ -13,7 +13,7 @@ describe("createRunner", () => { expect(run.deps.customValue).toBe(42); }); - describe("listener registration (mocked)", () => { + describe("event listeners", () => { const originalAddEventListener = globalThis.addEventListener; const originalRemoveEventListener = globalThis.removeEventListener; @@ -57,16 +57,13 @@ describe("createRunner", () => { addedListeners.get("unhandledrejection"), ); }); - }); - describe("error handling (real browser events)", () => { - test("catches and logs ErrorEvent", async () => { + test("error handler logs ErrorEvent", async () => { const console = testCreateConsole(); await using _run = createRunner({ console }); - globalThis.dispatchEvent( - new ErrorEvent("error", { error: new Error("test error") }), - ); + const handler = addedListeners.get("error")!; + handler(new ErrorEvent("error", { error: new Error("test error") })); const entries = console.getEntriesSnapshot(); expect(entries).toHaveLength(1); @@ -78,11 +75,12 @@ describe("createRunner", () => { }); }); - test("catches and logs PromiseRejectionEvent", async () => { + test("error handler logs PromiseRejectionEvent", async () => { const console = testCreateConsole(); await using _run = createRunner({ console }); - globalThis.dispatchEvent( + const handler = addedListeners.get("unhandledrejection")!; + handler( new PromiseRejectionEvent("unhandledrejection", { promise: Promise.resolve(), reason: new Error("test rejection"), @@ -98,36 +96,5 @@ describe("createRunner", () => { error: { message: "test rejection" }, }); }); - - test("stops catching events after dispose", async () => { - const console = testCreateConsole(); - - // First verify events ARE caught before dispose - { - await using _run = createRunner({ console }); - globalThis.dispatchEvent( - new ErrorEvent("error", { error: new Error("before dispose") }), - ); - } - expect(console.getEntriesSnapshot()).toHaveLength(1); - - // Verify events are NOT caught after dispose - // Prevent vitest from treating dispatched error as unhandled - const suppress = (e: Event) => e.preventDefault(); - globalThis.addEventListener("error", suppress); - - const beforeCount = console.getEntriesSnapshot().length; - - globalThis.dispatchEvent( - new ErrorEvent("error", { - error: new Error("after dispose"), - cancelable: true, - }), - ); - - globalThis.removeEventListener("error", suppress); - - expect(console.getEntriesSnapshot()).toHaveLength(beforeCount); - }); }); });