From f8449d1875fc14e733e2b94e44f0151d3c989b97 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Thu, 6 Jun 2024 14:14:14 +0300 Subject: [PATCH 1/7] feat: new store and signal store --- .gitignore | 3 ++- index.d.ts | 60 ----------------------------------------- index.js | 35 ------------------------ package.json | 19 ++++++++----- pnpm-lock.yaml | 16 +++++++++++ src/core/defineStore.js | 19 +++++++++++++ src/core/types.ts | 8 ++++++ src/index.d.ts | 8 ++++++ src/index.js | 7 +++++ src/signals/index.d.ts | 9 +++++++ src/signals/index.js | 19 +++++++++++++ test/index.test.ts | 20 +++++++------- 12 files changed, 111 insertions(+), 112 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.js create mode 100644 src/core/defineStore.js create mode 100644 src/core/types.ts create mode 100644 src/index.d.ts create mode 100644 src/index.js create mode 100644 src/signals/index.d.ts create mode 100644 src/signals/index.js diff --git a/.gitignore b/.gitignore index c6b9df2..2b0d947 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ - +.idea/ +.pnpm-store/ coverage/ diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 8416925..0000000 --- a/index.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { Store, StoreValue } from 'nanostores' - -type StoreKeys = T extends { setKey: (k: infer K, v: any) => unknown } - ? K - : never - -export interface UseStoreOptions { - /** - * Will re-render components only on specific key changes. - */ - keys?: StoreKeys[] -} - -/** - * Subscribe to store changes and get store’s value. - * - * Can be user with store builder too. - * - * ```js - * import { useStore } from 'nanostores/preact' - * - * import { router } from '../store/router' - * - * export const Layout = () => { - * let page = useStore(router) - * if (page.router === 'home') { - * return - * } else { - * return - * } - * } - * ``` - * - * @param store Store instance. - * @returns Store value. - */ -export function useStore( - store: SomeStore, - options?: UseStoreOptions -): StoreValue - -/** - * Batch React updates. It is just wrap for React’s `unstable_batchedUpdates` - * with fix for React Native. - * - * ```js - * import { batch } from 'nanostores/preact' - * - * React.useEffect(() => { - * let unbind = store.listen(() => { - * batch(() => { - * forceRender({}) - * }) - * }) - * }) - * ``` - * - * @param cb Callback to run in batching. - */ -export function batch(cb: () => void): void diff --git a/index.js b/index.js deleted file mode 100644 index 2756e54..0000000 --- a/index.js +++ /dev/null @@ -1,35 +0,0 @@ -import { listenKeys } from 'nanostores' -import { useEffect, useState } from 'preact/hooks' - -export function useStore(store, opts = {}) { - let [, forceRender] = useState({}) - let [valueBeforeEffect] = useState(store.get()) - - useEffect(() => { - valueBeforeEffect !== store.get() && forceRender({}) - }, []) - - useEffect(() => { - let batching, timer, unlisten - let rerender = () => { - if (!batching) { - batching = 1 - timer = setTimeout(() => { - batching = undefined - forceRender({}) - }) - } - } - if (opts.keys) { - unlisten = listenKeys(store, opts.keys, rerender) - } else { - unlisten = store.listen(rerender) - } - return () => { - unlisten() - clearTimeout(timer) - } - }, [store, '' + opts.keys]) - - return store.get() -} diff --git a/package.json b/package.json index 0e8578c..d714a2f 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,14 @@ "repository": "nanostores/preact", "sideEffects": false, "type": "module", - "types": "./index.d.ts", + "types": "./src/index.d.ts", "exports": { - ".": "./index.js", - "./package.json": "./package.json" + ".": "./src/index.js", + "./package.json": "./package.json", + "./signals": { + "import": "./src/signals/index.js", + "types": "./src/signals/index.d.ts" + } }, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -36,7 +40,8 @@ ], "peerDependencies": { "nanostores": "^0.9.0 || ^0.10.0", - "preact": ">=10.0.0" + "preact": ">=10.0.0", + "@preact/signals": ">=1.0.0" }, "devDependencies": { "@babel/core": "^7.23.9", @@ -63,6 +68,7 @@ "nanodelay": "^2.0.2", "nanostores": "^0.10.0", "preact": "^10.19.5", + "@preact/signals": "^1.2.3", "size-limit": "^11.0.2", "tsx": "^4.7.1", "typescript": "^5.3.3" @@ -102,10 +108,11 @@ "size-limit": [ { "import": { - "index.js": "{ useStore }", + "src/index.js": "{ useStore }", + "src/signals/index.js": "{ useStoreSignal }", "nanostores": "{ map, computed }" }, - "limit": "957 B" + "limit": "999 B" } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f859b80..964548b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ devDependencies: '@logux/eslint-config': specifier: ^52.0.2 version: 52.0.2(eslint-config-standard@17.1.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-node-import@1.0.4)(eslint-plugin-perfectionist@2.5.0)(eslint-plugin-prefer-let@3.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) + '@preact/signals': + specifier: ^1.2.3 + version: 1.2.3(preact@10.19.5) '@size-limit/preset-small-lib': specifier: ^11.0.2 version: 11.0.2(size-limit@11.0.2) @@ -647,6 +650,19 @@ packages: fastq: 1.17.1 dev: true + /@preact/signals-core@1.6.0: + resolution: {integrity: sha512-O/XGxwP85h1F7+ouqTMOIZ3+V1whfaV9ToIVcuyGriD4JkSD00cQo54BKdqjvBJxbenvp7ynfqRHEwI6e+NIhw==} + dev: true + + /@preact/signals@1.2.3(preact@10.19.5): + resolution: {integrity: sha512-M2DXse3Wi8HwjI1d2vQWOLJ3lHogvqTsJYvl4ofXRXgMFQzJ7kmlZvlt5i8x5S5VwgZu0ghru4HkLqOoFfU2JQ==} + peerDependencies: + preact: 10.x + dependencies: + '@preact/signals-core': 1.6.0 + preact: 10.19.5 + dev: true + /@sindresorhus/merge-streams@2.3.0: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} diff --git a/src/core/defineStore.js b/src/core/defineStore.js new file mode 100644 index 0000000..d962fc2 --- /dev/null +++ b/src/core/defineStore.js @@ -0,0 +1,19 @@ +import { listenKeys } from "nanostores"; +import { useCallback } from "preact/hooks"; + +export function defineStore(store, options = {}, useSyncExternalStoreFn) { + let subscribe = useCallback( + (onChange) => { + return options.keys + ? listenKeys(store, options.keys, onChange) + : store.listen(onChange); + }, + [options.keys, store], + ); + + let get = useCallback(() => { + return (options.selector ?? ((s) => s))(store.get()); + }, [options.selector, store]); + + return useSyncExternalStoreFn(subscribe, get); +} diff --git a/src/core/types.ts b/src/core/types.ts new file mode 100644 index 0000000..4c4d4f8 --- /dev/null +++ b/src/core/types.ts @@ -0,0 +1,8 @@ +import type { StoreValue } from 'nanostores'; + +export type StoreKeys = T extends { setKey: (k: infer K, v: never) => unknown } ? K : never; + +export interface UseStoreOptions { + keys?: StoreKeys[]; + selector?: (state: StoreValue) => Value; +} diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 0000000..f8abd61 --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1,8 @@ +import type { Store, StoreValue } from "nanostores"; + +import type { UseStoreOptions } from "./core/types"; + +export function useStore>( + store: SomeStore, + options: UseStoreOptions = {}, +): Value; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..85af223 --- /dev/null +++ b/src/index.js @@ -0,0 +1,7 @@ +import { useSyncExternalStore } from "preact/compat"; + +import { defineStore } from "./core/defineStore.js"; + +export function useStore(store, options = {}) { + return defineStore(store, options, useSyncExternalStore) +} diff --git a/src/signals/index.d.ts b/src/signals/index.d.ts new file mode 100644 index 0000000..384576f --- /dev/null +++ b/src/signals/index.d.ts @@ -0,0 +1,9 @@ +import type { ReadonlySignal } from '@preact/signals' +import type { Store, StoreValue } from 'nanostores'; + +import type { UseStoreOptions } from "../core/types"; + +export function useStoreSignal>( + store: SomeStore, + options: UseStoreOptions = {}, +): ReadonlySignal diff --git a/src/signals/index.js b/src/signals/index.js new file mode 100644 index 0000000..36370a4 --- /dev/null +++ b/src/signals/index.js @@ -0,0 +1,19 @@ +import { useComputed, useSignal } from '@preact/signals' +import { useEffect } from 'preact/hooks' + +import { defineStore } from "../core/defineStore.js"; + +function useSyncExternalStoreSignal(subscribe, getSnapshot) { + let cache = useSignal(getSnapshot()); + + useEffect(() => { + return subscribe(() => (cache.value = getSnapshot())); + }, [cache, subscribe, getSnapshot]); + + return useComputed(() => cache.value); +} + +export function useStoreSignal(store, options = {},) { + return defineStore(store, options, useSyncExternalStoreSignal) +} + diff --git a/test/index.test.ts b/test/index.test.ts index 71f7aa7..de8440b 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,15 +1,15 @@ -import type { FunctionalComponent as FC } from 'preact' - import './setup.js' -import { STORE_UNMOUNT_DELAY, onMount, atom, map } from 'nanostores' -import { render, screen, act } from '@testing-library/preact' -import { deepStrictEqual, equal } from 'node:assert' -import { useState } from 'preact/hooks' + +import { act, render, screen } from '@testing-library/preact' import { delay } from 'nanodelay' -import { test, afterEach } from 'node:test' +import { atom, map, onMount, STORE_UNMOUNT_DELAY } from 'nanostores' +import { deepStrictEqual, equal } from 'node:assert' +import { afterEach, test } from 'node:test' +import type { FunctionalComponent as FC } from 'preact' import { h } from 'preact' +import { useState } from 'preact/hooks' -import { useStore } from '../index.js' +import { useStore } from '../src/index.js' afterEach(() => { window.document.head.innerHTML = '' @@ -223,7 +223,7 @@ test('has keys option', async () => { }) test('return correct value for Atom, if store was changed between rendering and useEffect', async () => { - let store = atom<'old' | 'new'>('old') + let store = atom<'new' | 'old'>('old') let renderWithMutate = (value: string): string => { store.get() !== 'new' && store.set('new') @@ -242,7 +242,7 @@ test('return correct value for Atom, if store was changed between rendering and }) test('return correct value for MapStore, if store was changed between rendering and useEffect', async () => { - let store = map<{ value: 'old' | 'new' }>({ value: 'old' }) + let store = map<{ value: 'new' | 'old' }>({ value: 'old' }) let renderWithMutate = (value: string): string => { store.get().value !== 'new' && store.setKey('value', 'new') From c13f65c62f3beee2ad8b7f48d18d7b1e11d74d03 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Mon, 19 Aug 2024 23:40:26 +0300 Subject: [PATCH 2/7] feat: update deps --- package.json | 2 - pnpm-lock.yaml | 705 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 471 insertions(+), 236 deletions(-) diff --git a/package.json b/package.json index ea02bf6..110a1ff 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,6 @@ "nanostores": "^0.9.0 || ^0.10.0 || ^0.11.0", "preact": ">=10.0.0", "@preact/signals": ">=1.0.0" - "nanostores": "^0.9.0 || ^0.10.0 || ^0.11.0", - "preact": ">=10.0.0" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3838ea1..eb46b0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,25 +13,28 @@ importers: version: 7.25.2 '@logux/eslint-config': specifier: ^53.3.0 - version: 53.3.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) + version: 53.4.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@preact/signals': + specifier: ^1.2.3 + version: 1.3.0(preact@10.23.2) '@size-limit/preset-small-lib': specifier: ^11.1.4 version: 11.1.4(size-limit@11.1.4) '@testing-library/preact': specifier: ^3.2.4 - version: 3.2.4(preact@10.23.1) + version: 3.2.4(preact@10.23.2) '@types/node': specifier: ^22.1.0 - version: 22.1.0 + version: 22.4.1 '@types/ws': specifier: ^8.5.12 version: 8.5.12 '@typescript-eslint/eslint-plugin': specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) + version: 8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^8.0.0 - version: 8.0.0(eslint@9.8.0)(typescript@5.5.4) + version: 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) better-node-test: specifier: ^0.5.1 version: 0.5.1 @@ -46,7 +49,7 @@ importers: version: 5.0.0 eslint: specifier: ^9.8.0 - version: 9.8.0 + version: 9.9.0(jiti@1.21.6) happy-dom: specifier: ^14.12.3 version: 14.12.3 @@ -55,16 +58,16 @@ importers: version: 2.0.2 nanostores: specifier: ^0.11.0 - version: 0.11.0 + version: 0.11.2 preact: specifier: ^10.23.1 - version: 10.23.1 + version: 10.23.2 size-limit: specifier: ^11.1.4 version: 11.1.4 tsx: specifier: ^4.16.5 - version: 4.16.5 + version: 4.17.0 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -134,8 +137,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.24.7': - resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} '@babel/template@7.25.0': @@ -159,138 +162,282 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -309,8 +456,8 @@ packages: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.8.0': - resolution: {integrity: sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==} + '@eslint/js@9.9.0': + resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -345,17 +492,14 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@logux/eslint-config@53.3.0': - resolution: {integrity: sha512-OiRQsYSYwySQ1kicBceilFi3Kg9EQYuDqQGw0QkyPg8AHbreA0xSC4NMkUin79w8A7Skzttw4yCjQua8BftbJw==} + '@logux/eslint-config@53.4.0': + resolution: {integrity: sha512-eu3uEhWSar51TM/1cZL4lm/WMiOMtefBVPZPZG3kIfE+TCReg2eCkkafLe7gj34IpUNh5Qt268tWCUNFV5DdYA==} engines: {node: '>=18.0.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -379,23 +523,18 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - /@preact/signals-core@1.6.0: - resolution: {integrity: sha512-O/XGxwP85h1F7+ouqTMOIZ3+V1whfaV9ToIVcuyGriD4JkSD00cQo54BKdqjvBJxbenvp7ynfqRHEwI6e+NIhw==} - dev: true - - /@preact/signals@1.2.3(preact@10.19.5): - resolution: {integrity: sha512-M2DXse3Wi8HwjI1d2vQWOLJ3lHogvqTsJYvl4ofXRXgMFQzJ7kmlZvlt5i8x5S5VwgZu0ghru4HkLqOoFfU2JQ==} - peerDependencies: - preact: 10.x - dependencies: - '@preact/signals-core': 1.6.0 - preact: 10.19.5 - dev: true - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@preact/signals-core@1.8.0': + resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} + + '@preact/signals@1.3.0': + resolution: {integrity: sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==} + peerDependencies: + preact: 10.x + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} @@ -436,17 +575,17 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@22.1.0': - resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} + '@types/node@22.4.1': + resolution: {integrity: sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - '@typescript-eslint/eslint-plugin@8.0.0': - resolution: {integrity: sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==} + '@typescript-eslint/eslint-plugin@8.2.0': + resolution: {integrity: sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -456,8 +595,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.0.0': - resolution: {integrity: sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==} + '@typescript-eslint/parser@8.2.0': + resolution: {integrity: sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -466,12 +605,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.0.0': - resolution: {integrity: sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==} + '@typescript-eslint/scope-manager@8.2.0': + resolution: {integrity: sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.0.0': - resolution: {integrity: sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==} + '@typescript-eslint/type-utils@8.2.0': + resolution: {integrity: sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -479,12 +618,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.0.0': - resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==} + '@typescript-eslint/types@8.2.0': + resolution: {integrity: sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.0.0': - resolution: {integrity: sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==} + '@typescript-eslint/typescript-estree@8.2.0': + resolution: {integrity: sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -492,14 +631,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.0.0': - resolution: {integrity: sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==} + '@typescript-eslint/utils@8.2.0': + resolution: {integrity: sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.0.0': - resolution: {integrity: sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==} + '@typescript-eslint/visitor-keys@8.2.0': + resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -630,8 +769,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001647: - resolution: {integrity: sha512-n83xdNiyeNcHpzWY+1aFbqCK7LuLfBricc4+alSQL2Xb6OR3XpnQAmlDG+pQcdTfiHRuLcQ96VOfrPSGiNJYSg==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -742,8 +881,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + electron-to-chromium@1.5.11: + resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -794,6 +933,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -861,20 +1005,20 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-n@17.10.1: - resolution: {integrity: sha512-hm/q37W6efDptJXdwirsm6A257iY6ZNtpoSG0wEzFzjJ3AhL7OhEIhdSR2e4OdYfHO5EDeqlCfFrjf9q208IPw==} + eslint-plugin-n@17.10.2: + resolution: {integrity: sha512-e+s4eAf5NtJaxPhTNu3qMO0Iz40WANS93w9LQgYcvuljgvDmWi/a3rh+OrNyMHeng6aOWGJO0rCg5lH4zi8yTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' - eslint-plugin-perfectionist@3.1.0: - resolution: {integrity: sha512-QNL1L0CMo8FoKM3VkNdR8HUq8Nrl0nGZFF9jzjU8PYvDtds2bvNOm9RwpQC4Gf3M27F6CBp5JsA3jBYT4TBiHA==} + eslint-plugin-perfectionist@3.2.0: + resolution: {integrity: sha512-cX1aztMbSfRWPKJH8CD+gadrbkS+RNH1OGWuNGws8J6rHzYYhawxWTU/yzMYjq2IRJCpBCfhgfa7BHRXQYxLHA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' svelte: '>=3.0.0' - svelte-eslint-parser: ^0.40.0 + svelte-eslint-parser: ^0.41.0 vue-eslint-parser: '>=9.0.0' peerDependenciesMeta: astro-eslint-parser: @@ -890,8 +1034,8 @@ packages: resolution: {integrity: sha512-X4ep5PMO1320HKaNC9DM5+p6XvOhwv+RcqGjhv3aiw9iAtHhiFtdIUB5l0Zya0iM22ys2BGKzrNI9Xpw/ZHooQ==} engines: {node: '>=0.10.0'} - eslint-plugin-promise@7.0.0: - resolution: {integrity: sha512-wb1ECT+b90ndBdAujhIdAU8oQ3Vt5gKqP/t78KOmg0ifynrvc2jGR9f6ndbOVNFpKf6jLUBlBBDF3H3Wk0JICg==} + eslint-plugin-promise@7.1.0: + resolution: {integrity: sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -908,10 +1052,15 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.8.0: - resolution: {integrity: sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==} + eslint@9.9.0: + resolution: {integrity: sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true espree@10.1.0: resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} @@ -971,8 +1120,8 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} fsevents@2.3.3: @@ -1017,9 +1166,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true globals@11.12.0: @@ -1042,8 +1190,8 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} gopd@1.0.1: @@ -1092,8 +1240,8 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -1228,9 +1376,8 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} @@ -1284,9 +1431,8 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1314,10 +1460,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -1347,8 +1489,8 @@ packages: nanospinner@1.1.0: resolution: {integrity: sha512-yFvNYMig4AthKYfHFl1sLj7B2nkHL4lzdig4osvl9/LdGbXwrdFRoqBS98gsEsOakr0yH+r5NZ/1Y9gdVB8trA==} - nanostores@0.11.0: - resolution: {integrity: sha512-fT2u3vmWmUt93G9dmUgpnbs3AAYJb6lzu7KrJ1FdC/rjFopGiboS3bfKYv6NNkuY6g6eiRakTR48wKSL/F5C+g==} + nanostores@0.11.2: + resolution: {integrity: sha512-6bucNxMJA5rNV554WQl+MWGng0QVMzlRgpKTHHfIbVLrhQ+yRXBychV9ECGVuuUfCMQPjfIG9bj8oJFZ9hYP/Q==} engines: {node: ^18.0.0 || >=20.0.0} natural-compare-lite@1.4.0: @@ -1445,8 +1587,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - preact@10.23.1: - resolution: {integrity: sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==} + preact@10.23.2: + resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -1515,11 +1657,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -1641,8 +1778,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsx@4.16.5: - resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==} + tsx@4.17.0: + resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} engines: {node: '>=18.0.0'} hasBin: true @@ -1666,8 +1803,8 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript-eslint@8.0.0: - resolution: {integrity: sha512-yQWBJutWL1PmpmDddIOl9/Mi6vZjqNCjqSGBMQ4vsc2Aiodk0SnbQQWPXbSy0HNuKCuGkw1+u4aQ2mO40TdhDQ==} + typescript-eslint@8.2.0: + resolution: {integrity: sha512-DmnqaPcML0xYwUzgNbM1XaKXpEb7BShYf2P1tkUmmcl8hyeG7Pj08Er7R9bNy6AufabywzJcOybQAtnD/c9DGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1683,8 +1820,8 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@6.13.0: - resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} @@ -1706,14 +1843,14 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.2: + resolution: {integrity: sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==} webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} @@ -1865,7 +2002,7 @@ snapshots: dependencies: '@babel/types': 7.25.2 - '@babel/runtime@7.24.7': + '@babel/runtime@7.25.0': dependencies: regenerator-runtime: 0.14.1 @@ -1898,75 +2035,147 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.23.1': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.23.1': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.23.1': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.23.1': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.23.1': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.23.1': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.23.1': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.23.1': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.23.1': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.23.1': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.23.1': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.23.1': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.23.1': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.23.1': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.23.1': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.23.1': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.23.1': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.23.1': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.23.1': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.23.1': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.23.1': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.8.0)': + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.0(jiti@1.21.6))': dependencies: - eslint: 9.8.0 + eslint: 9.9.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.0': {} @@ -1985,7 +2194,7 @@ snapshots: debug: 4.3.6 espree: 10.1.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1993,7 +2202,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.8.0': {} + '@eslint/js@9.9.0': {} '@eslint/object-schema@2.1.4': {} @@ -2022,26 +2231,24 @@ snapshots: '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 - '@logux/eslint-config@53.3.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)': + '@logux/eslint-config@53.4.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': dependencies: '@eslint/eslintrc': 3.1.0 - eslint: 9.8.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0))(eslint-plugin-n@17.10.1(eslint@9.8.0))(eslint-plugin-promise@7.0.0(eslint@9.8.0))(eslint@9.8.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) - eslint-plugin-n: 17.10.1(eslint@9.8.0) - eslint-plugin-perfectionist: 3.1.0(eslint@9.8.0)(typescript@5.5.4) + eslint: 9.9.0(jiti@1.21.6) + eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6)))(eslint-plugin-n@17.10.2(eslint@9.9.0(jiti@1.21.6)))(eslint-plugin-promise@7.1.0(eslint@9.9.0(jiti@1.21.6)))(eslint@9.9.0(jiti@1.21.6)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6)) + eslint-plugin-n: 17.10.2(eslint@9.9.0(jiti@1.21.6)) + eslint-plugin-perfectionist: 3.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) eslint-plugin-prefer-let: 4.0.0 - eslint-plugin-promise: 7.0.0(eslint@9.8.0) - typescript-eslint: 8.0.0(eslint@9.8.0)(typescript@5.5.4) + eslint-plugin-promise: 7.1.0(eslint@9.9.0(jiti@1.21.6)) + typescript-eslint: 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) transitivePeerDependencies: - '@typescript-eslint/parser' - astro-eslint-parser @@ -2067,6 +2274,13 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@preact/signals-core@1.8.0': {} + + '@preact/signals@1.3.0(preact@10.23.2)': + dependencies: + '@preact/signals-core': 1.8.0 + preact: 10.23.2 + '@sindresorhus/merge-streams@2.3.0': {} '@size-limit/esbuild@11.1.4(size-limit@11.1.4)': @@ -2088,7 +2302,7 @@ snapshots: '@testing-library/dom@8.20.1': dependencies: '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.25.0 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -2096,10 +2310,10 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/preact@3.2.4(preact@10.23.1)': + '@testing-library/preact@3.2.4(preact@10.23.2)': dependencies: '@testing-library/dom': 8.20.1 - preact: 10.23.1 + preact: 10.23.2 '@types/aria-query@5.0.4': {} @@ -2107,27 +2321,27 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@22.1.0': + '@types/node@22.4.1': dependencies: - undici-types: 6.13.0 + undici-types: 6.19.8 - '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} '@types/ws@8.5.12': dependencies: - '@types/node': 22.1.0 + '@types/node': 22.4.1 - '@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.0.0 - eslint: 9.8.0 + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/type-utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.2.0 + eslint: 9.9.0(jiti@1.21.6) graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -2135,28 +2349,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.2.0 debug: 4.3.6 - eslint: 9.8.0 + eslint: 9.9.0(jiti@1.21.6) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.0.0': + '@typescript-eslint/scope-manager@8.2.0': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/visitor-keys': 8.2.0 - '@typescript-eslint/type-utils@8.0.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) debug: 4.3.6 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -2165,12 +2379,12 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.0.0': {} + '@typescript-eslint/types@8.2.0': {} - '@typescript-eslint/typescript-estree@8.0.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@8.2.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/visitor-keys': 8.2.0 debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 @@ -2182,20 +2396,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.0.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/utils@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.4) - eslint: 9.8.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + eslint: 9.9.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.0.0': + '@typescript-eslint/visitor-keys@8.2.0': dependencies: - '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/types': 8.2.0 eslint-visitor-keys: 3.4.3 acorn-jsx@5.3.2(acorn@8.12.1): @@ -2313,8 +2527,8 @@ snapshots: browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001647 - electron-to-chromium: 1.5.4 + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.11 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -2325,7 +2539,7 @@ snapshots: '@bcoe/v8-coverage': 0.2.3 '@istanbuljs/schema': 0.1.3 find-up: 5.0.0 - foreground-child: 3.2.1 + foreground-child: 3.3.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.1.7 @@ -2344,7 +2558,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001647: {} + caniuse-lite@1.0.30001651: {} chalk@2.4.2: dependencies: @@ -2363,7 +2577,7 @@ snapshots: nanospinner: 1.1.0 picocolors: 1.0.1 typescript: 5.5.4 - vfile-location: 5.0.2 + vfile-location: 5.0.3 chokidar@3.6.0: dependencies: @@ -2485,7 +2699,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.4: {} + electron-to-chromium@1.5.11: {} emoji-regex@8.0.0: {} @@ -2611,23 +2825,50 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + escalade@3.1.2: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.8.0): + eslint-compat-utils@0.5.1(eslint@9.9.0(jiti@1.21.6)): dependencies: - eslint: 9.8.0 + eslint: 9.9.0(jiti@1.21.6) semver: 7.6.3 - eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0))(eslint-plugin-n@17.10.1(eslint@9.8.0))(eslint-plugin-promise@7.0.0(eslint@9.8.0))(eslint@9.8.0): + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6)))(eslint-plugin-n@17.10.2(eslint@9.9.0(jiti@1.21.6)))(eslint-plugin-promise@7.1.0(eslint@9.9.0(jiti@1.21.6)))(eslint@9.9.0(jiti@1.21.6)): dependencies: - eslint: 9.8.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) - eslint-plugin-n: 17.10.1(eslint@9.8.0) - eslint-plugin-promise: 7.0.0(eslint@9.8.0) + eslint: 9.9.0(jiti@1.21.6) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6)) + eslint-plugin-n: 17.10.2(eslint@9.9.0(jiti@1.21.6)) + eslint-plugin-promise: 7.1.0(eslint@9.9.0(jiti@1.21.6)) eslint-import-resolver-node@0.3.9: dependencies: @@ -2637,24 +2878,24 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.9.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - eslint: 9.8.0 + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.8.0): + eslint-plugin-es-x@7.8.0(eslint@9.9.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.11.0 - eslint: 9.8.0 - eslint-compat-utils: 0.5.1(eslint@9.8.0) + eslint: 9.9.0(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.9.0(jiti@1.21.6)) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6)): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -2662,9 +2903,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.8.0 + eslint: 9.9.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.9.0(jiti@1.21.6)) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -2675,29 +2916,29 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.10.1(eslint@9.8.0): + eslint-plugin-n@17.10.2(eslint@9.9.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6)) enhanced-resolve: 5.17.1 - eslint: 9.8.0 - eslint-plugin-es-x: 7.8.0(eslint@9.8.0) + eslint: 9.9.0(jiti@1.21.6) + eslint-plugin-es-x: 7.8.0(eslint@9.9.0(jiti@1.21.6)) get-tsconfig: 4.7.6 globals: 15.9.0 - ignore: 5.3.1 + ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-perfectionist@3.1.0(eslint@9.8.0)(typescript@5.5.4): + eslint-plugin-perfectionist@3.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4): dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - eslint: 9.8.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.0(jiti@1.21.6) minimatch: 10.0.1 natural-compare-lite: 1.4.0 transitivePeerDependencies: @@ -2708,9 +2949,9 @@ snapshots: dependencies: requireindex: 1.2.0 - eslint-plugin-promise@7.0.0(eslint@9.8.0): + eslint-plugin-promise@7.1.0(eslint@9.9.0(jiti@1.21.6)): dependencies: - eslint: 9.8.0 + eslint: 9.9.0(jiti@1.21.6) eslint-scope@8.0.2: dependencies: @@ -2721,13 +2962,13 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.8.0: + eslint@9.9.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.11.0 '@eslint/config-array': 0.17.1 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.8.0 + '@eslint/js': 9.9.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -2745,7 +2986,7 @@ snapshots: file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2757,6 +2998,8 @@ snapshots: optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 transitivePeerDependencies: - supports-color @@ -2820,7 +3063,7 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.2.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -2869,11 +3112,11 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.2: + glob@10.4.5: dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 1.11.1 @@ -2894,15 +3137,15 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - globby@14.0.1: + globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -2945,7 +3188,7 @@ snapshots: html-escaper@2.0.2: {} - ignore@5.3.1: {} + ignore@5.3.2: {} import-fresh@3.3.0: dependencies: @@ -3068,7 +3311,7 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jackspeak@3.4.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -3113,7 +3356,7 @@ snapshots: lodash.merge@4.6.2: {} - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: @@ -3123,7 +3366,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 merge2@1.4.1: {} @@ -3140,10 +3383,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.4: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -3164,7 +3403,7 @@ snapshots: dependencies: picocolors: 1.0.1 - nanostores@0.11.0: {} + nanostores@0.11.2: {} natural-compare-lite@1.4.0: {} @@ -3240,7 +3479,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.1.2 path-type@4.0.0: {} @@ -3253,7 +3492,7 @@ snapshots: possible-typed-array-names@1.0.0: {} - preact@10.23.1: {} + preact@10.23.2: {} prelude-ls@1.2.1: {} @@ -3317,8 +3556,6 @@ snapshots: semver@6.3.1: {} - semver@7.6.2: {} - semver@7.6.3: {} set-function-length@1.2.2: @@ -3356,7 +3593,7 @@ snapshots: dependencies: bytes-iec: 3.1.1 chokidar: 3.6.0 - globby: 14.0.1 + globby: 14.0.2 jiti: 1.21.6 lilconfig: 3.1.2 nanospinner: 1.1.0 @@ -3428,8 +3665,8 @@ snapshots: test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 10.4.2 - minimatch: 9.0.4 + glob: 10.4.5 + minimatch: 9.0.5 text-table@0.2.0: {} @@ -3450,9 +3687,9 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsx@4.16.5: + tsx@4.17.0: dependencies: - esbuild: 0.21.5 + esbuild: 0.23.1 get-tsconfig: 4.7.6 optionalDependencies: fsevents: 2.3.3 @@ -3493,11 +3730,11 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript-eslint@8.0.0(eslint@9.8.0)(typescript@5.5.4): + typescript-eslint@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -3513,13 +3750,13 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@6.13.0: {} + undici-types@6.19.8: {} unicorn-magic@0.1.0: {} unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: @@ -3537,19 +3774,19 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vfile-location@5.0.2: + vfile-location@5.0.3: dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 + '@types/unist': 3.0.3 + vfile: 6.0.2 vfile-message@4.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - vfile@6.0.1: + vfile@6.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 From 2aa36e5549460e4c1b22a0aa395bc79c3b2defb4 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Tue, 20 Aug 2024 21:46:04 +0300 Subject: [PATCH 3/7] feat: change project structure --- .gitignore | 1 - {src/core => core}/defineStore.js | 0 {src/core => core}/types.ts | 0 src/index.d.ts => index.d.ts | 0 src/index.js => index.js | 0 package.json | 8 ++++---- {src/signals => signals}/index.d.ts | 0 {src/signals => signals}/index.js | 0 test/index.test.ts | 2 +- 9 files changed, 5 insertions(+), 6 deletions(-) rename {src/core => core}/defineStore.js (100%) rename {src/core => core}/types.ts (100%) rename src/index.d.ts => index.d.ts (100%) rename src/index.js => index.js (100%) rename {src/signals => signals}/index.d.ts (100%) rename {src/signals => signals}/index.js (100%) diff --git a/.gitignore b/.gitignore index 2b0d947..090b365 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules/ -.idea/ .pnpm-store/ coverage/ diff --git a/src/core/defineStore.js b/core/defineStore.js similarity index 100% rename from src/core/defineStore.js rename to core/defineStore.js diff --git a/src/core/types.ts b/core/types.ts similarity index 100% rename from src/core/types.ts rename to core/types.ts diff --git a/src/index.d.ts b/index.d.ts similarity index 100% rename from src/index.d.ts rename to index.d.ts diff --git a/src/index.js b/index.js similarity index 100% rename from src/index.js rename to index.js diff --git a/package.json b/package.json index 110a1ff..3efd55c 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,13 @@ "repository": "nanostores/preact", "sideEffects": false, "type": "module", - "types": "./src/index.d.ts", + "types": "./index.d.ts", "exports": { - ".": "./src/index.js", + ".": "./index.js", "./package.json": "./package.json", "./signals": { - "import": "./src/signals/index.js", - "types": "./src/signals/index.d.ts" + "import": "./signals/index.js", + "types": "./signals/index.d.ts" } }, "engines": { diff --git a/src/signals/index.d.ts b/signals/index.d.ts similarity index 100% rename from src/signals/index.d.ts rename to signals/index.d.ts diff --git a/src/signals/index.js b/signals/index.js similarity index 100% rename from src/signals/index.js rename to signals/index.js diff --git a/test/index.test.ts b/test/index.test.ts index de8440b..17a9a0d 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -9,7 +9,7 @@ import type { FunctionalComponent as FC } from 'preact' import { h } from 'preact' import { useState } from 'preact/hooks' -import { useStore } from '../src/index.js' +import { useStore } from '../index.js' afterEach(() => { window.document.head.innerHTML = '' From 8f3741449e1290f3c7d98bc4849164e3ed089be7 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Wed, 21 Aug 2024 20:36:53 +0300 Subject: [PATCH 4/7] feat: format code --- .gitignore | 1 - core/defineStore.js | 18 +++++++++--------- core/types.ts | 12 ++++++++---- index.d.ts | 12 ++++++------ index.js | 4 ++-- signals/index.d.ts | 11 +++++++---- signals/index.js | 13 ++++++------- 7 files changed, 38 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index 090b365..25fbf5a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ node_modules/ -.pnpm-store/ coverage/ diff --git a/core/defineStore.js b/core/defineStore.js index d962fc2..003fcf5 100644 --- a/core/defineStore.js +++ b/core/defineStore.js @@ -1,19 +1,19 @@ -import { listenKeys } from "nanostores"; -import { useCallback } from "preact/hooks"; +import { listenKeys } from 'nanostores' +import { useCallback } from 'preact/hooks' export function defineStore(store, options = {}, useSyncExternalStoreFn) { let subscribe = useCallback( - (onChange) => { + onChange => { return options.keys ? listenKeys(store, options.keys, onChange) - : store.listen(onChange); + : store.listen(onChange) }, - [options.keys, store], - ); + [options.keys, store] + ) let get = useCallback(() => { - return (options.selector ?? ((s) => s))(store.get()); - }, [options.selector, store]); + return (options.selector ?? (s => s))(store.get()) + }, [options.selector, store]) - return useSyncExternalStoreFn(subscribe, get); + return useSyncExternalStoreFn(subscribe, get) } diff --git a/core/types.ts b/core/types.ts index 4c4d4f8..bb104f6 100644 --- a/core/types.ts +++ b/core/types.ts @@ -1,8 +1,12 @@ -import type { StoreValue } from 'nanostores'; +import type { StoreValue } from 'nanostores' -export type StoreKeys = T extends { setKey: (k: infer K, v: never) => unknown } ? K : never; +export type StoreKeys = T extends { + setKey: (k: infer K, v: never) => unknown +} + ? K + : never export interface UseStoreOptions { - keys?: StoreKeys[]; - selector?: (state: StoreValue) => Value; + keys?: StoreKeys[] + selector?: (state: StoreValue) => Value } diff --git a/index.d.ts b/index.d.ts index f8abd61..51da6f8 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,8 +1,8 @@ -import type { Store, StoreValue } from "nanostores"; +import type { Store, StoreValue } from 'nanostores' -import type { UseStoreOptions } from "./core/types"; +import type { UseStoreOptions } from './core/types' -export function useStore>( - store: SomeStore, - options: UseStoreOptions = {}, -): Value; +export function useStore< + SomeStore extends Store, + Value = StoreValue +>(store: SomeStore, options: UseStoreOptions = {}): Value diff --git a/index.js b/index.js index 85af223..9069c46 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,6 @@ -import { useSyncExternalStore } from "preact/compat"; +import { useSyncExternalStore } from 'preact/compat' -import { defineStore } from "./core/defineStore.js"; +import { defineStore } from './core/defineStore.js' export function useStore(store, options = {}) { return defineStore(store, options, useSyncExternalStore) diff --git a/signals/index.d.ts b/signals/index.d.ts index 384576f..9d21b70 100644 --- a/signals/index.d.ts +++ b/signals/index.d.ts @@ -1,9 +1,12 @@ import type { ReadonlySignal } from '@preact/signals' -import type { Store, StoreValue } from 'nanostores'; +import type { Store, StoreValue } from 'nanostores' -import type { UseStoreOptions } from "../core/types"; +import type { UseStoreOptions } from '../core/types' -export function useStoreSignal>( +export function useStoreSignal< + SomeStore extends Store, + Value = StoreValue +>( store: SomeStore, - options: UseStoreOptions = {}, + options: UseStoreOptions = {} ): ReadonlySignal diff --git a/signals/index.js b/signals/index.js index 36370a4..8b75f18 100644 --- a/signals/index.js +++ b/signals/index.js @@ -1,19 +1,18 @@ import { useComputed, useSignal } from '@preact/signals' import { useEffect } from 'preact/hooks' -import { defineStore } from "../core/defineStore.js"; +import { defineStore } from '../core/defineStore.js' function useSyncExternalStoreSignal(subscribe, getSnapshot) { - let cache = useSignal(getSnapshot()); + let cache = useSignal(getSnapshot()) useEffect(() => { - return subscribe(() => (cache.value = getSnapshot())); - }, [cache, subscribe, getSnapshot]); + return subscribe(() => (cache.value = getSnapshot())) + }, [cache, subscribe, getSnapshot]) - return useComputed(() => cache.value); + return useComputed(() => cache.value) } -export function useStoreSignal(store, options = {},) { +export function useStoreSignal(store, options = {}) { return defineStore(store, options, useSyncExternalStoreSignal) } - From 06cbdac451d6d1285c4e654e6d95865d44f9d5f3 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Wed, 21 Aug 2024 20:37:11 +0300 Subject: [PATCH 5/7] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 25fbf5a..c6b9df2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ + coverage/ From a4aa6a273966b4b801a58a0c5d818fb67728b2cf Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Wed, 21 Aug 2024 21:21:19 +0300 Subject: [PATCH 6/7] feat: simplify implementation --- core/defineStore.js | 19 ------------------- core/types.ts | 12 ------------ index.d.ts | 20 +++++++++++++++++++- index.js | 34 +++++++++++++++++++++++++++++++++- package.json | 9 ++------- signals/index.d.ts | 12 ------------ signals/index.js | 18 ------------------ 7 files changed, 54 insertions(+), 70 deletions(-) delete mode 100644 core/defineStore.js delete mode 100644 core/types.ts delete mode 100644 signals/index.d.ts delete mode 100644 signals/index.js diff --git a/core/defineStore.js b/core/defineStore.js deleted file mode 100644 index 003fcf5..0000000 --- a/core/defineStore.js +++ /dev/null @@ -1,19 +0,0 @@ -import { listenKeys } from 'nanostores' -import { useCallback } from 'preact/hooks' - -export function defineStore(store, options = {}, useSyncExternalStoreFn) { - let subscribe = useCallback( - onChange => { - return options.keys - ? listenKeys(store, options.keys, onChange) - : store.listen(onChange) - }, - [options.keys, store] - ) - - let get = useCallback(() => { - return (options.selector ?? (s => s))(store.get()) - }, [options.selector, store]) - - return useSyncExternalStoreFn(subscribe, get) -} diff --git a/core/types.ts b/core/types.ts deleted file mode 100644 index bb104f6..0000000 --- a/core/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { StoreValue } from 'nanostores' - -export type StoreKeys = T extends { - setKey: (k: infer K, v: never) => unknown -} - ? K - : never - -export interface UseStoreOptions { - keys?: StoreKeys[] - selector?: (state: StoreValue) => Value -} diff --git a/index.d.ts b/index.d.ts index 51da6f8..46c3c20 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,8 +1,26 @@ +import type { ReadonlySignal } from '@preact/signals' import type { Store, StoreValue } from 'nanostores' -import type { UseStoreOptions } from './core/types' +export type StoreKeys = T extends { + setKey: (k: infer K, v: never) => unknown +} + ? K + : never + +export interface UseStoreOptions { + keys?: StoreKeys[] + selector?: (state: StoreValue) => Value +} export function useStore< SomeStore extends Store, Value = StoreValue +>( + store: SomeStore, + options: UseStoreOptions = {} +): ReadonlySignal + +export function useLegacyStore< + SomeStore extends Store, + Value = StoreValue >(store: SomeStore, options: UseStoreOptions = {}): Value diff --git a/index.js b/index.js index 9069c46..8977bc4 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,39 @@ +import { useComputed, useSignal } from '@preact/signals' +import { listenKeys } from 'nanostores' import { useSyncExternalStore } from 'preact/compat' +import { useCallback, useEffect } from 'preact/hooks' -import { defineStore } from './core/defineStore.js' +function defineStore(store, options = {}, syncExternalStoreFn) { + let subscribe = useCallback( + onChange => { + return options.keys + ? listenKeys(store, options.keys, onChange) + : store.listen(onChange) + }, + [options.keys, store] + ) + + let get = useCallback(() => { + return (options.selector ?? (s => s))(store.get()) + }, [options.selector, store]) + + return syncExternalStoreFn(subscribe, get) +} + +function useSignalLikeSyncExternalStore(subscribe, getSnapshot) { + let cache = useSignal(getSnapshot()) + + useEffect(() => { + return subscribe(() => (cache.value = getSnapshot())) + }, [cache, subscribe, getSnapshot]) + + return useComputed(() => cache.value) +} export function useStore(store, options = {}) { + return defineStore(store, options, useSignalLikeSyncExternalStore) +} + +export function useLegacyStore(store, options = {}) { return defineStore(store, options, useSyncExternalStore) } diff --git a/package.json b/package.json index 3efd55c..2771529 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,7 @@ "types": "./index.d.ts", "exports": { ".": "./index.js", - "./package.json": "./package.json", - "./signals": { - "import": "./signals/index.js", - "types": "./signals/index.d.ts" - } + "./package.json": "./package.json" }, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -91,8 +87,7 @@ "size-limit": [ { "import": { - "src/index.js": "{ useStore }", - "src/signals/index.js": "{ useStoreSignal }", + "index.js": "{ useStore, useLegacyStore }", "nanostores": "{ map, computed }" }, "limit": "999 B" diff --git a/signals/index.d.ts b/signals/index.d.ts deleted file mode 100644 index 9d21b70..0000000 --- a/signals/index.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { ReadonlySignal } from '@preact/signals' -import type { Store, StoreValue } from 'nanostores' - -import type { UseStoreOptions } from '../core/types' - -export function useStoreSignal< - SomeStore extends Store, - Value = StoreValue ->( - store: SomeStore, - options: UseStoreOptions = {} -): ReadonlySignal diff --git a/signals/index.js b/signals/index.js deleted file mode 100644 index 8b75f18..0000000 --- a/signals/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import { useComputed, useSignal } from '@preact/signals' -import { useEffect } from 'preact/hooks' - -import { defineStore } from '../core/defineStore.js' - -function useSyncExternalStoreSignal(subscribe, getSnapshot) { - let cache = useSignal(getSnapshot()) - - useEffect(() => { - return subscribe(() => (cache.value = getSnapshot())) - }, [cache, subscribe, getSnapshot]) - - return useComputed(() => cache.value) -} - -export function useStoreSignal(store, options = {}) { - return defineStore(store, options, useSyncExternalStoreSignal) -} From e63e4ae9fce94e8671b2739b281527cead30c223 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Wed, 21 Aug 2024 21:31:00 +0300 Subject: [PATCH 7/7] feat: update tsdoc comments and file with tests --- index.d.ts | 54 ++++++++++++++++++++++++++++++++++++++++++++++ test/index.test.ts | 16 +++++++------- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/index.d.ts b/index.d.ts index 46c3c20..8a07ec9 100644 --- a/index.d.ts +++ b/index.d.ts @@ -8,10 +8,40 @@ export type StoreKeys = T extends { : never export interface UseStoreOptions { + /** + * Will re-render components only on specific key changes. + */ keys?: StoreKeys[] + /** + * Allows you to extract value from complex/deep objects + */ selector?: (state: StoreValue) => Value } +/** + * Subscribe to store changes and get store’s value. + * + * Can be user with store builder too. + * + * ```js + * import { useStore } from 'nanostores/preact' + * + * import { router } from '../store/router' + * + * export const Layout = () => { + * let page = useStore(router) + * if (page.value.router === 'home') { + * return + * } else { + * return + * } + * } + * ``` + * + * @param store Store instance. + * @param options + * @returns Store value. + */ export function useStore< SomeStore extends Store, Value = StoreValue @@ -20,6 +50,30 @@ export function useStore< options: UseStoreOptions = {} ): ReadonlySignal +/** + * Subscribe to store changes and get store’s value. + * + * Can be user with store builder too. + * + * ```js + * import { useLegacyStore } from 'nanostores/preact' + * + * import { router } from '../store/router' + * + * export const Layout = () => { + * let page = useLegacyStore(router) + * if (page.router === 'home') { + * return + * } else { + * return + * } + * } + * ``` + * + * @param store Store instance. + * @param options + * @returns Store value. + */ export function useLegacyStore< SomeStore extends Store, Value = StoreValue diff --git a/test/index.test.ts b/test/index.test.ts index 17a9a0d..42693dd 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -9,7 +9,7 @@ import type { FunctionalComponent as FC } from 'preact' import { h } from 'preact' import { useState } from 'preact/hooks' -import { useStore } from '../index.js' +import { useLegacyStore } from '../index.js' afterEach(() => { window.document.head.innerHTML = '' @@ -32,13 +32,13 @@ test('renders simple store', async () => { let Test1: FC = () => { renders += 1 - let value = useStore(letter) + let value = useLegacyStore(letter) // @ts-expect-error: Preact type issue with data-* return h('div', { 'data-testid': 'test1' }, value) } let Test2: FC = () => { - let value = useStore(letter) + let value = useLegacyStore(letter) // @ts-expect-error: Preact type issue with data-* return h('div', { 'data-testid': 'test2' }, value) } @@ -96,13 +96,13 @@ test('does not reload store on component changes', async () => { }) let TestA: FC = () => { - let simpleValue = useStore(simple) + let simpleValue = useLegacyStore(simple) // @ts-expect-error: Preact type issue with data-* return h('div', { 'data-testid': 'test' }, `1 ${simpleValue}`) } let TestB: FC = () => { - let simpleValue = useStore(simple) + let simpleValue = useLegacyStore(simple) // @ts-expect-error: Preact type issue with data-* return h('div', { 'data-testid': 'test' }, `2 ${simpleValue}`) } @@ -166,7 +166,7 @@ test('has keys option', async () => { let MapTest: FC = () => { renderCount++ let [keys, setKeys] = useState<(keyof MapStore)[]>(['a']) - let { a, b } = useStore(mapSore, { keys }) + let { a, b } = useLegacyStore(mapSore, { keys }) return h( // @ts-expect-error: Preact type issue with data-* 'div', @@ -231,7 +231,7 @@ test('return correct value for Atom, if store was changed between rendering and } let Wrapper: FC = () => { - let value = useStore(store) + let value = useLegacyStore(store) return h('p', {}, renderWithMutate(value)) } @@ -250,7 +250,7 @@ test('return correct value for MapStore, if store was changed between rendering } let Wrapper: FC = () => { - let value = useStore(store).value + let value = useLegacyStore(store).value return h('p', {}, renderWithMutate(value)) }