diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ce03ce6..5ad9cda 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -47,6 +47,7 @@ const config = { ], '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/method-signature-style': 'error', + '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-empty-interface': 'off', '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-non-null-assertion': 'off', diff --git a/docs/framework/solid/reference/useStore.md b/docs/framework/solid/reference/useStore.md index 2811c11..bed242c 100644 --- a/docs/framework/solid/reference/useStore.md +++ b/docs/framework/solid/reference/useStore.md @@ -3,4 +3,4 @@ title: Use Store id: useStore --- -Please see [/packages/solid-store/src/index.ts](https://github.com/tanstack/store/tree/main/packages/solid-store/src/index.ts) +Please see [/packages/solid-store/src/store.ts](https://github.com/tanstack/store/tree/main/packages/solid-store/src/index.ts) diff --git a/docs/framework/vue/reference/useStore.md b/docs/framework/vue/reference/useStore.md index 725ae81..de535ca 100644 --- a/docs/framework/vue/reference/useStore.md +++ b/docs/framework/vue/reference/useStore.md @@ -3,4 +3,4 @@ title: Use Store id: useStore --- -Please see [/packages/vue-store/src/index.ts](https://github.com/tanstack/store/tree/main/packages/vue-store/src/index.ts) +Please see [/packages/vue-store/src/store.ts](https://github.com/tanstack/store/tree/main/packages/vue-store/src/index.ts) diff --git a/knip.json b/knip.json index 5dc66d8..65512ed 100644 --- a/knip.json +++ b/knip.json @@ -4,6 +4,15 @@ "packages/angular-store": { "ignoreDependencies": ["@angular/compiler-cli"] }, + "packages/store": { + "ignore": ["src/tests/derived.bench.ts"], + "ignoreDependencies": [ + "@angular/core", + "@preact/signals", + "solid-js", + "vue" + ] + }, "packages/vue-store": { "ignoreDependencies": ["vue2", "vue2.7"] } diff --git a/package.json b/package.json index 578fc87..8daa0b8 100644 --- a/package.json +++ b/package.json @@ -66,13 +66,13 @@ "react-dom": "^18.2.0", "rimraf": "^5.0.5", "sherif": "^0.7.0", - "solid-js": "^1.7.8", + "solid-js": "^1.8.14", "typescript": "^5.2.2", "typescript49": "npm:typescript@4.9", "typescript50": "npm:typescript@5.0", "typescript51": "npm:typescript@5.1", "vite": "^5.1.0", "vitest": "^1.2.2", - "vue": "^3.3.4" + "vue": "^3.4.15" } } diff --git a/packages/solid-store/package.json b/packages/solid-store/package.json index 09828b0..82227cc 100644 --- a/packages/solid-store/package.json +++ b/packages/solid-store/package.json @@ -60,7 +60,7 @@ "@tanstack/store": "workspace:*" }, "devDependencies": { - "solid-js": "^1.7.8", + "solid-js": "^1.8.14", "vite-plugin-solid": "^2.8.0" } } diff --git a/packages/store/package.json b/packages/store/package.json index 010ec55..fe79cd1 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -15,6 +15,7 @@ "test:types:versions52": "tsc", "test:types": "pnpm run \"/^test:types:versions.*/\"", "test:lib": "vitest", + "test:bench": "vitest bench", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict", "build": "vite build" @@ -51,5 +52,11 @@ "files": [ "dist", "src" - ] + ], + "devDependencies": { + "@angular/core": "^17.1.2", + "solid-js": "^1.8.14", + "@preact/signals": "^1.2.2", + "vue": "^3.4.15" + } } diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts new file mode 100644 index 0000000..9e22878 --- /dev/null +++ b/packages/store/src/derived.ts @@ -0,0 +1,115 @@ +import { Store } from './store' +import type { Listener } from './types' + +interface DerivedOptions { + onSubscribe?: (listener: Listener, derived: Derived) => () => void + onUpdate?: () => void +} + +export type Deps = Array | Store> + +export class Derived { + _store!: Store + rootStores = new Set>() + deps: Deps + + // Functions representing the subscriptions. Call a function to cleanup + _subscriptions: Array<() => void> = [] + + // What store called the current update, if any + _whatStoreIsCurrentlyInUse: Store | null = null + + constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { + this.deps = deps + this._store = new Store(fn(), { + onSubscribe: options?.onSubscribe?.bind(this) as never, + onUpdate: options?.onUpdate, + }) + /** + * This is here to solve the pyramid dependency problem where: + * A + * / \ + * B C + * \ / + * D + * + * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + * + * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been + * resolved. + * + * This is a record of stores, because derived stores are not able to write values to, but stores are + */ + const storeToDerived = new Map, Set>>() + const derivedToStore = new Map, Set>>() + + const updateStoreToDerived = ( + store: Store, + dep: Derived, + ) => { + const prevDerivesForStore = storeToDerived.get(store) || new Set() + prevDerivesForStore.add(dep) + storeToDerived.set(store, prevDerivesForStore) + } + for (const dep of deps) { + if (dep instanceof Derived) { + derivedToStore.set(dep, dep.rootStores) + for (const store of dep.rootStores) { + this.rootStores.add(store) + updateStoreToDerived(store, dep) + } + } else if (dep instanceof Store) { + this.rootStores.add(dep) + updateStoreToDerived(dep, this as Derived) + } + } + + let __depsThatHaveWrittenThisTick: Deps = [] + + for (const dep of deps) { + const isDepAStore = dep instanceof Store + let relatedLinkedDerivedVals: null | Set> = null + + const unsub = dep.subscribe(() => { + const store = isDepAStore ? dep : dep._whatStoreIsCurrentlyInUse + this._whatStoreIsCurrentlyInUse = store + if (store) { + relatedLinkedDerivedVals = storeToDerived.get(store) ?? null + } + + __depsThatHaveWrittenThisTick.push(dep) + if ( + !relatedLinkedDerivedVals || + __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size + ) { + // Yay! All deps are resolved - write the value of this derived + this._store.setState(fn) + // Cleanup the deps that have written this tick + __depsThatHaveWrittenThisTick = [] + this._whatStoreIsCurrentlyInUse = null + return + } + }) + + this._subscriptions.push(unsub) + } + } + + get state() { + return this._store.state + } + + cleanup = () => { + for (const cleanup of this._subscriptions) { + cleanup() + } + }; + + [Symbol.dispose]() { + this.cleanup() + } + + subscribe = (listener: Listener) => { + return this._store.subscribe(listener) + } +} diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts new file mode 100644 index 0000000..102812e --- /dev/null +++ b/packages/store/src/effect.ts @@ -0,0 +1,22 @@ +import { Derived } from './derived' +import type { Deps } from './derived' + +export class Effect { + _derived: Derived + + constructor(items: Deps, effectFn: () => void) { + this._derived = new Derived(items, () => {}, { + onUpdate() { + effectFn() + }, + }) + } + + cleanup() { + this._derived.cleanup() + } + + [Symbol.dispose]() { + this.cleanup() + } +} diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts index fba4301..c766b28 100644 --- a/packages/store/src/index.ts +++ b/packages/store/src/index.ts @@ -1,70 +1,4 @@ -export type AnyUpdater = (...args: any[]) => any - -export type Listener = () => void - -interface StoreOptions< - TState, - TUpdater extends AnyUpdater = (cb: TState) => TState, -> { - updateFn?: (previous: TState) => (updater: TUpdater) => TState - onSubscribe?: ( - listener: Listener, - store: Store, - ) => () => void - onUpdate?: () => void -} - -export class Store< - TState, - TUpdater extends AnyUpdater = (cb: TState) => TState, -> { - listeners = new Set() - state: TState - options?: StoreOptions - _batching = false - _flushing = 0 - - constructor(initialState: TState, options?: StoreOptions) { - this.state = initialState - this.options = options - } - - subscribe = (listener: Listener) => { - this.listeners.add(listener) - const unsub = this.options?.onSubscribe?.(listener, this) - return () => { - this.listeners.delete(listener) - unsub?.() - } - } - - setState = (updater: TUpdater) => { - const previous = this.state - this.state = this.options?.updateFn - ? this.options.updateFn(previous)(updater) - : (updater as any)(previous) - - // Always run onUpdate, regardless of batching - this.options?.onUpdate?.() - - // Attempt to flush - this._flush() - } - - _flush = () => { - if (this._batching) return - const flushId = ++this._flushing - this.listeners.forEach((listener) => { - if (this._flushing !== flushId) return - listener() - }) - } - - batch = (cb: () => void) => { - if (this._batching) return cb() - this._batching = true - cb() - this._batching = false - this._flush() - } -} +export * from './derived' +export * from './effect' +export * from './store' +export * from './types' diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts new file mode 100644 index 0000000..5674496 --- /dev/null +++ b/packages/store/src/store.ts @@ -0,0 +1,68 @@ +import type { AnyUpdater, Listener } from './types' + +interface StoreOptions< + TState, + TUpdater extends AnyUpdater = (cb: TState) => TState, +> { + updateFn?: (previous: TState) => (updater: TUpdater) => TState + onSubscribe?: ( + listener: Listener, + store: Store, + ) => () => void + onUpdate?: () => void +} + +export class Store< + TState, + TUpdater extends AnyUpdater = (cb: TState) => TState, +> { + listeners = new Set() + state: TState + options?: StoreOptions + _batching = false + _flushing = 0 + + constructor(initialState: TState, options?: StoreOptions) { + this.state = initialState + this.options = options + } + + subscribe = (listener: Listener) => { + this.listeners.add(listener) + const unsub = this.options?.onSubscribe?.(listener, this) + return () => { + this.listeners.delete(listener) + unsub?.() + } + } + + setState = (updater: TUpdater) => { + const previous = this.state + this.state = this.options?.updateFn + ? this.options.updateFn(previous)(updater) + : (updater as any)(previous) + + // Always run onUpdate, regardless of batching + this.options?.onUpdate?.() + + // Attempt to flush + this._flush() + } + + _flush = () => { + if (this._batching) return + const flushId = ++this._flushing + for (const listener of this.listeners) { + if (this._flushing !== flushId) continue + listener() + } + } + + batch = (cb: () => void) => { + if (this._batching) return cb() + this._batching = true + cb() + this._batching = false + this._flush() + } +} diff --git a/packages/store/src/tests/derived.bench.ts b/packages/store/src/tests/derived.bench.ts new file mode 100644 index 0000000..b95fc36 --- /dev/null +++ b/packages/store/src/tests/derived.bench.ts @@ -0,0 +1,114 @@ +/* istanbul ignore file -- @preserve */ +import { bench, describe } from 'vitest' +import { ref, computed as vueComputed, watch } from 'vue' +import { createEffect, createMemo, createSignal } from 'solid-js' +import { + computed as preactComputed, + effect as preactEffect, + signal as preactSignal, +} from '@preact/signals' +import { + computed as angularComputed, + signal as angularSignal, +} from '@angular/core' +import { createWatch } from '@angular/core/primitives/signals' +import { Store } from '../store' +import { Derived } from '../derived' + +function noop(val: any) { + val +} + +/** + * A + * / \ + * B C + * / \ | + * D E F + * \ / | + * \ / + * G + */ +describe('Derived', () => { + bench('TanStack', () => { + const a = new Store(1) + const b = new Derived([a], () => a.state) + const c = new Derived([a], () => a.state) + const d = new Derived([b], () => b.state) + const e = new Derived([b], () => b.state) + const f = new Derived([c], () => c.state) + const g = new Derived([d, e, f], () => d.state + e.state + f.state) + + g.subscribe(() => noop(g.state)) + + a.setState(() => 2) + }) + + bench('Vue', () => { + const a = ref(1) + const b = vueComputed(() => a.value) + const c = vueComputed(() => a.value) + const d = vueComputed(() => b.value) + const e = vueComputed(() => b.value) + const f = vueComputed(() => c.value) + const g = vueComputed(() => d.value + e.value + f.value) + + watch(g, () => { + noop(g.value) + }) + + a.value = 2 + }) + + bench('Solid', () => { + const [a, setA] = createSignal(1) + const b = createMemo(() => a()) + const c = createMemo(() => a()) + const d = createMemo(() => b()) + const e = createMemo(() => b()) + const f = createMemo(() => c()) + const g = createMemo(() => d() + e() + f()) + + createEffect(() => { + noop(g()) + }) + + setA(2) + }) + + bench('Preact', () => { + const a = preactSignal(1) + const b = preactComputed(() => a.value) + const c = preactComputed(() => a.value) + const d = preactComputed(() => b.value) + const e = preactComputed(() => b.value) + const f = preactComputed(() => c.value) + const g = preactComputed(() => d.value + e.value + f.value) + + preactEffect(() => { + noop(g.value) + }) + + a.value = 2 + }) + + bench('Angular', () => { + const a = angularSignal(1) + const b = angularComputed(() => a()) + const c = angularComputed(() => a()) + const d = angularComputed(() => b()) + const e = angularComputed(() => b()) + const f = angularComputed(() => c()) + const g = angularComputed(() => d() + e() + f()) + + createWatch( + () => { + console.log(g()) + }, + () => {}, + false, + ) + + a.set(2) + }) +}) diff --git a/packages/store/src/tests/derived.test.ts b/packages/store/src/tests/derived.test.ts new file mode 100644 index 0000000..24aafd2 --- /dev/null +++ b/packages/store/src/tests/derived.test.ts @@ -0,0 +1,109 @@ +import { afterEach, expect, vi } from 'vitest' +import { Store } from '../store' +import { Derived } from '../derived' + +function viFnSubscribe(subscribable: Store | Derived) { + const fn = vi.fn() + const cleanup = subscribable.subscribe(() => fn(subscribable.state)) + afterEach(() => { + cleanup() + }) + return fn +} + +describe('Derived', () => { + test('Diamond dep problem', () => { + const count = new Store(10) + + const halfCount = new Derived([count], () => { + return count.state / 2 + }) + + const doubleCount = new Derived([count], () => { + return count.state * 2 + }) + + const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { + return halfCount.state + doubleCount.state + }) + + const halfCountFn = viFnSubscribe(halfCount) + const doubleCountFn = viFnSubscribe(doubleCount) + const sumDoubleHalfCountFn = viFnSubscribe(sumDoubleHalfCount) + + count.setState(() => 20) + + expect(halfCountFn).toHaveBeenNthCalledWith(1, 10) + expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) + expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(1, 50) + + count.setState(() => 30) + + expect(halfCountFn).toHaveBeenNthCalledWith(2, 15) + expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) + expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(2, 75) + }) + + /** + * A + * / \ + * B C + * / \ | + * D E F + * \ / | + * \ / + * G + */ + test('Complex diamond dep problem', () => { + const a = new Store(1) + const b = new Derived([a], () => a.state) + const c = new Derived([a], () => a.state) + const d = new Derived([b], () => b.state) + const e = new Derived([b], () => b.state) + const f = new Derived([c], () => c.state) + const g = new Derived([d, e, f], () => d.state + e.state + f.state) + + const aFn = viFnSubscribe(a) + const bFn = viFnSubscribe(b) + const cFn = viFnSubscribe(c) + const dFn = viFnSubscribe(d) + const eFn = viFnSubscribe(e) + const fFn = viFnSubscribe(f) + const gFn = viFnSubscribe(g) + + a.setState(() => 2) + + expect(aFn).toHaveBeenNthCalledWith(1, 2) + expect(bFn).toHaveBeenNthCalledWith(1, 2) + expect(cFn).toHaveBeenNthCalledWith(1, 2) + expect(dFn).toHaveBeenNthCalledWith(1, 2) + expect(eFn).toHaveBeenNthCalledWith(1, 2) + expect(fFn).toHaveBeenNthCalledWith(1, 2) + expect(gFn).toHaveBeenNthCalledWith(1, 6) + }) + + test('Derive from store and another derived', () => { + const count = new Store(10) + + const doubleCount = new Derived([count], () => { + return count.state * 2 + }) + + const tripleCount = new Derived([count, doubleCount], () => { + return count.state + doubleCount.state + }) + + const doubleCountFn = viFnSubscribe(doubleCount) + const tripleCountFn = viFnSubscribe(tripleCount) + + count.setState(() => 20) + + expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) + expect(tripleCountFn).toHaveBeenNthCalledWith(1, 60) + + count.setState(() => 30) + + expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) + expect(tripleCountFn).toHaveBeenNthCalledWith(2, 90) + }) +}) diff --git a/packages/store/src/tests/effect.test.ts b/packages/store/src/tests/effect.test.ts new file mode 100644 index 0000000..d3b7d26 --- /dev/null +++ b/packages/store/src/tests/effect.test.ts @@ -0,0 +1,60 @@ +import { expect, vi } from 'vitest' +import { Store } from '../store' +import { Derived } from '../derived' +import { Effect } from '../effect' + +describe('Effect', () => { + test('Side effect free', () => { + const count = new Store(10) + + const halfCount = new Derived([count], () => { + return count.state / 2 + }) + + const doubleCount = new Derived([count], () => { + return count.state * 2 + }) + + const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { + return halfCount.state + doubleCount.state + }) + + const fn = vi.fn() + new Effect([sumDoubleHalfCount], () => fn(sumDoubleHalfCount.state)) + + count.setState(() => 20) + + expect(fn).toHaveBeenNthCalledWith(1, 50) + + count.setState(() => 30) + + expect(fn).toHaveBeenNthCalledWith(2, 75) + }) + + /** + * A + * / \ + * B C + * / \ | + * D E F + * \ / | + * \ / + * G + */ + test('Complex diamond dep problem', () => { + const a = new Store(1) + const b = new Derived([a], () => a.state) + const c = new Derived([a], () => a.state) + const d = new Derived([b], () => b.state) + const e = new Derived([b], () => b.state) + const f = new Derived([c], () => c.state) + const g = new Derived([d, e, f], () => d.state + e.state + f.state) + + const fn = vi.fn() + new Effect([g], () => fn(g.state)) + + a.setState(() => 2) + + expect(fn).toHaveBeenNthCalledWith(1, 6) + }) +}) diff --git a/packages/store/src/tests/index.test.tsx b/packages/store/src/tests/store.test.ts similarity index 97% rename from packages/store/src/tests/index.test.tsx rename to packages/store/src/tests/store.test.ts index fd3cbd5..44ca166 100644 --- a/packages/store/src/tests/index.test.tsx +++ b/packages/store/src/tests/store.test.ts @@ -58,7 +58,7 @@ describe('store', () => { const listener = vi.fn() - store.subscribe(listener) + const unsub = store.subscribe(listener) store.batch(() => { store.setState(() => 1) @@ -79,5 +79,6 @@ describe('store', () => { expect(store.state).toEqual(4) // Listener is called 4 times because of a lack of batching expect(listener).toHaveBeenCalledTimes(5) + unsub() }) }) diff --git a/packages/store/src/types.ts b/packages/store/src/types.ts new file mode 100644 index 0000000..964a731 --- /dev/null +++ b/packages/store/src/types.ts @@ -0,0 +1,3 @@ +export type AnyUpdater = (...args: any[]) => any + +export type Listener = () => void diff --git a/packages/vue-store/package.json b/packages/vue-store/package.json index 96cec8e..e03ab70 100644 --- a/packages/vue-store/package.json +++ b/packages/vue-store/package.json @@ -58,7 +58,7 @@ }, "devDependencies": { "@vue/composition-api": "^1.7.2", - "vue": "^3.3.4", + "vue": "^3.4.15", "vue2": "npm:vue@2.6", "vue2.7": "npm:vue@2.7", "@vitejs/plugin-vue": "^5.0.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1003e7..a64d4ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@solidjs/testing-library': specifier: ^0.8.5 - version: 0.8.5(@solidjs/router@0.8.3)(solid-js@1.7.11) + version: 0.8.5(@solidjs/router@0.8.3)(solid-js@1.8.14) '@tanstack/config': specifier: ^0.4.2 version: 0.4.2(@types/node@18.19.5)(esbuild@0.19.11)(rollup@4.9.4)(typescript@5.2.2)(vite@5.1.0) @@ -25,7 +25,7 @@ importers: version: 14.4.3(@testing-library/dom@9.3.1) '@testing-library/vue': specifier: ^7.0.0 - version: 7.0.0(@vue/compiler-sfc@3.3.4)(vue@3.3.4) + version: 7.0.0(@vue/compiler-sfc@3.4.15)(vue@3.4.15) '@types/eslint': specifier: ^8.56.2 version: 8.56.2 @@ -96,8 +96,8 @@ importers: specifier: ^0.7.0 version: 0.7.0 solid-js: - specifier: ^1.7.8 - version: 1.7.11 + specifier: ^1.8.14 + version: 1.8.14 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -117,8 +117,8 @@ importers: specifier: ^1.2.2 version: 1.2.2(@types/node@18.19.5)(jsdom@23.2.0) vue: - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.15 + version: 3.4.15(typescript@5.2.2) packages/angular-store: dependencies: @@ -180,13 +180,26 @@ importers: version: link:../store devDependencies: solid-js: - specifier: ^1.7.8 - version: 1.7.11 + specifier: ^1.8.14 + version: 1.8.14 vite-plugin-solid: specifier: ^2.8.0 - version: 2.8.0(solid-js@1.7.11)(vite@5.1.0) + version: 2.8.0(solid-js@1.8.14)(vite@5.1.0) - packages/store: {} + packages/store: + devDependencies: + '@angular/core': + specifier: ^17.1.2 + version: 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@preact/signals': + specifier: ^1.2.2 + version: 1.2.2(preact@10.19.5) + solid-js: + specifier: ^1.8.14 + version: 1.8.14 + vue: + specifier: ^3.4.15 + version: 3.4.15(typescript@5.2.2) packages/vue-store: dependencies: @@ -195,17 +208,17 @@ importers: version: link:../store vue-demi: specifier: ^0.14.6 - version: 0.14.6(@vue/composition-api@1.7.2)(vue@3.3.4) + version: 0.14.6(@vue/composition-api@1.7.2)(vue@3.4.15) devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.2 - version: 5.0.2(vite@5.1.0)(vue@3.3.4) + version: 5.0.2(vite@5.1.0)(vue@3.4.15) '@vue/composition-api': specifier: ^1.7.2 - version: 1.7.2(vue@3.3.4) + version: 1.7.2(vue@3.4.15) vue: - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.15 + version: 3.4.15(typescript@5.2.2) vue2: specifier: npm:vue@2.6 version: /vue@2.6.14 @@ -816,20 +829,20 @@ packages: /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.22.15: resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} @@ -885,6 +898,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.17 + dev: true /@babel/parser@7.23.6: resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} @@ -892,7 +906,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.23.6 - dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7): resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} @@ -1875,6 +1888,7 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.15 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.23.6: resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} @@ -1883,7 +1897,6 @@ packages: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true /@commitlint/parse@18.4.4: resolution: {integrity: sha512-99G7dyn/OoyNWXJni0Ki0K3aJd01pEb/Im/Id6y4X7PN+kGOahjz2z/cXYYHn7xDdooqFVdiVrVLeChfgpWZ2g==} @@ -2692,6 +2705,19 @@ packages: - domexception dev: true + /@preact/signals-core@1.5.1: + resolution: {integrity: sha512-dE6f+WCX5ZUDwXzUIWNMhhglmuLpqJhuy3X3xHrhZYI0Hm2LyQwOu0l9mdPiWrVNsE+Q7txOnJPgtIqHCYoBVA==} + dev: true + + /@preact/signals@1.2.2(preact@10.19.5): + resolution: {integrity: sha512-ColCqdo4cRP18bAuIR4Oik5rDpiyFtPIJIygaYPMEAwTnl4buWkBOflGBSzhYyPyJfKpkwlekrvK+1pzQ2ldWw==} + peerDependencies: + preact: 10.x + dependencies: + '@preact/signals-core': 1.5.1 + preact: 10.19.5 + dev: true + /@prettier/cli@0.3.0(prettier@4.0.0-alpha.8): resolution: {integrity: sha512-8qq527QT5n8paE9eoHeulmGw7a3MroVk5+8ITf+xoWJn1gcVaZiOP6vb9OlwZv49hhdRZ1WX+0MyisSSXL/4fA==} hasBin: true @@ -2886,24 +2912,24 @@ packages: p-map: 4.0.0 dev: true - /@solidjs/router@0.8.3(solid-js@1.7.11): + /@solidjs/router@0.8.3(solid-js@1.8.14): resolution: {integrity: sha512-oJuqQo10rVTiQYhe1qXIG1NyZIZ2YOwHnlLc8Xx+g/iJhFCJo1saLOIrD/Dkh2fpIaIny5ZMkz1cYYqoTYGJbg==} peerDependencies: solid-js: ^1.5.3 dependencies: - solid-js: 1.7.11 + solid-js: 1.8.14 dev: true - /@solidjs/testing-library@0.8.5(@solidjs/router@0.8.3)(solid-js@1.7.11): + /@solidjs/testing-library@0.8.5(@solidjs/router@0.8.3)(solid-js@1.8.14): resolution: {integrity: sha512-L9TowCoqdRQGB8ikODh9uHXrYTjCUZseVUG0tIVa836//qeSqXP4m0BKG66v9Zp1y1wRxok5qUW97GwrtEBMcw==} engines: {node: '>= 14'} peerDependencies: '@solidjs/router': '>=0.6.0' solid-js: '>=1.0.0' dependencies: - '@solidjs/router': 0.8.3(solid-js@1.7.11) + '@solidjs/router': 0.8.3(solid-js@1.8.14) '@testing-library/dom': 9.3.1 - solid-js: 1.7.11 + solid-js: 1.8.14 dev: true /@tanstack/config@0.4.2(@types/node@18.19.5)(esbuild@0.19.11)(rollup@4.9.4)(typescript@5.2.2)(vite@5.1.0): @@ -3004,7 +3030,7 @@ packages: '@testing-library/dom': 9.3.1 dev: true - /@testing-library/vue@7.0.0(@vue/compiler-sfc@3.3.4)(vue@3.3.4): + /@testing-library/vue@7.0.0(@vue/compiler-sfc@3.4.15)(vue@3.4.15): resolution: {integrity: sha512-JU/q93HGo2qdm1dCgWymkeQlfpC0/0/DBZ2nAHgEAsVZxX11xVIxT7gbXdI7HACQpUbsUWt1zABGU075Fzt9XQ==} engines: {node: '>=14'} peerDependencies: @@ -3013,9 +3039,9 @@ packages: dependencies: '@babel/runtime': 7.22.15 '@testing-library/dom': 9.3.1 - '@vue/compiler-sfc': 3.3.4 - '@vue/test-utils': 2.4.1(vue@3.3.4) - vue: 3.3.4 + '@vue/compiler-sfc': 3.4.15 + '@vue/test-utils': 2.4.1(vue@3.4.15) + vue: 3.4.15(typescript@5.2.2) transitivePeerDependencies: - '@vue/server-renderer' dev: true @@ -3439,7 +3465,7 @@ packages: - supports-color dev: true - /@vitejs/plugin-vue@5.0.2(vite@5.1.0)(vue@3.3.4): + /@vitejs/plugin-vue@5.0.2(vite@5.1.0)(vue@3.4.15): resolution: {integrity: sha512-kEjJHrLb5ePBvjD0SPZwJlw1QTRcjjCA9sB5VyfonoXVBxTS7TMnqL6EkLt1Eu61RDeiuZ/WN9Hf6PxXhPI2uA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: @@ -3447,7 +3473,7 @@ packages: vue: ^3.2.25 dependencies: vite: 5.1.0(@types/node@18.19.5) - vue: 3.3.4 + vue: 3.4.15(typescript@5.2.2) dev: true /@vitest/coverage-istanbul@1.2.2(vitest@1.2.2): @@ -3527,19 +3553,20 @@ packages: path-browserify: 1.0.1 dev: true - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + /@vue/compiler-core@3.4.15: + resolution: {integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==} dependencies: - '@babel/parser': 7.22.16 - '@vue/shared': 3.3.4 + '@babel/parser': 7.23.6 + '@vue/shared': 3.4.15 + entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + /@vue/compiler-dom@3.4.15: + resolution: {integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==} dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-core': 3.4.15 + '@vue/shared': 3.4.15 /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} @@ -3549,32 +3576,31 @@ packages: source-map: 0.6.1 dev: true - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + /@vue/compiler-sfc@3.4.15: + resolution: {integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==} dependencies: - '@babel/parser': 7.22.16 - '@vue/compiler-core': 3.3.4 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-ssr': 3.3.4 - '@vue/reactivity-transform': 3.3.4 - '@vue/shared': 3.3.4 + '@babel/parser': 7.23.6 + '@vue/compiler-core': 3.4.15 + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 estree-walker: 2.0.2 - magic-string: 0.30.3 - postcss: 8.4.29 + magic-string: 0.30.5 + postcss: 8.4.35 source-map-js: 1.0.2 - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + /@vue/compiler-ssr@3.4.15: + resolution: {integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==} dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.4.15 + '@vue/shared': 3.4.15 - /@vue/composition-api@1.7.2(vue@3.3.4): + /@vue/composition-api@1.7.2(vue@3.4.15): resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} peerDependencies: vue: '>= 2.5 < 2.7' dependencies: - vue: 3.3.4 + vue: 3.4.15(typescript@5.2.2) /@vue/language-core@1.8.27(typescript@5.2.2): resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} @@ -3586,8 +3612,8 @@ packages: dependencies: '@volar/language-core': 1.11.1 '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.4.15 + '@vue/shared': 3.4.15 computeds: 0.0.1 minimatch: 9.0.3 muggle-string: 0.3.1 @@ -3596,46 +3622,37 @@ packages: vue-template-compiler: 2.7.16 dev: true - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + /@vue/reactivity@3.4.15: + resolution: {integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==} dependencies: - '@babel/parser': 7.22.16 - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - magic-string: 0.30.3 + '@vue/shared': 3.4.15 - /@vue/reactivity@3.3.4: - resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + /@vue/runtime-core@3.4.15: + resolution: {integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==} dependencies: - '@vue/shared': 3.3.4 + '@vue/reactivity': 3.4.15 + '@vue/shared': 3.4.15 - /@vue/runtime-core@3.3.4: - resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + /@vue/runtime-dom@3.4.15: + resolution: {integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==} dependencies: - '@vue/reactivity': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/runtime-core': 3.4.15 + '@vue/shared': 3.4.15 + csstype: 3.1.3 - /@vue/runtime-dom@3.3.4: - resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} - dependencies: - '@vue/runtime-core': 3.3.4 - '@vue/shared': 3.3.4 - csstype: 3.1.2 - - /@vue/server-renderer@3.3.4(vue@3.3.4): - resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + /@vue/server-renderer@3.4.15(vue@3.4.15): + resolution: {integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==} peerDependencies: - vue: 3.3.4 + vue: 3.4.15 dependencies: - '@vue/compiler-ssr': 3.3.4 - '@vue/shared': 3.3.4 - vue: 3.3.4 + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 + vue: 3.4.15(typescript@5.2.2) - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + /@vue/shared@3.4.15: + resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==} - /@vue/test-utils@2.4.1(vue@3.3.4): + /@vue/test-utils@2.4.1(vue@3.4.15): resolution: {integrity: sha512-VO8nragneNzUZUah6kOjiFmD/gwRjUauG9DROh6oaOeFwX1cZRUNHhdeogE8635cISigXFTtGLUQWx5KCb0xeg==} peerDependencies: '@vue/server-renderer': ^3.0.1 @@ -3645,7 +3662,7 @@ packages: optional: true dependencies: js-beautify: 1.14.9 - vue: 3.3.4 + vue: 3.4.15(typescript@5.2.2) vue-component-type-helpers: 1.8.4 dev: true @@ -4814,7 +4831,7 @@ packages: postcss-modules-scope: 3.1.1(postcss@8.4.35) postcss-modules-values: 4.0.0(postcss@8.4.35) postcss-value-parser: 4.2.0 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.89.0(esbuild@0.19.11) dev: true @@ -4860,6 +4877,10 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} /current-git-branch@1.1.0: resolution: {integrity: sha512-n5mwGZllLsFzxDPtTmadqGe4IIBPfqPbiIRX4xgFR9VK/Bx47U+94KiVkxSKAKN6/s43TlkztS2GZpgMKzwQ8A==} @@ -5217,7 +5238,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -7656,18 +7676,11 @@ packages: vlq: 0.2.3 dev: true - /magic-string@0.30.3: - resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - /magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /magicast@0.3.3: resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} @@ -7940,12 +7953,12 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -8699,7 +8712,7 @@ packages: cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 postcss: 8.4.33 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.89.0(esbuild@0.19.11) transitivePeerDependencies: - typescript @@ -8765,6 +8778,7 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /postcss@8.4.33: resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} @@ -8782,6 +8796,9 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + + /preact@10.19.5: + resolution: {integrity: sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==} dev: true /prelude-ls@1.2.1: @@ -9480,8 +9497,17 @@ packages: randombytes: 2.1.0 dev: true - /seroval@0.5.1: - resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} + /seroval-plugins@1.0.4(seroval@1.0.4): + resolution: {integrity: sha512-DQ2IK6oQVvy8k+c2V5x5YCtUa/GGGsUwUBNN9UqohrZ0rWdUapBFpNMYP1bCyRHoxOJjdKGl+dieacFIpU/i1A==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + dependencies: + seroval: 1.0.4 + dev: true + + /seroval@1.0.4: + resolution: {integrity: sha512-qQs/N+KfJu83rmszFQaTxcoJoPn6KNUruX4KmnmyD0oZkUoiNvJ1rpdYKDf4YHM05k+HOgCxa3yvf15QbVijGg==} engines: {node: '>=10'} dev: true @@ -9675,14 +9701,15 @@ packages: websocket-driver: 0.7.4 dev: true - /solid-js@1.7.11: - resolution: {integrity: sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==} + /solid-js@1.8.14: + resolution: {integrity: sha512-kDfgHBm+ROVLDVuqaXh/jYz0ZVJ29TYfVsKsgDPtNcjoyaPtOvDX2l0tVnthjLdEXr7vDTYeqEYFfMkZakDsOQ==} dependencies: - csstype: 3.1.2 - seroval: 0.5.1 + csstype: 3.1.3 + seroval: 1.0.4 + seroval-plugins: 1.0.4(seroval@1.0.4) dev: true - /solid-refresh@0.5.3(solid-js@1.7.11): + /solid-refresh@0.5.3(solid-js@1.8.14): resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} peerDependencies: solid-js: ^1.3 @@ -9690,7 +9717,7 @@ packages: '@babel/generator': 7.22.15 '@babel/helper-module-imports': 7.22.15 '@babel/types': 7.23.6 - solid-js: 1.7.11 + solid-js: 1.8.14 dev: true /source-map-js@1.0.2: @@ -10433,7 +10460,6 @@ packages: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true - dev: true /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} @@ -10672,7 +10698,7 @@ packages: vite: 5.1.0(@types/node@18.19.5) dev: true - /vite-plugin-solid@2.8.0(solid-js@1.7.11)(vite@5.1.0): + /vite-plugin-solid@2.8.0(solid-js@1.8.14)(vite@5.1.0): resolution: {integrity: sha512-n5FAm7ZmTl94VWUoiJCgG7bouF2NlC9CA1wY/qbVnkFbYDWk++bFWyNoU48aLJ+lMtzNeYzJypJXOHzFKxL9xA==} peerDependencies: solid-js: ^1.7.2 @@ -10683,8 +10709,8 @@ packages: '@types/babel__core': 7.20.5 babel-preset-solid: 1.8.9(@babel/core@7.23.7) merge-anything: 5.1.7 - solid-js: 1.7.11 - solid-refresh: 0.5.3(solid-js@1.7.11) + solid-js: 1.8.14 + solid-refresh: 0.5.3(solid-js@1.8.14) vite: 5.1.0(@types/node@18.19.5) vitefu: 0.2.5(vite@5.1.0) transitivePeerDependencies: @@ -10843,7 +10869,7 @@ packages: resolution: {integrity: sha512-6bnLkn8O0JJyiFSIF0EfCogzeqNXpnjJ0vW/SZzNHfe6sPx30lTtTXlE5TFs2qhJlAtDFybStVNpL73cPe3OMQ==} dev: true - /vue-demi@0.14.6(@vue/composition-api@1.7.2)(vue@3.3.4): + /vue-demi@0.14.6(@vue/composition-api@1.7.2)(vue@3.4.15): resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} engines: {node: '>=12'} hasBin: true @@ -10855,8 +10881,8 @@ packages: '@vue/composition-api': optional: true dependencies: - '@vue/composition-api': 1.7.2(vue@3.3.4) - vue: 3.3.4 + '@vue/composition-api': 1.7.2(vue@3.4.15) + vue: 3.4.15(typescript@5.2.2) dev: false /vue-template-compiler@2.7.16: @@ -10889,14 +10915,20 @@ packages: csstype: 3.1.2 dev: true - /vue@3.3.4: - resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + /vue@3.4.15(typescript@5.2.2): + resolution: {integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-sfc': 3.3.4 - '@vue/runtime-dom': 3.3.4 - '@vue/server-renderer': 3.3.4(vue@3.3.4) - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-sfc': 3.4.15 + '@vue/runtime-dom': 3.4.15 + '@vue/server-renderer': 3.4.15(vue@3.4.15) + '@vue/shared': 3.4.15 + typescript: 5.2.2 /w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}