From 88833b525f19cb2d8bb864a6ab4de5889d5a8689 Mon Sep 17 00:00:00 2001 From: Alex Lohr Date: Tue, 28 Apr 2026 15:44:34 +0200 Subject: [PATCH 1/7] update: permission adapted to Solid-2.0 --- .changeset/sweet-olives-talk.md | 5 ++ packages/permission/package.json | 4 +- packages/permission/src/index.ts | 12 ++-- packages/permission/test/index.test.ts | 18 ++++-- pnpm-lock.yaml | 80 ++++++++++++++++++++------ 5 files changed, 89 insertions(+), 30 deletions(-) create mode 100644 .changeset/sweet-olives-talk.md diff --git a/.changeset/sweet-olives-talk.md b/.changeset/sweet-olives-talk.md new file mode 100644 index 000000000..a2c30d8f5 --- /dev/null +++ b/.changeset/sweet-olives-talk.md @@ -0,0 +1,5 @@ +--- +"@solid-primitives/permission": major +--- + +updated to Solid-2.0 diff --git a/packages/permission/package.json b/packages/permission/package.json index f2cbe3381..9a12f568e 100644 --- a/packages/permission/package.json +++ b/packages/permission/package.json @@ -41,7 +41,7 @@ "test:ssr": "pnpm run vitest --mode ssr" }, "peerDependencies": { - "solid-js": "^1.6.12" + "solid-js": "^2.0.0" }, "keywords": [ "permission", @@ -51,6 +51,6 @@ ], "typesVersions": {}, "devDependencies": { - "solid-js": "^1.9.7" + "solid-js": "2.0.0-beta.8" } } diff --git a/packages/permission/src/index.ts b/packages/permission/src/index.ts index 09f50c6a4..e798df77f 100644 --- a/packages/permission/src/index.ts +++ b/packages/permission/src/index.ts @@ -1,5 +1,4 @@ -import { type Accessor, createEffect, createSignal, on, onCleanup } from "solid-js"; -import { isServer } from "solid-js/web"; +import { type Accessor, createEffect, createSignal } from "solid-js"; /** * Querying the permission API @@ -10,7 +9,7 @@ import { isServer } from "solid-js/web"; export const createPermission = ( name: PermissionDescriptor | PermissionName | "microphone" | "camera", ): Accessor => { - if (isServer) { + if (globalThis.window !== globalThis) { return () => "unknown"; } const [permission, setPermission] = createSignal("unknown"); @@ -43,14 +42,15 @@ export const createPermission = ( : getUserMedia(constraints); }); createEffect( - on(status, status => { + status, + (status?: PermissionStatus) => { if (status) { setPermission(status.state); const listener = () => setPermission(status.state); status.addEventListener("change", listener); - onCleanup(() => status.removeEventListener("change", listener)); + return () => status.removeEventListener("change", listener); } - }), + } ); } return permission; diff --git a/packages/permission/test/index.test.ts b/packages/permission/test/index.test.ts index ae3a20652..033afec7d 100644 --- a/packages/permission/test/index.test.ts +++ b/packages/permission/test/index.test.ts @@ -1,6 +1,6 @@ import { __permissions__ } from "./setup.js"; -import { createEffect, createRoot } from "solid-js"; +import { createEffect, createRoot, flush } from "solid-js"; import { it, describe, expect } from "vitest"; import { createPermission } from "../src/index.js"; @@ -11,16 +11,20 @@ describe("createPermission", () => { const dispose = createRoot(dispose => { const permission = createPermission("microphone" as PermissionName); - createEffect(() => { - captured = permission(); + createEffect(permission, (state) => { + captured = state; }); return dispose; }); + flush(); + expect(captured).toEqual("unknown"); await Promise.resolve(); + flush(); + expect(captured).toEqual("granted"); dispose(); @@ -32,19 +36,23 @@ describe("createPermission", () => { const dispose = createRoot(dispose => { const permission = createPermission("camera" as PermissionName); - createEffect(() => { - captured = permission(); + createEffect(permission, (state) => { + captured = state; }); return dispose; }); + flush(); + expect(captured).toEqual("unknown"); await Promise.resolve(); + flush(); expect(captured).toEqual("denied"); __permissions__.camera.__dispatchEvent("granted"); + flush(); expect(captured).toEqual("granted"); dispose(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ecadfdb95..d038490bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -664,8 +664,8 @@ importers: packages/permission: devDependencies: solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.8 + version: 2.0.0-beta.8 packages/platform: devDependencies: @@ -1048,10 +1048,10 @@ importers: version: link:../packages/utils '@solidjs/meta': specifier: ^0.29.3 - version: 0.29.4(solid-js@1.9.7) + version: 0.29.4(solid-js@2.0.0-experimental.16) '@solidjs/router': specifier: ^0.13.1 - version: 0.13.6(solid-js@1.9.7) + version: 0.13.6(solid-js@2.0.0-experimental.16) clsx: specifier: ^2.0.0 version: 2.1.1 @@ -1078,13 +1078,13 @@ importers: version: 1.77.8 solid-dismiss: specifier: ^1.7.121 - version: 1.8.2(solid-js@1.9.7) + version: 1.8.2(solid-js@2.0.0-experimental.16) solid-icons: specifier: ^1.1.0 - version: 1.1.0(solid-js@1.9.7) + version: 1.1.0(solid-js@2.0.0-experimental.16) solid-tippy: specifier: ^0.2.1 - version: 0.2.1(solid-js@1.9.7)(tippy.js@6.3.7) + version: 0.2.1(solid-js@2.0.0-experimental.16)(tippy.js@6.3.7) tippy.js: specifier: ^6.3.7 version: 6.3.7 @@ -2587,6 +2587,12 @@ packages: peerDependencies: solid-js: ^1.5.3 + '@solidjs/signals@0.11.3': + resolution: {integrity: sha512-udMfutYPOlcxKUmc5+n1QtarsxOiAlC6LJY2TqFyaMwdXgo+reiYUcYGDlOiAPXfCLE0lavZHQ/6GT5pJbXKBA==} + + '@solidjs/signals@2.0.0-beta.8': + resolution: {integrity: sha512-4voN4js6a8miqWcOgo1wIWdGzHFqLraYaURJqHXGL4zHqTNDRRs1A3cYqhVanm3CoOCGXwyrR6Uw9zG6tzhobA==} + '@solidjs/start@1.1.4': resolution: {integrity: sha512-ma1TBYqoTju87tkqrHExMReM5Z/+DTXSmi30CCTavtwuR73Bsn4rVGqm528p4sL2koRMfAuBMkrhuttjzhL68g==} peerDependencies: @@ -5892,10 +5898,20 @@ packages: peerDependencies: seroval: ^1.0 + seroval-plugins@1.5.2: + resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + seroval@1.3.2: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} + seroval@1.5.2: + resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} + engines: {node: '>=10'} + serve-placeholder@2.0.2: resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} @@ -6001,6 +6017,12 @@ packages: solid-js@1.9.7: resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} + solid-js@2.0.0-beta.8: + resolution: {integrity: sha512-xaoGUlv4+ob4OrWTada3eibEPKxtPFr4eNVwr5fiMJYNZmyW6Qm9KChYfhUFTDp+qe4QXIz9abLRCnIzjWR/2Q==} + + solid-js@2.0.0-experimental.16: + resolution: {integrity: sha512-zZ1dU7cR0EnvLnrYiRLQbCFiDw5blLdlqmofgLzKUYE1TCMWDcisBlSwz0Ez8l4yXB4adbdhtaYCuynH4xSq9A==} + solid-refresh@0.6.3: resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} peerDependencies: @@ -8576,18 +8598,22 @@ snapshots: dependencies: solid-js: 1.9.7 - '@solidjs/meta@0.29.4(solid-js@1.9.7)': + '@solidjs/meta@0.29.4(solid-js@2.0.0-experimental.16)': dependencies: - solid-js: 1.9.7 + solid-js: 2.0.0-experimental.16 - '@solidjs/router@0.13.6(solid-js@1.9.7)': + '@solidjs/router@0.13.6(solid-js@2.0.0-experimental.16)': dependencies: - solid-js: 1.9.7 + solid-js: 2.0.0-experimental.16 '@solidjs/router@0.8.4(solid-js@1.9.7)': dependencies: solid-js: 1.9.7 + '@solidjs/signals@0.11.3': {} + + '@solidjs/signals@2.0.0-beta.8': {} + '@solidjs/start@1.1.4(solid-js@1.9.7)(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: '@tanstack/server-functions-plugin': 1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) @@ -12441,8 +12467,14 @@ snapshots: dependencies: seroval: 1.3.2 + seroval-plugins@1.5.2(seroval@1.5.2): + dependencies: + seroval: 1.5.2 + seroval@1.3.2: {} + seroval@1.5.2: {} + serve-placeholder@2.0.2: dependencies: defu: 6.1.4 @@ -12557,13 +12589,13 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - solid-dismiss@1.8.2(solid-js@1.9.7): + solid-dismiss@1.8.2(solid-js@2.0.0-experimental.16): dependencies: - solid-js: 1.9.7 + solid-js: 2.0.0-experimental.16 - solid-icons@1.1.0(solid-js@1.9.7): + solid-icons@1.1.0(solid-js@2.0.0-experimental.16): dependencies: - solid-js: 1.9.7 + solid-js: 2.0.0-experimental.16 solid-js@1.9.7: dependencies: @@ -12571,6 +12603,20 @@ snapshots: seroval: 1.3.2 seroval-plugins: 1.3.2(seroval@1.3.2) + solid-js@2.0.0-beta.8: + dependencies: + '@solidjs/signals': 2.0.0-beta.8 + csstype: 3.1.3 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + + solid-js@2.0.0-experimental.16: + dependencies: + '@solidjs/signals': 0.11.3 + csstype: 3.1.3 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-refresh@0.6.3(solid-js@1.9.7): dependencies: '@babel/generator': 7.27.5 @@ -12580,9 +12626,9 @@ snapshots: transitivePeerDependencies: - supports-color - solid-tippy@0.2.1(solid-js@1.9.7)(tippy.js@6.3.7): + solid-tippy@0.2.1(solid-js@2.0.0-experimental.16)(tippy.js@6.3.7): dependencies: - solid-js: 1.9.7 + solid-js: 2.0.0-experimental.16 tippy.js: 6.3.7 solid-transition-group@0.2.3(solid-js@1.9.7): From cf498eea98d9365bc2af2984bf62d9f089a14310 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Mon, 11 May 2026 10:14:01 -0400 Subject: [PATCH 2/7] Initial commit --- .changeset/notification-initial.md | 14 + packages/notification/LICENSE | 21 ++ packages/notification/README.md | 159 +++++++++ packages/notification/dev/index.tsx | 62 ++++ packages/notification/package.json | 69 ++++ packages/notification/src/index.ts | 189 +++++++++++ packages/notification/test/index.test.ts | 374 ++++++++++++++++++++++ packages/notification/test/server.test.ts | 42 +++ packages/notification/tsconfig.json | 16 + pnpm-lock.yaml | 13 + 10 files changed, 959 insertions(+) create mode 100644 .changeset/notification-initial.md create mode 100644 packages/notification/LICENSE create mode 100644 packages/notification/README.md create mode 100644 packages/notification/dev/index.tsx create mode 100644 packages/notification/package.json create mode 100644 packages/notification/src/index.ts create mode 100644 packages/notification/test/index.test.ts create mode 100644 packages/notification/test/server.test.ts create mode 100644 packages/notification/tsconfig.json diff --git a/.changeset/notification-initial.md b/.changeset/notification-initial.md new file mode 100644 index 000000000..d3d6c1eda --- /dev/null +++ b/.changeset/notification-initial.md @@ -0,0 +1,14 @@ +--- +"@solid-primitives/notification": minor +--- + +Add `@solid-primitives/notification` package (Stage 0) + +New primitives for the browser [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API). + +- **`isNotificationSupported()`** — SSR-safe runtime check for Notifications API availability. +- **`makeNotification(title, options?)`** — Non-reactive helper returning `[show, close]`. `show()` creates and returns a `Notification` instance (or `null` when permission is not `"granted"`); calling it again replaces the previous notification. No Solid lifecycle dependency. +- **`createNotification(title, options?)`** — Reactive primitive returning `{ show, close, notification, supported }`. Accepts reactive accessors for `title` and `options` — their current values are read at `show()` time. The `notification` accessor tracks the live instance, updating to `null` when it is dismissed by the OS or closed programmatically. Cleans up automatically on owner disposal. +- **`createNotificationPermission()`** — Reactive permission manager returning `{ permission, requestPermission }`. The `permission` accessor reflects `Notification.permission` and updates after each `requestPermission()` call. Degrades gracefully to `"denied"` on the server. + +Peer dependencies: `solid-js@^2.0.0-beta.10` and `@solidjs/web@^2.0.0-beta.10`. diff --git a/packages/notification/LICENSE b/packages/notification/LICENSE new file mode 100644 index 000000000..38b41d975 --- /dev/null +++ b/packages/notification/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Solid Primitives Working Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/notification/README.md b/packages/notification/README.md new file mode 100644 index 000000000..cc7e207b9 --- /dev/null +++ b/packages/notification/README.md @@ -0,0 +1,159 @@ +

+ Solid Primitives notification +

+ +# @solid-primitives/notification + +[![size](https://img.shields.io/bundlephobia/minzip/@solid-primitives/notification?style=for-the-badge&label=size)](https://bundlephobia.com/package/@solid-primitives/notification) +[![version](https://img.shields.io/npm/v/@solid-primitives/notification?style=for-the-badge)](https://www.npmjs.com/package/@solid-primitives/notification) +[![stage](https://img.shields.io/endpoint?style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-0.json)](https://github.com/solidjs-community/solid-primitives#contribution-process) + +Primitives for the browser [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API) with reactive permission management. + +- **`isNotificationSupported`** — SSR-safe check for Notifications API availability. +- **`makeNotification`** — Non-reactive helper returning `[show, close]`. No Solid lifecycle dependency. +- **`createNotification`** — Reactive primitive that tracks the live `Notification` instance and cleans up on owner disposal. +- **`createNotificationPermission`** — Reactive permission manager that exposes a signal and a `requestPermission` function. + +## Installation + +```bash +npm install @solid-primitives/notification +# or +yarn add @solid-primitives/notification +# or +pnpm add @solid-primitives/notification +``` + +## How to use it + +### `isNotificationSupported` + +Returns `true` when the Notifications API is available. Always `false` on the server. + +```ts +import { isNotificationSupported } from "@solid-primitives/notification"; + +if (isNotificationSupported()) { + console.log("notifications available"); +} +``` + +--- + +### `makeNotification` + +Non-reactive helper with no Solid lifecycle dependency. Both returned functions are no-ops when the API is unavailable. + +`show()` returns `null` when `Notification.permission` is not `"granted"` — use `createNotificationPermission` to request permission first. + +```ts +import { makeNotification } from "@solid-primitives/notification"; + +const [show, close] = makeNotification("New message", { body: "Hello!" }); + +button.addEventListener("click", () => show()); + +// Close programmatically at any time +close(); +``` + +--- + +### `createNotification` + +Reactive primitive tied to the current reactive owner. + +- `title` and `options` can be plain values **or** reactive accessors — their current values are read each time `show()` is called. +- `notification` is a reactive `Accessor` that reflects the live instance, updating to `null` when the notification is dismissed (either programmatically or by the OS). +- The notification is automatically closed when the reactive owner is disposed. + +```ts +import { createNotification } from "@solid-primitives/notification"; + +const { show, close, notification, supported } = createNotification( + () => `You have ${unread()} messages`, + { icon: "/icon.png" }, +); + +// Show a notification (reads reactive title at call time) +show(); + +// React to visibility changes +createEffect(() => { + if (notification()) console.log("notification visible"); + else console.log("notification gone"); +}); + +// Close programmatically +close(); +``` + +--- + +### `createNotificationPermission` + +Reactive permission manager. The `permission` accessor updates after each `requestPermission()` call. + +On the server or when the API is unavailable, `permission` always returns `"denied"` and `requestPermission` resolves immediately to `"denied"`. + +```ts +import { createNotificationPermission } from "@solid-primitives/notification"; + +const { permission, requestPermission } = createNotificationPermission(); + +// Gate UI on permission state + + + + +// Await the result +const result = await requestPermission(); +// result: "granted" | "denied" | "default" +``` + +--- + +### Full example + +```tsx +import { + createNotification, + createNotificationPermission, + isNotificationSupported, +} from "@solid-primitives/notification"; + +const NotificationDemo: Component = () => { + const { permission, requestPermission } = createNotificationPermission(); + const { show, close, notification } = createNotification("Solid Primitives", { + body: "Hello from SolidJS!", + }); + + return ( + Not supported

}> +

Permission: {permission()}

+

Active: {notification() ? "yes" : "no"}

+ + + + + +
+ ); +}; +``` + +## Types + +```ts +// Standard DOM type re-exported for convenience +type NotificationPermission = "granted" | "denied" | "default"; +``` + +## Browser Support + +The [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API#browser_compatibility) is supported in all modern browsers. It is not available in iOS Safari (as of 2025) or on the server. All primitives degrade gracefully — `show()` returns `null`, `close()` is a no-op. + +## Changelog + +See [CHANGELOG.md](./CHANGELOG.md) diff --git a/packages/notification/dev/index.tsx b/packages/notification/dev/index.tsx new file mode 100644 index 000000000..1aeecbefa --- /dev/null +++ b/packages/notification/dev/index.tsx @@ -0,0 +1,62 @@ +import { type Component, createSignal, Show } from "solid-js"; +import { + isNotificationSupported, + createNotification, + createNotificationPermission, +} from "../src/index.js"; + +const App: Component = () => { + const supported = isNotificationSupported(); + const [body, setBody] = createSignal("Hello from Solid Primitives!"); + const { permission, requestPermission } = createNotificationPermission(); + const { show, close, notification } = createNotification( + () => "Solid Primitives Notification", + () => ({ body: body() }), + ); + + return ( +
+
+

Notification Primitive

+ + Notifications API is not supported in this browser.

} + > +

+ Permission: {permission()} +

+

+ Active notification: {notification() ? "visible" : "none"} +

+ + + +
+ + + + + +
+
+
+
+ ); +}; + +export default App; diff --git a/packages/notification/package.json b/packages/notification/package.json new file mode 100644 index 000000000..b21590c41 --- /dev/null +++ b/packages/notification/package.json @@ -0,0 +1,69 @@ +{ + "name": "@solid-primitives/notification", + "version": "0.0.100", + "description": "Primitives for the browser Notifications API with reactive permission management", + "author": "David Di Biase ", + "contributors": [], + "license": "MIT", + "homepage": "https://primitives.solidjs.community/package/notification", + "repository": { + "type": "git", + "url": "git+https://github.com/solidjs-community/solid-primitives.git" + }, + "bugs": { + "url": "https://github.com/solidjs-community/solid-primitives/issues" + }, + "primitive": { + "name": "notification", + "stage": 0, + "list": [ + "isNotificationSupported", + "makeNotification", + "createNotification", + "createNotificationPermission" + ], + "category": "Browser APIs" + }, + "keywords": [ + "solid", + "notification", + "browser", + "permission", + "primitives" + ], + "private": false, + "sideEffects": false, + "files": [ + "dist" + ], + "type": "module", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "browser": {}, + "exports": { + "import": { + "@solid-primitives/source": "./src/index.ts", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "typesVersions": {}, + "scripts": { + "dev": "node --import=@nothing-but/node-resolve-ts --experimental-transform-types ../../scripts/dev.ts", + "build": "node --import=@nothing-but/node-resolve-ts --experimental-transform-types ../../scripts/build.ts", + "vitest": "vitest -c ../../configs/vitest.config.ts", + "test": "pnpm run vitest", + "test:ssr": "pnpm run vitest --mode ssr" + }, + "peerDependencies": { + "@solidjs/web": "^2.0.0-beta.10", + "solid-js": "^2.0.0-beta.10" + }, + "dependencies": { + "@solid-primitives/utils": "workspace:^" + }, + "devDependencies": { + "@solidjs/web": "2.0.0-beta.10", + "solid-js": "2.0.0-beta.10" + } +} diff --git a/packages/notification/src/index.ts b/packages/notification/src/index.ts new file mode 100644 index 000000000..b5a6afcae --- /dev/null +++ b/packages/notification/src/index.ts @@ -0,0 +1,189 @@ +import { createSignal, onCleanup, type Accessor } from "solid-js"; +import { isServer } from "@solidjs/web"; +import { INTERNAL_OPTIONS, noop, access, type MaybeAccessor } from "@solid-primitives/utils"; + +/** + * Returns `true` when the [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API) + * is available in the current environment. + */ +export const isNotificationSupported = (): boolean => !isServer && "Notification" in window; + +/** + * Non-reactive notification helper. No Solid lifecycle dependency. + * Both returned functions are no-ops / return `null` when the API is unavailable. + * + * Permission must be `"granted"` before calling `show()` — use + * `createNotificationPermission` to request it reactively. + * + * @param title Notification title. + * @param options Standard `NotificationOptions` (body, icon, tag, etc.). + * @returns `[show, close]` — `show()` creates and returns the `Notification` + * (or `null` when permission is not `"granted"`); `close()` dismisses it. + * + * @example + * ```ts + * const [show, close] = makeNotification("New message", { body: "Hello!" }); + * button.addEventListener("click", () => show()); + * ``` + */ +export function makeNotification( + title: string, + options?: NotificationOptions, +): [show: () => Notification | null, close: VoidFunction] { + if (!isNotificationSupported()) return [() => null, noop]; + + let current: Notification | undefined; + let closeHandler: VoidFunction | undefined; + + const close: VoidFunction = () => { + if (current && closeHandler) { + current.removeEventListener("close", closeHandler); + closeHandler = undefined; + } + current?.close(); + current = undefined; + }; + + const show = (): Notification | null => { + if (Notification.permission !== "granted") return null; + close(); + const n = new Notification(title, options); + current = n; + closeHandler = () => { + if (current === n) { + current = undefined; + closeHandler = undefined; + } + }; + n.addEventListener("close", closeHandler); + return n; + }; + + return [show, close]; +} + +/** + * Reactive notification primitive tied to the current reactive owner. + * + * Accepts reactive `title` and `options` — their current values are read each + * time `show()` is called. The `notification` accessor tracks the live + * `Notification` instance, updating to `null` when it is dismissed or closed. + * The notification is closed automatically on owner disposal. + * + * Permission must be `"granted"` before calling `show()` — use + * `createNotificationPermission` to request it reactively. + * + * @param title Notification title, or a reactive accessor returning one. + * @param options Standard `NotificationOptions`, or a reactive accessor. + * @returns `{ show, close, notification, supported }` + * + * @example + * ```ts + * const { show, close, notification } = createNotification( + * () => `You have ${unread()} messages`, + * { icon: "/icon.png" }, + * ); + * + * createEffect(() => { + * if (notification()) console.log("notification is visible"); + * }); + * ``` + */ +export function createNotification( + title: MaybeAccessor, + options?: MaybeAccessor, +): { + show: () => Notification | null; + close: VoidFunction; + notification: Accessor; + supported: boolean; +} { + const supported = isNotificationSupported(); + + if (!supported) { + return { show: () => null, close: noop, notification: () => null, supported }; + } + + const [notification, setNotification] = createSignal(null, INTERNAL_OPTIONS); + let current: Notification | null = null; + let closeHandler: VoidFunction | undefined; + + const close: VoidFunction = () => { + if (current && closeHandler) { + current.removeEventListener("close", closeHandler); + closeHandler = undefined; + } + current?.close(); + current = null; + setNotification(null); + }; + + const show = (): Notification | null => { + if (Notification.permission !== "granted") return null; + close(); + const n = new Notification(access(title), access(options)); + current = n; + closeHandler = () => { + if (current === n) { + current = null; + closeHandler = undefined; + setNotification(null); + } + }; + n.addEventListener("close", closeHandler); + setNotification(n); + return n; + }; + + onCleanup(close); + + return { show, close, notification, supported }; +} + +/** + * Reactive notification permission manager. + * + * The `permission` accessor reflects the current `Notification.permission` + * value and updates after each `requestPermission()` call. Use this to + * reactively gate UI controls or notification logic on permission state. + * + * On the server or when the Notifications API is unavailable, `permission` + * always returns `"denied"` and `requestPermission` resolves to `"denied"`. + * + * @returns `{ permission, requestPermission }` + * + * @example + * ```ts + * const { permission, requestPermission } = createNotificationPermission(); + * + * createEffect(() => { + * if (permission() === "granted") showWelcomeNotification(); + * }); + * + * + * ``` + */ +export function createNotificationPermission(): { + permission: Accessor; + requestPermission: () => Promise; +} { + if (!isNotificationSupported()) { + return { + permission: () => "denied" as NotificationPermission, + requestPermission: () => Promise.resolve("denied" as NotificationPermission), + }; + } + + const [permission, setPermission] = createSignal( + Notification.permission, + INTERNAL_OPTIONS, + ); + + const requestPermission = async (): Promise => { + const result = await Notification.requestPermission(); + setPermission(result); + return result; + }; + + return { permission, requestPermission }; +} diff --git a/packages/notification/test/index.test.ts b/packages/notification/test/index.test.ts new file mode 100644 index 000000000..509bba290 --- /dev/null +++ b/packages/notification/test/index.test.ts @@ -0,0 +1,374 @@ +import { describe, test, expect, vi, beforeAll, afterAll, beforeEach } from "vitest"; +import { createRoot, createSignal, flush } from "solid-js"; +import { + isNotificationSupported, + makeNotification, + createNotification, + createNotificationPermission, +} from "../src/index.js"; + +// ── Mock Notification API ───────────────────────────────────────────────────── + +class MockNotification { + static permission: NotificationPermission = "granted"; + static requestPermission = vi.fn().mockResolvedValue("granted" as NotificationPermission); + static instances: MockNotification[] = []; + + title: string; + private listeners: Map void)[]> = new Map(); + + constructor(title: string, _options?: NotificationOptions) { + this.title = title; + MockNotification.instances.push(this); + } + + close = vi.fn().mockImplementation(() => { + this.listeners.get("close")?.forEach(fn => fn()); + }); + + addEventListener = vi.fn().mockImplementation((event: string, fn: () => void) => { + const list = this.listeners.get(event) ?? []; + list.push(fn); + this.listeners.set(event, list); + }); + + removeEventListener = vi.fn().mockImplementation((event: string, fn: () => void) => { + const list = this.listeners.get(event) ?? []; + this.listeners.set( + event, + list.filter(f => f !== fn), + ); + }); + + /** Test helper: simulate the OS dismissing the notification externally. */ + simulateClose() { + this.listeners.get("close")?.forEach(fn => fn()); + } +} + +beforeAll(() => { + Object.defineProperty(window, "Notification", { + value: MockNotification, + configurable: true, + writable: true, + }); +}); + +afterAll(() => { + Object.defineProperty(window, "Notification", { + value: undefined, + configurable: true, + }); +}); + +beforeEach(() => { + MockNotification.instances = []; + MockNotification.permission = "granted"; + MockNotification.requestPermission.mockClear().mockResolvedValue("granted"); +}); + +// ── isNotificationSupported ─────────────────────────────────────────────────── + +describe("isNotificationSupported", () => { + test("returns true when Notification is available", () => { + expect(isNotificationSupported()).toBe(true); + }); +}); + +// ── makeNotification ────────────────────────────────────────────────────────── + +describe("makeNotification", () => { + test("show creates a Notification with the given title", () => { + const [show] = makeNotification("Hello"); + show(); + expect(MockNotification.instances).toHaveLength(1); + expect(MockNotification.instances[0]!.title).toBe("Hello"); + }); + + test("show returns the Notification instance", () => { + const [show] = makeNotification("Hello"); + const n = show(); + expect(n).toBeInstanceOf(MockNotification); + }); + + test("show returns null when permission is not granted", () => { + MockNotification.permission = "denied"; + const [show] = makeNotification("Hello"); + expect(show()).toBeNull(); + expect(MockNotification.instances).toHaveLength(0); + }); + + test("close dismisses the current notification", () => { + const [show, close] = makeNotification("Hello"); + show(); + const instance = MockNotification.instances[0]!; + close(); + expect(instance.close).toHaveBeenCalled(); + }); + + test("show replaces an existing notification", () => { + const [show] = makeNotification("Hello"); + show(); + const first = MockNotification.instances[0]!; + show(); + expect(first.close).toHaveBeenCalled(); + expect(MockNotification.instances).toHaveLength(2); + }); + + test("external close clears internal reference so close() becomes a no-op", () => { + const [show, close] = makeNotification("Hello"); + show(); + const instance = MockNotification.instances[0]!; + instance.simulateClose(); // OS dismissed it + instance.close.mockClear(); + close(); // should be a no-op — reference already cleared + expect(instance.close).not.toHaveBeenCalled(); + }); + + test("close removes the event listener before closing", () => { + const [show, close] = makeNotification("Hello"); + show(); + const instance = MockNotification.instances[0]!; + close(); + expect(instance.removeEventListener).toHaveBeenCalledWith("close", expect.any(Function)); + }); +}); + +// ── createNotification ──────────────────────────────────────────────────────── + +describe("createNotification", () => { + test("initial state: notification is null, supported is true", () => { + createRoot(dispose => { + const { notification, supported } = createNotification("Hello"); + expect(notification()).toBeNull(); + expect(supported).toBe(true); + dispose(); + }); + }); + + test("show creates a Notification and updates the signal", () => { + const { show, notification, dispose } = createRoot(dispose => { + const { show, notification } = createNotification("Hello"); + return { show, notification, dispose }; + }); + + show(); + flush(); + expect(notification()).toBeInstanceOf(MockNotification); + expect((notification() as MockNotification).title).toBe("Hello"); + + dispose(); + }); + + test("show returns the Notification instance", () => { + const { show, dispose } = createRoot(dispose => { + const { show } = createNotification("Hello"); + return { show, dispose }; + }); + + const n = show(); + expect(n).toBeInstanceOf(MockNotification); + + dispose(); + }); + + test("show returns null and does not update signal when permission is denied", () => { + MockNotification.permission = "denied"; + + const { show, notification, dispose } = createRoot(dispose => { + const { show, notification } = createNotification("Hello"); + return { show, notification, dispose }; + }); + + const result = show(); + flush(); + expect(result).toBeNull(); + expect(notification()).toBeNull(); + + dispose(); + }); + + test("close dismisses the notification and sets signal to null", () => { + const { show, close, notification, dispose } = createRoot(dispose => { + const { show, close, notification } = createNotification("Hello"); + return { show, close, notification, dispose }; + }); + + show(); + flush(); + expect(notification()).not.toBeNull(); + + close(); + flush(); + expect(notification()).toBeNull(); + expect(MockNotification.instances[0]!.close).toHaveBeenCalled(); + + dispose(); + }); + + test("external close (OS dismiss) sets signal to null", () => { + const { show, notification, dispose } = createRoot(dispose => { + const { show, notification } = createNotification("Hello"); + return { show, notification, dispose }; + }); + + show(); + flush(); + expect(notification()).not.toBeNull(); + + MockNotification.instances[0]!.simulateClose(); + flush(); + expect(notification()).toBeNull(); + + dispose(); + }); + + test("show replaces an existing notification", () => { + const { show, notification, dispose } = createRoot(dispose => { + const { show, notification } = createNotification("Hello"); + return { show, notification, dispose }; + }); + + show(); + flush(); + const first = notification(); + + show(); + flush(); + const second = notification(); + + expect(first).not.toBe(second); + expect((first as MockNotification).close).toHaveBeenCalled(); + expect(MockNotification.instances).toHaveLength(2); + + dispose(); + }); + + test("dispose closes the notification", () => { + const { show, dispose } = createRoot(dispose => { + const { show } = createNotification("Hello"); + return { show, dispose }; + }); + + show(); + flush(); + const instance = MockNotification.instances[0]!; + instance.close.mockClear(); + + dispose(); + expect(instance.close).toHaveBeenCalled(); + }); + + test("close removes the event listener before closing", () => { + const { show, close, dispose } = createRoot(dispose => { + const { show, close } = createNotification("Hello"); + return { show, close, dispose }; + }); + + show(); + flush(); + const instance = MockNotification.instances[0]!; + close(); + expect(instance.removeEventListener).toHaveBeenCalledWith("close", expect.any(Function)); + + dispose(); + }); + + test("reactive title: reads current accessor value at show() time", () => { + const [title, setTitle] = createSignal("First"); + + const { show, notification, dispose } = createRoot(dispose => { + const { show, notification } = createNotification(title); + return { show, notification, dispose }; + }); + + show(); + flush(); + expect((notification() as MockNotification).title).toBe("First"); + + setTitle("Second"); + flush(); + // title signal changed but notification is still showing "First" — re-show not automatic + expect((notification() as MockNotification).title).toBe("First"); + + // calling show() again reads the updated title + show(); + flush(); + expect((notification() as MockNotification).title).toBe("Second"); + + dispose(); + }); +}); + +// ── createNotificationPermission ────────────────────────────────────────────── + +describe("createNotificationPermission", () => { + test("permission reflects Notification.permission on creation", () => { + MockNotification.permission = "default"; + + createRoot(dispose => { + const { permission } = createNotificationPermission(); + expect(permission()).toBe("default"); + dispose(); + }); + }); + + test("requestPermission calls Notification.requestPermission", async () => { + const { requestPermission, dispose } = createRoot(dispose => { + const { requestPermission } = createNotificationPermission(); + return { requestPermission, dispose }; + }); + + await requestPermission(); + expect(MockNotification.requestPermission).toHaveBeenCalledOnce(); + + dispose(); + }); + + test("permission updates after requestPermission resolves to granted", async () => { + MockNotification.permission = "default"; + MockNotification.requestPermission.mockResolvedValue("granted"); + + const { permission, requestPermission, dispose } = createRoot(dispose => { + const { permission, requestPermission } = createNotificationPermission(); + return { permission, requestPermission, dispose }; + }); + + expect(permission()).toBe("default"); + await requestPermission(); + flush(); + expect(permission()).toBe("granted"); + + dispose(); + }); + + test("permission updates after requestPermission resolves to denied", async () => { + MockNotification.permission = "default"; + MockNotification.requestPermission.mockResolvedValue("denied"); + + const { permission, requestPermission, dispose } = createRoot(dispose => { + const { permission, requestPermission } = createNotificationPermission(); + return { permission, requestPermission, dispose }; + }); + + await requestPermission(); + flush(); + expect(permission()).toBe("denied"); + + dispose(); + }); + + test("requestPermission returns the resolved permission value", async () => { + MockNotification.requestPermission.mockResolvedValue("granted"); + + const { requestPermission, dispose } = createRoot(dispose => { + const { requestPermission } = createNotificationPermission(); + return { requestPermission, dispose }; + }); + + const result = await requestPermission(); + expect(result).toBe("granted"); + + dispose(); + }); +}); diff --git a/packages/notification/test/server.test.ts b/packages/notification/test/server.test.ts new file mode 100644 index 000000000..a5b909991 --- /dev/null +++ b/packages/notification/test/server.test.ts @@ -0,0 +1,42 @@ +import { describe, test, expect } from "vitest"; +import { + isNotificationSupported, + makeNotification, + createNotification, + createNotificationPermission, +} from "../src/index.js"; + +describe("isNotificationSupported (SSR)", () => { + test("returns false on the server", () => { + expect(isNotificationSupported()).toBe(false); + }); +}); + +describe("makeNotification (SSR)", () => { + test("returns no-op functions without throwing", () => { + const [show, close] = makeNotification("Hello", { body: "World" }); + expect(typeof show).toBe("function"); + expect(typeof close).toBe("function"); + expect(show()).toBeNull(); + expect(() => close()).not.toThrow(); + }); +}); + +describe("createNotification (SSR)", () => { + test("returns static defaults without throwing", () => { + const { show, close, notification, supported } = createNotification("Hello"); + expect(supported).toBe(false); + expect(notification()).toBeNull(); + expect(show()).toBeNull(); + expect(() => close()).not.toThrow(); + }); +}); + +describe("createNotificationPermission (SSR)", () => { + test("returns denied permission without throwing", async () => { + const { permission, requestPermission } = createNotificationPermission(); + expect(permission()).toBe("denied"); + const result = await requestPermission(); + expect(result).toBe("denied"); + }); +}); diff --git a/packages/notification/tsconfig.json b/packages/notification/tsconfig.json new file mode 100644 index 000000000..dc1970e16 --- /dev/null +++ b/packages/notification/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "rootDir": "src" + }, + "references": [ + { + "path": "../utils" + } + ], + "include": [ + "src" + ] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 70787571b..af00d92b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -644,6 +644,19 @@ importers: specifier: ^1.9.7 version: 1.9.7 + packages/notification: + dependencies: + '@solid-primitives/utils': + specifier: workspace:^ + version: link:../utils + devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + solid-js: + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10 + packages/orientation: dependencies: '@solid-primitives/utils': From ef5857a6d19b731fb9354068e76e05bdc64168fd Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Mon, 11 May 2026 10:42:12 -0400 Subject: [PATCH 3/7] new: notification primitive + permission beta.10 migration - Add @solid-primitives/notification package (stage 0) with isNotificationSupported, makeNotification, createNotification, createNotificationPermission - Migrate @solid-primitives/permission to Solid 2.0 beta.10: isServer from @solidjs/web, ownedWrite on signals, split createEffect with closure-based cleanup, onCleanup at function scope Co-Authored-By: Claude Sonnet 4.6 --- packages/notification/README.md | 49 +++- packages/notification/package.json | 1 + packages/notification/src/index.ts | 113 ++++++--- packages/notification/test/index.test.ts | 290 ++++++++++++++++------ packages/notification/test/server.test.ts | 4 +- packages/notification/tsconfig.json | 3 + packages/permission/README.md | 74 +++++- packages/permission/package.json | 6 +- packages/permission/src/index.ts | 35 ++- packages/permission/test/index.test.ts | 37 +-- pnpm-lock.yaml | 10 +- 11 files changed, 445 insertions(+), 177 deletions(-) diff --git a/packages/notification/README.md b/packages/notification/README.md index cc7e207b9..d8ef38d4d 100644 --- a/packages/notification/README.md +++ b/packages/notification/README.md @@ -13,7 +13,7 @@ Primitives for the browser [Notifications API](https://developer.mozilla.org/en- - **`isNotificationSupported`** — SSR-safe check for Notifications API availability. - **`makeNotification`** — Non-reactive helper returning `[show, close]`. No Solid lifecycle dependency. - **`createNotification`** — Reactive primitive that tracks the live `Notification` instance and cleans up on owner disposal. -- **`createNotificationPermission`** — Reactive permission manager that exposes a signal and a `requestPermission` function. +- **`createNotificationPermission`** — Reactive permission manager that exposes a live permission signal and a `requestPermission` function. ## Installation @@ -47,17 +47,25 @@ Non-reactive helper with no Solid lifecycle dependency. Both returned functions `show()` returns `null` when `Notification.permission` is not `"granted"` — use `createNotificationPermission` to request permission first. +Because `makeNotification` has no reactive owner, **cleanup is the caller's responsibility**. Inside a reactive scope, register `close` with `onCleanup`: + ```ts +import { onCleanup } from "solid-js"; import { makeNotification } from "@solid-primitives/notification"; const [show, close] = makeNotification("New message", { body: "Hello!" }); +// Register cleanup with the current reactive owner +onCleanup(close); + button.addEventListener("click", () => show()); -// Close programmatically at any time +// Or close programmatically at any time close(); ``` +Outside a reactive scope (e.g. in plain event handlers), call `close()` directly when done. + --- ### `createNotification` @@ -67,6 +75,7 @@ Reactive primitive tied to the current reactive owner. - `title` and `options` can be plain values **or** reactive accessors — their current values are read each time `show()` is called. - `notification` is a reactive `Accessor` that reflects the live instance, updating to `null` when the notification is dismissed (either programmatically or by the OS). - The notification is automatically closed when the reactive owner is disposed. +- Pass an optional `handlers` object to respond to notification events. ```ts import { createNotification } from "@solid-primitives/notification"; @@ -74,6 +83,11 @@ import { createNotification } from "@solid-primitives/notification"; const { show, close, notification, supported } = createNotification( () => `You have ${unread()} messages`, { icon: "/icon.png" }, + { + onClick: n => { window.focus(); }, + onClose: n => { console.log("dismissed"); }, + onError: n => { console.error("notification failed"); }, + }, ); // Show a notification (reads reactive title at call time) @@ -93,9 +107,13 @@ close(); ### `createNotificationPermission` -Reactive permission manager. The `permission` accessor updates after each `requestPermission()` call. +Reactive permission manager built on the browser [Permissions API](https://developer.mozilla.org/en-US/docs/Web/API/Permissions_API). + +The `permission` accessor reflects the **live** permission state and updates automatically whenever it changes — including after `requestPermission()` resolves or the user edits their browser settings directly. -On the server or when the API is unavailable, `permission` always returns `"denied"` and `requestPermission` resolves immediately to `"denied"`. +Permission values follow Permissions API vocabulary: `"granted"`, `"denied"`, `"prompt"` (not yet asked), or `"unknown"` while the initial async query is still resolving. Note that the Notifications API uses `"default"` for the same concept that the Permissions API calls `"prompt"`. + +On the server or when the API is unavailable, `permission` always returns `"unknown"` and `requestPermission` resolves immediately to `"denied"`. ```ts import { createNotificationPermission } from "@solid-primitives/notification"; @@ -107,7 +125,7 @@ const { permission, requestPermission } = createNotificationPermission(); -// Await the result +// Await the result (returns the raw NotificationPermission value) const result = await requestPermission(); // result: "granted" | "denied" | "default" ``` @@ -125,9 +143,11 @@ import { const NotificationDemo: Component = () => { const { permission, requestPermission } = createNotificationPermission(); - const { show, close, notification } = createNotification("Solid Primitives", { - body: "Hello from SolidJS!", - }); + const { show, close, notification } = createNotification( + "Solid Primitives", + { body: "Hello from SolidJS!" }, + { onClick: () => window.focus() }, + ); return ( Not supported

}> @@ -146,13 +166,20 @@ const NotificationDemo: Component = () => { ## Types ```ts -// Standard DOM type re-exported for convenience -type NotificationPermission = "granted" | "denied" | "default"; +/** Event handler callbacks for `createNotification`. */ +type NotificationEventHandlers = { + /** Called when the user clicks the notification. */ + onClick?: (notification: Notification) => void; + /** Called when the notification is dismissed, whether by the user, the OS, or `close()`. */ + onClose?: (notification: Notification) => void; + /** Called when the notification fails to display. */ + onError?: (notification: Notification) => void; +}; ``` ## Browser Support -The [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API#browser_compatibility) is supported in all modern browsers. It is not available in iOS Safari (as of 2025) or on the server. All primitives degrade gracefully — `show()` returns `null`, `close()` is a no-op. +The [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API#browser_compatibility) is supported in all modern browsers. It is not available in iOS Safari (as of 2025) or on the server. All primitives degrade gracefully — `show()` returns `null`, `close()` is a no-op, and `permission()` returns `"unknown"`. ## Changelog diff --git a/packages/notification/package.json b/packages/notification/package.json index b21590c41..a8f18e92e 100644 --- a/packages/notification/package.json +++ b/packages/notification/package.json @@ -60,6 +60,7 @@ "solid-js": "^2.0.0-beta.10" }, "dependencies": { + "@solid-primitives/permission": "workspace:^", "@solid-primitives/utils": "workspace:^" }, "devDependencies": { diff --git a/packages/notification/src/index.ts b/packages/notification/src/index.ts index b5a6afcae..d6fa2df68 100644 --- a/packages/notification/src/index.ts +++ b/packages/notification/src/index.ts @@ -1,6 +1,7 @@ import { createSignal, onCleanup, type Accessor } from "solid-js"; import { isServer } from "@solidjs/web"; -import { INTERNAL_OPTIONS, noop, access, type MaybeAccessor } from "@solid-primitives/utils"; +import { INTERNAL_OPTIONS, isDev, noop, access, type MaybeAccessor } from "@solid-primitives/utils"; +import { createPermission } from "@solid-primitives/permission"; /** * Returns `true` when the [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API) @@ -45,7 +46,13 @@ export function makeNotification( }; const show = (): Notification | null => { - if (Notification.permission !== "granted") return null; + if (Notification.permission !== "granted") { + // eslint-disable-next-line no-console + if (isDev) console.warn( + `[@solid-primitives/notification] show() called with Notification.permission "${Notification.permission}" — must be "granted".`, + ); + return null; + } close(); const n = new Notification(title, options); current = n; @@ -62,6 +69,16 @@ export function makeNotification( return [show, close]; } +/** Event handler callbacks for `createNotification`. */ +export type NotificationEventHandlers = { + /** Called when the user clicks the notification. */ + onClick?: (notification: Notification) => void; + /** Called when the notification is dismissed, whether by the user, the OS, or `close()`. */ + onClose?: (notification: Notification) => void; + /** Called when the notification fails to display. */ + onError?: (notification: Notification) => void; +}; + /** * Reactive notification primitive tied to the current reactive owner. * @@ -75,6 +92,7 @@ export function makeNotification( * * @param title Notification title, or a reactive accessor returning one. * @param options Standard `NotificationOptions`, or a reactive accessor. + * @param handlers Optional event callbacks (`onClick`, `onClose`, `onError`). * @returns `{ show, close, notification, supported }` * * @example @@ -82,16 +100,14 @@ export function makeNotification( * const { show, close, notification } = createNotification( * () => `You have ${unread()} messages`, * { icon: "/icon.png" }, + * { onClick: () => window.focus() }, * ); - * - * createEffect(() => { - * if (notification()) console.log("notification is visible"); - * }); * ``` */ export function createNotification( title: MaybeAccessor, options?: MaybeAccessor, + handlers?: NotificationEventHandlers, ): { show: () => Notification | null; close: VoidFunction; @@ -106,31 +122,56 @@ export function createNotification( const [notification, setNotification] = createSignal(null, INTERNAL_OPTIONS); let current: Notification | null = null; - let closeHandler: VoidFunction | undefined; + let currentCleanup: VoidFunction | undefined; const close: VoidFunction = () => { - if (current && closeHandler) { - current.removeEventListener("close", closeHandler); - closeHandler = undefined; - } - current?.close(); + const n = current; + currentCleanup?.(); + currentCleanup = undefined; + n?.close(); current = null; setNotification(null); + if (n) handlers?.onClose?.(n); }; const show = (): Notification | null => { - if (Notification.permission !== "granted") return null; + if (Notification.permission !== "granted") { + // eslint-disable-next-line no-console + if (isDev) console.warn( + `[@solid-primitives/notification] show() called with Notification.permission "${Notification.permission}" — must be "granted".`, + ); + return null; + } close(); const n = new Notification(access(title), access(options)); current = n; - closeHandler = () => { + + const onCloseEvent = () => { if (current === n) { + currentCleanup?.(); + currentCleanup = undefined; current = null; - closeHandler = undefined; setNotification(null); + handlers?.onClose?.(n); } }; - n.addEventListener("close", closeHandler); + + n.addEventListener("close", onCloseEvent); + const cleanups: VoidFunction[] = [() => n.removeEventListener("close", onCloseEvent)]; + + if (handlers?.onClick) { + const h = () => handlers.onClick!(n); + n.addEventListener("click", h); + cleanups.push(() => n.removeEventListener("click", h)); + } + + if (handlers?.onError) { + const h = () => handlers.onError!(n); + n.addEventListener("error", h); + cleanups.push(() => n.removeEventListener("error", h)); + } + + currentCleanup = () => cleanups.forEach(fn => fn()); setNotification(n); return n; }; @@ -141,14 +182,17 @@ export function createNotification( } /** - * Reactive notification permission manager. + * Reactive notification permission manager built on `createPermission`. * - * The `permission` accessor reflects the current `Notification.permission` - * value and updates after each `requestPermission()` call. Use this to - * reactively gate UI controls or notification logic on permission state. + * The `permission` accessor reflects the live state from the browser + * [Permissions API](https://developer.mozilla.org/en-US/docs/Web/API/Permissions_API) + * and updates automatically whenever permission changes — including after + * `requestPermission()` resolves or the user edits browser settings. * - * On the server or when the Notifications API is unavailable, `permission` - * always returns `"denied"` and `requestPermission` resolves to `"denied"`. + * Permission values follow the Permissions API vocabulary: `"granted"`, + * `"denied"`, `"prompt"` (not yet asked), or `"unknown"` while the query + * is still resolving. Note that the Notifications API uses `"default"` for + * the same concept that the Permissions API calls `"prompt"`. * * @returns `{ permission, requestPermission }` * @@ -156,34 +200,27 @@ export function createNotification( * ```ts * const { permission, requestPermission } = createNotificationPermission(); * - * createEffect(() => { - * if (permission() === "granted") showWelcomeNotification(); - * }); - * - * + * + * + * * ``` */ export function createNotificationPermission(): { - permission: Accessor; + permission: Accessor; requestPermission: () => Promise; } { if (!isNotificationSupported()) { return { - permission: () => "denied" as NotificationPermission, + permission: () => "unknown" as const, requestPermission: () => Promise.resolve("denied" as NotificationPermission), }; } - const [permission, setPermission] = createSignal( - Notification.permission, - INTERNAL_OPTIONS, - ); + const permission = createPermission("notifications"); - const requestPermission = async (): Promise => { - const result = await Notification.requestPermission(); - setPermission(result); - return result; - }; + // createPermission tracks state via the change event — no manual update needed + const requestPermission = async (): Promise => + Notification.requestPermission(); return { permission, requestPermission }; } diff --git a/packages/notification/test/index.test.ts b/packages/notification/test/index.test.ts index 509bba290..e53a88d9b 100644 --- a/packages/notification/test/index.test.ts +++ b/packages/notification/test/index.test.ts @@ -1,5 +1,5 @@ import { describe, test, expect, vi, beforeAll, afterAll, beforeEach } from "vitest"; -import { createRoot, createSignal, flush } from "solid-js"; +import { createRoot, createSignal, flush, onCleanup } from "solid-js"; import { isNotificationSupported, makeNotification, @@ -40,31 +40,63 @@ class MockNotification { ); }); - /** Test helper: simulate the OS dismissing the notification externally. */ simulateClose() { this.listeners.get("close")?.forEach(fn => fn()); } + + simulateClick() { + this.listeners.get("click")?.forEach(fn => fn()); + } + + simulateError() { + this.listeners.get("error")?.forEach(fn => fn()); + } } +// ── Mock Permissions API ────────────────────────────────────────────────────── + +const mockPermStatus = { + state: "granted" as PermissionState, + _listeners: [] as (() => void)[], + addEventListener(_: string, fn: () => void) { + this._listeners.push(fn); + }, + removeEventListener(_: string, fn: () => void) { + const i = this._listeners.indexOf(fn); + if (i >= 0) this._listeners.splice(i, 1); + }, + dispatchChange(state: PermissionState) { + this.state = state; + this._listeners.forEach(fn => fn()); + }, +}; + +// ── Global setup ────────────────────────────────────────────────────────────── + beforeAll(() => { Object.defineProperty(window, "Notification", { value: MockNotification, configurable: true, writable: true, }); + + (navigator as any).permissions ??= {} as any; + navigator.permissions.query = vi.fn().mockImplementation(({ name }: PermissionDescriptor) => { + if (name === "notifications") return Promise.resolve(mockPermStatus); + return Promise.reject(new Error(`Unhandled permission: ${name}`)); + }); }); afterAll(() => { - Object.defineProperty(window, "Notification", { - value: undefined, - configurable: true, - }); + Object.defineProperty(window, "Notification", { value: undefined, configurable: true }); }); beforeEach(() => { MockNotification.instances = []; MockNotification.permission = "granted"; MockNotification.requestPermission.mockClear().mockResolvedValue("granted"); + mockPermStatus.state = "granted"; + mockPermStatus._listeners = []; }); // ── isNotificationSupported ─────────────────────────────────────────────────── @@ -87,8 +119,7 @@ describe("makeNotification", () => { test("show returns the Notification instance", () => { const [show] = makeNotification("Hello"); - const n = show(); - expect(n).toBeInstanceOf(MockNotification); + expect(show()).toBeInstanceOf(MockNotification); }); test("show returns null when permission is not granted", () => { @@ -106,6 +137,14 @@ describe("makeNotification", () => { expect(instance.close).toHaveBeenCalled(); }); + test("close removes the event listener before closing", () => { + const [show, close] = makeNotification("Hello"); + show(); + const instance = MockNotification.instances[0]!; + close(); + expect(instance.removeEventListener).toHaveBeenCalledWith("close", expect.any(Function)); + }); + test("show replaces an existing notification", () => { const [show] = makeNotification("Hello"); show(); @@ -119,18 +158,25 @@ describe("makeNotification", () => { const [show, close] = makeNotification("Hello"); show(); const instance = MockNotification.instances[0]!; - instance.simulateClose(); // OS dismissed it + instance.simulateClose(); instance.close.mockClear(); - close(); // should be a no-op — reference already cleared + close(); expect(instance.close).not.toHaveBeenCalled(); }); - test("close removes the event listener before closing", () => { - const [show, close] = makeNotification("Hello"); - show(); + test("close can be registered with onCleanup by the caller for reactive cleanup", () => { + const { dispose } = createRoot(dispose => { + const [show, close] = makeNotification("Hello"); + onCleanup(close); + show(); + return { dispose }; + }); + const instance = MockNotification.instances[0]!; - close(); - expect(instance.removeEventListener).toHaveBeenCalledWith("close", expect.any(Function)); + instance.close.mockClear(); + + dispose(); + expect(instance.close).toHaveBeenCalled(); }); }); @@ -160,31 +206,21 @@ describe("createNotification", () => { dispose(); }); - test("show returns the Notification instance", () => { - const { show, dispose } = createRoot(dispose => { - const { show } = createNotification("Hello"); - return { show, dispose }; - }); - - const n = show(); - expect(n).toBeInstanceOf(MockNotification); - - dispose(); - }); - - test("show returns null and does not update signal when permission is denied", () => { + test("show returns null and warns when permission is not granted", () => { MockNotification.permission = "denied"; + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); const { show, notification, dispose } = createRoot(dispose => { const { show, notification } = createNotification("Hello"); return { show, notification, dispose }; }); - const result = show(); + expect(show()).toBeNull(); flush(); - expect(result).toBeNull(); expect(notification()).toBeNull(); + expect(warnSpy).toHaveBeenCalled(); + warnSpy.mockRestore(); dispose(); }); @@ -196,7 +232,6 @@ describe("createNotification", () => { show(); flush(); - expect(notification()).not.toBeNull(); close(); flush(); @@ -206,6 +241,23 @@ describe("createNotification", () => { dispose(); }); + test("close removes the event listener before closing", () => { + const { show, close, dispose } = createRoot(dispose => { + const { show, close } = createNotification("Hello"); + return { show, close, dispose }; + }); + + show(); + flush(); + close(); + expect(MockNotification.instances[0]!.removeEventListener).toHaveBeenCalledWith( + "close", + expect.any(Function), + ); + + dispose(); + }); + test("external close (OS dismiss) sets signal to null", () => { const { show, notification, dispose } = createRoot(dispose => { const { show, notification } = createNotification("Hello"); @@ -214,7 +266,6 @@ describe("createNotification", () => { show(); flush(); - expect(notification()).not.toBeNull(); MockNotification.instances[0]!.simulateClose(); flush(); @@ -235,11 +286,8 @@ describe("createNotification", () => { show(); flush(); - const second = notification(); - - expect(first).not.toBe(second); + expect(notification()).not.toBe(first); expect((first as MockNotification).close).toHaveBeenCalled(); - expect(MockNotification.instances).toHaveLength(2); dispose(); }); @@ -259,42 +307,123 @@ describe("createNotification", () => { expect(instance.close).toHaveBeenCalled(); }); - test("close removes the event listener before closing", () => { + test("reactive title: reads current accessor value at show() time", () => { + const [title, setTitle] = createSignal("First"); + + const { show, notification, dispose } = createRoot(dispose => { + const { show, notification } = createNotification(title); + return { show, notification, dispose }; + }); + + show(); + flush(); + expect((notification() as MockNotification).title).toBe("First"); + + setTitle("Second"); + flush(); + // not re-shown automatically — title only read on next show() call + expect((notification() as MockNotification).title).toBe("First"); + + show(); + flush(); + expect((notification() as MockNotification).title).toBe("Second"); + + dispose(); + }); + + // ── Event callbacks ───────────────────────────────────────────────────────── + + test("onClick fires when click event is dispatched", () => { + const onClick = vi.fn(); + + const { show, dispose } = createRoot(dispose => { + const { show } = createNotification("Hello", undefined, { onClick }); + return { show, dispose }; + }); + + show(); + flush(); + MockNotification.instances[0]!.simulateClick(); + + expect(onClick).toHaveBeenCalledOnce(); + expect(onClick).toHaveBeenCalledWith(MockNotification.instances[0]); + + dispose(); + }); + + test("onClose fires when OS dismisses the notification", () => { + const onClose = vi.fn(); + + const { show, dispose } = createRoot(dispose => { + const { show } = createNotification("Hello", undefined, { onClose }); + return { show, dispose }; + }); + + show(); + flush(); + MockNotification.instances[0]!.simulateClose(); + + expect(onClose).toHaveBeenCalledOnce(); + expect(onClose).toHaveBeenCalledWith(MockNotification.instances[0]); + + dispose(); + }); + + test("onClose fires when close() is called programmatically", () => { + const onClose = vi.fn(); + const { show, close, dispose } = createRoot(dispose => { - const { show, close } = createNotification("Hello"); + const { show, close } = createNotification("Hello", undefined, { onClose }); return { show, close, dispose }; }); show(); flush(); - const instance = MockNotification.instances[0]!; close(); - expect(instance.removeEventListener).toHaveBeenCalledWith("close", expect.any(Function)); + + expect(onClose).toHaveBeenCalledOnce(); dispose(); }); - test("reactive title: reads current accessor value at show() time", () => { - const [title, setTitle] = createSignal("First"); + test("onError fires when error event is dispatched", () => { + const onError = vi.fn(); - const { show, notification, dispose } = createRoot(dispose => { - const { show, notification } = createNotification(title); - return { show, notification, dispose }; + const { show, dispose } = createRoot(dispose => { + const { show } = createNotification("Hello", undefined, { onError }); + return { show, dispose }; }); show(); flush(); - expect((notification() as MockNotification).title).toBe("First"); + MockNotification.instances[0]!.simulateError(); - setTitle("Second"); - flush(); - // title signal changed but notification is still showing "First" — re-show not automatic - expect((notification() as MockNotification).title).toBe("First"); + expect(onError).toHaveBeenCalledOnce(); + expect(onError).toHaveBeenCalledWith(MockNotification.instances[0]); + + dispose(); + }); + + test("event listeners are removed when close() is called", () => { + const onClick = vi.fn(); + const onClose = vi.fn(); + + const { show, close, dispose } = createRoot(dispose => { + const { show, close } = createNotification("Hello", undefined, { onClick, onClose }); + return { show, close, dispose }; + }); - // calling show() again reads the updated title show(); flush(); - expect((notification() as MockNotification).title).toBe("Second"); + close(); + onClose.mockClear(); + + // After close(), simulating OS events should not trigger callbacks + MockNotification.instances[0]!.simulateClick(); + MockNotification.instances[0]!.simulateClose(); + + expect(onClick).not.toHaveBeenCalled(); + expect(onClose).not.toHaveBeenCalled(); dispose(); }); @@ -303,57 +432,57 @@ describe("createNotification", () => { // ── createNotificationPermission ────────────────────────────────────────────── describe("createNotificationPermission", () => { - test("permission reflects Notification.permission on creation", () => { - MockNotification.permission = "default"; - + test("permission starts as unknown before query resolves", () => { createRoot(dispose => { const { permission } = createNotificationPermission(); - expect(permission()).toBe("default"); + expect(permission()).toBe("unknown"); dispose(); }); }); - test("requestPermission calls Notification.requestPermission", async () => { - const { requestPermission, dispose } = createRoot(dispose => { - const { requestPermission } = createNotificationPermission(); - return { requestPermission, dispose }; + test("permission resolves to current state after query", async () => { + mockPermStatus.state = "granted"; + + const { permission, dispose } = createRoot(dispose => { + const { permission } = createNotificationPermission(); + return { permission, dispose }; }); - await requestPermission(); - expect(MockNotification.requestPermission).toHaveBeenCalledOnce(); + expect(permission()).toBe("unknown"); + await Promise.resolve(); + flush(); + expect(permission()).toBe("granted"); dispose(); }); - test("permission updates after requestPermission resolves to granted", async () => { - MockNotification.permission = "default"; - MockNotification.requestPermission.mockResolvedValue("granted"); + test("permission updates reactively when state changes externally", async () => { + mockPermStatus.state = "granted"; - const { permission, requestPermission, dispose } = createRoot(dispose => { - const { permission, requestPermission } = createNotificationPermission(); - return { permission, requestPermission, dispose }; + const { permission, dispose } = createRoot(dispose => { + const { permission } = createNotificationPermission(); + return { permission, dispose }; }); - expect(permission()).toBe("default"); - await requestPermission(); + await Promise.resolve(); flush(); expect(permission()).toBe("granted"); + mockPermStatus.dispatchChange("denied"); + flush(); + expect(permission()).toBe("denied"); + dispose(); }); - test("permission updates after requestPermission resolves to denied", async () => { - MockNotification.permission = "default"; - MockNotification.requestPermission.mockResolvedValue("denied"); - - const { permission, requestPermission, dispose } = createRoot(dispose => { - const { permission, requestPermission } = createNotificationPermission(); - return { permission, requestPermission, dispose }; + test("requestPermission calls Notification.requestPermission", async () => { + const { requestPermission, dispose } = createRoot(dispose => { + const { requestPermission } = createNotificationPermission(); + return { requestPermission, dispose }; }); await requestPermission(); - flush(); - expect(permission()).toBe("denied"); + expect(MockNotification.requestPermission).toHaveBeenCalledOnce(); dispose(); }); @@ -366,8 +495,7 @@ describe("createNotificationPermission", () => { return { requestPermission, dispose }; }); - const result = await requestPermission(); - expect(result).toBe("granted"); + expect(await requestPermission()).toBe("granted"); dispose(); }); diff --git a/packages/notification/test/server.test.ts b/packages/notification/test/server.test.ts index a5b909991..e19f755c0 100644 --- a/packages/notification/test/server.test.ts +++ b/packages/notification/test/server.test.ts @@ -33,9 +33,9 @@ describe("createNotification (SSR)", () => { }); describe("createNotificationPermission (SSR)", () => { - test("returns denied permission without throwing", async () => { + test("returns unknown permission and resolves denied without throwing", async () => { const { permission, requestPermission } = createNotificationPermission(); - expect(permission()).toBe("denied"); + expect(permission()).toBe("unknown"); const result = await requestPermission(); expect(result).toBe("denied"); }); diff --git a/packages/notification/tsconfig.json b/packages/notification/tsconfig.json index dc1970e16..cc6a7fe80 100644 --- a/packages/notification/tsconfig.json +++ b/packages/notification/tsconfig.json @@ -6,6 +6,9 @@ "rootDir": "src" }, "references": [ + { + "path": "../permission" + }, { "path": "../utils" } diff --git a/packages/permission/README.md b/packages/permission/README.md index fdc864749..2931b08c7 100644 --- a/packages/permission/README.md +++ b/packages/permission/README.md @@ -8,25 +8,89 @@ [![size](https://img.shields.io/npm/v/@solid-primitives/permission?style=for-the-badge)](https://www.npmjs.com/package/@solid-primitives/permission) [![stage](https://img.shields.io/endpoint?style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-3.json)](https://github.com/solidjs-community/solid-primitives#contribution-process) -Creates a primitive to query user permissions. +Reactive wrapper around the browser [Permissions API](https://developer.mozilla.org/en-US/docs/Web/API/Permissions_API). Queries a named permission and returns a live signal that updates automatically whenever the permission state changes. ## Installation -``` +```bash npm install @solid-primitives/permission # or yarn add @solid-primitives/permission +# or +pnpm add @solid-primitives/permission ``` ## How to use it +### `createPermission` + +Queries a browser permission by name (or descriptor object) and returns a reactive accessor reflecting its current state. + +```ts +import { createPermission } from "@solid-primitives/permission"; + +const permission = createPermission("microphone"); +// permission(): "unknown" | "granted" | "denied" | "prompt" +``` + +The signal starts as `"unknown"` — the Permissions API query is async and the initial value is not available synchronously. After the first microtask, the signal resolves to the current state and begins tracking changes. + +The signal updates automatically when the permission changes — for example when the user grants or revokes access in browser settings, or after an API call prompts the user. + +**Accepted values** follow the [PermissionName](https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query#name) vocabulary. Pass either a plain string or a full `PermissionDescriptor` object: + ```ts -const state: "unknown" | PermissionState = createPermission(descriptor: PermissionDescription | PermissionName); +// Plain name +const mic = createPermission("microphone"); + +// Descriptor object (required for some permissions) +const cam = createPermission({ name: "camera" }); + +// Used by @solid-primitives/notification +const notifs = createPermission("notifications"); ``` -## Demo +**Return values** map to [PermissionState](https://developer.mozilla.org/en-US/docs/Web/API/PermissionStatus/state): + +| Value | Meaning | +|-------|---------| +| `"unknown"` | Initial state — query has not resolved yet | +| `"granted"` | Permission has been granted | +| `"denied"` | Permission has been denied | +| `"prompt"` | Not yet asked; prompting the user is possible | + +### SSR -TODO +On the server, `createPermission` returns a static `() => "unknown"` accessor. No query is made and no listeners are registered. + +### Reactive usage example + +```tsx +import { createPermission } from "@solid-primitives/permission"; + +const CameraGate: Component = () => { + const permission = createPermission("camera"); + + return ( + + +

Checking camera permission…

+
+ + + + +

Camera access denied. Enable it in browser settings.

+
+ + + +
+ ); +}; +``` ## Changelog diff --git a/packages/permission/package.json b/packages/permission/package.json index f2cbe3381..96c119a30 100644 --- a/packages/permission/package.json +++ b/packages/permission/package.json @@ -41,7 +41,8 @@ "test:ssr": "pnpm run vitest --mode ssr" }, "peerDependencies": { - "solid-js": "^1.6.12" + "@solidjs/web": "^2.0.0-beta.10", + "solid-js": "^2.0.0-beta.10" }, "keywords": [ "permission", @@ -51,6 +52,7 @@ ], "typesVersions": {}, "devDependencies": { - "solid-js": "^1.9.7" + "@solidjs/web": "2.0.0-beta.10", + "solid-js": "2.0.0-beta.10" } } diff --git a/packages/permission/src/index.ts b/packages/permission/src/index.ts index 09f50c6a4..989c3086f 100644 --- a/packages/permission/src/index.ts +++ b/packages/permission/src/index.ts @@ -1,5 +1,5 @@ -import { type Accessor, createEffect, createSignal, on, onCleanup } from "solid-js"; -import { isServer } from "solid-js/web"; +import { type Accessor, createEffect, createSignal, onCleanup } from "solid-js"; +import { isServer } from "@solidjs/web"; /** * Querying the permission API @@ -13,13 +13,17 @@ export const createPermission = ( if (isServer) { return () => "unknown"; } - const [permission, setPermission] = createSignal("unknown"); - const [status, setStatus] = createSignal(); + const [permission, setPermission] = createSignal("unknown", { + ownedWrite: true, + }); + const [status, setStatus] = createSignal(undefined, { + ownedWrite: true, + }); // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (navigator) { navigator.permissions .query(typeof name === "string" ? { name } : name) - .then(setStatus) + .then(s => setStatus(() => s)) .catch(error => { if (error.name !== "TypeError" || (name !== "microphone" && name !== "camera")) { return; @@ -42,16 +46,23 @@ export const createPermission = ( }) : getUserMedia(constraints); }); + let removeChangeListener: VoidFunction | undefined; + createEffect( - on(status, status => { - if (status) { - setPermission(status.state); - const listener = () => setPermission(status.state); - status.addEventListener("change", listener); - onCleanup(() => status.removeEventListener("change", listener)); + () => status(), + currentStatus => { + removeChangeListener?.(); + removeChangeListener = undefined; + if (currentStatus) { + setPermission(currentStatus.state); + const listener = () => setPermission(currentStatus.state); + currentStatus.addEventListener("change", listener); + removeChangeListener = () => currentStatus.removeEventListener("change", listener); } - }), + }, ); + + onCleanup(() => removeChangeListener?.()); } return permission; }; diff --git a/packages/permission/test/index.test.ts b/packages/permission/test/index.test.ts index ae3a20652..46193510f 100644 --- a/packages/permission/test/index.test.ts +++ b/packages/permission/test/index.test.ts @@ -1,51 +1,40 @@ import { __permissions__ } from "./setup.js"; -import { createEffect, createRoot } from "solid-js"; +import { createRoot, flush } from "solid-js"; import { it, describe, expect } from "vitest"; import { createPermission } from "../src/index.js"; describe("createPermission", () => { it("reads permission", async () => { - let captured: unknown; - - const dispose = createRoot(dispose => { + const { permission, dispose } = createRoot(dispose => { const permission = createPermission("microphone" as PermissionName); - - createEffect(() => { - captured = permission(); - }); - - return dispose; + return { permission, dispose }; }); - expect(captured).toEqual("unknown"); + expect(permission()).toBe("unknown"); await Promise.resolve(); - expect(captured).toEqual("granted"); + flush(); + expect(permission()).toBe("granted"); dispose(); }); it("reads permission updates", async () => { - let captured: unknown; - - const dispose = createRoot(dispose => { + const { permission, dispose } = createRoot(dispose => { const permission = createPermission("camera" as PermissionName); - - createEffect(() => { - captured = permission(); - }); - - return dispose; + return { permission, dispose }; }); - expect(captured).toEqual("unknown"); + expect(permission()).toBe("unknown"); await Promise.resolve(); - expect(captured).toEqual("denied"); + flush(); + expect(permission()).toBe("denied"); __permissions__.camera.__dispatchEvent("granted"); - expect(captured).toEqual("granted"); + flush(); + expect(permission()).toBe("granted"); dispose(); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af00d92b9..0a1208dca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -646,6 +646,9 @@ importers: packages/notification: dependencies: + '@solid-primitives/permission': + specifier: workspace:^ + version: link:../permission '@solid-primitives/utils': specifier: workspace:^ version: link:../utils @@ -698,9 +701,12 @@ importers: packages/permission: devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10 packages/platform: devDependencies: From 151fab1a4ca0b237b568915ff69bae92928ce648 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sun, 17 May 2026 09:21:03 -0400 Subject: [PATCH 4/7] Adapting action/optimstic --- packages/notification/src/index.ts | 22 +- packages/notification/test/index.test.ts | 46 +- packages/notification/test/server.test.ts | 8 +- pnpm-lock.yaml | 841 +++++++++++----------- 4 files changed, 485 insertions(+), 432 deletions(-) diff --git a/packages/notification/src/index.ts b/packages/notification/src/index.ts index d6fa2df68..cdb08b8d8 100644 --- a/packages/notification/src/index.ts +++ b/packages/notification/src/index.ts @@ -1,4 +1,4 @@ -import { createSignal, onCleanup, type Accessor } from "solid-js"; +import { action, createOptimistic, createSignal, onCleanup, type Accessor } from "solid-js"; import { isServer } from "@solidjs/web"; import { INTERNAL_OPTIONS, isDev, noop, access, type MaybeAccessor } from "@solid-primitives/utils"; import { createPermission } from "@solid-primitives/permission"; @@ -207,20 +207,30 @@ export function createNotification( */ export function createNotificationPermission(): { permission: Accessor; - requestPermission: () => Promise; + requestPermission: () => Promise; + pending: Accessor; } { if (!isNotificationSupported()) { return { permission: () => "unknown" as const, - requestPermission: () => Promise.resolve("denied" as NotificationPermission), + requestPermission: () => Promise.resolve(), + pending: () => false, }; } const permission = createPermission("notifications"); + const [pending, setPending] = createOptimistic(false, INTERNAL_OPTIONS); // createPermission tracks state via the change event — no manual update needed - const requestPermission = async (): Promise => - Notification.requestPermission(); + const requestPermission = action(function* () { + setPending(true); + try { + yield Notification.requestPermission(); + } catch { + // swallow — permission updates reactively via createPermission + } + setPending(false); + }); - return { permission, requestPermission }; + return { permission, requestPermission, pending }; } diff --git a/packages/notification/test/index.test.ts b/packages/notification/test/index.test.ts index e53a88d9b..5a4333241 100644 --- a/packages/notification/test/index.test.ts +++ b/packages/notification/test/index.test.ts @@ -487,15 +487,51 @@ describe("createNotificationPermission", () => { dispose(); }); - test("requestPermission returns the resolved permission value", async () => { + test("permission reflects resolved value after requestPermission", async () => { + mockPermStatus.state = "granted"; MockNotification.requestPermission.mockResolvedValue("granted"); - const { requestPermission, dispose } = createRoot(dispose => { - const { requestPermission } = createNotificationPermission(); - return { requestPermission, dispose }; + const { permission, requestPermission, dispose } = createRoot(dispose => { + const { permission, requestPermission } = createNotificationPermission(); + return { permission, requestPermission, dispose }; }); - expect(await requestPermission()).toBe("granted"); + await Promise.resolve(); + flush(); + await requestPermission(); + flush(); + expect(permission()).toBe("granted"); + + dispose(); + }); + + test("pending is false initially", () => { + createRoot(dispose => { + const { pending } = createNotificationPermission(); + expect(pending()).toBe(false); + dispose(); + }); + }); + + test("pending is true while requestPermission is in flight", async () => { + let resolve!: (v: NotificationPermission) => void; + MockNotification.requestPermission.mockImplementation( + () => new Promise(r => (resolve = r)), + ); + + const { requestPermission, pending, dispose } = createRoot(dispose => { + const { requestPermission, pending } = createNotificationPermission(); + return { requestPermission, pending, dispose }; + }); + + const promise = requestPermission(); + flush(); + expect(pending()).toBe(true); + + resolve("granted"); + await promise; + flush(); + expect(pending()).toBe(false); dispose(); }); diff --git a/packages/notification/test/server.test.ts b/packages/notification/test/server.test.ts index e19f755c0..952fb9361 100644 --- a/packages/notification/test/server.test.ts +++ b/packages/notification/test/server.test.ts @@ -33,10 +33,10 @@ describe("createNotification (SSR)", () => { }); describe("createNotificationPermission (SSR)", () => { - test("returns unknown permission and resolves denied without throwing", async () => { - const { permission, requestPermission } = createNotificationPermission(); + test("returns unknown permission, false pending, and resolves without throwing", async () => { + const { permission, requestPermission, pending } = createNotificationPermission(); expect(permission()).toBe("unknown"); - const result = await requestPermission(); - expect(result).toBe("denied"); + expect(pending()).toBe(false); + await expect(requestPermission()).resolves.toBeUndefined(); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41fb58600..291fb04d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + '@babel/core': + specifier: ^7.27.0 + version: 7.29.0 '@changesets/cli': specifier: ^2.29.4 version: 2.29.4 @@ -16,7 +19,7 @@ importers: version: 1.0.1 '@solidjs/start': specifier: ^1.1.4 - version: 1.1.4(solid-js@2.0.0-beta.10)(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + version: 1.1.4(solid-js@2.0.0-beta.13)(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) '@types/jsdom': specifier: ^21.1.7 version: 21.1.7 @@ -29,12 +32,15 @@ importers: '@typescript-eslint/parser': specifier: ^8.34.0 version: 8.34.0(eslint@9.28.0(jiti@2.6.1))(typescript@5.8.3) + babel-preset-solid: + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.13) esbuild: specifier: ^0.25.5 version: 0.25.5 esbuild-plugin-solid: specifier: ^0.6.0 - version: 0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.10) + version: 0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.13) eslint: specifier: ^9.28.0 version: 9.28.0(jiti@2.6.1) @@ -69,20 +75,20 @@ importers: specifier: ^4.0.1 version: 4.0.1 solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 typescript: specifier: ^5.8.3 version: 5.8.3 vinxi: specifier: ^0.5.7 - version: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + version: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + version: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) vite-plugin-solid: specifier: ^2.11.6 - version: 2.11.6(solid-js@2.0.0-beta.10)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + version: 2.11.6(solid-js@2.0.0-beta.13)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) vitest: specifier: ^2.1.9 version: 2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0) @@ -115,9 +121,12 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/autofocus: dependencies: @@ -126,11 +135,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/bounds: dependencies: @@ -145,20 +154,20 @@ importers: specifier: workspace:^ version: link:../scheduled '@solidjs/web': - specifier: ^2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: ^2.0.0-beta.12 + version: 2.0.0-beta.13(solid-js@2.0.0-experimental.16) solid-js: - specifier: ^2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: ^2.0.0-beta.12 + version: 2.0.0-experimental.16 packages/broadcast-channel: devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/clipboard: dependencies: @@ -166,9 +175,12 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/connectivity: dependencies: @@ -270,8 +282,8 @@ importers: version: link:../utils devDependencies: solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/devices: devDependencies: @@ -286,8 +298,8 @@ importers: version: link:../utils devDependencies: solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/event-dispatcher: devDependencies: @@ -302,17 +314,17 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/event-props: devDependencies: solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/fetch: dependencies: @@ -364,6 +376,9 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) '@types/leaflet': specifier: ^1.9.8 version: 1.9.12 @@ -371,8 +386,8 @@ importers: specifier: ^1.9.4 version: 1.9.4 solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10 packages/gestures: devDependencies: @@ -388,7 +403,7 @@ importers: devDependencies: '@graphql-codegen/cli': specifier: ^5.0.0 - version: 5.0.2(@parcel/watcher@2.5.1)(@types/node@24.0.1)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3) + version: 5.0.2(@parcel/watcher@2.5.1)(@types/node@22.15.31)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3) '@graphql-codegen/typed-document-node': specifier: ^5.0.1 version: 5.0.9(graphql@16.9.0) @@ -458,8 +473,8 @@ importers: packages/input-mask: devDependencies: solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/intersection-observer: dependencies: @@ -470,9 +485,12 @@ importers: '@solid-primitives/range': specifier: workspace:^ version: link:../range + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/jsx-tokenizer: dependencies: @@ -496,9 +514,12 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/keyed: devDependencies: @@ -540,8 +561,8 @@ importers: packages/marker: devDependencies: solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/masonry: dependencies: @@ -553,8 +574,8 @@ importers: specifier: workspace:^ version: link:../media solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/match: devDependencies: @@ -578,30 +599,24 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/memo: dependencies: - '@solid-primitives/scheduled': - specifier: workspace:^ - version: link:../scheduled '@solid-primitives/utils': specifier: workspace:^ version: link:../utils devDependencies: - '@solid-primitives/mouse': - specifier: workspace:^ - version: link:../mouse - '@solidjs/router': - specifier: ^0.8.4 - version: 0.8.4(solid-js@1.9.7) + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/mouse: dependencies: @@ -637,12 +652,12 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: - '@solid-primitives/composites': - specifier: ^1.1.1 - version: 1.1.1(solid-js@1.9.7) + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/notification: dependencies: @@ -667,11 +682,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/page-visibility: dependencies: @@ -710,9 +725,12 @@ importers: packages/platform: devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/pointer: dependencies: @@ -727,11 +745,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/presence: dependencies: @@ -740,8 +758,8 @@ importers: version: link:../utils devDependencies: solid-js: - specifier: ^2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: ^2.0.0-beta.12 + version: 2.0.0-experimental.16 packages/promise: dependencies: @@ -770,11 +788,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/range: dependencies: @@ -795,12 +813,15 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 solid-transition-group: specifier: ^0.2.3 - version: 0.2.3(solid-js@1.9.7) + version: 0.2.3(solid-js@2.0.0-beta.13) packages/resize-observer: dependencies: @@ -817,9 +838,12 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/resource: devDependencies: @@ -834,11 +858,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/scheduled: devDependencies: @@ -848,18 +872,21 @@ importers: '@solid-primitives/timer': specifier: workspace:^ version: link:../timer + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/script-loader: devDependencies: '@solidjs/web': - specifier: ^2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: ^2.0.0-beta.12 + version: 2.0.0-beta.13(solid-js@2.0.0-experimental.16) solid-js: - specifier: ^2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: ^2.0.0-beta.12 + version: 2.0.0-experimental.16 packages/scroll: dependencies: @@ -872,10 +899,16 @@ importers: '@solid-primitives/static-store': specifier: workspace:^ version: link:../static-store + '@solid-primitives/utils': + specifier: workspace:^ + version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.12 + version: 2.0.0-beta.12(solid-js@2.0.0-beta.12) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.12 + version: 2.0.0-beta.12 packages/selection: devDependencies: @@ -938,11 +971,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/storage: dependencies: @@ -977,11 +1010,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/timer: devDependencies: @@ -1008,17 +1041,20 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/tween: devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/upload: dependencies: @@ -1033,11 +1069,11 @@ importers: packages/utils: devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/vibrate: dependencies: @@ -1046,11 +1082,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/virtual: dependencies: @@ -1062,14 +1098,14 @@ importers: specifier: ^7.27.0 version: 7.29.0 '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) babel-preset-solid: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(@babel/core@7.29.0)(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.13) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/websocket: devDependencies: @@ -1138,10 +1174,10 @@ importers: version: link:../packages/utils '@tanstack/solid-router': specifier: ^1.168.16 - version: 1.169.1(solid-js@2.0.0-experimental.16) + version: 1.169.1(solid-js@2.0.0-beta.13) '@tanstack/solid-start': specifier: ^1.167.28 - version: 1.167.59(solid-js@2.0.0-experimental.16)(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + version: 1.167.59(solid-js@2.0.0-beta.13)(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) clsx: specifier: ^2.0.0 version: 2.1.1 @@ -1168,10 +1204,10 @@ importers: version: 1.77.8 solid-dismiss: specifier: ^1.7.121 - version: 1.8.2(solid-js@2.0.0-experimental.16) + version: 1.8.2(solid-js@2.0.0-beta.13) solid-icons: specifier: ^1.1.0 - version: 1.1.0(solid-js@2.0.0-experimental.16) + version: 1.1.0(solid-js@2.0.0-beta.13) undici: specifier: ^5.28.2 version: 5.28.4 @@ -1205,10 +1241,10 @@ importers: version: 4.0.0 vite: specifier: ^8.0.8 - version: 8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + version: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) vite-plugin-solid: specifier: ^2.11.12 - version: 2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + version: 2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) packages: @@ -2856,17 +2892,6 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/composites@1.1.1': - resolution: {integrity: sha512-eNi1jnUJehBjcVQvod8N1uz91Cn3KvJn/HJIPHUVpnpDj8dFhu5eHJtsiEdNBFJFOR/pPmf9RhJG0pKoTdPz6g==} - peerDependencies: - solid-js: ^1.3.1 - - '@solid-primitives/debounce@1.3.0': - resolution: {integrity: sha512-Cen4ccCPTuEtQM7o9aEKuOJ0LRlAnzKvN7loEBBOQ+zKdu7/7kYKr7HHE/WS8JAI3QeQr5v2ModYRIZLERw5zw==} - deprecated: debounce primitive moved to @solid-primitives/scheduled - peerDependencies: - solid-js: '>=1.0.0' - '@solid-primitives/event-listener@2.4.5': resolution: {integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==} peerDependencies: @@ -2917,12 +2942,6 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/throttle@1.2.0': - resolution: {integrity: sha512-qYKYEgGl/nSCF+wq7H6zFFi8s2e/woFZJkZbCbyUrtbEIvCze4xSZRr64Xi067GlBE+T/N4LZX/htJmLfwkAeg==} - deprecated: throttle primitive moved to @solid-primitives/scheduled - peerDependencies: - solid-js: ^1.3.1 - '@solid-primitives/transition-group@1.0.5': resolution: {integrity: sha512-G3FuqvL13kQ55WzWPX2ewiXdZ/1iboiX53195sq7bbkDbXqP6TYKiadwEdsaDogW5rPnPYAym3+xnsNplQJRKQ==} peerDependencies: @@ -2943,17 +2962,15 @@ packages: peerDependencies: solid-js: '>=1.8.4' - '@solidjs/router@0.8.4': - resolution: {integrity: sha512-Gi/WVoVseGMKS1DBdT3pNAMgOzEOp6Q3dpgNd2mW9GUEnVocPmtyBjDvXwN6m7tjSGsqqfqJFXk7bm1hxabSRw==} - peerDependencies: - solid-js: ^1.5.3 - '@solidjs/signals@0.11.3': resolution: {integrity: sha512-udMfutYPOlcxKUmc5+n1QtarsxOiAlC6LJY2TqFyaMwdXgo+reiYUcYGDlOiAPXfCLE0lavZHQ/6GT5pJbXKBA==} '@solidjs/signals@2.0.0-beta.10': resolution: {integrity: sha512-McdmbLNiSlz616zcykS8Rb1t9QTOTKdNAoaWd4/OjXEbcAUrPqRX1CWgR+caiWUk4qn0a+LesTTV4jZhFFPaSg==} + '@solidjs/signals@2.0.0-beta.13': + resolution: {integrity: sha512-jc+wLRK+eyUFerH8Mjed4HikdJwz3z95TT7tqyG+K00IV9jfgZWvR1nZDUEZc6kXffmtW/z+w6PNn62ea5KjIw==} + '@solidjs/start@1.1.4': resolution: {integrity: sha512-ma1TBYqoTju87tkqrHExMReM5Z/+DTXSmi30CCTavtwuR73Bsn4rVGqm528p4sL2koRMfAuBMkrhuttjzhL68g==} peerDependencies: @@ -2964,6 +2981,16 @@ packages: peerDependencies: solid-js: ^2.0.0-beta.10 + '@solidjs/web@2.0.0-beta.12': + resolution: {integrity: sha512-Wc+/LctUqfNQs98VnijoEu4gWFOSu/kUcZiBIjQ+S9ZUuT6Z77CRkmiZ0C8dyOhNPbTgpU2JYH6B5wqY2eqS0A==} + peerDependencies: + solid-js: ^2.0.0-beta.12 + + '@solidjs/web@2.0.0-beta.13': + resolution: {integrity: sha512-ugSnWcNc18osJZ24+op7mQpm6LlyHSgTnvSaYqEwL9PVmLxXpmAS7/dt5nc7MLLZtwgf1J1rmRfZb7mT8fTL2w==} + peerDependencies: + solid-js: ^2.0.0-beta.13 + '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} @@ -3194,9 +3221,6 @@ packages: '@types/node@22.15.31': resolution: {integrity: sha512-jnVe5ULKl6tijxUhvQeNbQG/84fHfg+yMak02cT8QVhBx/F05rAVxCGBYYTh2EKz22D6JF5ktXuNwdx7b9iEGw==} - '@types/node@24.0.1': - resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3572,8 +3596,8 @@ packages: peerDependencies: '@babel/core': ^7.20.12 - babel-plugin-jsx-dom-expressions@0.50.0-next.6: - resolution: {integrity: sha512-D7SSrMu1EupiCFT3hBhWJj0EWzaI27HV1ysbLSKFcH1ROZe61DmnNVchrnr5QeAw5O8bqSdlMDLdEqMYzi4tTA==} + babel-plugin-jsx-dom-expressions@0.50.0-next.11: + resolution: {integrity: sha512-J9Z9T3khj0LxYMtcg1jNA5sdrZia/uWVLVUI0fuBgrjWfKju4+6wlzJSFnrGjFbydOaviykhpPB5FqZoufg+Vw==} peerDependencies: '@babel/core': ^7.20.12 @@ -3590,11 +3614,11 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-solid@2.0.0-beta.10: - resolution: {integrity: sha512-lzGgPsh1fVtBJDl+UWLTCgimzPMda7X2Xzq7asCCOq/zHRwiF5vF3Eb3xj65dGyi7YpgVROTwJEpj+XiroKaww==} + babel-preset-solid@2.0.0-beta.13: + resolution: {integrity: sha512-VX5fa4b6Sn92v+vFw3ITEvDv0f5vZZZhGgGcqYaAzjP7RF45+VZcZBoG0pHwCGA7UfXdYLUQuqXb4tG1uV3cQA==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^2.0.0-beta.10 + solid-js: ^2.0.0-beta.13 peerDependenciesMeta: solid-js: optional: true @@ -4697,9 +4721,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - giget@2.0.0: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true @@ -6455,9 +6476,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -6699,6 +6717,12 @@ packages: solid-js@2.0.0-beta.10: resolution: {integrity: sha512-EAfV6b1SC4c3wEBAoX4dMy063uTb4nfL5uXnN8yse4InH7RTw1LoB0I9HAy+pj3/GHqQE2tYZurlZtqU4pGyog==} + solid-js@2.0.0-beta.12: + resolution: {integrity: sha512-UJC4gc0Dgbm6BTBFhUdrfIEXiQ/jaQuUGxYfZnEkywwD5FX16MhlM/e6bq2+94mhXUExYI9VJoGBh7CpOZ/1XA==} + + solid-js@2.0.0-beta.13: + resolution: {integrity: sha512-uAknr7Xkn25zAufBrYko4eOCbcg/gkrwnmE9KVb2Kb3vVZw2ibqseNxpjslnwJkT4gFScmFniqJtzRp7vO2klA==} + solid-js@2.0.0-experimental.16: resolution: {integrity: sha512-zZ1dU7cR0EnvLnrYiRLQbCFiDw5blLdlqmofgLzKUYE1TCMWDcisBlSwz0Ez8l4yXB4adbdhtaYCuynH4xSq9A==} @@ -7031,11 +7055,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.20.2: - resolution: {integrity: sha512-He0ZWr41gLa4vD30Au3yuwpe0HXaCZbclvl8RBieUiJ9aFnPMWUPIyvw3RU8+1Crjfcrauvitae2a4tUzRAGsw==} - engines: {node: '>=18.0.0'} - hasBin: true - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -7078,9 +7097,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -8059,10 +8075,10 @@ snapshots: '@babel/traverse@7.27.4': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.1 globals: 11.12.0 @@ -8511,7 +8527,7 @@ snapshots: graphql: 16.9.0 tslib: 2.6.3 - '@graphql-codegen/cli@5.0.2(@parcel/watcher@2.5.1)(@types/node@24.0.1)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3)': + '@graphql-codegen/cli@5.0.2(@parcel/watcher@2.5.1)(@types/node@22.15.31)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3)': dependencies: '@babel/generator': 7.27.5 '@babel/template': 7.27.2 @@ -8522,12 +8538,12 @@ snapshots: '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@16.9.0) '@graphql-tools/code-file-loader': 8.1.3(graphql@16.9.0) '@graphql-tools/git-loader': 8.0.7(graphql@16.9.0) - '@graphql-tools/github-loader': 8.0.1(@types/node@24.0.1)(graphql@16.9.0) + '@graphql-tools/github-loader': 8.0.1(@types/node@22.15.31)(graphql@16.9.0) '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0) '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0) '@graphql-tools/load': 8.0.2(graphql@16.9.0) - '@graphql-tools/prisma-loader': 8.0.4(@types/node@24.0.1)(graphql@16.9.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@24.0.1)(graphql@16.9.0) + '@graphql-tools/prisma-loader': 8.0.4(@types/node@22.15.31)(graphql@16.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@22.15.31)(graphql@16.9.0) '@graphql-tools/utils': 10.3.4(graphql@16.9.0) '@whatwg-node/fetch': 0.8.8 chalk: 4.1.2 @@ -8535,7 +8551,7 @@ snapshots: debounce: 1.2.1 detect-indent: 6.1.0 graphql: 16.9.0 - graphql-config: 5.1.0(@types/node@24.0.1)(graphql@16.9.0)(typescript@5.8.3) + graphql-config: 5.1.0(@types/node@22.15.31)(graphql@16.9.0)(typescript@5.8.3) inquirer: 8.2.6 is-glob: 4.0.3 jiti: 1.21.7 @@ -8730,14 +8746,14 @@ snapshots: - bufferutil - utf-8-validate - '@graphql-tools/executor-http@1.1.5(@types/node@24.0.1)(graphql@16.9.0)': + '@graphql-tools/executor-http@1.1.5(@types/node@22.15.31)(graphql@16.9.0)': dependencies: '@graphql-tools/utils': 10.3.4(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/fetch': 0.9.19 extract-files: 11.0.0 graphql: 16.9.0 - meros: 1.3.0(@types/node@24.0.1) + meros: 1.3.0(@types/node@22.15.31) tslib: 2.8.1 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -8776,10 +8792,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-tools/github-loader@8.0.1(@types/node@24.0.1)(graphql@16.9.0)': + '@graphql-tools/github-loader@8.0.1(@types/node@22.15.31)(graphql@16.9.0)': dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/executor-http': 1.1.5(@types/node@24.0.1)(graphql@16.9.0) + '@graphql-tools/executor-http': 1.1.5(@types/node@22.15.31)(graphql@16.9.0) '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0) '@graphql-tools/utils': 10.3.4(graphql@16.9.0) '@whatwg-node/fetch': 0.9.19 @@ -8847,9 +8863,9 @@ snapshots: graphql: 16.9.0 tslib: 2.8.1 - '@graphql-tools/prisma-loader@8.0.4(@types/node@24.0.1)(graphql@16.9.0)': + '@graphql-tools/prisma-loader@8.0.4(@types/node@22.15.31)(graphql@16.9.0)': dependencies: - '@graphql-tools/url-loader': 8.0.2(@types/node@24.0.1)(graphql@16.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@22.15.31)(graphql@16.9.0) '@graphql-tools/utils': 10.3.4(graphql@16.9.0) '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.9.19 @@ -8891,12 +8907,12 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.12 - '@graphql-tools/url-loader@8.0.2(@types/node@24.0.1)(graphql@16.9.0)': + '@graphql-tools/url-loader@8.0.2(@types/node@22.15.31)(graphql@16.9.0)': dependencies: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/delegate': 10.0.18(graphql@16.9.0) '@graphql-tools/executor-graphql-ws': 1.2.0(graphql@16.9.0) - '@graphql-tools/executor-http': 1.1.5(@types/node@24.0.1)(graphql@16.9.0) + '@graphql-tools/executor-http': 1.1.5(@types/node@22.15.31)(graphql@16.9.0) '@graphql-tools/executor-legacy-ws': 1.1.0(graphql@16.9.0) '@graphql-tools/utils': 10.3.4(graphql@16.9.0) '@graphql-tools/wrap': 10.0.5(graphql@16.9.0) @@ -9491,158 +9507,146 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} - '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-experimental.16)': + '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-beta.13)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-experimental.16) - '@solid-primitives/bounds': 0.1.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/keyboard': 1.3.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 - - '@solid-devtools/logger@0.9.11(solid-js@2.0.0-experimental.16)': + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.13) + '@solid-primitives/bounds': 0.1.5(solid-js@2.0.0-beta.13) + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) + '@solid-primitives/keyboard': 1.3.5(solid-js@2.0.0-beta.13) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 + + '@solid-devtools/logger@0.9.11(solid-js@2.0.0-beta.13)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-experimental.16) - '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-beta.13) + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-devtools/shared@0.20.0(solid-js@2.0.0-experimental.16)': + '@solid-devtools/shared@0.20.0(solid-js@2.0.0-beta.13)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/media': 2.3.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/refs': 1.1.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/styles': 0.1.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 - - '@solid-primitives/bounds@0.1.5(solid-js@2.0.0-experimental.16)': - dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/resize-observer': 2.1.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) + '@solid-primitives/media': 2.3.5(solid-js@2.0.0-beta.13) + '@solid-primitives/refs': 1.1.3(solid-js@2.0.0-beta.13) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) + '@solid-primitives/styles': 0.1.3(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/composites@1.1.1(solid-js@1.9.7)': + '@solid-primitives/bounds@0.1.5(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/debounce': 1.3.0(solid-js@1.9.7) - '@solid-primitives/throttle': 1.2.0(solid-js@1.9.7) - solid-js: 1.9.7 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) + '@solid-primitives/resize-observer': 2.1.5(solid-js@2.0.0-beta.13) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/debounce@1.3.0(solid-js@1.9.7)': + '@solid-primitives/event-listener@2.4.5(solid-js@2.0.0-beta.13)': dependencies: - solid-js: 1.9.7 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/event-listener@2.4.5(solid-js@2.0.0-experimental.16)': + '@solid-primitives/keyboard@1.3.5(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/keyboard@1.3.5(solid-js@2.0.0-experimental.16)': + '@solid-primitives/media@2.3.5(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 - - '@solid-primitives/media@2.3.5(solid-js@2.0.0-experimental.16)': - dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 '@solid-primitives/refs@1.0.8(solid-js@1.9.7)': dependencies: '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) solid-js: 1.9.7 - '@solid-primitives/refs@1.0.8(solid-js@2.0.0-experimental.16)': + '@solid-primitives/refs@1.0.8(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/utils': 6.2.3(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/refs@1.1.3(solid-js@2.0.0-experimental.16)': + '@solid-primitives/refs@1.1.3(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/resize-observer@2.1.5(solid-js@2.0.0-experimental.16)': + '@solid-primitives/resize-observer@2.1.5(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/rootless@1.5.3(solid-js@2.0.0-experimental.16)': + '@solid-primitives/rootless@1.5.3(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/scheduled@1.5.3(solid-js@2.0.0-experimental.16)': + '@solid-primitives/scheduled@1.5.3(solid-js@2.0.0-beta.13)': dependencies: - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 - '@solid-primitives/static-store@0.1.3(solid-js@2.0.0-experimental.16)': + '@solid-primitives/static-store@0.1.3(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/styles@0.1.3(solid-js@2.0.0-experimental.16)': + '@solid-primitives/styles@0.1.3(solid-js@2.0.0-beta.13)': dependencies: - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) - solid-js: 2.0.0-experimental.16 + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 - '@solid-primitives/throttle@1.2.0(solid-js@1.9.7)': + '@solid-primitives/transition-group@1.0.5(solid-js@1.9.7)': dependencies: solid-js: 1.9.7 - '@solid-primitives/transition-group@1.0.5(solid-js@1.9.7)': + '@solid-primitives/transition-group@1.0.5(solid-js@2.0.0-beta.13)': dependencies: - solid-js: 1.9.7 + solid-js: 2.0.0-beta.13 '@solid-primitives/utils@6.2.3(solid-js@1.9.7)': dependencies: solid-js: 1.9.7 - '@solid-primitives/utils@6.2.3(solid-js@2.0.0-experimental.16)': + '@solid-primitives/utils@6.2.3(solid-js@2.0.0-beta.13)': dependencies: - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 - '@solid-primitives/utils@6.4.0(solid-js@2.0.0-experimental.16)': + '@solid-primitives/utils@6.4.0(solid-js@2.0.0-beta.13)': dependencies: - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 - '@solidjs/meta@0.29.4(solid-js@2.0.0-experimental.16)': + '@solidjs/meta@0.29.4(solid-js@2.0.0-beta.13)': dependencies: - solid-js: 2.0.0-experimental.16 - - '@solidjs/router@0.8.4(solid-js@1.9.7)': - dependencies: - solid-js: 1.9.7 + solid-js: 2.0.0-beta.13 '@solidjs/signals@0.11.3': {} '@solidjs/signals@2.0.0-beta.10': {} - '@solidjs/start@1.1.4(solid-js@2.0.0-beta.10)(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@solidjs/signals@2.0.0-beta.13': {} + + '@solidjs/start@1.1.4(solid-js@2.0.0-beta.13)(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: - '@tanstack/server-functions-plugin': 1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/server-functions-plugin': 1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -9651,10 +9655,10 @@ snapshots: seroval-plugins: 1.3.2(seroval@1.3.2) shiki: 1.29.2 source-map-js: 1.2.1 - terracotta: 1.0.6(solid-js@2.0.0-beta.10) + terracotta: 1.0.6(solid-js@2.0.0-beta.13) tinyglobby: 0.2.14 - vinxi: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) - vite-plugin-solid: 2.11.12(solid-js@2.0.0-beta.10)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + vinxi: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) + vite-plugin-solid: 2.11.12(solid-js@2.0.0-beta.13)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) transitivePeerDependencies: - '@testing-library/jest-dom' - solid-js @@ -9667,6 +9671,24 @@ snapshots: seroval-plugins: 1.5.2(seroval@1.5.2) solid-js: 2.0.0-beta.10 + '@solidjs/web@2.0.0-beta.12(solid-js@2.0.0-beta.12)': + dependencies: + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js: 2.0.0-beta.12 + + '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.13)': + dependencies: + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js: 2.0.0-beta.13 + + '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-experimental.16)': + dependencies: + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js: 2.0.0-experimental.16 + '@speed-highlight/core@1.2.7': {} '@supabase/auth-js@2.67.3': @@ -9723,16 +9745,16 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.3.3 - '@tanstack/directive-functions-plugin@1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/directive-functions-plugin@1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 '@tanstack/router-utils': 1.121.0 babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 - vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) transitivePeerDependencies: - supports-color @@ -9758,7 +9780,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/router-plugin@1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) @@ -9774,8 +9796,8 @@ snapshots: unplugin: 3.0.0 zod: 3.25.63 optionalDependencies: - vite: 8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) - vite-plugin-solid: 2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) + vite-plugin-solid: 2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) transitivePeerDependencies: - supports-color @@ -9804,7 +9826,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/server-functions-plugin@1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 @@ -9813,54 +9835,54 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.27.4 '@babel/types': 7.27.6 - '@tanstack/directive-functions-plugin': 1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/directive-functions-plugin': 1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/solid-router@1.169.1(solid-js@2.0.0-experimental.16)': + '@tanstack/solid-router@1.169.1(solid-js@2.0.0-beta.13)': dependencies: - '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-experimental.16) - '@solid-primitives/refs': 1.0.8(solid-js@2.0.0-experimental.16) - '@solidjs/meta': 0.29.4(solid-js@2.0.0-experimental.16) + '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-beta.13) + '@solid-primitives/refs': 1.0.8(solid-js@2.0.0-beta.13) + '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.13) '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.169.1 isbot: 5.1.39 - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 - '@tanstack/solid-start-client@1.166.46(solid-js@2.0.0-experimental.16)': + '@tanstack/solid-start-client@1.166.46(solid-js@2.0.0-beta.13)': dependencies: '@tanstack/router-core': 1.169.1 - '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-experimental.16) + '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-beta.13) '@tanstack/start-client-core': 1.168.1 - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 - '@tanstack/solid-start-server@1.166.50(solid-js@2.0.0-experimental.16)': + '@tanstack/solid-start-server@1.166.50(solid-js@2.0.0-beta.13)': dependencies: - '@solidjs/meta': 0.29.4(solid-js@2.0.0-experimental.16) + '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.13) '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.169.1 - '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-experimental.16) + '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-beta.13) '@tanstack/start-client-core': 1.168.1 '@tanstack/start-server-core': 1.167.29 - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.167.59(solid-js@2.0.0-experimental.16)(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/solid-start@1.167.59(solid-js@2.0.0-beta.13)(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: - '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-experimental.16) - '@tanstack/solid-start-client': 1.166.46(solid-js@2.0.0-experimental.16) - '@tanstack/solid-start-server': 1.166.50(solid-js@2.0.0-experimental.16) + '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-beta.13) + '@tanstack/solid-start-client': 1.166.46(solid-js@2.0.0-beta.13) + '@tanstack/solid-start-server': 1.166.50(solid-js@2.0.0-beta.13) '@tanstack/start-client-core': 1.168.1 - '@tanstack/start-plugin-core': 1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-plugin-core': 1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) '@tanstack/start-server-core': 1.167.29 pathe: 2.0.3 - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 optionalDependencies: - vite: 8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) transitivePeerDependencies: - '@tanstack/react-router' - crossws @@ -9877,7 +9899,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/start-plugin-core@1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -9885,7 +9907,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.169.1 '@tanstack/router-generator': 1.166.39 - '@tanstack/router-plugin': 1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/router-plugin': 1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) '@tanstack/router-utils': 1.161.7 '@tanstack/start-client-core': 1.168.1 '@tanstack/start-server-core': 1.167.29 @@ -9899,11 +9921,11 @@ snapshots: srvx: 0.11.15 tinyglobby: 0.2.16 ufo: 1.6.1 - vitefu: 1.1.3(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + vitefu: 1.1.3(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) xmlbuilder2: 4.0.3 zod: 3.25.63 optionalDependencies: - vite: 8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) transitivePeerDependencies: - '@tanstack/react-router' - crossws @@ -9944,7 +9966,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.5 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -10017,11 +10039,6 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@24.0.1': - dependencies: - undici-types: 7.8.0 - optional: true - '@types/normalize-package-data@2.4.4': {} '@types/phoenix@1.6.6': {} @@ -10180,7 +10197,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@babel/parser': 7.27.5 acorn: 8.15.0 @@ -10191,18 +10208,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vinxi: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) - '@vinxi/server-components@0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0))': + '@vinxi/server-components@0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) acorn: 8.15.0 acorn-loose: 8.5.1 acorn-typescript: 1.4.13(acorn@8.15.0) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vinxi: 0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) '@vitest/expect@2.1.9': dependencies: @@ -10498,8 +10515,8 @@ snapshots: babel-dead-code-elimination@1.0.10: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.27.5 - '@babel/traverse': 7.27.4 + '@babel/parser': 7.29.3 + '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -10523,7 +10540,7 @@ snapshots: parse5: 7.3.0 validate-html-nesting: 1.2.2 - babel-plugin-jsx-dom-expressions@0.50.0-next.6(@babel/core@7.29.0): + babel-plugin-jsx-dom-expressions@0.50.0-next.11(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 @@ -10573,12 +10590,12 @@ snapshots: '@babel/core': 7.29.0 babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.29.0) - babel-preset-solid@2.0.0-beta.10(@babel/core@7.29.0)(solid-js@2.0.0-beta.10): + babel-preset-solid@2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.13): dependencies: '@babel/core': 7.29.0 - babel-plugin-jsx-dom-expressions: 0.50.0-next.6(@babel/core@7.29.0) + babel-plugin-jsx-dom-expressions: 0.50.0-next.11(@babel/core@7.29.0) optionalDependencies: - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.13 bail@2.0.2: {} @@ -11290,13 +11307,13 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild-plugin-solid@0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.10): + esbuild-plugin-solid@0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.13): dependencies: '@babel/core': 7.29.0 '@babel/preset-typescript': 7.27.1(@babel/core@7.29.0) babel-preset-solid: 1.9.6(@babel/core@7.29.0) esbuild: 0.25.5 - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.13 transitivePeerDependencies: - supports-color @@ -11700,11 +11717,6 @@ snapshots: get-stream@8.0.1: {} - get-tsconfig@4.10.1: - dependencies: - resolve-pkg-maps: 1.0.0 - optional: true - giget@2.0.0: dependencies: citty: 0.1.6 @@ -11774,13 +11786,13 @@ snapshots: graphemer@1.4.0: {} - graphql-config@5.1.0(@types/node@24.0.1)(graphql@16.9.0)(typescript@5.8.3): + graphql-config@5.1.0(@types/node@22.15.31)(graphql@16.9.0)(typescript@5.8.3): dependencies: '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0) '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0) '@graphql-tools/load': 8.0.2(graphql@16.9.0) '@graphql-tools/merge': 9.0.4(graphql@16.9.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@24.0.1)(graphql@16.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@22.15.31)(graphql@16.9.0) '@graphql-tools/utils': 10.3.4(graphql@16.9.0) cosmiconfig: 8.3.6(typescript@5.8.3) graphql: 16.9.0 @@ -12460,7 +12472,7 @@ snapshots: magicast@0.2.11: dependencies: - '@babel/parser': 7.27.5 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 recast: 0.23.11 @@ -12602,9 +12614,9 @@ snapshots: merge2@1.4.1: {} - meros@1.3.0(@types/node@24.0.1): + meros@1.3.0(@types/node@22.15.31): optionalDependencies: - '@types/node': 24.0.1 + '@types/node': 22.15.31 micro-api-client@3.3.0: {} @@ -13713,9 +13725,6 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: - optional: true - resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -14005,13 +14014,13 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - solid-dismiss@1.8.2(solid-js@2.0.0-experimental.16): + solid-dismiss@1.8.2(solid-js@2.0.0-beta.13): dependencies: - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 - solid-icons@1.1.0(solid-js@2.0.0-experimental.16): + solid-icons@1.1.0(solid-js@2.0.0-beta.13): dependencies: - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 solid-js@1.9.7: dependencies: @@ -14026,28 +14035,33 @@ snapshots: seroval: 1.5.2 seroval-plugins: 1.5.2(seroval@1.5.2) - solid-js@2.0.0-experimental.16: + solid-js@2.0.0-beta.12: dependencies: - '@solidjs/signals': 0.11.3 + '@solidjs/signals': 2.0.0-beta.13 csstype: 3.1.3 seroval: 1.5.2 seroval-plugins: 1.5.2(seroval@1.5.2) - solid-refresh@0.6.3(solid-js@2.0.0-beta.10): + solid-js@2.0.0-beta.13: dependencies: - '@babel/generator': 7.27.5 - '@babel/helper-module-imports': 7.28.6 - '@babel/types': 7.29.0 - solid-js: 2.0.0-beta.10 - transitivePeerDependencies: - - supports-color + '@solidjs/signals': 2.0.0-beta.13 + csstype: 3.1.3 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) - solid-refresh@0.6.3(solid-js@2.0.0-experimental.16): + solid-js@2.0.0-experimental.16: dependencies: - '@babel/generator': 7.27.5 + '@solidjs/signals': 0.11.3 + csstype: 3.1.3 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + + solid-refresh@0.6.3(solid-js@2.0.0-beta.13): + dependencies: + '@babel/generator': 7.29.1 '@babel/helper-module-imports': 7.28.6 '@babel/types': 7.29.0 - solid-js: 2.0.0-experimental.16 + solid-js: 2.0.0-beta.13 transitivePeerDependencies: - supports-color @@ -14057,9 +14071,15 @@ snapshots: '@solid-primitives/transition-group': 1.0.5(solid-js@1.9.7) solid-js: 1.9.7 - solid-use@0.9.1(solid-js@2.0.0-beta.10): + solid-transition-group@0.2.3(solid-js@2.0.0-beta.13): dependencies: - solid-js: 2.0.0-beta.10 + '@solid-primitives/refs': 1.0.8(solid-js@2.0.0-beta.13) + '@solid-primitives/transition-group': 1.0.5(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-beta.13 + + solid-use@0.9.1(solid-js@2.0.0-beta.13): + dependencies: + solid-js: 2.0.0-beta.13 source-map-js@1.2.1: {} @@ -14284,10 +14304,10 @@ snapshots: term-size@2.2.1: {} - terracotta@1.0.6(solid-js@2.0.0-beta.10): + terracotta@1.0.6(solid-js@2.0.0-beta.13): dependencies: - solid-js: 2.0.0-beta.10 - solid-use: 0.9.1(solid-js@2.0.0-beta.10) + solid-js: 2.0.0-beta.13 + solid-use: 0.9.1(solid-js@2.0.0-beta.13) terser@5.42.0: dependencies: @@ -14390,14 +14410,6 @@ snapshots: tslib@2.8.1: {} - tsx@4.20.2: - dependencies: - esbuild: 0.25.5 - get-tsconfig: 4.10.1 - optionalDependencies: - fsevents: 2.3.3 - optional: true - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -14429,9 +14441,6 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.8.0: - optional: true - undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -14627,7 +14636,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0): + vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0): dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) @@ -14661,7 +14670,7 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unstorage: 1.16.0(db0@0.3.2)(ioredis@5.6.1) - vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) zod: 3.25.63 transitivePeerDependencies: - '@azure/app-configuration' @@ -14723,42 +14732,42 @@ snapshots: - supports-color - terser - vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.10)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 babel-preset-solid: 1.9.6(@babel/core@7.29.0) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.10 - solid-refresh: 0.6.3(solid-js@2.0.0-beta.10) - vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + solid-js: 2.0.0-beta.13 + solid-refresh: 0.6.3(solid-js@2.0.0-beta.13) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) + vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 babel-preset-solid: 1.9.6(@babel/core@7.29.0) merge-anything: 5.1.7 - solid-js: 2.0.0-experimental.16 - solid-refresh: 0.6.3(solid-js@2.0.0-experimental.16) - vite: 8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.0.6(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + solid-js: 2.0.0-beta.13 + solid-refresh: 0.6.3(solid-js@2.0.0-beta.13) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) + vitefu: 1.0.6(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.6(solid-js@2.0.0-beta.10)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@2.11.6(solid-js@2.0.0-beta.13)(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 babel-preset-solid: 1.9.6(@babel/core@7.29.0) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.10 - solid-refresh: 0.6.3(solid-js@2.0.0-beta.10) - vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)) + solid-js: 2.0.0-beta.13 + solid-refresh: 0.6.3(solid-js@2.0.0-beta.13) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) + vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) transitivePeerDependencies: - supports-color @@ -14774,7 +14783,7 @@ snapshots: sass: 1.77.8 terser: 5.42.0 - vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0): + vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -14789,10 +14798,9 @@ snapshots: lightningcss: 1.32.0 sass: 1.77.8 terser: 5.42.0 - tsx: 4.20.2 yaml: 2.5.0 - vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0): + vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -14800,26 +14808,25 @@ snapshots: rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 24.0.1 + '@types/node': 22.15.31 esbuild: 0.25.5 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.77.8 terser: 5.42.0 - tsx: 4.20.2 yaml: 2.5.0 - vitefu@1.0.6(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)): + vitefu@1.0.6(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): optionalDependencies: - vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) - vitefu@1.0.6(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)): + vitefu@1.0.6(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): optionalDependencies: - vite: 8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) - vitefu@1.1.3(vite@8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0)): + vitefu@1.1.3(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): optionalDependencies: - vite: 8.0.10(@types/node@24.0.1)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) vitest@2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0): dependencies: From 20f84b0eee5e420bd7c6256096ca8da44125db3b Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sat, 23 May 2026 17:34:00 -0400 Subject: [PATCH 5/7] Beta beta 14 --- packages/notification/package.json | 8 +- packages/permission/package.json | 8 +- pnpm-lock.yaml | 268 +++++++++++++++++------------ 3 files changed, 164 insertions(+), 120 deletions(-) diff --git a/packages/notification/package.json b/packages/notification/package.json index a8f18e92e..e5f5b1072 100644 --- a/packages/notification/package.json +++ b/packages/notification/package.json @@ -56,15 +56,15 @@ "test:ssr": "pnpm run vitest --mode ssr" }, "peerDependencies": { - "@solidjs/web": "^2.0.0-beta.10", - "solid-js": "^2.0.0-beta.10" + "@solidjs/web": "^2.0.0-beta.14", + "solid-js": "^2.0.0-beta.14" }, "dependencies": { "@solid-primitives/permission": "workspace:^", "@solid-primitives/utils": "workspace:^" }, "devDependencies": { - "@solidjs/web": "2.0.0-beta.10", - "solid-js": "2.0.0-beta.10" + "@solidjs/web": "2.0.0-beta.14", + "solid-js": "2.0.0-beta.14" } } diff --git a/packages/permission/package.json b/packages/permission/package.json index 96c119a30..403075bb9 100644 --- a/packages/permission/package.json +++ b/packages/permission/package.json @@ -41,8 +41,8 @@ "test:ssr": "pnpm run vitest --mode ssr" }, "peerDependencies": { - "@solidjs/web": "^2.0.0-beta.10", - "solid-js": "^2.0.0-beta.10" + "@solidjs/web": "^2.0.0-beta.14", + "solid-js": "^2.0.0-beta.14" }, "keywords": [ "permission", @@ -52,7 +52,7 @@ ], "typesVersions": {}, "devDependencies": { - "@solidjs/web": "2.0.0-beta.10", - "solid-js": "2.0.0-beta.10" + "@solidjs/web": "2.0.0-beta.14", + "solid-js": "2.0.0-beta.14" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 291fb04d1..76d4f88d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -669,11 +669,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/orientation: dependencies: @@ -717,11 +717,11 @@ importers: packages/permission: devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/platform: devDependencies: @@ -1174,10 +1174,10 @@ importers: version: link:../packages/utils '@tanstack/solid-router': specifier: ^1.168.16 - version: 1.169.1(solid-js@2.0.0-beta.13) + version: 1.169.1(solid-js@2.0.0-experimental.16) '@tanstack/solid-start': specifier: ^1.167.28 - version: 1.167.59(solid-js@2.0.0-beta.13)(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) + version: 1.167.59(solid-js@2.0.0-experimental.16)(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) clsx: specifier: ^2.0.0 version: 2.1.1 @@ -1204,10 +1204,10 @@ importers: version: 1.77.8 solid-dismiss: specifier: ^1.7.121 - version: 1.8.2(solid-js@2.0.0-beta.13) + version: 1.8.2(solid-js@2.0.0-experimental.16) solid-icons: specifier: ^1.1.0 - version: 1.1.0(solid-js@2.0.0-beta.13) + version: 1.1.0(solid-js@2.0.0-experimental.16) undici: specifier: ^5.28.2 version: 5.28.4 @@ -1244,7 +1244,7 @@ importers: version: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) vite-plugin-solid: specifier: ^2.11.12 - version: 2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) + version: 2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) packages: @@ -2971,6 +2971,9 @@ packages: '@solidjs/signals@2.0.0-beta.13': resolution: {integrity: sha512-jc+wLRK+eyUFerH8Mjed4HikdJwz3z95TT7tqyG+K00IV9jfgZWvR1nZDUEZc6kXffmtW/z+w6PNn62ea5KjIw==} + '@solidjs/signals@2.0.0-beta.14': + resolution: {integrity: sha512-y72nYtD7ogwX/UR5g2Y+meyeO6Q/xbQGtmvVTQX6USkMwEGOMnytqDnHj5amUzD7Fzqg32svwtCSx/q8hsOXAA==} + '@solidjs/start@1.1.4': resolution: {integrity: sha512-ma1TBYqoTju87tkqrHExMReM5Z/+DTXSmi30CCTavtwuR73Bsn4rVGqm528p4sL2koRMfAuBMkrhuttjzhL68g==} peerDependencies: @@ -2991,6 +2994,11 @@ packages: peerDependencies: solid-js: ^2.0.0-beta.13 + '@solidjs/web@2.0.0-beta.14': + resolution: {integrity: sha512-iYqLqYapbnYBxbX9WspujYBdFHM1HND+Pd0p18vXHHlhYi42oBmIayxH4JsqPA+abe19nnpjXLmv03X2/IpmVQ==} + peerDependencies: + solid-js: ^2.0.0-beta.14 + '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} @@ -6723,6 +6731,9 @@ packages: solid-js@2.0.0-beta.13: resolution: {integrity: sha512-uAknr7Xkn25zAufBrYko4eOCbcg/gkrwnmE9KVb2Kb3vVZw2ibqseNxpjslnwJkT4gFScmFniqJtzRp7vO2klA==} + solid-js@2.0.0-beta.14: + resolution: {integrity: sha512-gbbvlxhs1GgL1IsnwHNtkTCRBBQcIDMwznBw3T05iYvP+fuUKMyIPku+ZLjeALyX4RaSLR99JSL6NttyHsYb8Q==} + solid-js@2.0.0-experimental.16: resolution: {integrity: sha512-zZ1dU7cR0EnvLnrYiRLQbCFiDw5blLdlqmofgLzKUYE1TCMWDcisBlSwz0Ez8l4yXB4adbdhtaYCuynH4xSq9A==} @@ -9507,67 +9518,67 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} - '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-beta.13)': + '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-experimental.16)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.13) - '@solid-primitives/bounds': 0.1.5(solid-js@2.0.0-beta.13) - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) - '@solid-primitives/keyboard': 1.3.5(solid-js@2.0.0-beta.13) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-experimental.16) + '@solid-primitives/bounds': 0.1.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/keyboard': 1.3.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-devtools/logger@0.9.11(solid-js@2.0.0-beta.13)': + '@solid-devtools/logger@0.9.11(solid-js@2.0.0-experimental.16)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-beta.13) - '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-experimental.16) + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-devtools/shared@0.20.0(solid-js@2.0.0-beta.13)': + '@solid-devtools/shared@0.20.0(solid-js@2.0.0-experimental.16)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) - '@solid-primitives/media': 2.3.5(solid-js@2.0.0-beta.13) - '@solid-primitives/refs': 1.1.3(solid-js@2.0.0-beta.13) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) - '@solid-primitives/styles': 0.1.3(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/media': 2.3.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/refs': 1.1.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/styles': 0.1.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/bounds@0.1.5(solid-js@2.0.0-beta.13)': + '@solid-primitives/bounds@0.1.5(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) - '@solid-primitives/resize-observer': 2.1.5(solid-js@2.0.0-beta.13) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/resize-observer': 2.1.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/event-listener@2.4.5(solid-js@2.0.0-beta.13)': + '@solid-primitives/event-listener@2.4.5(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/keyboard@1.3.5(solid-js@2.0.0-beta.13)': + '@solid-primitives/keyboard@1.3.5(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/media@2.3.5(solid-js@2.0.0-beta.13)': + '@solid-primitives/media@2.3.5(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 '@solid-primitives/refs@1.0.8(solid-js@1.9.7)': dependencies: @@ -9579,38 +9590,43 @@ snapshots: '@solid-primitives/utils': 6.2.3(solid-js@2.0.0-beta.13) solid-js: 2.0.0-beta.13 - '@solid-primitives/refs@1.1.3(solid-js@2.0.0-beta.13)': + '@solid-primitives/refs@1.0.8(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/utils': 6.2.3(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/resize-observer@2.1.5(solid-js@2.0.0-beta.13)': + '@solid-primitives/refs@1.1.3(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.13) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/rootless@1.5.3(solid-js@2.0.0-beta.13)': + '@solid-primitives/resize-observer@2.1.5(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-experimental.16) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/scheduled@1.5.3(solid-js@2.0.0-beta.13)': + '@solid-primitives/rootless@1.5.3(solid-js@2.0.0-experimental.16)': dependencies: - solid-js: 2.0.0-beta.13 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 - '@solid-primitives/static-store@0.1.3(solid-js@2.0.0-beta.13)': + '@solid-primitives/scheduled@1.5.3(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 - '@solid-primitives/styles@0.1.3(solid-js@2.0.0-beta.13)': + '@solid-primitives/static-store@0.1.3(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.13) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 + + '@solid-primitives/styles@0.1.3(solid-js@2.0.0-experimental.16)': + dependencies: + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-experimental.16) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-experimental.16) + solid-js: 2.0.0-experimental.16 '@solid-primitives/transition-group@1.0.5(solid-js@1.9.7)': dependencies: @@ -9628,13 +9644,17 @@ snapshots: dependencies: solid-js: 2.0.0-beta.13 - '@solid-primitives/utils@6.4.0(solid-js@2.0.0-beta.13)': + '@solid-primitives/utils@6.2.3(solid-js@2.0.0-experimental.16)': dependencies: - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 - '@solidjs/meta@0.29.4(solid-js@2.0.0-beta.13)': + '@solid-primitives/utils@6.4.0(solid-js@2.0.0-experimental.16)': dependencies: - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 + + '@solidjs/meta@0.29.4(solid-js@2.0.0-experimental.16)': + dependencies: + solid-js: 2.0.0-experimental.16 '@solidjs/signals@0.11.3': {} @@ -9642,6 +9662,8 @@ snapshots: '@solidjs/signals@2.0.0-beta.13': {} + '@solidjs/signals@2.0.0-beta.14': {} + '@solidjs/start@1.1.4(solid-js@2.0.0-beta.13)(vinxi@0.5.7(@types/node@22.15.31)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@tanstack/server-functions-plugin': 1.121.0(vite@6.3.5(@types/node@22.15.31)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) @@ -9689,6 +9711,12 @@ snapshots: seroval-plugins: 1.5.2(seroval@1.5.2) solid-js: 2.0.0-experimental.16 + '@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14)': + dependencies: + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js: 2.0.0-beta.14 + '@speed-highlight/core@1.2.7': {} '@supabase/auth-js@2.67.3': @@ -9780,7 +9808,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': + '@tanstack/router-plugin@1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) @@ -9797,7 +9825,7 @@ snapshots: zod: 3.25.63 optionalDependencies: vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) - vite-plugin-solid: 2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) + vite-plugin-solid: 2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) transitivePeerDependencies: - supports-color @@ -9842,45 +9870,45 @@ snapshots: - supports-color - vite - '@tanstack/solid-router@1.169.1(solid-js@2.0.0-beta.13)': + '@tanstack/solid-router@1.169.1(solid-js@2.0.0-experimental.16)': dependencies: - '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-beta.13) - '@solid-primitives/refs': 1.0.8(solid-js@2.0.0-beta.13) - '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.13) + '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-experimental.16) + '@solid-primitives/refs': 1.0.8(solid-js@2.0.0-experimental.16) + '@solidjs/meta': 0.29.4(solid-js@2.0.0-experimental.16) '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.169.1 isbot: 5.1.39 - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 - '@tanstack/solid-start-client@1.166.46(solid-js@2.0.0-beta.13)': + '@tanstack/solid-start-client@1.166.46(solid-js@2.0.0-experimental.16)': dependencies: '@tanstack/router-core': 1.169.1 - '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-beta.13) + '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-experimental.16) '@tanstack/start-client-core': 1.168.1 - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 - '@tanstack/solid-start-server@1.166.50(solid-js@2.0.0-beta.13)': + '@tanstack/solid-start-server@1.166.50(solid-js@2.0.0-experimental.16)': dependencies: - '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.13) + '@solidjs/meta': 0.29.4(solid-js@2.0.0-experimental.16) '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.169.1 - '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-beta.13) + '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-experimental.16) '@tanstack/start-client-core': 1.168.1 '@tanstack/start-server-core': 1.167.29 - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.167.59(solid-js@2.0.0-beta.13)(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': + '@tanstack/solid-start@1.167.59(solid-js@2.0.0-experimental.16)(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: - '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-beta.13) - '@tanstack/solid-start-client': 1.166.46(solid-js@2.0.0-beta.13) - '@tanstack/solid-start-server': 1.166.50(solid-js@2.0.0-beta.13) + '@tanstack/solid-router': 1.169.1(solid-js@2.0.0-experimental.16) + '@tanstack/solid-start-client': 1.166.46(solid-js@2.0.0-experimental.16) + '@tanstack/solid-start-server': 1.166.50(solid-js@2.0.0-experimental.16) '@tanstack/start-client-core': 1.168.1 - '@tanstack/start-plugin-core': 1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) + '@tanstack/start-plugin-core': 1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) '@tanstack/start-server-core': 1.167.29 pathe: 2.0.3 - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 optionalDependencies: vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) transitivePeerDependencies: @@ -9899,7 +9927,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': + '@tanstack/start-plugin-core@1.169.17(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -9907,7 +9935,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.169.1 '@tanstack/router-generator': 1.166.39 - '@tanstack/router-plugin': 1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) + '@tanstack/router-plugin': 1.167.32(vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) '@tanstack/router-utils': 1.161.7 '@tanstack/start-client-core': 1.168.1 '@tanstack/start-server-core': 1.167.29 @@ -14014,13 +14042,13 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - solid-dismiss@1.8.2(solid-js@2.0.0-beta.13): + solid-dismiss@1.8.2(solid-js@2.0.0-experimental.16): dependencies: - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 - solid-icons@1.1.0(solid-js@2.0.0-beta.13): + solid-icons@1.1.0(solid-js@2.0.0-experimental.16): dependencies: - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-experimental.16 solid-js@1.9.7: dependencies: @@ -14049,6 +14077,13 @@ snapshots: seroval: 1.5.2 seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js@2.0.0-beta.14: + dependencies: + '@solidjs/signals': 2.0.0-beta.14 + csstype: 3.1.3 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js@2.0.0-experimental.16: dependencies: '@solidjs/signals': 0.11.3 @@ -14065,6 +14100,15 @@ snapshots: transitivePeerDependencies: - supports-color + solid-refresh@0.6.3(solid-js@2.0.0-experimental.16): + dependencies: + '@babel/generator': 7.29.1 + '@babel/helper-module-imports': 7.28.6 + '@babel/types': 7.29.0 + solid-js: 2.0.0-experimental.16 + transitivePeerDependencies: + - supports-color + solid-transition-group@0.2.3(solid-js@1.9.7): dependencies: '@solid-primitives/refs': 1.0.8(solid-js@1.9.7) @@ -14745,14 +14789,14 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.12(solid-js@2.0.0-beta.13)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): + vite-plugin-solid@2.11.12(solid-js@2.0.0-experimental.16)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 babel-preset-solid: 1.9.6(@babel/core@7.29.0) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.13 - solid-refresh: 0.6.3(solid-js@2.0.0-beta.13) + solid-js: 2.0.0-experimental.16 + solid-refresh: 0.6.3(solid-js@2.0.0-experimental.16) vite: 8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0) vitefu: 1.0.6(vite@8.0.10(@types/node@22.15.31)(esbuild@0.25.5)(jiti@2.6.1)(sass@1.77.8)(terser@5.42.0)(yaml@2.5.0)) transitivePeerDependencies: From e7f52d3cec3101533a9ef2c3910e1b297476b381 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sat, 23 May 2026 17:35:20 -0400 Subject: [PATCH 6/7] Lock update --- pnpm-lock.yaml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee1923c5f..70fdcd15d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -692,6 +692,22 @@ importers: specifier: 2.0.0-beta.14 version: 2.0.0-beta.14 + packages/notification: + dependencies: + '@solid-primitives/permission': + specifier: workspace:^ + version: link:../permission + '@solid-primitives/utils': + specifier: workspace:^ + version: link:../utils + devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) + solid-js: + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 + packages/orientation: dependencies: '@solid-primitives/utils': @@ -733,9 +749,12 @@ importers: packages/permission: devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/platform: devDependencies: From c136eba8dff40708eaffd9fe8f5315bf2afc9d60 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sat, 23 May 2026 17:44:13 -0400 Subject: [PATCH 7/7] Documentation fixes caught by CR --- .changeset/notification-initial.md | 4 ++-- packages/notification/README.md | 10 ++++++---- packages/notification/src/index.ts | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.changeset/notification-initial.md b/.changeset/notification-initial.md index d3d6c1eda..d2679fbdb 100644 --- a/.changeset/notification-initial.md +++ b/.changeset/notification-initial.md @@ -9,6 +9,6 @@ New primitives for the browser [Notifications API](https://developer.mozilla.org - **`isNotificationSupported()`** — SSR-safe runtime check for Notifications API availability. - **`makeNotification(title, options?)`** — Non-reactive helper returning `[show, close]`. `show()` creates and returns a `Notification` instance (or `null` when permission is not `"granted"`); calling it again replaces the previous notification. No Solid lifecycle dependency. - **`createNotification(title, options?)`** — Reactive primitive returning `{ show, close, notification, supported }`. Accepts reactive accessors for `title` and `options` — their current values are read at `show()` time. The `notification` accessor tracks the live instance, updating to `null` when it is dismissed by the OS or closed programmatically. Cleans up automatically on owner disposal. -- **`createNotificationPermission()`** — Reactive permission manager returning `{ permission, requestPermission }`. The `permission` accessor reflects `Notification.permission` and updates after each `requestPermission()` call. Degrades gracefully to `"denied"` on the server. +- **`createNotificationPermission()`** — Reactive permission manager returning `{ permission, requestPermission }`. The `permission` accessor reflects `Notification.permission` and updates after each `requestPermission()` call. Degrades gracefully to `"unknown"` on the server or when the Notifications API is unsupported. -Peer dependencies: `solid-js@^2.0.0-beta.10` and `@solidjs/web@^2.0.0-beta.10`. +Peer dependencies: `solid-js@^2.0.0-beta.14` and `@solidjs/web@^2.0.0-beta.14`. diff --git a/packages/notification/README.md b/packages/notification/README.md index d8ef38d4d..4b5a85bc3 100644 --- a/packages/notification/README.md +++ b/packages/notification/README.md @@ -78,6 +78,7 @@ Reactive primitive tied to the current reactive owner. - Pass an optional `handlers` object to respond to notification events. ```ts +import { createEffect } from "solid-js"; import { createNotification } from "@solid-primitives/notification"; const { show, close, notification, supported } = createNotification( @@ -113,9 +114,10 @@ The `permission` accessor reflects the **live** permission state and updates aut Permission values follow Permissions API vocabulary: `"granted"`, `"denied"`, `"prompt"` (not yet asked), or `"unknown"` while the initial async query is still resolving. Note that the Notifications API uses `"default"` for the same concept that the Permissions API calls `"prompt"`. -On the server or when the API is unavailable, `permission` always returns `"unknown"` and `requestPermission` resolves immediately to `"denied"`. +On the server or when the API is unavailable, `permission` always returns `"unknown"` and `requestPermission` resolves immediately without effect. ```ts +import { Show } from "solid-js"; import { createNotificationPermission } from "@solid-primitives/notification"; const { permission, requestPermission } = createNotificationPermission(); @@ -125,9 +127,8 @@ const { permission, requestPermission } = createNotificationPermission();
-// Await the result (returns the raw NotificationPermission value) -const result = await requestPermission(); -// result: "granted" | "denied" | "default" +// Call without expecting a return value — permission() updates reactively after it resolves +requestPermission(); ``` --- @@ -135,6 +136,7 @@ const result = await requestPermission(); ### Full example ```tsx +import { Component, Show } from "solid-js"; import { createNotification, createNotificationPermission, diff --git a/packages/notification/src/index.ts b/packages/notification/src/index.ts index cdb08b8d8..cd0ad0a0c 100644 --- a/packages/notification/src/index.ts +++ b/packages/notification/src/index.ts @@ -194,7 +194,7 @@ export function createNotification( * is still resolving. Note that the Notifications API uses `"default"` for * the same concept that the Permissions API calls `"prompt"`. * - * @returns `{ permission, requestPermission }` + * @returns `{ permission, requestPermission, pending }` * * @example * ```ts