From 282b20c460a3c6d6b2c9d5fe05a27d3110c92357 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 23 Dec 2025 16:28:10 -0800 Subject: [PATCH] Add pomade signer --- package.json | 3 +- packages/app/package.json | 8 +- packages/app/src/session.ts | 28 +++ packages/signer/package.json | 10 +- packages/signer/src/index.ts | 1 + packages/signer/src/signers/pomade.ts | 68 +++++++ packages/util/src/Relay.ts | 4 + pnpm-lock.yaml | 260 ++++++++++++++++++++++++-- 8 files changed, 361 insertions(+), 21 deletions(-) create mode 100644 packages/signer/src/signers/pomade.ts diff --git a/package.json b/package.json index 97225d5..44617a7 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,8 @@ "pnpm": { "overrides": { "@tiptap/core": "^2.11.7", - "@tiptap/pm": "^2.11.7" + "@tiptap/pm": "^2.11.7", + "@pomade/core": "link:../pomade/packages/core" } } } diff --git a/packages/app/package.json b/packages/app/package.json index 1211ca4..6595970 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -23,8 +23,8 @@ "@types/throttle-debounce": "^5.0.2", "@welshman/feeds": "workspace:*", "@welshman/lib": "workspace:*", - "@welshman/router": "workspace:*", "@welshman/net": "workspace:*", + "@welshman/router": "workspace:*", "@welshman/signer": "workspace:*", "@welshman/store": "workspace:*", "@welshman/util": "workspace:*", @@ -32,8 +32,12 @@ "svelte": "^4.2.18", "throttle-debounce": "^5.0.2" }, + "peerDependencies": { + "@pomade/core": "^0.0.4" + }, "devDependencies": { "rimraf": "~6.0.0", - "typescript": "~5.8.0" + "typescript": "~5.8.0", + "@pomade/core": "^0.0.4" } } diff --git a/packages/app/src/session.ts b/packages/app/src/session.ts index 3735c7e..0003cb2 100644 --- a/packages/app/src/session.ts +++ b/packages/app/src/session.ts @@ -1,3 +1,4 @@ +import {Client, ClientOptions} from "@pomade/core" import {derived, writable} from "svelte/store" import {cached, randomId, append, omit, equals, assoc} from "@welshman/lib" import {withGetter} from "@welshman/store" @@ -13,6 +14,7 @@ import { import { Nip59, WrappedSigner, + PomadeSigner, Nip46Broker, Nip46Signer, Nip07Signer, @@ -28,6 +30,7 @@ export enum SessionMethod { Nip07 = "nip07", Nip46 = "nip46", Nip55 = "nip55", + Pomade = "pomade", Pubkey = "pubkey", Anonymous = "anonymous", } @@ -59,6 +62,12 @@ export type SessionNip55 = { signer: string } +export type SessionPomade = { + method: SessionMethod.Pomade + pubkey: string + clientOptions: ClientOptions +} + export type SessionPubkey = { method: SessionMethod.Pubkey pubkey: string @@ -73,6 +82,7 @@ export type SessionAnyMethod = | SessionNip07 | SessionNip46 | SessionNip55 + | SessionPomade | SessionPubkey | SessionAnonymous @@ -109,6 +119,10 @@ export const dropSession = (_pubkey: string) => { $signer.broker.cleanup() } + if ($signer instanceof PomadeSigner) { + $signer.client.rpc.stop() + } + pubkey.update($pubkey => ($pubkey === _pubkey ? undefined : $pubkey)) sessions.update($sessions => omit([_pubkey], $sessions)) } @@ -150,6 +164,12 @@ export const makeNip55Session = (pubkey: string, signer: string): SessionNip55 = signer, }) +export const makePomadeSession = (pubkey: string, clientOptions: ClientOptions): SessionPomade => ({ + method: SessionMethod.Pomade, + pubkey, + clientOptions, +}) + export const makePubkeySession = (pubkey: string): SessionPubkey => ({ method: SessionMethod.Pubkey, pubkey, @@ -169,6 +189,9 @@ export const isNip46Session = (session?: Session): session is SessionNip46 => export const isNip55Session = (session?: Session): session is SessionNip55 => session?.method === SessionMethod.Nip55 +export const isPomadeSession = (session?: Session): session is SessionPomade => + session?.method === SessionMethod.Pomade + export const isPubkeySession = (session?: Session): session is SessionPubkey => session?.method === SessionMethod.Pubkey @@ -188,6 +211,9 @@ export const loginWithNip46 = ( export const loginWithNip55 = (pubkey: string, signer: string) => addSession(makeNip55Session(pubkey, signer)) +export const loginWithPomade = (pubkey: string, clientOptions: ClientOptions) => + addSession(makePomadeSession(pubkey, clientOptions)) + export const loginWithPubkey = (pubkey: string) => addSession(makePubkeySession(pubkey)) // Other stuff @@ -250,6 +276,8 @@ export const getSigner = cached({ if (isNip07Session(session)) return wrapSigner(new Nip07Signer()) if (isNip01Session(session)) return wrapSigner(new Nip01Signer(session.secret)) if (isNip55Session(session)) return wrapSigner(new Nip55Signer(session.signer, session.pubkey)) + if (isPomadeSession(session)) + return wrapSigner(new PomadeSigner(new Client(session.clientOptions))) if (isNip46Session(session)) { const { secret: clientSecret, diff --git a/packages/signer/package.json b/packages/signer/package.json index dda00f4..f00ba77 100644 --- a/packages/signer/package.json +++ b/packages/signer/package.json @@ -28,13 +28,15 @@ "@welshman/util": "workspace:*", "nostr-tools": "^2.18.2" }, + "peerDependencies": { + "nostr-signer-capacitor-plugin": "~0.0.4", + "@pomade/core": "^0.0.4" + }, "devDependencies": { "@capacitor/core": "^7.2.0", "nostr-signer-capacitor-plugin": "~0.0.4", "rimraf": "~6.0.0", - "typescript": "~5.8.0" - }, - "peerDependencies": { - "nostr-signer-capacitor-plugin": "~0.0.4" + "typescript": "~5.8.0", + "@pomade/core": "^0.0.4" } } diff --git a/packages/signer/src/index.ts b/packages/signer/src/index.ts index 8a22420..a4a9dd6 100644 --- a/packages/signer/src/index.ts +++ b/packages/signer/src/index.ts @@ -4,3 +4,4 @@ export * from "./signers/nip01.js" export * from "./signers/nip07.js" export * from "./signers/nip46.js" export * from "./signers/nip55.js" +export * from "./signers/pomade.js" diff --git a/packages/signer/src/signers/pomade.ts b/packages/signer/src/signers/pomade.ts new file mode 100644 index 0000000..bc1e61c --- /dev/null +++ b/packages/signer/src/signers/pomade.ts @@ -0,0 +1,68 @@ +import * as nt44 from "nostr-tools/nip44" +import type {Client} from "@pomade/core" +import type {StampedEvent} from "@welshman/util" +import {thrower, hexToBytes} from "@welshman/lib" +import {ISigner, SignOptions, signWithOptions} from "../util.js" + +export class PomadeSigner implements ISigner { + #pubkey: string + #sharedSecretCache = new Map>() + + constructor(readonly client: Client) { + this.#pubkey = client.userPubkey + } + + private getSharedSecret = async (pubkey: string) => { + let sharedSecret = this.#sharedSecretCache.get(pubkey) + if (!sharedSecret) { + const hexSharedSecret = await this.client.getConversationKey(pubkey) + + if (hexSharedSecret) { + sharedSecret = hexToBytes(hexSharedSecret) + this.#sharedSecretCache.set(pubkey, sharedSecret) + } + } + + return sharedSecret + } + + getPubkey = async () => this.#pubkey + + sign = (event: StampedEvent, options: SignOptions = {}) => { + const promise = this.client.sign(event).then(r => { + if (!r.event) { + throw new Error(r.messages[0]?.payload.message || "Failed to sign event") + } + + return r.event + }) + + return signWithOptions(promise, options) + } + + nip04 = { + encrypt: thrower("PomadeSigner does not support nip44"), + decrypt: thrower("PomadeSigner does not support nip44"), + } + + nip44 = { + encrypt: async (pubkey: string, message: string) => { + const sharedSecret = await this.getSharedSecret(pubkey) + + if (!sharedSecret) { + throw new Error("Failed to get shared secret") + } + + return nt44.v2.encrypt(message, sharedSecret) + }, + decrypt: async (pubkey: string, message: string) => { + const sharedSecret = await this.getSharedSecret(pubkey) + + if (!sharedSecret) { + throw new Error("Failed to get shared secret") + } + + return nt44.v2.decrypt(message, sharedSecret) + }, + } +} diff --git a/packages/util/src/Relay.ts b/packages/util/src/Relay.ts index 84295a4..fb8f94a 100644 --- a/packages/util/src/Relay.ts +++ b/packages/util/src/Relay.ts @@ -32,6 +32,8 @@ export type RelayProfile = { // Utils related to bare urls +export const LOCAL_RELAY_URL = "local://welshman.relay/" + export const isRelayUrl = (url: string) => { if (!url.includes("://")) { url = "wss://" + url @@ -65,6 +67,8 @@ export const isIPAddress = (url: string) => Boolean(url.match(/\d+\.\d+\.\d+\.\d export const isShareableRelayUrl = (url: string) => Boolean(isRelayUrl(url) && !isLocalUrl(url)) export const normalizeRelayUrl = (url: string) => { + if (url === LOCAL_RELAY_URL) return url + const prefix = url.match(/^wss?:\/\//)?.[0] || (isOnionUrl(url) ? "ws://" : "wss://") // Use our library to normalize diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb2e2d8..241fe5f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,7 @@ settings: overrides: '@tiptap/core': ^2.11.7 '@tiptap/pm': ^2.11.7 + '@pomade/core': link:../pomade/packages/core importers: @@ -59,7 +60,7 @@ importers: version: 8.29.0(eslint@9.23.0)(typescript@5.8.2) vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.23.3)(@types/node@22.13.17)(fuse.js@7.1.0)(postcss@8.5.3)(search-insights@2.17.3)(typescript@5.8.2) + version: 1.6.3(@algolia/client-search@5.23.3)(@types/node@22.13.17)(fuse.js@7.1.0)(postcss@8.5.6)(search-insights@2.17.3)(typescript@5.8.2) vitest: specifier: ^3.1.1 version: 3.1.1(@types/node@22.13.17)(happy-dom@17.4.4) @@ -150,10 +151,10 @@ importers: version: 1.41.3 rollup-plugin-peer-deps-external: specifier: ^2.2.4 - version: 2.2.4(rollup@4.39.0) + version: 2.2.4(rollup@4.53.5) rollup-plugin-visualizer: specifier: ^5.12.0 - version: 5.14.0(rollup@4.39.0) + version: 5.14.0(rollup@4.53.5) typescript: specifier: ^5.5.4 version: 5.8.2 @@ -165,13 +166,16 @@ importers: version: 5.4.17(@types/node@22.13.17) vite-plugin-dts: specifier: ^4.0.3 - version: 4.5.4(@types/node@22.13.17)(rollup@4.39.0)(typescript@5.8.2)(vite@5.4.17(@types/node@22.13.17)) + version: 4.5.4(@types/node@22.13.17)(rollup@4.53.5)(typescript@5.8.2)(vite@5.4.17(@types/node@22.13.17)) vitest: specifier: ^2.0.5 version: 2.1.9(@types/node@22.13.17)(happy-dom@15.11.7) packages/app: dependencies: + '@pomade/core': + specifier: link:../../../pomade/packages/core + version: link:../../../pomade/packages/core '@types/throttle-debounce': specifier: ^5.0.2 version: 5.0.2 @@ -392,6 +396,9 @@ importers: '@noble/hashes': specifier: ^2.0.1 version: 2.0.1 + '@pomade/core': + specifier: link:../../../pomade/packages/core + version: link:../../../pomade/packages/core '@welshman/lib': specifier: workspace:* version: link:../lib @@ -947,51 +954,106 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.53.5': + resolution: {integrity: sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.39.0': resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.53.5': + resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.39.0': resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.53.5': + resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.39.0': resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.53.5': + resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.39.0': resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.53.5': + resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.39.0': resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.53.5': + resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': + resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.39.0': resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.53.5': + resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.39.0': resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.53.5': + resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.39.0': resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.53.5': + resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.5': + resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} cpu: [loong64] @@ -1002,46 +1064,101 @@ packages: cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.53.5': + resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.39.0': resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.53.5': + resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.39.0': resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.53.5': + resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.39.0': resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.53.5': + resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.39.0': resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.53.5': + resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.39.0': resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.53.5': + resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.5': + resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.39.0': resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.53.5': + resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.39.0': resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.53.5': + resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.5': + resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.39.0': resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.53.5': + resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==} + cpu: [x64] + os: [win32] + '@rushstack/node-core-library@5.19.0': resolution: {integrity: sha512-BxAopbeWBvNJ6VGiUL+5lbJXywTdsnMeOS8j57Cn/xY10r6sV/gbsTlfYKjzVCUBZATX2eRzJHSMCchsMTGN6A==} peerDependencies: @@ -1329,6 +1446,9 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/events@3.0.3': resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} @@ -2454,6 +2574,10 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + preact@10.26.5: resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} @@ -2610,6 +2734,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.53.5: + resolution: {integrity: sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} @@ -3539,74 +3668,140 @@ snapshots: '@remirror/core-constants@3.0.0': {} - '@rollup/pluginutils@5.3.0(rollup@4.39.0)': + '@rollup/pluginutils@5.3.0(rollup@4.53.5)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.39.0 + rollup: 4.53.5 '@rollup/rollup-android-arm-eabi@4.39.0': optional: true + '@rollup/rollup-android-arm-eabi@4.53.5': + optional: true + '@rollup/rollup-android-arm64@4.39.0': optional: true + '@rollup/rollup-android-arm64@4.53.5': + optional: true + '@rollup/rollup-darwin-arm64@4.39.0': optional: true + '@rollup/rollup-darwin-arm64@4.53.5': + optional: true + '@rollup/rollup-darwin-x64@4.39.0': optional: true + '@rollup/rollup-darwin-x64@4.53.5': + optional: true + '@rollup/rollup-freebsd-arm64@4.39.0': optional: true + '@rollup/rollup-freebsd-arm64@4.53.5': + optional: true + '@rollup/rollup-freebsd-x64@4.39.0': optional: true + '@rollup/rollup-freebsd-x64@4.53.5': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.39.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.53.5': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.39.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.53.5': + optional: true + '@rollup/rollup-linux-arm64-musl@4.39.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.53.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.5': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.53.5': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.39.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.53.5': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.39.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.53.5': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.39.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.53.5': + optional: true + '@rollup/rollup-linux-x64-gnu@4.39.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.53.5': + optional: true + '@rollup/rollup-linux-x64-musl@4.39.0': optional: true + '@rollup/rollup-linux-x64-musl@4.53.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.5': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.39.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.53.5': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.39.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.53.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.5': + optional: true + '@rollup/rollup-win32-x64-msvc@4.39.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.53.5': + optional: true + '@rushstack/node-core-library@5.19.0(@types/node@22.13.17)': dependencies: ajv: 8.13.0 @@ -3927,6 +4122,8 @@ snapshots: '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} + '@types/events@3.0.3': {} '@types/hast@3.0.4': @@ -5217,6 +5414,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + optional: true + preact@10.26.5: {} prelude-ls@1.2.1: {} @@ -5375,18 +5579,18 @@ snapshots: glob: 11.0.1 package-json-from-dist: 1.0.1 - rollup-plugin-peer-deps-external@2.2.4(rollup@4.39.0): + rollup-plugin-peer-deps-external@2.2.4(rollup@4.53.5): dependencies: - rollup: 4.39.0 + rollup: 4.53.5 - rollup-plugin-visualizer@5.14.0(rollup@4.39.0): + rollup-plugin-visualizer@5.14.0(rollup@4.53.5): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 4.39.0 + rollup: 4.53.5 rollup@4.39.0: dependencies: @@ -5414,6 +5618,34 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.39.0 fsevents: 2.3.3 + rollup@4.53.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.5 + '@rollup/rollup-android-arm64': 4.53.5 + '@rollup/rollup-darwin-arm64': 4.53.5 + '@rollup/rollup-darwin-x64': 4.53.5 + '@rollup/rollup-freebsd-arm64': 4.53.5 + '@rollup/rollup-freebsd-x64': 4.53.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.5 + '@rollup/rollup-linux-arm-musleabihf': 4.53.5 + '@rollup/rollup-linux-arm64-gnu': 4.53.5 + '@rollup/rollup-linux-arm64-musl': 4.53.5 + '@rollup/rollup-linux-loong64-gnu': 4.53.5 + '@rollup/rollup-linux-ppc64-gnu': 4.53.5 + '@rollup/rollup-linux-riscv64-gnu': 4.53.5 + '@rollup/rollup-linux-riscv64-musl': 4.53.5 + '@rollup/rollup-linux-s390x-gnu': 4.53.5 + '@rollup/rollup-linux-x64-gnu': 4.53.5 + '@rollup/rollup-linux-x64-musl': 4.53.5 + '@rollup/rollup-openharmony-arm64': 4.53.5 + '@rollup/rollup-win32-arm64-msvc': 4.53.5 + '@rollup/rollup-win32-ia32-msvc': 4.53.5 + '@rollup/rollup-win32-x64-gnu': 4.53.5 + '@rollup/rollup-win32-x64-msvc': 4.53.5 + fsevents: 2.3.3 + rope-sequence@1.3.4: {} run-parallel@1.2.0: @@ -5720,10 +5952,10 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.5.4(@types/node@22.13.17)(rollup@4.39.0)(typescript@5.8.2)(vite@5.4.17(@types/node@22.13.17)): + vite-plugin-dts@4.5.4(@types/node@22.13.17)(rollup@4.53.5)(typescript@5.8.2)(vite@5.4.17(@types/node@22.13.17)): dependencies: '@microsoft/api-extractor': 7.55.1(@types/node@22.13.17) - '@rollup/pluginutils': 5.3.0(rollup@4.39.0) + '@rollup/pluginutils': 5.3.0(rollup@4.53.5) '@volar/typescript': 2.4.26 '@vue/language-core': 2.2.0(typescript@5.8.2) compare-versions: 6.1.1 @@ -5748,7 +5980,7 @@ snapshots: '@types/node': 22.13.17 fsevents: 2.3.3 - vitepress@1.6.3(@algolia/client-search@5.23.3)(@types/node@22.13.17)(fuse.js@7.1.0)(postcss@8.5.3)(search-insights@2.17.3)(typescript@5.8.2): + vitepress@1.6.3(@algolia/client-search@5.23.3)(@types/node@22.13.17)(fuse.js@7.1.0)(postcss@8.5.6)(search-insights@2.17.3)(typescript@5.8.2): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.23.3)(search-insights@2.17.3) @@ -5769,7 +6001,7 @@ snapshots: vite: 5.4.17(@types/node@22.13.17) vue: 3.5.13(typescript@5.8.2) optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/node'