From c4b66b1676389f51fde50955761108cd65fc47e3 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Sun, 15 Dec 2024 22:46:53 +0100 Subject: [PATCH 1/3] Add solid patch --- package.json | 11 +- packages/debugger/package.json | 3 - packages/debugger/src/inspector/store.ts | 51 +- packages/debugger/src/setup.ts | 4 +- packages/extension/package.json | 3 +- packages/frontend/package.json | 3 - packages/logger/package.json | 3 - packages/overlay/package.json | 3 - packages/shared/package.json | 3 - patches/solid-js.patch | 6234 ++++++++++++++++++++++ pnpm-lock.yaml | 319 +- 11 files changed, 6427 insertions(+), 210 deletions(-) create mode 100644 patches/solid-js.patch diff --git a/package.json b/package.json index 4e9a6794..ce5b3cf8 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "devDependencies": { "@changesets/cli": "^2.27.10", + "@eslint-community/eslint-plugin-eslint-comments": "^4.4.1", "@nothing-but/eslint-plugin": "^0.2.3", "@playwright/test": "^1.49.0", "@solid-devtools/shared": "file:packages/shared", @@ -35,18 +36,17 @@ "@types/node": "^22.10.1", "@typescript-eslint/eslint-plugin": "^8.17.0", "@typescript-eslint/parser": "^8.17.0", + "@unocss/core": "0.65.1", + "@unocss/preset-uno": "0.65.1", "cross-env": "^7.0.3", "esbuild": "^0.24.0", "esbuild-plugin-solid": "^0.6.0", "eslint": "^9.16.0", - "@eslint-community/eslint-plugin-eslint-comments": "^4.4.1", "eslint-plugin-no-only-tests": "^3.3.0", "jsdom": "^25.0.1", "solid-js": "^1.9.3", "turbo": "^1.10.16", "typescript": "^5.7.2", - "@unocss/core": "0.65.1", - "@unocss/preset-uno": "0.65.1", "vite": "6.0.3", "vite-plugin-solid": "^2.11.0", "vitest": "^2.1.8" @@ -55,5 +55,10 @@ "engines": { "node": ">=22", "pnpm": ">=9.14.0" + }, + "pnpm": { + "patchedDependencies": { + "solid-js": "patches/solid-js.patch" + } } } diff --git a/packages/debugger/package.json b/packages/debugger/package.json index 0fbcacf3..818c9129 100644 --- a/packages/debugger/package.json +++ b/packages/debugger/package.json @@ -74,9 +74,6 @@ "peerDependencies": { "solid-js": "^1.9.0" }, - "devDependencies": { - "solid-js": "^1.9.3" - }, "keywords": [ "solid", "devtools", diff --git a/packages/debugger/src/inspector/store.ts b/packages/debugger/src/inspector/store.ts index eb678af0..c9aebf12 100644 --- a/packages/debugger/src/inspector/store.ts +++ b/packages/debugger/src/inspector/store.ts @@ -26,40 +26,37 @@ export function setOnStoreNodeUpdate(fn: OnNodeUpdate): void { } // path solid global dev hook -SolidAPI.STORE_DEV.hooks.onStoreNodeUpdate = (node, property, value, prev) => - SolidAPI.untrack(() => { - if (!OnNodeUpdate || !Nodes.has(node) || typeof property === 'symbol') return +SolidAPI.STORE_DEV.hooks.onStoreNodeUpdate = (node, property, value, prev) => { + if (!OnNodeUpdate || !Nodes.has(node) || typeof property === 'symbol') return - property = property.toString() - const storeProperty: StoreNodeProperty = `${getSdtId( - node, - ObjectType.StoreNode, - )}:${property}` - // Update array length - if (property === 'length' && typeof value === 'number' && Array.isArray(node)) { - return OnNodeUpdate(storeProperty, value) - } - isWrappable(prev) && untrackStore(prev, storeProperty) - // Delete property - if (value === undefined) { - OnNodeUpdate(storeProperty, undefined) - } - // Update/Set property - else { - OnNodeUpdate(storeProperty, {value}) - isWrappable(value) && trackStore(value, storeProperty) - } - }) + property = property.toString() + const storeProperty: StoreNodeProperty = `${getSdtId( + node, + ObjectType.StoreNode, + )}:${property}` + // Update array length + if (property === 'length' && typeof value === 'number' && Array.isArray(node)) { + return OnNodeUpdate(storeProperty, value) + } + isWrappable(prev) && untrackStore(prev, storeProperty) + // Delete property + if (value === undefined) { + OnNodeUpdate(storeProperty, undefined) + } + // Update/Set property + else { + OnNodeUpdate(storeProperty, {value}) + isWrappable(value) && trackStore(value, storeProperty) + } +} export function observeStoreNode(rootNode: Solid.StoreNode): VoidFunction { // might still pass in a proxy rootNode = SolidAPI.unwrap(rootNode) const symbol = Symbol('inspect-store') - return SolidAPI.untrack(() => { - trackStore(rootNode, symbol) - return () => untrackStore(rootNode, symbol) - }) + trackStore(rootNode, symbol) + return () => untrackStore(rootNode, symbol) } function trackStore(node: Solid.StoreNode, parent: ParentProperty): void { diff --git a/packages/debugger/src/setup.ts b/packages/debugger/src/setup.ts index 0e26f367..98493193 100644 --- a/packages/debugger/src/setup.ts +++ b/packages/debugger/src/setup.ts @@ -35,8 +35,8 @@ export function useLocator(options: LocatorOptions) { PassedLocatorOptions = options } -let ClientVersion: string | null = null -let SolidVersion: string | null = null +let ClientVersion: string | null = null +let SolidVersion: string | null = null let ExpectedSolidVersion: string | null = null export function setClientVersion(version: string) { diff --git a/packages/extension/package.json b/packages/extension/package.json index bfcaa54c..027e3bc7 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -23,8 +23,7 @@ "@solid-devtools/frontend": "workspace:^", "@solid-devtools/shared": "workspace:^", "@solid-primitives/utils": "^6.2.3", - "solid-devtools": "workspace:^", - "solid-js": "^1.9.3" + "solid-devtools": "workspace:^" }, "overrides": { "@crxjs/vite-plugin": { diff --git a/packages/frontend/package.json b/packages/frontend/package.json index b7841014..8645c1b2 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -59,9 +59,6 @@ "clsx": "^2.1.1", "solid-headless": "^0.13.1" }, - "devDependencies": { - "solid-js": "^1.9.3" - }, "peerDependencies": { "solid-js": "^1.9.0" } diff --git a/packages/logger/package.json b/packages/logger/package.json index 15dfd9d1..9fdd291e 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -47,9 +47,6 @@ "test:unit": "echo \"NOOP test\"", "test:types": "tsc --noEmit --paths null" }, - "devDependencies": { - "solid-js": "^1.9.3" - }, "dependencies": { "@nothing-but/utils": "~0.17.0", "@solid-devtools/debugger": "workspace:^", diff --git a/packages/overlay/package.json b/packages/overlay/package.json index 601407e9..9068a371 100644 --- a/packages/overlay/package.json +++ b/packages/overlay/package.json @@ -58,8 +58,5 @@ }, "peerDependencies": { "solid-js": "^1.9.0" - }, - "devDependencies": { - "solid-js": "^1.9.3" } } diff --git a/packages/shared/package.json b/packages/shared/package.json index 8c71fecd..07c72b09 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -74,8 +74,5 @@ "@solid-primitives/styles": "^0.0.114", "@solid-primitives/utils": "^6.2.3", "@nothing-but/utils": "~0.17.0" - }, - "devDependencies": { - "solid-js": "^1.9.3" } } diff --git a/patches/solid-js.patch b/patches/solid-js.patch new file mode 100644 index 00000000..4fc9f144 --- /dev/null +++ b/patches/solid-js.patch @@ -0,0 +1,6234 @@ +diff --git a/dist/dev.cjs b/dist/dev.cjs +index 167f46db6c602046179dac32a285a63081c9962b..56378faedce8e046950405965663d4f7130deb15 100644 +--- a/dist/dev.cjs ++++ b/dist/dev.cjs +@@ -275,14 +275,14 @@ function createResource(pSource, pFetcher, pOptions) { + let source; + let fetcher; + let options; +- if (arguments.length === 2 && typeof pFetcher === "object" || arguments.length === 1) { +- source = true; +- fetcher = pSource; +- options = pFetcher || {}; +- } else { ++ if (typeof pFetcher === "function") { + source = pSource; + fetcher = pFetcher; + options = pOptions || {}; ++ } else { ++ source = true; ++ fetcher = pSource; ++ options = pFetcher || {}; + } + let pr = null, + initP = NO_INIT, +@@ -1750,12 +1750,20 @@ function Suspense(props) { + } + + const DEV = { ++ version: "1.9.3", ++ getOwner: getOwner, ++ getListener: getListener, ++ $PROXY: $PROXY, ++ $DEVCOMP: $DEVCOMP, ++ $TRACK: $TRACK, + hooks: DevHooks, +- writeSignal, +- registerGraph ++ readSignal: readSignal, ++ writeSignal: writeSignal, ++ registerGraph: registerGraph, ++ sharedConfig: sharedConfig + } ; + if (globalThis) { +- if (!globalThis.Solid$$) globalThis.Solid$$ = true;else console.warn("You appear to have multiple instances of Solid. This can lead to unexpected behavior."); ++ if (!globalThis.Solid$$) globalThis.Solid$$ = DEV;else console.warn("You appear to have multiple instances of Solid. This can lead to unexpected behavior."); + } + + exports.$DEVCOMP = $DEVCOMP; +diff --git a/dist/dev.js b/dist/dev.js +index 1aa04011e0aa28d0ef33f21a2f94d11533acdaea..09b3748094d8a2f9d3d1013a3c014f04e12e0b28 100644 +--- a/dist/dev.js ++++ b/dist/dev.js +@@ -52,11 +52,9 @@ function enqueue(taskQueue, task) { + let m = 0; + let n = taskQueue.length - 1; + while (m <= n) { +- const k = (n + m) >> 1; ++ const k = n + m >> 1; + const cmp = task.expirationTime - taskQueue[k].expirationTime; +- if (cmp > 0) m = k + 1; +- else if (cmp < 0) n = k - 1; +- else return k; ++ if (cmp > 0) m = k + 1;else if (cmp < 0) n = k - 1;else return k; + } + return m; + } +@@ -181,25 +179,20 @@ function createRoot(fn, detachedOwner) { + owner = Owner, + unowned = fn.length === 0, + current = detachedOwner === undefined ? owner : detachedOwner, +- root = unowned +- ? { +- owned: null, +- cleanups: null, +- context: null, +- owner: null +- } +- : { +- owned: null, +- cleanups: null, +- context: current ? current.context : null, +- owner: current +- }, +- updateFn = unowned +- ? () => +- fn(() => { +- throw new Error("Dispose method must be an explicit argument to createRoot function"); +- }) +- : () => fn(() => untrack(() => cleanNode(root))); ++ root = unowned ? { ++ owned: null, ++ cleanups: null, ++ context: null, ++ owner: null ++ } : { ++ owned: null, ++ cleanups: null, ++ context: current ? current.context : null, ++ owner: current ++ }, ++ updateFn = unowned ? () => fn(() => { ++ throw new Error("Dispose method must be an explicit argument to createRoot function"); ++ }) : () => fn(() => untrack(() => cleanNode(root))); + DevHooks.afterCreateOwner && DevHooks.afterCreateOwner(root); + Owner = root; + Listener = null; +@@ -225,26 +218,23 @@ function createSignal(value, options) { + } + const setter = value => { + if (typeof value === "function") { +- if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue); +- else value = value(s.value); ++ if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);else value = value(s.value); + } + return writeSignal(s, value); + }; + return [readSignal.bind(s), setter]; + } + function createComputed(fn, value, options) { +- const c = createComputation(fn, value, true, STALE, options); +- if (Scheduler && Transition && Transition.running) Updates.push(c); +- else updateComputation(c); ++ const c = createComputation(fn, value, true, STALE, options ); ++ if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c); + } + function createRenderEffect(fn, value, options) { +- const c = createComputation(fn, value, false, STALE, options); +- if (Scheduler && Transition && Transition.running) Updates.push(c); +- else updateComputation(c); ++ const c = createComputation(fn, value, false, STALE, options ); ++ if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c); + } + function createEffect(fn, value, options) { + runEffects = runUserEffects; +- const c = createComputation(fn, value, false, STALE, options), ++ const c = createComputation(fn, value, false, STALE, options ), + s = SuspenseContext && useContext(SuspenseContext); + if (s) c.suspense = s; + if (!options || !options.render) c.user = true; +@@ -252,16 +242,10 @@ function createEffect(fn, value, options) { + } + function createReaction(onInvalidate, options) { + let fn; +- const c = createComputation( +- () => { +- fn ? fn() : untrack(onInvalidate); +- fn = undefined; +- }, +- undefined, +- false, +- 0, +- options +- ), ++ const c = createComputation(() => { ++ fn ? fn() : untrack(onInvalidate); ++ fn = undefined; ++ }, undefined, false, 0, options ), + s = SuspenseContext && useContext(SuspenseContext); + if (s) c.suspense = s; + c.user = true; +@@ -272,7 +256,7 @@ function createReaction(onInvalidate, options) { + } + function createMemo(fn, value, options) { + options = options ? Object.assign({}, signalOptions, options) : signalOptions; +- const c = createComputation(fn, value, true, 0, options); ++ const c = createComputation(fn, value, true, 0, options ); + c.observers = null; + c.observerSlots = null; + c.comparator = options.equals || undefined; +@@ -289,14 +273,14 @@ function createResource(pSource, pFetcher, pOptions) { + let source; + let fetcher; + let options; +- if ((arguments.length === 2 && typeof pFetcher === "object") || arguments.length === 1) { +- source = true; +- fetcher = pSource; +- options = pFetcher || {}; +- } else { ++ if (typeof pFetcher === "function") { + source = pSource; + fetcher = pFetcher; + options = pOptions || {}; ++ } else { ++ source = true; ++ fetcher = pSource; ++ options = pFetcher || {}; + } + let pr = null, + initP = NO_INIT, +@@ -314,19 +298,15 @@ function createResource(pSource, pFetcher, pOptions) { + [state, setState] = createSignal(resolved ? "ready" : "unresolved"); + if (sharedConfig.context) { + id = sharedConfig.getNextContextId(); +- if (options.ssrLoadFrom === "initial") initP = options.initialValue; +- else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id); ++ if (options.ssrLoadFrom === "initial") initP = options.initialValue;else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id); + } + function loadEnd(p, v, error, key) { + if (pr === p) { + pr = null; + key !== undefined && (resolved = true); +- if ((p === initP || v === initP) && options.onHydrated) +- queueMicrotask(() => +- options.onHydrated(key, { +- value: v +- }) +- ); ++ if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, { ++ value: v ++ })); + initP = NO_INIT; + if (Transition && p && loadedUnderTransition) { + Transition.promises.delete(p); +@@ -357,8 +337,7 @@ function createResource(pSource, pFetcher, pOptions) { + createComputed(() => { + track(); + if (pr) { +- if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr); +- else if (!contexts.has(c)) { ++ if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);else if (!contexts.has(c)) { + c.increment(); + contexts.add(c); + } +@@ -377,35 +356,26 @@ function createResource(pSource, pFetcher, pOptions) { + return; + } + if (Transition && pr) Transition.promises.delete(pr); +- const p = +- initP !== NO_INIT +- ? initP +- : untrack(() => +- fetcher(lookup, { +- value: value(), +- refetching +- }) +- ); ++ const p = initP !== NO_INIT ? initP : untrack(() => fetcher(lookup, { ++ value: value(), ++ refetching ++ })); + if (!isPromise(p)) { + loadEnd(pr, p, undefined, lookup); + return p; + } + pr = p; + if ("value" in p) { +- if (p.status === "success") loadEnd(pr, p.value, undefined, lookup); +- else loadEnd(pr, undefined, castError(p.value), lookup); ++ if (p.status === "success") loadEnd(pr, p.value, undefined, lookup);else loadEnd(pr, undefined, castError(p.value), lookup); + return p; + } + scheduled = true; +- queueMicrotask(() => (scheduled = false)); ++ queueMicrotask(() => scheduled = false); + runUpdates(() => { + setState(resolved ? "refreshing" : "pending"); + trigger(); + }, false); +- return p.then( +- v => loadEnd(p, v, undefined, lookup), +- e => loadEnd(p, undefined, castError(e), lookup) +- ); ++ return p.then(v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, undefined, castError(e), lookup)); + } + Object.defineProperties(read, { + state: { +@@ -429,81 +399,50 @@ function createResource(pSource, pFetcher, pOptions) { + } + } + }); +- if (dynamic) createComputed(() => load(false)); +- else load(false); +- return [ +- read, +- { +- refetch: load, +- mutate: setValue +- } +- ]; ++ if (dynamic) createComputed(() => load(false));else load(false); ++ return [read, { ++ refetch: load, ++ mutate: setValue ++ }]; + } + function createDeferred(source, options) { + let t, + timeout = options ? options.timeoutMs : undefined; +- const node = createComputation( +- () => { +- if (!t || !t.fn) +- t = requestCallback( +- () => setDeferred(() => node.value), +- timeout !== undefined +- ? { +- timeout +- } +- : undefined +- ); +- return source(); +- }, +- undefined, +- true +- ); +- const [deferred, setDeferred] = createSignal( +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, +- options +- ); ++ const node = createComputation(() => { ++ if (!t || !t.fn) t = requestCallback(() => setDeferred(() => node.value), timeout !== undefined ? { ++ timeout ++ } : undefined); ++ return source(); ++ }, undefined, true); ++ const [deferred, setDeferred] = createSignal(Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, options); + updateComputation(node); +- setDeferred(() => +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value +- ); ++ setDeferred(() => Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value); + return deferred; + } + function createSelector(source, fn = equalFn, options) { + const subs = new Map(); +- const node = createComputation( +- p => { +- const v = source(); +- for (const [key, val] of subs.entries()) +- if (fn(key, v) !== fn(key, p)) { +- for (const c of val.values()) { +- c.state = STALE; +- if (c.pure) Updates.push(c); +- else Effects.push(c); +- } +- } +- return v; +- }, +- undefined, +- true, +- STALE, +- options +- ); ++ const node = createComputation(p => { ++ const v = source(); ++ for (const [key, val] of subs.entries()) if (fn(key, v) !== fn(key, p)) { ++ for (const c of val.values()) { ++ c.state = STALE; ++ if (c.pure) Updates.push(c);else Effects.push(c); ++ } ++ } ++ return v; ++ }, undefined, true, STALE, options ); + updateComputation(node); + return key => { + const listener = Listener; + if (listener) { + let l; +- if ((l = subs.get(key))) l.add(listener); +- else subs.set(key, (l = new Set([listener]))); ++ if (l = subs.get(key)) l.add(listener);else subs.set(key, l = new Set([listener])); + onCleanup(() => { + l.delete(listener); + !l.size && subs.delete(key); + }); + } +- return fn( +- key, +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value +- ); ++ return fn(key, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value); + }; + } + function batch(fn) { +@@ -543,10 +482,7 @@ function onMount(fn) { + createEffect(() => untrack(fn)); + } + function onCleanup(fn) { +- if (Owner === null) +- console.warn("cleanups created outside a `createRoot` or `render` will never be run"); +- else if (Owner.cleanups === null) Owner.cleanups = [fn]; +- else Owner.cleanups.push(fn); ++ if (Owner === null) console.warn("cleanups created outside a `createRoot` or `render` will never be run");else if (Owner.cleanups === null) Owner.cleanups = [fn];else Owner.cleanups.push(fn); + return fn; + } + function catchError(fn, handler) { +@@ -600,17 +536,15 @@ function startTransition(fn) { + Owner = o; + let t; + if (Scheduler || SuspenseContext) { +- t = +- Transition || +- (Transition = { +- sources: new Set(), +- effects: [], +- promises: new Set(), +- disposed: new Set(), +- queue: new Set(), +- running: true +- }); +- t.done || (t.done = new Promise(res => (t.resolve = res))); ++ t = Transition || (Transition = { ++ sources: new Set(), ++ effects: [], ++ promises: new Set(), ++ disposed: new Set(), ++ queue: new Set(), ++ running: true ++ }); ++ t.done || (t.done = new Promise(res => t.resolve = res)); + t.running = true; + } + runUpdates(fn, false); +@@ -618,7 +552,7 @@ function startTransition(fn) { + return t ? t.done : undefined; + }); + } +-const [transPending, setTransPending] = /*@__PURE__*/ createSignal(false); ++const [transPending, setTransPending] = /*@__PURE__*/createSignal(false); + function useTransition() { + return [transPending, startTransition]; + } +@@ -627,18 +561,12 @@ function resumeEffects(e) { + e.length = 0; + } + function devComponent(Comp, props) { +- const c = createComputation( +- () => +- untrack(() => { +- Object.assign(Comp, { +- [$DEVCOMP]: true +- }); +- return Comp(props); +- }), +- undefined, +- true, +- 0 +- ); ++ const c = createComputation(() => untrack(() => { ++ Object.assign(Comp, { ++ [$DEVCOMP]: true ++ }); ++ return Comp(props); ++ }), undefined, true, 0); + c.props = props; + c.observers = null; + c.observerSlots = null; +@@ -649,8 +577,7 @@ function devComponent(Comp, props) { + } + function registerGraph(value) { + if (!Owner) return; +- if (Owner.sourceMap) Owner.sourceMap.push(value); +- else Owner.sourceMap = [value]; ++ if (Owner.sourceMap) Owner.sourceMap.push(value);else Owner.sourceMap = [value]; + value.graph = Owner; + } + function createContext(defaultValue, options) { +@@ -663,15 +590,13 @@ function createContext(defaultValue, options) { + } + function useContext(context) { + let value; +- return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined +- ? value +- : context.defaultValue; ++ return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined ? value : context.defaultValue; + } + function children(fn) { + const children = createMemo(fn); + const memo = createMemo(() => resolveChildren(children()), undefined, { + name: "children" +- }); ++ }) ; + memo.toArray = () => { + const c = memo(); + return Array.isArray(c) ? c : c != null ? [c] : []; +@@ -684,7 +609,10 @@ function getSuspenseContext() { + } + function enableExternalSource(factory, untrack = fn => fn()) { + if (ExternalSourceConfig) { +- const { factory: oldFactory, untrack: oldUntrack } = ExternalSourceConfig; ++ const { ++ factory: oldFactory, ++ untrack: oldUntrack ++ } = ExternalSourceConfig; + ExternalSourceConfig = { + factory: (fn, trigger) => { + const oldSource = oldFactory(fn, trigger); +@@ -709,8 +637,7 @@ function enableExternalSource(factory, untrack = fn => fn()) { + function readSignal() { + const runningTransition = Transition && Transition.running; + if (this.sources && (runningTransition ? this.tState : this.state)) { +- if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this); +- else { ++ if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);else { + const updates = Updates; + Updates = null; + runUpdates(() => lookUpstream(this), false); +@@ -738,12 +665,11 @@ function readSignal() { + return this.value; + } + function writeSignal(node, value, isComp) { +- let current = +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value; ++ let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value; + if (!node.comparator || !node.comparator(current, value)) { + if (Transition) { + const TransitionRunning = Transition.running; +- if (TransitionRunning || (!isComp && Transition.sources.has(node))) { ++ if (TransitionRunning || !isComp && Transition.sources.has(node)) { + Transition.sources.add(node); + node.tValue = value; + } +@@ -756,12 +682,10 @@ function writeSignal(node, value, isComp) { + const TransitionRunning = Transition && Transition.running; + if (TransitionRunning && Transition.disposed.has(o)) continue; + if (TransitionRunning ? !o.tState : !o.state) { +- if (o.pure) Updates.push(o); +- else Effects.push(o); ++ if (o.pure) Updates.push(o);else Effects.push(o); + if (o.observers) markDownstream(o); + } +- if (!TransitionRunning) o.state = STALE; +- else o.tState = STALE; ++ if (!TransitionRunning) o.state = STALE;else o.tState = STALE; + } + if (Updates.length > 10e5) { + Updates = []; +@@ -777,11 +701,7 @@ function updateComputation(node) { + if (!node.fn) return; + cleanNode(node); + const time = ExecCount; +- runComputation( +- node, +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, +- time +- ); ++ runComputation(node, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, time); + if (Transition && !Transition.running && Transition.sources.has(node)) { + queueMicrotask(() => { + runUpdates(() => { +@@ -846,15 +766,11 @@ function createComputation(fn, init, pure, state = STALE, options) { + c.state = 0; + c.tState = state; + } +- if (Owner === null) +- console.warn("computations created outside a `createRoot` or `render` will never be disposed"); +- else if (Owner !== UNOWNED) { ++ if (Owner === null) console.warn("computations created outside a `createRoot` or `render` will never be disposed");else if (Owner !== UNOWNED) { + if (Transition && Transition.running && Owner.pure) { +- if (!Owner.tOwned) Owner.tOwned = [c]; +- else Owner.tOwned.push(c); ++ if (!Owner.tOwned) Owner.tOwned = [c];else Owner.tOwned.push(c); + } else { +- if (!Owner.owned) Owner.owned = [c]; +- else Owner.owned.push(c); ++ if (!Owner.owned) Owner.owned = [c];else Owner.owned.push(c); + } + } + if (options && options.name) c.name = options.name; +@@ -907,8 +823,7 @@ function runUpdates(fn, init) { + if (Updates) return fn(); + let wait = false; + if (!init) Updates = []; +- if (Effects) wait = true; +- else Effects = []; ++ if (Effects) wait = true;else Effects = []; + ExecCount++; + try { + const res = fn(); +@@ -922,8 +837,7 @@ function runUpdates(fn, init) { + } + function completeUpdates(wait) { + if (Updates) { +- if (Scheduler && Transition && Transition.running) scheduleQueue(Updates); +- else runQueue(Updates); ++ if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);else runQueue(Updates); + Updates = null; + } + if (wait) return; +@@ -963,8 +877,7 @@ function completeUpdates(wait) { + } + const e = Effects; + Effects = null; +- if (e.length) runUpdates(() => runEffects(e), false); +- else DevHooks.afterUpdate && DevHooks.afterUpdate(); ++ if (e.length) runUpdates(() => runEffects(e), false);else DevHooks.afterUpdate && DevHooks.afterUpdate(); + if (res) res(); + } + function runQueue(queue) { +@@ -992,8 +905,7 @@ function runUserEffects(queue) { + userLength = 0; + for (i = 0; i < queue.length; i++) { + const e = queue[i]; +- if (!e.user) runTop(e); +- else queue[userLength++] = e; ++ if (!e.user) runTop(e);else queue[userLength++] = e; + } + if (sharedConfig.context) { + if (sharedConfig.count) { +@@ -1012,15 +924,13 @@ function runUserEffects(queue) { + } + function lookUpstream(node, ignore) { + const runningTransition = Transition && Transition.running; +- if (runningTransition) node.tState = 0; +- else node.state = 0; ++ if (runningTransition) node.tState = 0;else node.state = 0; + for (let i = 0; i < node.sources.length; i += 1) { + const source = node.sources[i]; + if (source.sources) { + const state = runningTransition ? source.tState : source.state; + if (state === STALE) { +- if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) +- runTop(source); ++ if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source); + } else if (state === PENDING) lookUpstream(source, ignore); + } + } +@@ -1030,10 +940,8 @@ function markDownstream(node) { + for (let i = 0; i < node.observers.length; i += 1) { + const o = node.observers[i]; + if (runningTransition ? !o.tState : !o.state) { +- if (runningTransition) o.tState = PENDING; +- else o.state = PENDING; +- if (o.pure) Updates.push(o); +- else Effects.push(o); ++ if (runningTransition) o.tState = PENDING;else o.state = PENDING; ++ if (o.pure) Updates.push(o);else Effects.push(o); + o.observers && markDownstream(o); + } + } +@@ -1070,8 +978,7 @@ function cleanNode(node) { + for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i](); + node.cleanups = null; + } +- if (Transition && Transition.running) node.tState = 0; +- else node.state = 0; ++ if (Transition && Transition.running) node.tState = 0;else node.state = 0; + delete node.sourceMap; + } + function reset(node, top) { +@@ -1093,21 +1000,19 @@ function runErrors(err, fns, owner) { + try { + for (const f of fns) f(err); + } catch (e) { +- handleError(e, (owner && owner.owner) || null); ++ handleError(e, owner && owner.owner || null); + } + } + function handleError(err, owner = Owner) { + const fns = ERROR && owner && owner.context && owner.context[ERROR]; + const error = castError(err); + if (!fns) throw error; +- if (Effects) +- Effects.push({ +- fn() { +- runErrors(error, fns, owner); +- }, +- state: STALE +- }); +- else runErrors(error, fns, owner); ++ if (Effects) Effects.push({ ++ fn() { ++ runErrors(error, fns, owner); ++ }, ++ state: STALE ++ });else runErrors(error, fns, owner); + } + function resolveChildren(children) { + if (typeof children === "function" && !children.length) return resolveChildren(children()); +@@ -1124,26 +1029,19 @@ function resolveChildren(children) { + function createProvider(id, options) { + return function provider(props) { + let res; +- createRenderEffect( +- () => +- (res = untrack(() => { +- Owner.context = { +- ...Owner.context, +- [id]: props.value +- }; +- return children(() => props.children); +- })), +- undefined, +- options +- ); ++ createRenderEffect(() => res = untrack(() => { ++ Owner.context = { ++ ...Owner.context, ++ [id]: props.value ++ }; ++ return children(() => props.children); ++ }), undefined, options); + return res; + }; + } + function onError(fn) { + ERROR || (ERROR = Symbol("error")); +- if (Owner === null) +- console.warn("error handlers created outside a `createRoot` or `render` will never be run"); +- else if (Owner.context === null || !Owner.context[ERROR]) { ++ if (Owner === null) console.warn("error handlers created outside a `createRoot` or `render` will never be run");else if (Owner.context === null || !Owner.context[ERROR]) { + Owner.context = { + ...Owner.context, + [ERROR]: [fn] +@@ -1172,8 +1070,7 @@ function observable(input) { + if (!(observer instanceof Object) || observer == null) { + throw new TypeError("Expected the observer to be an object."); + } +- const handler = +- typeof observer === "function" ? observer : observer.next && observer.next.bind(observer); ++ const handler = typeof observer === "function" ? observer : observer.next && observer.next.bind(observer); + if (!handler) { + return { + unsubscribe() {} +@@ -1204,7 +1101,7 @@ function from(producer) { + }); + if ("subscribe" in producer) { + const unsub = producer.subscribe(v => set(() => v)); +- onCleanup(() => ("unsubscribe" in unsub ? unsub.unsubscribe() : unsub())); ++ onCleanup(() => "unsubscribe" in unsub ? unsub.unsubscribe() : unsub()); + } else { + const clean = producer(set); + onCleanup(clean); +@@ -1248,7 +1145,8 @@ function mapArray(list, mapFn, options = {}) { + }); + len = 1; + } +- } else if (len === 0) { ++ } ++ else if (len === 0) { + mapped = new Array(newLen); + for (j = 0; j < newLen; j++) { + items[j] = newItems[j]; +@@ -1259,16 +1157,8 @@ function mapArray(list, mapFn, options = {}) { + temp = new Array(newLen); + tempdisposers = new Array(newLen); + indexes && (tempIndexes = new Array(newLen)); +- for ( +- start = 0, end = Math.min(len, newLen); +- start < end && items[start] === newItems[start]; +- start++ +- ); +- for ( +- end = len - 1, newEnd = newLen - 1; +- end >= start && newEnd >= start && items[end] === newItems[newEnd]; +- end--, newEnd-- +- ) { ++ for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++); ++ for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) { + temp[newEnd] = mapped[end]; + tempdisposers[newEnd] = disposers[end]; + indexes && (tempIndexes[newEnd] = indexes[end]); +@@ -1302,7 +1192,7 @@ function mapArray(list, mapFn, options = {}) { + } + } else mapped[j] = createRoot(mapper); + } +- mapped = mapped.slice(0, (len = newLen)); ++ mapped = mapped.slice(0, len = newLen); + items = newItems.slice(0); + } + return mapped; +@@ -1312,7 +1202,7 @@ function mapArray(list, mapFn, options = {}) { + if (indexes) { + const [s, set] = createSignal(j, { + name: "index" +- }); ++ }) ; + indexes[j] = set; + return mapFn(newItems[j], s); + } +@@ -1371,13 +1261,13 @@ function indexArray(list, mapFn, options = {}) { + } + len = signals.length = disposers.length = newLen; + items = newItems.slice(0); +- return (mapped = mapped.slice(0, len)); ++ return mapped = mapped.slice(0, len); + }); + function mapper(disposer) { + disposers[i] = disposer; + const [s, set] = createSignal(newItems[i], { + name: "value" +- }); ++ }) ; + signals[i] = set; + return mapFn(s, i); + } +@@ -1393,7 +1283,7 @@ function createComponent(Comp, props) { + if (sharedConfig.context) { + const c = sharedConfig.context; + setHydrateContext(nextHydrateContext()); +- const r = devComponent(Comp, props || {}); ++ const r = devComponent(Comp, props || {}) ; + setHydrateContext(c); + return r; + } +@@ -1442,33 +1332,29 @@ function mergeProps(...sources) { + let proxy = false; + for (let i = 0; i < sources.length; i++) { + const s = sources[i]; +- proxy = proxy || (!!s && $PROXY in s); +- sources[i] = typeof s === "function" ? ((proxy = true), createMemo(s)) : s; ++ proxy = proxy || !!s && $PROXY in s; ++ sources[i] = typeof s === "function" ? (proxy = true, createMemo(s)) : s; + } + if (SUPPORTS_PROXY && proxy) { +- return new Proxy( +- { +- get(property) { +- for (let i = sources.length - 1; i >= 0; i--) { +- const v = resolveSource(sources[i])[property]; +- if (v !== undefined) return v; +- } +- }, +- has(property) { +- for (let i = sources.length - 1; i >= 0; i--) { +- if (property in resolveSource(sources[i])) return true; +- } +- return false; +- }, +- keys() { +- const keys = []; +- for (let i = 0; i < sources.length; i++) +- keys.push(...Object.keys(resolveSource(sources[i]))); +- return [...new Set(keys)]; ++ return new Proxy({ ++ get(property) { ++ for (let i = sources.length - 1; i >= 0; i--) { ++ const v = resolveSource(sources[i])[property]; ++ if (v !== undefined) return v; + } + }, +- propTraps +- ); ++ has(property) { ++ for (let i = sources.length - 1; i >= 0; i--) { ++ if (property in resolveSource(sources[i])) return true; ++ } ++ return false; ++ }, ++ keys() { ++ const keys = []; ++ for (let i = 0; i < sources.length; i++) keys.push(...Object.keys(resolveSource(sources[i]))); ++ return [...new Set(keys)]; ++ } ++ }, propTraps); + } + const sourcesMap = {}; + const defined = Object.create(null); +@@ -1481,20 +1367,15 @@ function mergeProps(...sources) { + if (key === "__proto__" || key === "constructor") continue; + const desc = Object.getOwnPropertyDescriptor(source, key); + if (!defined[key]) { +- defined[key] = desc.get +- ? { +- enumerable: true, +- configurable: true, +- get: resolveSources.bind((sourcesMap[key] = [desc.get.bind(source)])) +- } +- : desc.value !== undefined +- ? desc +- : undefined; ++ defined[key] = desc.get ? { ++ enumerable: true, ++ configurable: true, ++ get: resolveSources.bind(sourcesMap[key] = [desc.get.bind(source)]) ++ } : desc.value !== undefined ? desc : undefined; + } else { + const sources = sourcesMap[key]; + if (sources) { +- if (desc.get) sources.push(desc.get.bind(source)); +- else if (desc.value !== undefined) sources.push(() => desc.value); ++ if (desc.get) sources.push(desc.get.bind(source));else if (desc.value !== undefined) sources.push(() => desc.value); + } + } + } +@@ -1504,8 +1385,7 @@ function mergeProps(...sources) { + for (let i = definedKeys.length - 1; i >= 0; i--) { + const key = definedKeys[i], + desc = defined[key]; +- if (desc && desc.get) Object.defineProperty(target, key, desc); +- else target[key] = desc ? desc.value : undefined; ++ if (desc && desc.get) Object.defineProperty(target, key, desc);else target[key] = desc ? desc.value : undefined; + } + return target; + } +@@ -1513,60 +1393,47 @@ function splitProps(props, ...keys) { + if (SUPPORTS_PROXY && $PROXY in props) { + const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]); + const res = keys.map(k => { +- return new Proxy( +- { +- get(property) { +- return k.includes(property) ? props[property] : undefined; +- }, +- has(property) { +- return k.includes(property) && property in props; +- }, +- keys() { +- return k.filter(property => property in props); +- } ++ return new Proxy({ ++ get(property) { ++ return k.includes(property) ? props[property] : undefined; + }, +- propTraps +- ); +- }); +- res.push( +- new Proxy( +- { +- get(property) { +- return blocked.has(property) ? undefined : props[property]; +- }, +- has(property) { +- return blocked.has(property) ? false : property in props; +- }, +- keys() { +- return Object.keys(props).filter(k => !blocked.has(k)); +- } ++ has(property) { ++ return k.includes(property) && property in props; + }, +- propTraps +- ) +- ); ++ keys() { ++ return k.filter(property => property in props); ++ } ++ }, propTraps); ++ }); ++ res.push(new Proxy({ ++ get(property) { ++ return blocked.has(property) ? undefined : props[property]; ++ }, ++ has(property) { ++ return blocked.has(property) ? false : property in props; ++ }, ++ keys() { ++ return Object.keys(props).filter(k => !blocked.has(k)); ++ } ++ }, propTraps)); + return res; + } + const otherObject = {}; + const objects = keys.map(() => ({})); + for (const propName of Object.getOwnPropertyNames(props)) { + const desc = Object.getOwnPropertyDescriptor(props, propName); +- const isDefaultDesc = +- !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable; ++ const isDefaultDesc = !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable; + let blocked = false; + let objectIndex = 0; + for (const k of keys) { + if (k.includes(propName)) { + blocked = true; +- isDefaultDesc +- ? (objects[objectIndex][propName] = desc.value) +- : Object.defineProperty(objects[objectIndex], propName, desc); ++ isDefaultDesc ? objects[objectIndex][propName] = desc.value : Object.defineProperty(objects[objectIndex], propName, desc); + } + ++objectIndex; + } + if (!blocked) { +- isDefaultDesc +- ? (otherObject[propName] = desc.value) +- : Object.defineProperty(otherObject, propName, desc); ++ isDefaultDesc ? otherObject[propName] = desc.value : Object.defineProperty(otherObject, propName, desc); + } + } + return [...objects, otherObject]; +@@ -1592,24 +1459,19 @@ function lazy(fn) { + comp = s; + } + let Comp; +- return createMemo(() => +- (Comp = comp()) +- ? untrack(() => { +- if (true) +- Object.assign(Comp, { +- [$DEVCOMP]: true +- }); +- if (!ctx || sharedConfig.done) return Comp(props); +- const c = sharedConfig.context; +- setHydrateContext(ctx); +- const r = Comp(props); +- setHydrateContext(c); +- return r; +- }) +- : "" +- ); ++ return createMemo(() => (Comp = comp()) ? untrack(() => { ++ if (true) Object.assign(Comp, { ++ [$DEVCOMP]: true ++ }); ++ if (!ctx || sharedConfig.done) return Comp(props); ++ const c = sharedConfig.context; ++ setHydrateContext(ctx); ++ const r = Comp(props); ++ setHydrateContext(c); ++ return r; ++ }) : ""); + }; +- wrap.preload = () => p || ((p = fn()).then(mod => (comp = () => mod.default)), p); ++ wrap.preload = () => p || ((p = fn()).then(mod => comp = () => mod.default), p); + return wrap; + } + let counter = 0; +@@ -1618,112 +1480,75 @@ function createUniqueId() { + return ctx ? sharedConfig.getNextContextId() : `cl-${counter++}`; + } + +-const narrowedError = name => +- `Attempting to access a stale value from <${name}> that could possibly be undefined. This may occur because you are reading the accessor returned from the component at a time where it has already been unmounted. We recommend cleaning up any stale timers or async, or reading from the initial condition.`; ++const narrowedError = name => `Attempting to access a stale value from <${name}> that could possibly be undefined. This may occur because you are reading the accessor returned from the component at a time where it has already been unmounted. We recommend cleaning up any stale timers or async, or reading from the initial condition.` ; + function For(props) { + const fallback = "fallback" in props && { + fallback: () => props.fallback + }; +- return createMemo( +- mapArray(() => props.each, props.children, fallback || undefined), +- undefined, +- { +- name: "value" +- } +- ); ++ return createMemo(mapArray(() => props.each, props.children, fallback || undefined), undefined, { ++ name: "value" ++ }) ; + } + function Index(props) { + const fallback = "fallback" in props && { + fallback: () => props.fallback + }; +- return createMemo( +- indexArray(() => props.each, props.children, fallback || undefined), +- undefined, +- { +- name: "value" +- } +- ); ++ return createMemo(indexArray(() => props.each, props.children, fallback || undefined), undefined, { ++ name: "value" ++ }) ; + } + function Show(props) { + const keyed = props.keyed; + const condition = createMemo(() => props.when, undefined, { +- equals: (a, b) => (keyed ? a === b : !a === !b), ++ equals: (a, b) => keyed ? a === b : !a === !b, + name: "condition" +- }); +- return createMemo( +- () => { +- const c = condition(); +- if (c) { +- const child = props.children; +- const fn = typeof child === "function" && child.length > 0; +- return fn +- ? untrack(() => +- child( +- keyed +- ? c +- : () => { +- if (!untrack(condition)) throw narrowedError("Show"); +- return props.when; +- } +- ) +- ) +- : child; +- } +- return props.fallback; +- }, +- undefined, +- { +- name: "value" ++ } ); ++ return createMemo(() => { ++ const c = condition(); ++ if (c) { ++ const child = props.children; ++ const fn = typeof child === "function" && child.length > 0; ++ return fn ? untrack(() => child(keyed ? c : () => { ++ if (!untrack(condition)) throw narrowedError("Show"); ++ return props.when; ++ })) : child; + } +- ); ++ return props.fallback; ++ }, undefined, { ++ name: "value" ++ } ); + } + function Switch(props) { + let keyed = false; + const equals = (a, b) => (keyed ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2]; + const conditions = children(() => props.children), +- evalConditions = createMemo( +- () => { +- let conds = conditions(); +- if (!Array.isArray(conds)) conds = [conds]; +- for (let i = 0; i < conds.length; i++) { +- const c = conds[i].when; +- if (c) { +- keyed = !!conds[i].keyed; +- return [i, c, conds[i]]; +- } ++ evalConditions = createMemo(() => { ++ let conds = conditions(); ++ if (!Array.isArray(conds)) conds = [conds]; ++ for (let i = 0; i < conds.length; i++) { ++ const c = conds[i].when; ++ if (c) { ++ keyed = !!conds[i].keyed; ++ return [i, c, conds[i]]; + } +- return [-1]; +- }, +- undefined, +- { +- equals, +- name: "eval conditions" + } +- ); +- return createMemo( +- () => { +- const [index, when, cond] = evalConditions(); +- if (index < 0) return props.fallback; +- const c = cond.children; +- const fn = typeof c === "function" && c.length > 0; +- return fn +- ? untrack(() => +- c( +- keyed +- ? when +- : () => { +- if (untrack(evalConditions)[0] !== index) throw narrowedError("Match"); +- return cond.when; +- } +- ) +- ) +- : c; +- }, +- undefined, +- { +- name: "value" +- } +- ); ++ return [-1]; ++ }, undefined, { ++ equals, ++ name: "eval conditions" ++ } ); ++ return createMemo(() => { ++ const [index, when, cond] = evalConditions(); ++ if (index < 0) return props.fallback; ++ const c = cond.children; ++ const fn = typeof c === "function" && c.length > 0; ++ return fn ? untrack(() => c(keyed ? when : () => { ++ if (untrack(evalConditions)[0] !== index) throw narrowedError("Match"); ++ return cond.when; ++ })) : c; ++ }, undefined, { ++ name: "value" ++ } ); + } + function Match(props) { + return props; +@@ -1734,34 +1559,28 @@ function resetErrorBoundaries() { + } + function ErrorBoundary(props) { + let err; +- if (sharedConfig.context && sharedConfig.load) +- err = sharedConfig.load(sharedConfig.getContextId()); ++ if (sharedConfig.context && sharedConfig.load) err = sharedConfig.load(sharedConfig.getContextId()); + const [errored, setErrored] = createSignal(err, { + name: "errored" +- }); ++ } ); + Errors || (Errors = new Set()); + Errors.add(setErrored); + onCleanup(() => Errors.delete(setErrored)); +- return createMemo( +- () => { +- let e; +- if ((e = errored())) { +- const f = props.fallback; +- if (typeof f !== "function" || f.length == 0) console.error(e); +- return typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored())) : f; +- } +- return catchError(() => props.children, setErrored); +- }, +- undefined, +- { +- name: "value" ++ return createMemo(() => { ++ let e; ++ if (e = errored()) { ++ const f = props.fallback; ++ if ((typeof f !== "function" || f.length == 0)) console.error(e); ++ return typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored())) : f; + } +- ); ++ return catchError(() => props.children, setErrored); ++ }, undefined, { ++ name: "value" ++ } ); + } + +-const suspenseListEquals = (a, b) => +- a.showContent === b.showContent && a.showFallback === b.showFallback; +-const SuspenseListContext = /* #__PURE__ */ createContext(); ++const suspenseListEquals = (a, b) => a.showContent === b.showContent && a.showFallback === b.showFallback; ++const SuspenseListContext = /* #__PURE__ */createContext(); + function SuspenseList(props) { + let [wrapper, setWrapper] = createSignal(() => ({ + inFallback: false +@@ -1772,51 +1591,51 @@ function SuspenseList(props) { + if (listContext) { + show = listContext.register(createMemo(() => wrapper()().inFallback)); + } +- const resolved = createMemo( +- prev => { +- const reveal = props.revealOrder, +- tail = props.tail, +- { showContent = true, showFallback = true } = show ? show() : {}, +- reg = registry(), +- reverse = reveal === "backwards"; +- if (reveal === "together") { +- const all = reg.every(inFallback => !inFallback()); +- const res = reg.map(() => ({ +- showContent: all && showContent, ++ const resolved = createMemo(prev => { ++ const reveal = props.revealOrder, ++ tail = props.tail, ++ { ++ showContent = true, ++ showFallback = true ++ } = show ? show() : {}, ++ reg = registry(), ++ reverse = reveal === "backwards"; ++ if (reveal === "together") { ++ const all = reg.every(inFallback => !inFallback()); ++ const res = reg.map(() => ({ ++ showContent: all && showContent, ++ showFallback ++ })); ++ res.inFallback = !all; ++ return res; ++ } ++ let stop = false; ++ let inFallback = prev.inFallback; ++ const res = []; ++ for (let i = 0, len = reg.length; i < len; i++) { ++ const n = reverse ? len - i - 1 : i, ++ s = reg[n](); ++ if (!stop && !s) { ++ res[n] = { ++ showContent, + showFallback +- })); +- res.inFallback = !all; +- return res; +- } +- let stop = false; +- let inFallback = prev.inFallback; +- const res = []; +- for (let i = 0, len = reg.length; i < len; i++) { +- const n = reverse ? len - i - 1 : i, +- s = reg[n](); +- if (!stop && !s) { +- res[n] = { +- showContent, +- showFallback +- }; +- } else { +- const next = !stop; +- if (next) inFallback = true; +- res[n] = { +- showContent: next, +- showFallback: !tail || (next && tail === "collapsed") ? showFallback : false +- }; +- stop = true; +- } ++ }; ++ } else { ++ const next = !stop; ++ if (next) inFallback = true; ++ res[n] = { ++ showContent: next, ++ showFallback: !tail || next && tail === "collapsed" ? showFallback : false ++ }; ++ stop = true; + } +- if (!stop) inFallback = false; +- res.inFallback = inFallback; +- return res; +- }, +- { +- inFallback: false + } +- ); ++ if (!stop) inFallback = false; ++ res.inFallback = inFallback; ++ return res; ++ }, { ++ inFallback: false ++ }); + setWrapper(() => resolved); + return createComponent(SuspenseListContext.Provider, { + value: { +@@ -1861,27 +1680,23 @@ function Suspense(props) { + const key = sharedConfig.getContextId(); + let ref = sharedConfig.load(key); + if (ref) { +- if (typeof ref !== "object" || ref.status !== "success") p = ref; +- else sharedConfig.gather(key); ++ if (typeof ref !== "object" || ref.status !== "success") p = ref;else sharedConfig.gather(key); + } + if (p && p !== "$$f") { + const [s, set] = createSignal(undefined, { + equals: false + }); + flicker = s; +- p.then( +- () => { +- if (sharedConfig.done) return set(); +- sharedConfig.gather(key); +- setHydrateContext(ctx); +- set(); +- setHydrateContext(); +- }, +- err => { +- error = err; +- set(); +- } +- ); ++ p.then(() => { ++ if (sharedConfig.done) return set(); ++ sharedConfig.gather(key); ++ setHydrateContext(ctx); ++ set(); ++ setHydrateContext(); ++ }, err => { ++ error = err; ++ set(); ++ }); + } + } + const listContext = useContext(SuspenseListContext); +@@ -1896,14 +1711,17 @@ function Suspense(props) { + ctx = sharedConfig.context; + if (flicker) { + flicker(); +- return (flicker = undefined); ++ return flicker = undefined; + } + if (ctx && p === "$$f") setHydrateContext(); + const rendered = createMemo(() => props.children); + return createMemo(prev => { + const inFallback = store.inFallback(), +- { showContent = true, showFallback = true } = show ? show() : {}; +- if ((!inFallback || (p && p !== "$$f")) && showContent) { ++ { ++ showContent = true, ++ showFallback = true ++ } = show ? show() : {}; ++ if ((!inFallback || p && p !== "$$f") && showContent) { + store.resolved = true; + dispose && dispose(); + dispose = ctx = p = undefined; +@@ -1930,71 +1748,20 @@ function Suspense(props) { + } + + const DEV = { ++ version: "1.9.3", ++ getOwner: getOwner, ++ getListener: getListener, ++ $PROXY: $PROXY, ++ $DEVCOMP: $DEVCOMP, ++ $TRACK: $TRACK, + hooks: DevHooks, +- writeSignal, +- registerGraph +-}; ++ readSignal: readSignal, ++ writeSignal: writeSignal, ++ registerGraph: registerGraph, ++ sharedConfig: sharedConfig ++} ; + if (globalThis) { +- if (!globalThis.Solid$$) globalThis.Solid$$ = true; +- else +- console.warn( +- "You appear to have multiple instances of Solid. This can lead to unexpected behavior." +- ); ++ if (!globalThis.Solid$$) globalThis.Solid$$ = DEV;else console.warn("You appear to have multiple instances of Solid. This can lead to unexpected behavior."); + } + +-export { +- $DEVCOMP, +- $PROXY, +- $TRACK, +- DEV, +- ErrorBoundary, +- For, +- Index, +- Match, +- Show, +- Suspense, +- SuspenseList, +- Switch, +- batch, +- cancelCallback, +- catchError, +- children, +- createComponent, +- createComputed, +- createContext, +- createDeferred, +- createEffect, +- createMemo, +- createReaction, +- createRenderEffect, +- createResource, +- createRoot, +- createSelector, +- createSignal, +- createUniqueId, +- enableExternalSource, +- enableHydration, +- enableScheduling, +- equalFn, +- from, +- getListener, +- getOwner, +- indexArray, +- lazy, +- mapArray, +- mergeProps, +- observable, +- on, +- onCleanup, +- onError, +- onMount, +- requestCallback, +- resetErrorBoundaries, +- runWithOwner, +- sharedConfig, +- splitProps, +- startTransition, +- untrack, +- useContext, +- useTransition +-}; ++export { $DEVCOMP, $PROXY, $TRACK, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, catchError, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition }; +diff --git a/dist/server.cjs b/dist/server.cjs +index 860868f23a4c79f57778b3a08701d4a3d9e2914b..5cc7743f4e88ad6bf74a138f9d076dd29a983e62 100644 +--- a/dist/server.cjs ++++ b/dist/server.cjs +@@ -470,15 +470,10 @@ function ErrorBoundary(props) { + const SuspenseContext = createContext(); + let resourceContext = null; + function createResource(source, fetcher, options = {}) { +- if (arguments.length === 2) { +- if (typeof fetcher === "object") { +- options = fetcher; +- fetcher = source; +- source = true; +- } +- } else if (arguments.length === 1) { +- fetcher = source; ++ if (typeof fetcher !== "function") { + source = true; ++ fetcher = source; ++ options = fetcher || {}; + } + const contexts = new Set(); + const id = sharedConfig.getNextContextId(); +diff --git a/dist/server.js b/dist/server.js +index ef26b85268ff3a74511650bf3222ff411e679c9b..d770f94a94e02a11f0214ffaaddfc79567c27f94 100644 +--- a/dist/server.js ++++ b/dist/server.js +@@ -17,7 +17,7 @@ function handleError(err, owner = Owner) { + try { + for (const f of fns) f(error); + } catch (e) { +- handleError(e, (owner && owner.owner) || null); ++ handleError(e, owner && owner.owner || null); + } + } + const UNOWNED = { +@@ -35,23 +35,19 @@ function createOwner() { + cleanups: null + }; + if (Owner) { +- if (!Owner.owned) Owner.owned = [o]; +- else Owner.owned.push(o); ++ if (!Owner.owned) Owner.owned = [o];else Owner.owned.push(o); + } + return o; + } + function createRoot(fn, detachedOwner) { + const owner = Owner, + current = detachedOwner === undefined ? owner : detachedOwner, +- root = +- fn.length === 0 +- ? UNOWNED +- : { +- context: current ? current.context : null, +- owner: current, +- owned: null, +- cleanups: null +- }; ++ root = fn.length === 0 ? UNOWNED : { ++ context: current ? current.context : null, ++ owner: current, ++ owned: null, ++ cleanups: null ++ }; + Owner = root; + let result; + try { +@@ -64,12 +60,9 @@ function createRoot(fn, detachedOwner) { + return result; + } + function createSignal(value, options) { +- return [ +- () => value, +- v => { +- return (value = typeof v === "function" ? v(value) : v); +- } +- ]; ++ return [() => value, v => { ++ return value = typeof v === "function" ? v(value) : v; ++ }]; + } + function createComputed(fn, value) { + Owner = createOwner(); +@@ -126,8 +119,7 @@ function on(deps, fn, options = {}) { + function onMount(fn) {} + function onCleanup(fn) { + if (Owner) { +- if (!Owner.cleanups) Owner.cleanups = [fn]; +- else Owner.cleanups.push(fn); ++ if (!Owner.cleanups) Owner.cleanups = [fn];else Owner.cleanups.push(fn); + } + return fn; + } +@@ -168,9 +160,7 @@ function createContext(defaultValue) { + }; + } + function useContext(context) { +- return Owner && Owner.context && Owner.context[context.id] !== undefined +- ? Owner.context[context.id] +- : context.defaultValue; ++ return Owner && Owner.context && Owner.context[context.id] !== undefined ? Owner.context[context.id] : context.defaultValue; + } + function getOwner() { + return Owner; +@@ -247,8 +237,7 @@ function observable(input) { + if (!(observer instanceof Object) || observer == null) { + throw new TypeError("Expected the observer to be an object."); + } +- const handler = +- typeof observer === "function" ? observer : observer.next && observer.next.bind(observer); ++ const handler = typeof observer === "function" ? observer : observer.next && observer.next.bind(observer); + if (!handler) { + return { + unsubscribe() {} +@@ -277,7 +266,7 @@ function from(producer) { + const [s, set] = createSignal(undefined); + if ("subscribe" in producer) { + const unsub = producer.subscribe(v => set(() => v)); +- onCleanup(() => ("unsubscribe" in unsub ? unsub.unsubscribe() : unsub())); ++ onCleanup(() => "unsubscribe" in unsub ? unsub.unsubscribe() : unsub()); + } else { + const clean = producer(set); + onCleanup(clean); +@@ -320,7 +309,7 @@ function resolveSSRNode(node) { + let mapped = ""; + for (let i = 0, len = node.length; i < len; i++) { + if (typeof prev !== "object" && typeof node[i] !== "object") mapped += ``; +- mapped += resolveSSRNode((prev = node[i])); ++ mapped += resolveSSRNode(prev = node[i]); + } + return mapped; + } +@@ -335,8 +324,7 @@ const sharedConfig = { + return getContextId(this.context.count); + }, + getNextContextId() { +- if (!this.context) +- throw new Error(`getNextContextId cannot be used under non-hydrating context`); ++ if (!this.context) throw new Error(`getNextContextId cannot be used under non-hydrating context`); + return getContextId(this.context.count++); + } + }; +@@ -349,13 +337,11 @@ function setHydrateContext(context) { + sharedConfig.context = context; + } + function nextHydrateContext() { +- return sharedConfig.context +- ? { +- ...sharedConfig.context, +- id: sharedConfig.getNextContextId(), +- count: 0 +- } +- : undefined; ++ return sharedConfig.context ? { ++ ...sharedConfig.context, ++ id: sharedConfig.getNextContextId(), ++ count: 0 ++ } : undefined; + } + function createUniqueId() { + return sharedConfig.getNextContextId(); +@@ -430,11 +416,7 @@ function Index(props) { + } + function Show(props) { + let c; +- return props.when +- ? typeof (c = props.children) === "function" +- ? c(props.keyed ? props.when : () => props.when) +- : c +- : props.fallback || ""; ++ return props.when ? typeof (c = props.children) === "function" ? c(props.keyed ? props.when : () => props.when) : c : props.fallback || ""; + } + function Switch(props) { + let conditions = props.children; +@@ -471,14 +453,11 @@ function ErrorBoundary(props) { + } + createMemo(() => { + clean = Owner; +- return catchError( +- () => (res = props.children), +- err => { +- error = err; +- !sync && ctx.replace("e" + id, displayFallback); +- sync = true; +- } +- ); ++ return catchError(() => res = props.children, err => { ++ error = err; ++ !sync && ctx.replace("e" + id, displayFallback); ++ sync = true; ++ }); + }); + if (error) return displayFallback(); + sync = false; +@@ -489,15 +468,10 @@ function ErrorBoundary(props) { + const SuspenseContext = createContext(); + let resourceContext = null; + function createResource(source, fetcher, options = {}) { +- if (arguments.length === 2) { +- if (typeof fetcher === "object") { +- options = fetcher; +- fetcher = source; +- source = true; +- } +- } else if (arguments.length === 1) { +- fetcher = source; ++ if (typeof fetcher !== "function") { + source = true; ++ fetcher = source; ++ options = fetcher || {}; + } + const contexts = new Set(); + const id = sharedConfig.getNextContextId(); +@@ -508,17 +482,13 @@ function createResource(source, fetcher, options = {}) { + if (sharedConfig.context.async && options.ssrLoadFrom !== "initial") { + resource = sharedConfig.context.resources[id] || (sharedConfig.context.resources[id] = {}); + if (resource.ref) { +- if (!resource.data && !resource.ref[0].loading && !resource.ref[0].error) +- resource.ref[1].refetch(); ++ if (!resource.data && !resource.ref[0].loading && !resource.ref[0].error) resource.ref[1].refetch(); + return resource.ref; + } + } + const read = () => { + if (error) throw error; +- const resolved = +- options.ssrLoadFrom !== "initial" && +- sharedConfig.context.async && +- "data" in sharedConfig.context.resources[id]; ++ const resolved = options.ssrLoadFrom !== "initial" && sharedConfig.context.async && "data" in sharedConfig.context.resources[id]; + if (!resolved && resourceContext) resourceContext.push(id); + if (!resolved && read.loading) { + const ctx = useContext(SuspenseContext); +@@ -539,7 +509,7 @@ function createResource(source, fetcher, options = {}) { + }); + function load() { + const ctx = sharedConfig.context; +- if (!ctx.async) return (read.loading = !!(typeof source === "function" ? source() : source)); ++ if (!ctx.async) return read.loading = !!(typeof source === "function" ? source() : source); + if (ctx.resources && id in ctx.resources && "data" in ctx.resources[id]) { + value = ctx.resources[id].data; + return; +@@ -561,23 +531,21 @@ function createResource(source, fetcher, options = {}) { + if (p != undefined && typeof p === "object" && "then" in p) { + read.loading = true; + read.state = "pending"; +- p = p +- .then(res => { +- read.loading = false; +- read.state = "ready"; +- ctx.resources[id].data = res; +- p = null; +- notifySuspense(contexts); +- return res; +- }) +- .catch(err => { +- read.loading = false; +- read.state = "errored"; +- read.error = error = castError(err); +- p = null; +- notifySuspense(contexts); +- throw error; +- }); ++ p = p.then(res => { ++ read.loading = false; ++ read.state = "ready"; ++ ctx.resources[id].data = res; ++ p = null; ++ notifySuspense(contexts); ++ return res; ++ }).catch(err => { ++ read.loading = false; ++ read.state = "errored"; ++ read.error = error = castError(err); ++ p = null; ++ notifySuspense(contexts); ++ throw error; ++ }); + if (ctx.serialize) ctx.serialize(id, p, options.deferStream); + return p; + } +@@ -587,20 +555,17 @@ function createResource(source, fetcher, options = {}) { + return ctx.resources[id].data; + } + if (options.ssrLoadFrom !== "initial") load(); +- return (resource.ref = [ +- read, +- { +- refetch: load, +- mutate: v => (value = v) +- } +- ]); ++ return resource.ref = [read, { ++ refetch: load, ++ mutate: v => value = v ++ }]; + } + function lazy(fn) { + let p; + let load = id => { + if (!p) { + p = fn(); +- p.then(mod => (p.resolved = mod.default)); ++ p.then(mod => p.resolved = mod.default); + if (id) sharedConfig.context.lazy[id] = p; + } + return p; +@@ -609,8 +574,7 @@ function lazy(fn) { + const wrap = props => { + const id = sharedConfig.context.id; + let ref = sharedConfig.context.lazy[id]; +- if (ref) p = ref; +- else load(id); ++ if (ref) p = ref;else load(id); + if (p.resolved) return p.resolved(props); + const ctx = useContext(SuspenseContext); + const track = { +@@ -622,12 +586,10 @@ function lazy(fn) { + contexts.add(ctx); + } + if (sharedConfig.context.async) { +- sharedConfig.context.block( +- p.then(() => { +- track.loading = false; +- notifySuspense(contexts); +- }) +- ); ++ sharedConfig.context.block(p.then(() => { ++ track.loading = false; ++ notifySuspense(contexts); ++ })); + } + return ""; + }; +@@ -655,12 +617,9 @@ function startTransition(fn) { + fn(); + } + function useTransition() { +- return [ +- () => false, +- fn => { +- fn(); +- } +- ]; ++ return [() => false, fn => { ++ fn(); ++ }]; + } + function SuspenseList(props) { + return props.children; +@@ -670,17 +629,15 @@ function Suspense(props) { + const ctx = sharedConfig.context; + const id = sharedConfig.getContextId(); + const o = createOwner(); +- const value = +- ctx.suspense[id] || +- (ctx.suspense[id] = { +- resources: new Map(), +- completed: () => { +- const res = runSuspense(); +- if (suspenseComplete(value)) { +- done(resolveSSRNode(res)); +- } ++ const value = ctx.suspense[id] || (ctx.suspense[id] = { ++ resources: new Map(), ++ completed: () => { ++ const res = runSuspense(); ++ if (suspenseComplete(value)) { ++ done(resolveSSRNode(res)); + } +- }); ++ } ++ }); + function suspenseError(err) { + if (!done || !done(undefined, err)) { + runWithOwner(o.owner, () => { +@@ -694,14 +651,12 @@ function Suspense(props) { + count: 0 + }); + cleanNode(o); +- return runWithOwner(o, () => +- createComponent(SuspenseContext.Provider, { +- value, +- get children() { +- return catchError(() => props.children, suspenseError); +- } +- }) +- ); ++ return runWithOwner(o, () => createComponent(SuspenseContext.Provider, { ++ value, ++ get children() { ++ return catchError(() => props.children, suspenseError); ++ } ++ })); + } + const res = runSuspense(); + if (suspenseComplete(value)) { +@@ -733,58 +688,4 @@ function Suspense(props) { + }, suspenseError); + } + +-export { +- $DEVCOMP, +- $PROXY, +- $TRACK, +- DEV, +- ErrorBoundary, +- For, +- Index, +- Match, +- Show, +- Suspense, +- SuspenseList, +- Switch, +- batch, +- catchError, +- children, +- createComponent, +- createComputed, +- createContext, +- createDeferred, +- createEffect, +- createMemo, +- createReaction, +- createRenderEffect, +- createResource, +- createRoot, +- createSelector, +- createSignal, +- createUniqueId, +- enableExternalSource, +- enableHydration, +- enableScheduling, +- equalFn, +- from, +- getListener, +- getOwner, +- indexArray, +- lazy, +- mapArray, +- mergeProps, +- observable, +- on, +- onCleanup, +- onError, +- onMount, +- requestCallback, +- resetErrorBoundaries, +- runWithOwner, +- sharedConfig, +- splitProps, +- startTransition, +- untrack, +- useContext, +- useTransition +-}; ++export { $DEVCOMP, $PROXY, $TRACK, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, catchError, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition }; +diff --git a/dist/solid.cjs b/dist/solid.cjs +index 9277d3a27c0822b05f968f0ed137655a79cd7158..c07278b29b76d24c9133f5202b5c2f1f6a8951ba 100644 +--- a/dist/solid.cjs ++++ b/dist/solid.cjs +@@ -257,14 +257,14 @@ function createResource(pSource, pFetcher, pOptions) { + let source; + let fetcher; + let options; +- if (arguments.length === 2 && typeof pFetcher === "object" || arguments.length === 1) { +- source = true; +- fetcher = pSource; +- options = pFetcher || {}; +- } else { ++ if (typeof pFetcher === "function") { + source = pSource; + fetcher = pFetcher; + options = pOptions || {}; ++ } else { ++ source = true; ++ fetcher = pSource; ++ options = pFetcher || {}; + } + let pr = null, + initP = NO_INIT, +diff --git a/dist/solid.js b/dist/solid.js +index b9ced44f69369d2db93452cb7fbd9476f411e890..55203e3cf3b0a9973d455df20281b6cfc31e833d 100644 +--- a/dist/solid.js ++++ b/dist/solid.js +@@ -52,11 +52,9 @@ function enqueue(taskQueue, task) { + let m = 0; + let n = taskQueue.length - 1; + while (m <= n) { +- const k = (n + m) >> 1; ++ const k = n + m >> 1; + const cmp = task.expirationTime - taskQueue[k].expirationTime; +- if (cmp > 0) m = k + 1; +- else if (cmp < 0) n = k - 1; +- else return k; ++ if (cmp > 0) m = k + 1;else if (cmp < 0) n = k - 1;else return k; + } + return m; + } +@@ -176,14 +174,12 @@ function createRoot(fn, detachedOwner) { + owner = Owner, + unowned = fn.length === 0, + current = detachedOwner === undefined ? owner : detachedOwner, +- root = unowned +- ? UNOWNED +- : { +- owned: null, +- cleanups: null, +- context: current ? current.context : null, +- owner: current +- }, ++ root = unowned ? UNOWNED : { ++ owned: null, ++ cleanups: null, ++ context: current ? current.context : null, ++ owner: current ++ }, + updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root))); + Owner = root; + Listener = null; +@@ -204,8 +200,7 @@ function createSignal(value, options) { + }; + const setter = value => { + if (typeof value === "function") { +- if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue); +- else value = value(s.value); ++ if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);else value = value(s.value); + } + return writeSignal(s, value); + }; +@@ -213,13 +208,11 @@ function createSignal(value, options) { + } + function createComputed(fn, value, options) { + const c = createComputation(fn, value, true, STALE); +- if (Scheduler && Transition && Transition.running) Updates.push(c); +- else updateComputation(c); ++ if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c); + } + function createRenderEffect(fn, value, options) { + const c = createComputation(fn, value, false, STALE); +- if (Scheduler && Transition && Transition.running) Updates.push(c); +- else updateComputation(c); ++ if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c); + } + function createEffect(fn, value, options) { + runEffects = runUserEffects; +@@ -231,15 +224,10 @@ function createEffect(fn, value, options) { + } + function createReaction(onInvalidate, options) { + let fn; +- const c = createComputation( +- () => { +- fn ? fn() : untrack(onInvalidate); +- fn = undefined; +- }, +- undefined, +- false, +- 0 +- ), ++ const c = createComputation(() => { ++ fn ? fn() : untrack(onInvalidate); ++ fn = undefined; ++ }, undefined, false, 0), + s = SuspenseContext && useContext(SuspenseContext); + if (s) c.suspense = s; + c.user = true; +@@ -267,14 +255,14 @@ function createResource(pSource, pFetcher, pOptions) { + let source; + let fetcher; + let options; +- if ((arguments.length === 2 && typeof pFetcher === "object") || arguments.length === 1) { +- source = true; +- fetcher = pSource; +- options = pFetcher || {}; +- } else { ++ if (typeof pFetcher === "function") { + source = pSource; + fetcher = pFetcher; + options = pOptions || {}; ++ } else { ++ source = true; ++ fetcher = pSource; ++ options = pFetcher || {}; + } + let pr = null, + initP = NO_INIT, +@@ -292,19 +280,15 @@ function createResource(pSource, pFetcher, pOptions) { + [state, setState] = createSignal(resolved ? "ready" : "unresolved"); + if (sharedConfig.context) { + id = sharedConfig.getNextContextId(); +- if (options.ssrLoadFrom === "initial") initP = options.initialValue; +- else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id); ++ if (options.ssrLoadFrom === "initial") initP = options.initialValue;else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id); + } + function loadEnd(p, v, error, key) { + if (pr === p) { + pr = null; + key !== undefined && (resolved = true); +- if ((p === initP || v === initP) && options.onHydrated) +- queueMicrotask(() => +- options.onHydrated(key, { +- value: v +- }) +- ); ++ if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, { ++ value: v ++ })); + initP = NO_INIT; + if (Transition && p && loadedUnderTransition) { + Transition.promises.delete(p); +@@ -335,8 +319,7 @@ function createResource(pSource, pFetcher, pOptions) { + createComputed(() => { + track(); + if (pr) { +- if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr); +- else if (!contexts.has(c)) { ++ if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);else if (!contexts.has(c)) { + c.increment(); + contexts.add(c); + } +@@ -355,35 +338,26 @@ function createResource(pSource, pFetcher, pOptions) { + return; + } + if (Transition && pr) Transition.promises.delete(pr); +- const p = +- initP !== NO_INIT +- ? initP +- : untrack(() => +- fetcher(lookup, { +- value: value(), +- refetching +- }) +- ); ++ const p = initP !== NO_INIT ? initP : untrack(() => fetcher(lookup, { ++ value: value(), ++ refetching ++ })); + if (!isPromise(p)) { + loadEnd(pr, p, undefined, lookup); + return p; + } + pr = p; + if ("value" in p) { +- if (p.status === "success") loadEnd(pr, p.value, undefined, lookup); +- else loadEnd(pr, undefined, castError(p.value), lookup); ++ if (p.status === "success") loadEnd(pr, p.value, undefined, lookup);else loadEnd(pr, undefined, castError(p.value), lookup); + return p; + } + scheduled = true; +- queueMicrotask(() => (scheduled = false)); ++ queueMicrotask(() => scheduled = false); + runUpdates(() => { + setState(resolved ? "refreshing" : "pending"); + trigger(); + }, false); +- return p.then( +- v => loadEnd(p, v, undefined, lookup), +- e => loadEnd(p, undefined, castError(e), lookup) +- ); ++ return p.then(v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, undefined, castError(e), lookup)); + } + Object.defineProperties(read, { + state: { +@@ -407,80 +381,50 @@ function createResource(pSource, pFetcher, pOptions) { + } + } + }); +- if (dynamic) createComputed(() => load(false)); +- else load(false); +- return [ +- read, +- { +- refetch: load, +- mutate: setValue +- } +- ]; ++ if (dynamic) createComputed(() => load(false));else load(false); ++ return [read, { ++ refetch: load, ++ mutate: setValue ++ }]; + } + function createDeferred(source, options) { + let t, + timeout = options ? options.timeoutMs : undefined; +- const node = createComputation( +- () => { +- if (!t || !t.fn) +- t = requestCallback( +- () => setDeferred(() => node.value), +- timeout !== undefined +- ? { +- timeout +- } +- : undefined +- ); +- return source(); +- }, +- undefined, +- true +- ); +- const [deferred, setDeferred] = createSignal( +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, +- options +- ); ++ const node = createComputation(() => { ++ if (!t || !t.fn) t = requestCallback(() => setDeferred(() => node.value), timeout !== undefined ? { ++ timeout ++ } : undefined); ++ return source(); ++ }, undefined, true); ++ const [deferred, setDeferred] = createSignal(Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, options); + updateComputation(node); +- setDeferred(() => +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value +- ); ++ setDeferred(() => Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value); + return deferred; + } + function createSelector(source, fn = equalFn, options) { + const subs = new Map(); +- const node = createComputation( +- p => { +- const v = source(); +- for (const [key, val] of subs.entries()) +- if (fn(key, v) !== fn(key, p)) { +- for (const c of val.values()) { +- c.state = STALE; +- if (c.pure) Updates.push(c); +- else Effects.push(c); +- } +- } +- return v; +- }, +- undefined, +- true, +- STALE +- ); ++ const node = createComputation(p => { ++ const v = source(); ++ for (const [key, val] of subs.entries()) if (fn(key, v) !== fn(key, p)) { ++ for (const c of val.values()) { ++ c.state = STALE; ++ if (c.pure) Updates.push(c);else Effects.push(c); ++ } ++ } ++ return v; ++ }, undefined, true, STALE); + updateComputation(node); + return key => { + const listener = Listener; + if (listener) { + let l; +- if ((l = subs.get(key))) l.add(listener); +- else subs.set(key, (l = new Set([listener]))); ++ if (l = subs.get(key)) l.add(listener);else subs.set(key, l = new Set([listener])); + onCleanup(() => { + l.delete(listener); + !l.size && subs.delete(key); + }); + } +- return fn( +- key, +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value +- ); ++ return fn(key, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value); + }; + } + function batch(fn) { +@@ -520,9 +464,7 @@ function onMount(fn) { + createEffect(() => untrack(fn)); + } + function onCleanup(fn) { +- if (Owner === null); +- else if (Owner.cleanups === null) Owner.cleanups = [fn]; +- else Owner.cleanups.push(fn); ++ if (Owner === null) ;else if (Owner.cleanups === null) Owner.cleanups = [fn];else Owner.cleanups.push(fn); + return fn; + } + function catchError(fn, handler) { +@@ -576,17 +518,15 @@ function startTransition(fn) { + Owner = o; + let t; + if (Scheduler || SuspenseContext) { +- t = +- Transition || +- (Transition = { +- sources: new Set(), +- effects: [], +- promises: new Set(), +- disposed: new Set(), +- queue: new Set(), +- running: true +- }); +- t.done || (t.done = new Promise(res => (t.resolve = res))); ++ t = Transition || (Transition = { ++ sources: new Set(), ++ effects: [], ++ promises: new Set(), ++ disposed: new Set(), ++ queue: new Set(), ++ running: true ++ }); ++ t.done || (t.done = new Promise(res => t.resolve = res)); + t.running = true; + } + runUpdates(fn, false); +@@ -594,7 +534,7 @@ function startTransition(fn) { + return t ? t.done : undefined; + }); + } +-const [transPending, setTransPending] = /*@__PURE__*/ createSignal(false); ++const [transPending, setTransPending] = /*@__PURE__*/createSignal(false); + function useTransition() { + return [transPending, startTransition]; + } +@@ -612,9 +552,7 @@ function createContext(defaultValue, options) { + } + function useContext(context) { + let value; +- return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined +- ? value +- : context.defaultValue; ++ return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined ? value : context.defaultValue; + } + function children(fn) { + const children = createMemo(fn); +@@ -631,7 +569,10 @@ function getSuspenseContext() { + } + function enableExternalSource(factory, untrack = fn => fn()) { + if (ExternalSourceConfig) { +- const { factory: oldFactory, untrack: oldUntrack } = ExternalSourceConfig; ++ const { ++ factory: oldFactory, ++ untrack: oldUntrack ++ } = ExternalSourceConfig; + ExternalSourceConfig = { + factory: (fn, trigger) => { + const oldSource = oldFactory(fn, trigger); +@@ -656,8 +597,7 @@ function enableExternalSource(factory, untrack = fn => fn()) { + function readSignal() { + const runningTransition = Transition && Transition.running; + if (this.sources && (runningTransition ? this.tState : this.state)) { +- if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this); +- else { ++ if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);else { + const updates = Updates; + Updates = null; + runUpdates(() => lookUpstream(this), false); +@@ -685,12 +625,11 @@ function readSignal() { + return this.value; + } + function writeSignal(node, value, isComp) { +- let current = +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value; ++ let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value; + if (!node.comparator || !node.comparator(current, value)) { + if (Transition) { + const TransitionRunning = Transition.running; +- if (TransitionRunning || (!isComp && Transition.sources.has(node))) { ++ if (TransitionRunning || !isComp && Transition.sources.has(node)) { + Transition.sources.add(node); + node.tValue = value; + } +@@ -703,16 +642,14 @@ function writeSignal(node, value, isComp) { + const TransitionRunning = Transition && Transition.running; + if (TransitionRunning && Transition.disposed.has(o)) continue; + if (TransitionRunning ? !o.tState : !o.state) { +- if (o.pure) Updates.push(o); +- else Effects.push(o); ++ if (o.pure) Updates.push(o);else Effects.push(o); + if (o.observers) markDownstream(o); + } +- if (!TransitionRunning) o.state = STALE; +- else o.tState = STALE; ++ if (!TransitionRunning) o.state = STALE;else o.tState = STALE; + } + if (Updates.length > 10e5) { + Updates = []; +- if (false); ++ if (false) ; + throw new Error(); + } + }, false); +@@ -724,11 +661,7 @@ function updateComputation(node) { + if (!node.fn) return; + cleanNode(node); + const time = ExecCount; +- runComputation( +- node, +- Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, +- time +- ); ++ runComputation(node, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, time); + if (Transition && !Transition.running && Transition.sources.has(node)) { + queueMicrotask(() => { + runUpdates(() => { +@@ -793,14 +726,11 @@ function createComputation(fn, init, pure, state = STALE, options) { + c.state = 0; + c.tState = state; + } +- if (Owner === null); +- else if (Owner !== UNOWNED) { ++ if (Owner === null) ;else if (Owner !== UNOWNED) { + if (Transition && Transition.running && Owner.pure) { +- if (!Owner.tOwned) Owner.tOwned = [c]; +- else Owner.tOwned.push(c); ++ if (!Owner.tOwned) Owner.tOwned = [c];else Owner.tOwned.push(c); + } else { +- if (!Owner.owned) Owner.owned = [c]; +- else Owner.owned.push(c); ++ if (!Owner.owned) Owner.owned = [c];else Owner.owned.push(c); + } + } + if (ExternalSourceConfig && c.fn) { +@@ -851,8 +781,7 @@ function runUpdates(fn, init) { + if (Updates) return fn(); + let wait = false; + if (!init) Updates = []; +- if (Effects) wait = true; +- else Effects = []; ++ if (Effects) wait = true;else Effects = []; + ExecCount++; + try { + const res = fn(); +@@ -866,8 +795,7 @@ function runUpdates(fn, init) { + } + function completeUpdates(wait) { + if (Updates) { +- if (Scheduler && Transition && Transition.running) scheduleQueue(Updates); +- else runQueue(Updates); ++ if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);else runQueue(Updates); + Updates = null; + } + if (wait) return; +@@ -935,8 +863,7 @@ function runUserEffects(queue) { + userLength = 0; + for (i = 0; i < queue.length; i++) { + const e = queue[i]; +- if (!e.user) runTop(e); +- else queue[userLength++] = e; ++ if (!e.user) runTop(e);else queue[userLength++] = e; + } + if (sharedConfig.context) { + if (sharedConfig.count) { +@@ -955,15 +882,13 @@ function runUserEffects(queue) { + } + function lookUpstream(node, ignore) { + const runningTransition = Transition && Transition.running; +- if (runningTransition) node.tState = 0; +- else node.state = 0; ++ if (runningTransition) node.tState = 0;else node.state = 0; + for (let i = 0; i < node.sources.length; i += 1) { + const source = node.sources[i]; + if (source.sources) { + const state = runningTransition ? source.tState : source.state; + if (state === STALE) { +- if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) +- runTop(source); ++ if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source); + } else if (state === PENDING) lookUpstream(source, ignore); + } + } +@@ -973,10 +898,8 @@ function markDownstream(node) { + for (let i = 0; i < node.observers.length; i += 1) { + const o = node.observers[i]; + if (runningTransition ? !o.tState : !o.state) { +- if (runningTransition) o.tState = PENDING; +- else o.state = PENDING; +- if (o.pure) Updates.push(o); +- else Effects.push(o); ++ if (runningTransition) o.tState = PENDING;else o.state = PENDING; ++ if (o.pure) Updates.push(o);else Effects.push(o); + o.observers && markDownstream(o); + } + } +@@ -1013,8 +936,7 @@ function cleanNode(node) { + for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i](); + node.cleanups = null; + } +- if (Transition && Transition.running) node.tState = 0; +- else node.state = 0; ++ if (Transition && Transition.running) node.tState = 0;else node.state = 0; + } + function reset(node, top) { + if (!top) { +@@ -1035,21 +957,19 @@ function runErrors(err, fns, owner) { + try { + for (const f of fns) f(err); + } catch (e) { +- handleError(e, (owner && owner.owner) || null); ++ handleError(e, owner && owner.owner || null); + } + } + function handleError(err, owner = Owner) { + const fns = ERROR && owner && owner.context && owner.context[ERROR]; + const error = castError(err); + if (!fns) throw error; +- if (Effects) +- Effects.push({ +- fn() { +- runErrors(error, fns, owner); +- }, +- state: STALE +- }); +- else runErrors(error, fns, owner); ++ if (Effects) Effects.push({ ++ fn() { ++ runErrors(error, fns, owner); ++ }, ++ state: STALE ++ });else runErrors(error, fns, owner); + } + function resolveChildren(children) { + if (typeof children === "function" && !children.length) return resolveChildren(children()); +@@ -1066,24 +986,19 @@ function resolveChildren(children) { + function createProvider(id, options) { + return function provider(props) { + let res; +- createRenderEffect( +- () => +- (res = untrack(() => { +- Owner.context = { +- ...Owner.context, +- [id]: props.value +- }; +- return children(() => props.children); +- })), +- undefined +- ); ++ createRenderEffect(() => res = untrack(() => { ++ Owner.context = { ++ ...Owner.context, ++ [id]: props.value ++ }; ++ return children(() => props.children); ++ }), undefined); + return res; + }; + } + function onError(fn) { + ERROR || (ERROR = Symbol("error")); +- if (Owner === null); +- else if (Owner.context === null || !Owner.context[ERROR]) { ++ if (Owner === null) ;else if (Owner.context === null || !Owner.context[ERROR]) { + Owner.context = { + ...Owner.context, + [ERROR]: [fn] +@@ -1112,8 +1027,7 @@ function observable(input) { + if (!(observer instanceof Object) || observer == null) { + throw new TypeError("Expected the observer to be an object."); + } +- const handler = +- typeof observer === "function" ? observer : observer.next && observer.next.bind(observer); ++ const handler = typeof observer === "function" ? observer : observer.next && observer.next.bind(observer); + if (!handler) { + return { + unsubscribe() {} +@@ -1144,7 +1058,7 @@ function from(producer) { + }); + if ("subscribe" in producer) { + const unsub = producer.subscribe(v => set(() => v)); +- onCleanup(() => ("unsubscribe" in unsub ? unsub.unsubscribe() : unsub())); ++ onCleanup(() => "unsubscribe" in unsub ? unsub.unsubscribe() : unsub()); + } else { + const clean = producer(set); + onCleanup(clean); +@@ -1188,7 +1102,8 @@ function mapArray(list, mapFn, options = {}) { + }); + len = 1; + } +- } else if (len === 0) { ++ } ++ else if (len === 0) { + mapped = new Array(newLen); + for (j = 0; j < newLen; j++) { + items[j] = newItems[j]; +@@ -1199,16 +1114,8 @@ function mapArray(list, mapFn, options = {}) { + temp = new Array(newLen); + tempdisposers = new Array(newLen); + indexes && (tempIndexes = new Array(newLen)); +- for ( +- start = 0, end = Math.min(len, newLen); +- start < end && items[start] === newItems[start]; +- start++ +- ); +- for ( +- end = len - 1, newEnd = newLen - 1; +- end >= start && newEnd >= start && items[end] === newItems[newEnd]; +- end--, newEnd-- +- ) { ++ for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++); ++ for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) { + temp[newEnd] = mapped[end]; + tempdisposers[newEnd] = disposers[end]; + indexes && (tempIndexes[newEnd] = indexes[end]); +@@ -1242,7 +1149,7 @@ function mapArray(list, mapFn, options = {}) { + } + } else mapped[j] = createRoot(mapper); + } +- mapped = mapped.slice(0, (len = newLen)); ++ mapped = mapped.slice(0, len = newLen); + items = newItems.slice(0); + } + return mapped; +@@ -1309,7 +1216,7 @@ function indexArray(list, mapFn, options = {}) { + } + len = signals.length = disposers.length = newLen; + items = newItems.slice(0); +- return (mapped = mapped.slice(0, len)); ++ return mapped = mapped.slice(0, len); + }); + function mapper(disposer) { + disposers[i] = disposer; +@@ -1378,33 +1285,29 @@ function mergeProps(...sources) { + let proxy = false; + for (let i = 0; i < sources.length; i++) { + const s = sources[i]; +- proxy = proxy || (!!s && $PROXY in s); +- sources[i] = typeof s === "function" ? ((proxy = true), createMemo(s)) : s; ++ proxy = proxy || !!s && $PROXY in s; ++ sources[i] = typeof s === "function" ? (proxy = true, createMemo(s)) : s; + } + if (SUPPORTS_PROXY && proxy) { +- return new Proxy( +- { +- get(property) { +- for (let i = sources.length - 1; i >= 0; i--) { +- const v = resolveSource(sources[i])[property]; +- if (v !== undefined) return v; +- } +- }, +- has(property) { +- for (let i = sources.length - 1; i >= 0; i--) { +- if (property in resolveSource(sources[i])) return true; +- } +- return false; +- }, +- keys() { +- const keys = []; +- for (let i = 0; i < sources.length; i++) +- keys.push(...Object.keys(resolveSource(sources[i]))); +- return [...new Set(keys)]; ++ return new Proxy({ ++ get(property) { ++ for (let i = sources.length - 1; i >= 0; i--) { ++ const v = resolveSource(sources[i])[property]; ++ if (v !== undefined) return v; ++ } ++ }, ++ has(property) { ++ for (let i = sources.length - 1; i >= 0; i--) { ++ if (property in resolveSource(sources[i])) return true; + } ++ return false; + }, +- propTraps +- ); ++ keys() { ++ const keys = []; ++ for (let i = 0; i < sources.length; i++) keys.push(...Object.keys(resolveSource(sources[i]))); ++ return [...new Set(keys)]; ++ } ++ }, propTraps); + } + const sourcesMap = {}; + const defined = Object.create(null); +@@ -1417,20 +1320,15 @@ function mergeProps(...sources) { + if (key === "__proto__" || key === "constructor") continue; + const desc = Object.getOwnPropertyDescriptor(source, key); + if (!defined[key]) { +- defined[key] = desc.get +- ? { +- enumerable: true, +- configurable: true, +- get: resolveSources.bind((sourcesMap[key] = [desc.get.bind(source)])) +- } +- : desc.value !== undefined +- ? desc +- : undefined; ++ defined[key] = desc.get ? { ++ enumerable: true, ++ configurable: true, ++ get: resolveSources.bind(sourcesMap[key] = [desc.get.bind(source)]) ++ } : desc.value !== undefined ? desc : undefined; + } else { + const sources = sourcesMap[key]; + if (sources) { +- if (desc.get) sources.push(desc.get.bind(source)); +- else if (desc.value !== undefined) sources.push(() => desc.value); ++ if (desc.get) sources.push(desc.get.bind(source));else if (desc.value !== undefined) sources.push(() => desc.value); + } + } + } +@@ -1440,8 +1338,7 @@ function mergeProps(...sources) { + for (let i = definedKeys.length - 1; i >= 0; i--) { + const key = definedKeys[i], + desc = defined[key]; +- if (desc && desc.get) Object.defineProperty(target, key, desc); +- else target[key] = desc ? desc.value : undefined; ++ if (desc && desc.get) Object.defineProperty(target, key, desc);else target[key] = desc ? desc.value : undefined; + } + return target; + } +@@ -1449,60 +1346,47 @@ function splitProps(props, ...keys) { + if (SUPPORTS_PROXY && $PROXY in props) { + const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]); + const res = keys.map(k => { +- return new Proxy( +- { +- get(property) { +- return k.includes(property) ? props[property] : undefined; +- }, +- has(property) { +- return k.includes(property) && property in props; +- }, +- keys() { +- return k.filter(property => property in props); +- } ++ return new Proxy({ ++ get(property) { ++ return k.includes(property) ? props[property] : undefined; + }, +- propTraps +- ); +- }); +- res.push( +- new Proxy( +- { +- get(property) { +- return blocked.has(property) ? undefined : props[property]; +- }, +- has(property) { +- return blocked.has(property) ? false : property in props; +- }, +- keys() { +- return Object.keys(props).filter(k => !blocked.has(k)); +- } ++ has(property) { ++ return k.includes(property) && property in props; + }, +- propTraps +- ) +- ); ++ keys() { ++ return k.filter(property => property in props); ++ } ++ }, propTraps); ++ }); ++ res.push(new Proxy({ ++ get(property) { ++ return blocked.has(property) ? undefined : props[property]; ++ }, ++ has(property) { ++ return blocked.has(property) ? false : property in props; ++ }, ++ keys() { ++ return Object.keys(props).filter(k => !blocked.has(k)); ++ } ++ }, propTraps)); + return res; + } + const otherObject = {}; + const objects = keys.map(() => ({})); + for (const propName of Object.getOwnPropertyNames(props)) { + const desc = Object.getOwnPropertyDescriptor(props, propName); +- const isDefaultDesc = +- !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable; ++ const isDefaultDesc = !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable; + let blocked = false; + let objectIndex = 0; + for (const k of keys) { + if (k.includes(propName)) { + blocked = true; +- isDefaultDesc +- ? (objects[objectIndex][propName] = desc.value) +- : Object.defineProperty(objects[objectIndex], propName, desc); ++ isDefaultDesc ? objects[objectIndex][propName] = desc.value : Object.defineProperty(objects[objectIndex], propName, desc); + } + ++objectIndex; + } + if (!blocked) { +- isDefaultDesc +- ? (otherObject[propName] = desc.value) +- : Object.defineProperty(otherObject, propName, desc); ++ isDefaultDesc ? otherObject[propName] = desc.value : Object.defineProperty(otherObject, propName, desc); + } + } + return [...objects, otherObject]; +@@ -1528,21 +1412,17 @@ function lazy(fn) { + comp = s; + } + let Comp; +- return createMemo(() => +- (Comp = comp()) +- ? untrack(() => { +- if (false); +- if (!ctx || sharedConfig.done) return Comp(props); +- const c = sharedConfig.context; +- setHydrateContext(ctx); +- const r = Comp(props); +- setHydrateContext(c); +- return r; +- }) +- : "" +- ); ++ return createMemo(() => (Comp = comp()) ? untrack(() => { ++ if (false) ; ++ if (!ctx || sharedConfig.done) return Comp(props); ++ const c = sharedConfig.context; ++ setHydrateContext(ctx); ++ const r = Comp(props); ++ setHydrateContext(c); ++ return r; ++ }) : ""); + }; +- wrap.preload = () => p || ((p = fn()).then(mod => (comp = () => mod.default)), p); ++ wrap.preload = () => p || ((p = fn()).then(mod => comp = () => mod.default), p); + return wrap; + } + let counter = 0; +@@ -1567,77 +1447,49 @@ function Index(props) { + function Show(props) { + const keyed = props.keyed; + const condition = createMemo(() => props.when, undefined, { +- equals: (a, b) => (keyed ? a === b : !a === !b) ++ equals: (a, b) => keyed ? a === b : !a === !b + }); +- return createMemo( +- () => { +- const c = condition(); +- if (c) { +- const child = props.children; +- const fn = typeof child === "function" && child.length > 0; +- return fn +- ? untrack(() => +- child( +- keyed +- ? c +- : () => { +- if (!untrack(condition)) throw narrowedError("Show"); +- return props.when; +- } +- ) +- ) +- : child; +- } +- return props.fallback; +- }, +- undefined, +- undefined +- ); ++ return createMemo(() => { ++ const c = condition(); ++ if (c) { ++ const child = props.children; ++ const fn = typeof child === "function" && child.length > 0; ++ return fn ? untrack(() => child(keyed ? c : () => { ++ if (!untrack(condition)) throw narrowedError("Show"); ++ return props.when; ++ })) : child; ++ } ++ return props.fallback; ++ }, undefined, undefined); + } + function Switch(props) { + let keyed = false; + const equals = (a, b) => (keyed ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2]; + const conditions = children(() => props.children), +- evalConditions = createMemo( +- () => { +- let conds = conditions(); +- if (!Array.isArray(conds)) conds = [conds]; +- for (let i = 0; i < conds.length; i++) { +- const c = conds[i].when; +- if (c) { +- keyed = !!conds[i].keyed; +- return [i, c, conds[i]]; +- } ++ evalConditions = createMemo(() => { ++ let conds = conditions(); ++ if (!Array.isArray(conds)) conds = [conds]; ++ for (let i = 0; i < conds.length; i++) { ++ const c = conds[i].when; ++ if (c) { ++ keyed = !!conds[i].keyed; ++ return [i, c, conds[i]]; + } +- return [-1]; +- }, +- undefined, +- { +- equals + } +- ); +- return createMemo( +- () => { +- const [index, when, cond] = evalConditions(); +- if (index < 0) return props.fallback; +- const c = cond.children; +- const fn = typeof c === "function" && c.length > 0; +- return fn +- ? untrack(() => +- c( +- keyed +- ? when +- : () => { +- if (untrack(evalConditions)[0] !== index) throw narrowedError("Match"); +- return cond.when; +- } +- ) +- ) +- : c; +- }, +- undefined, +- undefined +- ); ++ return [-1]; ++ }, undefined, { ++ equals ++ }); ++ return createMemo(() => { ++ const [index, when, cond] = evalConditions(); ++ if (index < 0) return props.fallback; ++ const c = cond.children; ++ const fn = typeof c === "function" && c.length > 0; ++ return fn ? untrack(() => c(keyed ? when : () => { ++ if (untrack(evalConditions)[0] !== index) throw narrowedError("Match"); ++ return cond.when; ++ })) : c; ++ }, undefined, undefined); + } + function Match(props) { + return props; +@@ -1648,29 +1500,23 @@ function resetErrorBoundaries() { + } + function ErrorBoundary(props) { + let err; +- if (sharedConfig.context && sharedConfig.load) +- err = sharedConfig.load(sharedConfig.getContextId()); ++ if (sharedConfig.context && sharedConfig.load) err = sharedConfig.load(sharedConfig.getContextId()); + const [errored, setErrored] = createSignal(err, undefined); + Errors || (Errors = new Set()); + Errors.add(setErrored); + onCleanup(() => Errors.delete(setErrored)); +- return createMemo( +- () => { +- let e; +- if ((e = errored())) { +- const f = props.fallback; +- return typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored())) : f; +- } +- return catchError(() => props.children, setErrored); +- }, +- undefined, +- undefined +- ); ++ return createMemo(() => { ++ let e; ++ if (e = errored()) { ++ const f = props.fallback; ++ return typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored())) : f; ++ } ++ return catchError(() => props.children, setErrored); ++ }, undefined, undefined); + } + +-const suspenseListEquals = (a, b) => +- a.showContent === b.showContent && a.showFallback === b.showFallback; +-const SuspenseListContext = /* #__PURE__ */ createContext(); ++const suspenseListEquals = (a, b) => a.showContent === b.showContent && a.showFallback === b.showFallback; ++const SuspenseListContext = /* #__PURE__ */createContext(); + function SuspenseList(props) { + let [wrapper, setWrapper] = createSignal(() => ({ + inFallback: false +@@ -1681,51 +1527,51 @@ function SuspenseList(props) { + if (listContext) { + show = listContext.register(createMemo(() => wrapper()().inFallback)); + } +- const resolved = createMemo( +- prev => { +- const reveal = props.revealOrder, +- tail = props.tail, +- { showContent = true, showFallback = true } = show ? show() : {}, +- reg = registry(), +- reverse = reveal === "backwards"; +- if (reveal === "together") { +- const all = reg.every(inFallback => !inFallback()); +- const res = reg.map(() => ({ +- showContent: all && showContent, ++ const resolved = createMemo(prev => { ++ const reveal = props.revealOrder, ++ tail = props.tail, ++ { ++ showContent = true, ++ showFallback = true ++ } = show ? show() : {}, ++ reg = registry(), ++ reverse = reveal === "backwards"; ++ if (reveal === "together") { ++ const all = reg.every(inFallback => !inFallback()); ++ const res = reg.map(() => ({ ++ showContent: all && showContent, ++ showFallback ++ })); ++ res.inFallback = !all; ++ return res; ++ } ++ let stop = false; ++ let inFallback = prev.inFallback; ++ const res = []; ++ for (let i = 0, len = reg.length; i < len; i++) { ++ const n = reverse ? len - i - 1 : i, ++ s = reg[n](); ++ if (!stop && !s) { ++ res[n] = { ++ showContent, + showFallback +- })); +- res.inFallback = !all; +- return res; +- } +- let stop = false; +- let inFallback = prev.inFallback; +- const res = []; +- for (let i = 0, len = reg.length; i < len; i++) { +- const n = reverse ? len - i - 1 : i, +- s = reg[n](); +- if (!stop && !s) { +- res[n] = { +- showContent, +- showFallback +- }; +- } else { +- const next = !stop; +- if (next) inFallback = true; +- res[n] = { +- showContent: next, +- showFallback: !tail || (next && tail === "collapsed") ? showFallback : false +- }; +- stop = true; +- } ++ }; ++ } else { ++ const next = !stop; ++ if (next) inFallback = true; ++ res[n] = { ++ showContent: next, ++ showFallback: !tail || next && tail === "collapsed" ? showFallback : false ++ }; ++ stop = true; + } +- if (!stop) inFallback = false; +- res.inFallback = inFallback; +- return res; +- }, +- { +- inFallback: false + } +- ); ++ if (!stop) inFallback = false; ++ res.inFallback = inFallback; ++ return res; ++ }, { ++ inFallback: false ++ }); + setWrapper(() => resolved); + return createComponent(SuspenseListContext.Provider, { + value: { +@@ -1770,27 +1616,23 @@ function Suspense(props) { + const key = sharedConfig.getContextId(); + let ref = sharedConfig.load(key); + if (ref) { +- if (typeof ref !== "object" || ref.status !== "success") p = ref; +- else sharedConfig.gather(key); ++ if (typeof ref !== "object" || ref.status !== "success") p = ref;else sharedConfig.gather(key); + } + if (p && p !== "$$f") { + const [s, set] = createSignal(undefined, { + equals: false + }); + flicker = s; +- p.then( +- () => { +- if (sharedConfig.done) return set(); +- sharedConfig.gather(key); +- setHydrateContext(ctx); +- set(); +- setHydrateContext(); +- }, +- err => { +- error = err; +- set(); +- } +- ); ++ p.then(() => { ++ if (sharedConfig.done) return set(); ++ sharedConfig.gather(key); ++ setHydrateContext(ctx); ++ set(); ++ setHydrateContext(); ++ }, err => { ++ error = err; ++ set(); ++ }); + } + } + const listContext = useContext(SuspenseListContext); +@@ -1805,14 +1647,17 @@ function Suspense(props) { + ctx = sharedConfig.context; + if (flicker) { + flicker(); +- return (flicker = undefined); ++ return flicker = undefined; + } + if (ctx && p === "$$f") setHydrateContext(); + const rendered = createMemo(() => props.children); + return createMemo(prev => { + const inFallback = store.inFallback(), +- { showContent = true, showFallback = true } = show ? show() : {}; +- if ((!inFallback || (p && p !== "$$f")) && showContent) { ++ { ++ showContent = true, ++ showFallback = true ++ } = show ? show() : {}; ++ if ((!inFallback || p && p !== "$$f") && showContent) { + store.resolved = true; + dispose && dispose(); + dispose = ctx = p = undefined; +@@ -1840,59 +1685,4 @@ function Suspense(props) { + + const DEV = undefined; + +-export { +- $DEVCOMP, +- $PROXY, +- $TRACK, +- DEV, +- ErrorBoundary, +- For, +- Index, +- Match, +- Show, +- Suspense, +- SuspenseList, +- Switch, +- batch, +- cancelCallback, +- catchError, +- children, +- createComponent, +- createComputed, +- createContext, +- createDeferred, +- createEffect, +- createMemo, +- createReaction, +- createRenderEffect, +- createResource, +- createRoot, +- createSelector, +- createSignal, +- createUniqueId, +- enableExternalSource, +- enableHydration, +- enableScheduling, +- equalFn, +- from, +- getListener, +- getOwner, +- indexArray, +- lazy, +- mapArray, +- mergeProps, +- observable, +- on, +- onCleanup, +- onError, +- onMount, +- requestCallback, +- resetErrorBoundaries, +- runWithOwner, +- sharedConfig, +- splitProps, +- startTransition, +- untrack, +- useContext, +- useTransition +-}; ++export { $DEVCOMP, $PROXY, $TRACK, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, catchError, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition }; +diff --git a/store/dist/dev.cjs b/store/dist/dev.cjs +index 3b9a413b2c494e09010a15bd3cb8c7850aafd2a7..57961388696a5ebfc3bc42acc22c3388896e4b35 100644 +--- a/store/dist/dev.cjs ++++ b/store/dist/dev.cjs +@@ -341,7 +341,7 @@ function applyState(target, parent, property, merge, key) { + } + const temp = new Array(target.length), + newIndices = new Map(); +- for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[start] && target[start] && previous[end][key] === target[newEnd][key]); end--, newEnd--) { ++ for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[end] && target[newEnd] && previous[end][key] === target[newEnd][key]); end--, newEnd--) { + temp[newEnd] = previous[end]; + } + if (start > newEnd || start > end) { +@@ -439,10 +439,17 @@ function produce(fn) { + } + + const DEV = { +- $NODE, +- isWrappable, ++ $NODE: $NODE, ++ $HAS: $HAS, ++ $RAW: $RAW, ++ $SELF: $SELF, ++ isWrappable: isWrappable, ++ unwrap: unwrap, + hooks: DevHooks + } ; ++if (globalThis) { ++ globalThis.SolidStore$$ = DEV; ++} + + exports.$RAW = $RAW; + exports.DEV = DEV; +diff --git a/store/dist/dev.js b/store/dist/dev.js +index 8d52c37224b2d4849ea86fdbeb6db874f9fb6d81..618d0aa6e79aba08aabe26f94ed16f4a969ae13a 100644 +--- a/store/dist/dev.js ++++ b/store/dist/dev.js +@@ -1,4 +1,4 @@ +-import { DEV as DEV$1, $PROXY, $TRACK, getListener, batch, createSignal } from "solid-js"; ++import { DEV as DEV$1, $PROXY, $TRACK, getListener, batch, createSignal } from 'solid-js'; + + const $RAW = Symbol("store-raw"), + $NODE = Symbol("store-node"), +@@ -11,7 +11,7 @@ function wrap$1(value) { + let p = value[$PROXY]; + if (!p) { + Object.defineProperty(value, $PROXY, { +- value: (p = new Proxy(value, proxyTraps$1)) ++ value: p = new Proxy(value, proxyTraps$1) + }); + if (!Array.isArray(value)) { + const keys = Object.keys(value), +@@ -31,29 +31,20 @@ function wrap$1(value) { + } + function isWrappable(obj) { + let proto; +- return ( +- obj != null && +- typeof obj === "object" && +- (obj[$PROXY] || +- !(proto = Object.getPrototypeOf(obj)) || +- proto === Object.prototype || +- Array.isArray(obj)) +- ); ++ return obj != null && typeof obj === "object" && (obj[$PROXY] || !(proto = Object.getPrototypeOf(obj)) || proto === Object.prototype || Array.isArray(obj)); + } + function unwrap(item, set = new Set()) { + let result, unwrapped, v, prop; +- if ((result = item != null && item[$RAW])) return result; ++ if (result = item != null && item[$RAW]) return result; + if (!isWrappable(item) || set.has(item)) return item; + if (Array.isArray(item)) { +- if (Object.isFrozen(item)) item = item.slice(0); +- else set.add(item); ++ if (Object.isFrozen(item)) item = item.slice(0);else set.add(item); + for (let i = 0, l = item.length; i < l; i++) { + v = item[i]; + if ((unwrapped = unwrap(v, set)) !== v) item[i] = unwrapped; + } + } else { +- if (Object.isFrozen(item)) item = Object.assign({}, item); +- else set.add(item); ++ if (Object.isFrozen(item)) item = Object.assign({}, item);else set.add(item); + const keys = Object.keys(item), + desc = Object.getOwnPropertyDescriptors(item); + for (let i = 0, l = keys.length; i < l; i++) { +@@ -67,10 +58,9 @@ function unwrap(item, set = new Set()) { + } + function getNodes(target, symbol) { + let nodes = target[symbol]; +- if (!nodes) +- Object.defineProperty(target, symbol, { +- value: (nodes = Object.create(null)) +- }); ++ if (!nodes) Object.defineProperty(target, symbol, { ++ value: nodes = Object.create(null) ++ }); + return nodes; + } + function getNode(nodes, property, value) { +@@ -80,12 +70,11 @@ function getNode(nodes, property, value) { + internal: true + }); + s.$ = set; +- return (nodes[property] = s); ++ return nodes[property] = s; + } + function proxyDescriptor$1(target, property) { + const desc = Reflect.getOwnPropertyDescriptor(target, property); +- if (!desc || desc.get || !desc.configurable || property === $PROXY || property === $NODE) +- return desc; ++ if (!desc || desc.get || !desc.configurable || property === $PROXY || property === $NODE) return desc; + delete desc.value; + delete desc.writable; + desc.get = () => target[$PROXY][property]; +@@ -112,25 +101,12 @@ const proxyTraps$1 = { + if (property === $NODE || property === $HAS || property === "__proto__") return value; + if (!tracked) { + const desc = Object.getOwnPropertyDescriptor(target, property); +- if ( +- getListener() && +- (typeof value !== "function" || target.hasOwnProperty(property)) && +- !(desc && desc.get) +- ) +- value = getNode(nodes, property, value)(); ++ if (getListener() && (typeof value !== "function" || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)(); + } + return isWrappable(value) ? wrap$1(value) : value; + }, + has(target, property) { +- if ( +- property === $RAW || +- property === $PROXY || +- property === $TRACK || +- property === $NODE || +- property === $HAS || +- property === "__proto__" +- ) +- return true; ++ if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === "__proto__") return true; + getListener() && getNode(getNodes(target, $HAS), property)(); + return property in target; + }, +@@ -159,7 +135,7 @@ function setProperty(state, property, value, deleting = false) { + } + let nodes = getNodes(state, $NODE), + node; +- if ((node = getNode(nodes, property, prev))) node.$(() => value); ++ if (node = getNode(nodes, property, prev)) node.$(() => value); + if (Array.isArray(state) && state.length !== len) { + for (let i = state.length; i < len; i++) (node = nodes[i]) && node.$(); + (node = getNode(nodes, "length", len)) && node.$(state.length); +@@ -205,7 +181,11 @@ function updatePath(current, path, traversed = []) { + } + return; + } else if (isArray && partType === "object") { +- const { from = 0, to = current.length - 1, by = 1 } = part; ++ const { ++ from = 0, ++ to = current.length - 1, ++ by = 1 ++ } = part; + for (let i = from; i <= to; i += by) { + updatePath(current, [i].concat(path), traversed); + } +@@ -224,17 +204,14 @@ function updatePath(current, path, traversed = []) { + } + if (part === undefined && value == undefined) return; + value = unwrap(value); +- if (part === undefined || (isWrappable(prev) && isWrappable(value) && !Array.isArray(value))) { ++ if (part === undefined || isWrappable(prev) && isWrappable(value) && !Array.isArray(value)) { + mergeStoreNode(prev, value); + } else setProperty(current, part, value); + } + function createStore(...[store, options]) { + const unwrappedStore = unwrap(store || {}); + const isArray = Array.isArray(unwrappedStore); +- if (typeof unwrappedStore !== "object" && typeof unwrappedStore !== "function") +- throw new Error( +- `Unexpected type ${typeof unwrappedStore} received when initializing 'createStore'. Expected an object.` +- ); ++ if (typeof unwrappedStore !== "object" && typeof unwrappedStore !== "function") throw new Error(`Unexpected type ${typeof unwrappedStore} received when initializing 'createStore'. Expected an object.`); + const wrappedStore = wrap$1(unwrappedStore); + DEV$1.registerGraph({ + value: unwrappedStore, +@@ -242,9 +219,7 @@ function createStore(...[store, options]) { + }); + function setStore(...args) { + batch(() => { +- isArray && args.length === 1 +- ? updateArray(unwrappedStore, args[0]) +- : updatePath(unwrappedStore, args); ++ isArray && args.length === 1 ? updateArray(unwrappedStore, args[0]) : updatePath(unwrappedStore, args); + }); + } + return [wrappedStore, setStore]; +@@ -252,19 +227,11 @@ function createStore(...[store, options]) { + + function proxyDescriptor(target, property) { + const desc = Reflect.getOwnPropertyDescriptor(target, property); +- if ( +- !desc || +- desc.get || +- desc.set || +- !desc.configurable || +- property === $PROXY || +- property === $NODE +- ) +- return desc; ++ if (!desc || desc.get || desc.set || !desc.configurable || property === $PROXY || property === $NODE) return desc; + delete desc.value; + delete desc.writable; + desc.get = () => target[$PROXY][property]; +- desc.set = v => (target[$PROXY][property] = v); ++ desc.set = v => target[$PROXY][property] = v; + return desc; + } + const proxyTraps = { +@@ -282,24 +249,14 @@ const proxyTraps = { + if (!tracked) { + const desc = Object.getOwnPropertyDescriptor(target, property); + const isFunction = typeof value === "function"; +- if (getListener() && (!isFunction || target.hasOwnProperty(property)) && !(desc && desc.get)) +- value = getNode(nodes, property, value)(); +- else if (value != null && isFunction && value === Array.prototype[property]) { ++ if (getListener() && (!isFunction || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)();else if (value != null && isFunction && value === Array.prototype[property]) { + return (...args) => batch(() => Array.prototype[property].apply(receiver, args)); + } + } + return isWrappable(value) ? wrap(value) : value; + }, + has(target, property) { +- if ( +- property === $RAW || +- property === $PROXY || +- property === $TRACK || +- property === $NODE || +- property === $HAS || +- property === "__proto__" +- ) +- return true; ++ if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === "__proto__") return true; + getListener() && getNode(getNodes(target, $HAS), property)(); + return property in target; + }, +@@ -318,17 +275,12 @@ function wrap(value) { + let p = value[$PROXY]; + if (!p) { + Object.defineProperty(value, $PROXY, { +- value: (p = new Proxy(value, proxyTraps)) ++ value: p = new Proxy(value, proxyTraps) + }); + const keys = Object.keys(value), + desc = Object.getOwnPropertyDescriptors(value); + const proto = Object.getPrototypeOf(value); +- const isClass = +- proto !== null && +- value !== null && +- typeof value === "object" && +- !Array.isArray(value) && +- proto !== Object.prototype; ++ const isClass = proto !== null && value !== null && typeof value === "object" && !Array.isArray(value) && proto !== Object.prototype; + if (isClass) { + const descriptors = Object.getOwnPropertyDescriptors(proto); + keys.push(...Object.keys(descriptors)); +@@ -358,10 +310,7 @@ function wrap(value) { + } + function createMutable(state, options) { + const unwrappedStore = unwrap(state || {}); +- if (typeof unwrappedStore !== "object" && typeof unwrappedStore !== "function") +- throw new Error( +- `Unexpected type ${typeof unwrappedStore} received when initializing 'createMutable'. Expected an object.` +- ); ++ if (typeof unwrappedStore !== "object" && typeof unwrappedStore !== "function") throw new Error(`Unexpected type ${typeof unwrappedStore} received when initializing 'createMutable'. Expected an object.`); + const wrappedStore = wrap(unwrappedStore); + DEV$1.registerGraph({ + value: unwrappedStore, +@@ -378,42 +327,19 @@ function applyState(target, parent, property, merge, key) { + const previous = parent[property]; + if (target === previous) return; + const isArray = Array.isArray(target); +- if ( +- property !== $ROOT && +- (!isWrappable(target) || +- !isWrappable(previous) || +- isArray !== Array.isArray(previous) || +- (key && target[key] !== previous[key])) +- ) { ++ if (property !== $ROOT && (!isWrappable(target) || !isWrappable(previous) || isArray !== Array.isArray(previous) || key && target[key] !== previous[key])) { + setProperty(parent, property, target); + return; + } + if (isArray) { +- if ( +- target.length && +- previous.length && +- (!merge || (key && target[0] && target[0][key] != null)) +- ) { ++ if (target.length && previous.length && (!merge || key && target[0] && target[0][key] != null)) { + let i, j, start, end, newEnd, item, newIndicesNext, keyVal; +- for ( +- start = 0, end = Math.min(previous.length, target.length); +- start < end && +- (previous[start] === target[start] || +- (key && previous[start] && target[start] && previous[start][key] === target[start][key])); +- start++ +- ) { ++ for (start = 0, end = Math.min(previous.length, target.length); start < end && (previous[start] === target[start] || key && previous[start] && target[start] && previous[start][key] === target[start][key]); start++) { + applyState(target[start], previous, start, merge, key); + } + const temp = new Array(target.length), + newIndices = new Map(); +- for ( +- end = previous.length - 1, newEnd = target.length - 1; +- end >= start && +- newEnd >= start && +- (previous[end] === target[newEnd] || +- (key && previous[start] && target[start] && previous[end][key] === target[newEnd][key])); +- end--, newEnd-- +- ) { ++ for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[end] && target[newEnd] && previous[end][key] === target[newEnd][key]); end--, newEnd--) { + temp[newEnd] = previous[end]; + } + if (start > newEnd || start > end) { +@@ -467,19 +393,16 @@ function applyState(target, parent, property, merge, key) { + } + } + function reconcile(value, options = {}) { +- const { merge, key = "id" } = options, ++ const { ++ merge, ++ key = "id" ++ } = options, + v = unwrap(value); + return state => { + if (!isWrappable(state) || !isWrappable(v)) return v; +- const res = applyState( +- v, +- { +- [$ROOT]: state +- }, +- $ROOT, +- merge, +- key +- ); ++ const res = applyState(v, { ++ [$ROOT]: state ++ }, $ROOT, merge, key); + return res === undefined ? state : res; + }; + } +@@ -489,10 +412,7 @@ const setterTraps = { + if (property === $RAW) return target; + const value = target[property]; + let proxy; +- return isWrappable(value) +- ? producers.get(value) || +- (producers.set(value, (proxy = new Proxy(value, setterTraps))), proxy) +- : value; ++ return isWrappable(value) ? producers.get(value) || (producers.set(value, proxy = new Proxy(value, setterTraps)), proxy) : value; + }, + set(target, property, value) { + setProperty(target, property, unwrap(value)); +@@ -508,7 +428,7 @@ function produce(fn) { + if (isWrappable(state)) { + let proxy; + if (!(proxy = producers.get(state))) { +- producers.set(state, (proxy = new Proxy(state, setterTraps))); ++ producers.set(state, proxy = new Proxy(state, setterTraps)); + } + fn(proxy); + } +@@ -517,9 +437,16 @@ function produce(fn) { + } + + const DEV = { +- $NODE, +- isWrappable, ++ $NODE: $NODE, ++ $HAS: $HAS, ++ $RAW: $RAW, ++ $SELF: $SELF, ++ isWrappable: isWrappable, ++ unwrap: unwrap, + hooks: DevHooks +-}; ++} ; ++if (globalThis) { ++ globalThis.SolidStore$$ = DEV; ++} + + export { $RAW, DEV, createMutable, createStore, modifyMutable, produce, reconcile, unwrap }; +diff --git a/store/dist/server.js b/store/dist/server.js +index a9ecdf897ee3c3f3204a44fa4a9e9587c19fa10c..fbd9254e9f26e3286f869f16db2d7c29d00874e5 100644 +--- a/store/dist/server.js ++++ b/store/dist/server.js +@@ -1,10 +1,6 @@ + const $RAW = Symbol("state-raw"); + function isWrappable(obj) { +- return ( +- obj != null && +- typeof obj === "object" && +- (Object.getPrototypeOf(obj) === Object.prototype || Array.isArray(obj)) +- ); ++ return obj != null && typeof obj === "object" && (Object.getPrototypeOf(obj) === Object.prototype || Array.isArray(obj)); + } + function unwrap(item) { + return item; +@@ -53,7 +49,11 @@ function updatePath(current, path, traversed = []) { + } + return; + } else if (isArray && partType === "object") { +- const { from = 0, to = current.length - 1, by = 1 } = part; ++ const { ++ from = 0, ++ to = current.length - 1, ++ by = 1 ++ } = part; + for (let i = from; i <= to; i += by) { + updatePath(current, [i].concat(path), traversed); + } +@@ -71,7 +71,7 @@ function updatePath(current, path, traversed = []) { + if (value === next) return; + } + if (part === undefined && value == undefined) return; +- if (part === undefined || (isWrappable(next) && isWrappable(value) && !Array.isArray(value))) { ++ if (part === undefined || isWrappable(next) && isWrappable(value) && !Array.isArray(value)) { + mergeStoreNode(next, value); + } else setProperty(current, part, value); + } +@@ -111,16 +111,4 @@ function produce(fn) { + } + const DEV = undefined; + +-export { +- $RAW, +- DEV, +- createMutable, +- createStore, +- isWrappable, +- modifyMutable, +- produce, +- reconcile, +- setProperty, +- unwrap, +- updatePath +-}; ++export { $RAW, DEV, createMutable, createStore, isWrappable, modifyMutable, produce, reconcile, setProperty, unwrap, updatePath }; +diff --git a/store/dist/store.cjs b/store/dist/store.cjs +index e1a27af53ed58bd6381dd5fc9eb35363c0ed5d10..7803b704245e299faf209a23ee5af72b1a40fdb0 100644 +--- a/store/dist/store.cjs ++++ b/store/dist/store.cjs +@@ -325,7 +325,7 @@ function applyState(target, parent, property, merge, key) { + } + const temp = new Array(target.length), + newIndices = new Map(); +- for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[start] && target[start] && previous[end][key] === target[newEnd][key]); end--, newEnd--) { ++ for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[end] && target[newEnd] && previous[end][key] === target[newEnd][key]); end--, newEnd--) { + temp[newEnd] = previous[end]; + } + if (start > newEnd || start > end) { +diff --git a/store/dist/store.js b/store/dist/store.js +index fb518424106d2b1238933e9a1a5f94b7a72a6232..5972e440e5ae2ce986240dbbdafebd44c7d1c146 100644 +--- a/store/dist/store.js ++++ b/store/dist/store.js +@@ -1,4 +1,4 @@ +-import { $PROXY, $TRACK, getListener, batch, createSignal } from "solid-js"; ++import { $PROXY, $TRACK, getListener, batch, createSignal } from 'solid-js'; + + const $RAW = Symbol("store-raw"), + $NODE = Symbol("store-node"), +@@ -8,7 +8,7 @@ function wrap$1(value) { + let p = value[$PROXY]; + if (!p) { + Object.defineProperty(value, $PROXY, { +- value: (p = new Proxy(value, proxyTraps$1)) ++ value: p = new Proxy(value, proxyTraps$1) + }); + if (!Array.isArray(value)) { + const keys = Object.keys(value), +@@ -28,29 +28,20 @@ function wrap$1(value) { + } + function isWrappable(obj) { + let proto; +- return ( +- obj != null && +- typeof obj === "object" && +- (obj[$PROXY] || +- !(proto = Object.getPrototypeOf(obj)) || +- proto === Object.prototype || +- Array.isArray(obj)) +- ); ++ return obj != null && typeof obj === "object" && (obj[$PROXY] || !(proto = Object.getPrototypeOf(obj)) || proto === Object.prototype || Array.isArray(obj)); + } + function unwrap(item, set = new Set()) { + let result, unwrapped, v, prop; +- if ((result = item != null && item[$RAW])) return result; ++ if (result = item != null && item[$RAW]) return result; + if (!isWrappable(item) || set.has(item)) return item; + if (Array.isArray(item)) { +- if (Object.isFrozen(item)) item = item.slice(0); +- else set.add(item); ++ if (Object.isFrozen(item)) item = item.slice(0);else set.add(item); + for (let i = 0, l = item.length; i < l; i++) { + v = item[i]; + if ((unwrapped = unwrap(v, set)) !== v) item[i] = unwrapped; + } + } else { +- if (Object.isFrozen(item)) item = Object.assign({}, item); +- else set.add(item); ++ if (Object.isFrozen(item)) item = Object.assign({}, item);else set.add(item); + const keys = Object.keys(item), + desc = Object.getOwnPropertyDescriptors(item); + for (let i = 0, l = keys.length; i < l; i++) { +@@ -64,10 +55,9 @@ function unwrap(item, set = new Set()) { + } + function getNodes(target, symbol) { + let nodes = target[symbol]; +- if (!nodes) +- Object.defineProperty(target, symbol, { +- value: (nodes = Object.create(null)) +- }); ++ if (!nodes) Object.defineProperty(target, symbol, { ++ value: nodes = Object.create(null) ++ }); + return nodes; + } + function getNode(nodes, property, value) { +@@ -77,12 +67,11 @@ function getNode(nodes, property, value) { + internal: true + }); + s.$ = set; +- return (nodes[property] = s); ++ return nodes[property] = s; + } + function proxyDescriptor$1(target, property) { + const desc = Reflect.getOwnPropertyDescriptor(target, property); +- if (!desc || desc.get || !desc.configurable || property === $PROXY || property === $NODE) +- return desc; ++ if (!desc || desc.get || !desc.configurable || property === $PROXY || property === $NODE) return desc; + delete desc.value; + delete desc.writable; + desc.get = () => target[$PROXY][property]; +@@ -109,25 +98,12 @@ const proxyTraps$1 = { + if (property === $NODE || property === $HAS || property === "__proto__") return value; + if (!tracked) { + const desc = Object.getOwnPropertyDescriptor(target, property); +- if ( +- getListener() && +- (typeof value !== "function" || target.hasOwnProperty(property)) && +- !(desc && desc.get) +- ) +- value = getNode(nodes, property, value)(); ++ if (getListener() && (typeof value !== "function" || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)(); + } + return isWrappable(value) ? wrap$1(value) : value; + }, + has(target, property) { +- if ( +- property === $RAW || +- property === $PROXY || +- property === $TRACK || +- property === $NODE || +- property === $HAS || +- property === "__proto__" +- ) +- return true; ++ if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === "__proto__") return true; + getListener() && getNode(getNodes(target, $HAS), property)(); + return property in target; + }, +@@ -153,7 +129,7 @@ function setProperty(state, property, value, deleting = false) { + } + let nodes = getNodes(state, $NODE), + node; +- if ((node = getNode(nodes, property, prev))) node.$(() => value); ++ if (node = getNode(nodes, property, prev)) node.$(() => value); + if (Array.isArray(state) && state.length !== len) { + for (let i = state.length; i < len; i++) (node = nodes[i]) && node.$(); + (node = getNode(nodes, "length", len)) && node.$(state.length); +@@ -199,7 +175,11 @@ function updatePath(current, path, traversed = []) { + } + return; + } else if (isArray && partType === "object") { +- const { from = 0, to = current.length - 1, by = 1 } = part; ++ const { ++ from = 0, ++ to = current.length - 1, ++ by = 1 ++ } = part; + for (let i = from; i <= to; i += by) { + updatePath(current, [i].concat(path), traversed); + } +@@ -218,7 +198,7 @@ function updatePath(current, path, traversed = []) { + } + if (part === undefined && value == undefined) return; + value = unwrap(value); +- if (part === undefined || (isWrappable(prev) && isWrappable(value) && !Array.isArray(value))) { ++ if (part === undefined || isWrappable(prev) && isWrappable(value) && !Array.isArray(value)) { + mergeStoreNode(prev, value); + } else setProperty(current, part, value); + } +@@ -228,9 +208,7 @@ function createStore(...[store, options]) { + const wrappedStore = wrap$1(unwrappedStore); + function setStore(...args) { + batch(() => { +- isArray && args.length === 1 +- ? updateArray(unwrappedStore, args[0]) +- : updatePath(unwrappedStore, args); ++ isArray && args.length === 1 ? updateArray(unwrappedStore, args[0]) : updatePath(unwrappedStore, args); + }); + } + return [wrappedStore, setStore]; +@@ -238,19 +216,11 @@ function createStore(...[store, options]) { + + function proxyDescriptor(target, property) { + const desc = Reflect.getOwnPropertyDescriptor(target, property); +- if ( +- !desc || +- desc.get || +- desc.set || +- !desc.configurable || +- property === $PROXY || +- property === $NODE +- ) +- return desc; ++ if (!desc || desc.get || desc.set || !desc.configurable || property === $PROXY || property === $NODE) return desc; + delete desc.value; + delete desc.writable; + desc.get = () => target[$PROXY][property]; +- desc.set = v => (target[$PROXY][property] = v); ++ desc.set = v => target[$PROXY][property] = v; + return desc; + } + const proxyTraps = { +@@ -268,24 +238,14 @@ const proxyTraps = { + if (!tracked) { + const desc = Object.getOwnPropertyDescriptor(target, property); + const isFunction = typeof value === "function"; +- if (getListener() && (!isFunction || target.hasOwnProperty(property)) && !(desc && desc.get)) +- value = getNode(nodes, property, value)(); +- else if (value != null && isFunction && value === Array.prototype[property]) { ++ if (getListener() && (!isFunction || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)();else if (value != null && isFunction && value === Array.prototype[property]) { + return (...args) => batch(() => Array.prototype[property].apply(receiver, args)); + } + } + return isWrappable(value) ? wrap(value) : value; + }, + has(target, property) { +- if ( +- property === $RAW || +- property === $PROXY || +- property === $TRACK || +- property === $NODE || +- property === $HAS || +- property === "__proto__" +- ) +- return true; ++ if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === "__proto__") return true; + getListener() && getNode(getNodes(target, $HAS), property)(); + return property in target; + }, +@@ -304,17 +264,12 @@ function wrap(value) { + let p = value[$PROXY]; + if (!p) { + Object.defineProperty(value, $PROXY, { +- value: (p = new Proxy(value, proxyTraps)) ++ value: p = new Proxy(value, proxyTraps) + }); + const keys = Object.keys(value), + desc = Object.getOwnPropertyDescriptors(value); + const proto = Object.getPrototypeOf(value); +- const isClass = +- proto !== null && +- value !== null && +- typeof value === "object" && +- !Array.isArray(value) && +- proto !== Object.prototype; ++ const isClass = proto !== null && value !== null && typeof value === "object" && !Array.isArray(value) && proto !== Object.prototype; + if (isClass) { + const descriptors = Object.getOwnPropertyDescriptors(proto); + keys.push(...Object.keys(descriptors)); +@@ -356,42 +311,19 @@ function applyState(target, parent, property, merge, key) { + const previous = parent[property]; + if (target === previous) return; + const isArray = Array.isArray(target); +- if ( +- property !== $ROOT && +- (!isWrappable(target) || +- !isWrappable(previous) || +- isArray !== Array.isArray(previous) || +- (key && target[key] !== previous[key])) +- ) { ++ if (property !== $ROOT && (!isWrappable(target) || !isWrappable(previous) || isArray !== Array.isArray(previous) || key && target[key] !== previous[key])) { + setProperty(parent, property, target); + return; + } + if (isArray) { +- if ( +- target.length && +- previous.length && +- (!merge || (key && target[0] && target[0][key] != null)) +- ) { ++ if (target.length && previous.length && (!merge || key && target[0] && target[0][key] != null)) { + let i, j, start, end, newEnd, item, newIndicesNext, keyVal; +- for ( +- start = 0, end = Math.min(previous.length, target.length); +- start < end && +- (previous[start] === target[start] || +- (key && previous[start] && target[start] && previous[start][key] === target[start][key])); +- start++ +- ) { ++ for (start = 0, end = Math.min(previous.length, target.length); start < end && (previous[start] === target[start] || key && previous[start] && target[start] && previous[start][key] === target[start][key]); start++) { + applyState(target[start], previous, start, merge, key); + } + const temp = new Array(target.length), + newIndices = new Map(); +- for ( +- end = previous.length - 1, newEnd = target.length - 1; +- end >= start && +- newEnd >= start && +- (previous[end] === target[newEnd] || +- (key && previous[start] && target[start] && previous[end][key] === target[newEnd][key])); +- end--, newEnd-- +- ) { ++ for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[end] && target[newEnd] && previous[end][key] === target[newEnd][key]); end--, newEnd--) { + temp[newEnd] = previous[end]; + } + if (start > newEnd || start > end) { +@@ -445,19 +377,16 @@ function applyState(target, parent, property, merge, key) { + } + } + function reconcile(value, options = {}) { +- const { merge, key = "id" } = options, ++ const { ++ merge, ++ key = "id" ++ } = options, + v = unwrap(value); + return state => { + if (!isWrappable(state) || !isWrappable(v)) return v; +- const res = applyState( +- v, +- { +- [$ROOT]: state +- }, +- $ROOT, +- merge, +- key +- ); ++ const res = applyState(v, { ++ [$ROOT]: state ++ }, $ROOT, merge, key); + return res === undefined ? state : res; + }; + } +@@ -467,10 +396,7 @@ const setterTraps = { + if (property === $RAW) return target; + const value = target[property]; + let proxy; +- return isWrappable(value) +- ? producers.get(value) || +- (producers.set(value, (proxy = new Proxy(value, setterTraps))), proxy) +- : value; ++ return isWrappable(value) ? producers.get(value) || (producers.set(value, proxy = new Proxy(value, setterTraps)), proxy) : value; + }, + set(target, property, value) { + setProperty(target, property, unwrap(value)); +@@ -486,7 +412,7 @@ function produce(fn) { + if (isWrappable(state)) { + let proxy; + if (!(proxy = producers.get(state))) { +- producers.set(state, (proxy = new Proxy(state, setterTraps))); ++ producers.set(state, proxy = new Proxy(state, setterTraps)); + } + fn(proxy); + } +diff --git a/store/types/index.d.ts b/store/types/index.d.ts +index 6c35008285ccd649cc222f72f8801d263281544e..689ddb48911a14ccbf672606be00960b0d93a56a 100644 +--- a/store/types/index.d.ts ++++ b/store/types/index.d.ts +@@ -1,26 +1,23 @@ + export { $RAW, createStore, unwrap } from "./store.js"; +-export type { +- ArrayFilterFn, +- DeepMutable, +- DeepReadonly, +- NotWrappable, +- Part, +- SetStoreFunction, +- SolidStore, +- Store, +- StoreNode, +- StorePathRange, +- StoreSetter +-} from "./store.js"; ++export type { ArrayFilterFn, DeepMutable, DeepReadonly, NotWrappable, Part, SetStoreFunction, SolidStore, Store, StoreNode, StorePathRange, StoreSetter } from "./store.js"; + export * from "./mutable.js"; + export * from "./modifiers.js"; +-import { $NODE, isWrappable } from "./store.js"; +-export declare const DEV: +- | { +- readonly $NODE: typeof $NODE; +- readonly isWrappable: typeof isWrappable; +- readonly hooks: { +- onStoreNodeUpdate: import("./store.js").OnStoreNodeUpdate | null; +- }; +- } +- | undefined; ++import * as store from "./store.js"; ++/** ++ * Development-only solid-js/store apis exposed for debugging, ++ * `undefined` in production or on the server. ++ */ ++export declare const DEV: { ++ readonly $NODE: typeof store.$NODE; ++ readonly $HAS: typeof store.$HAS; ++ readonly $RAW: typeof store.$RAW; ++ readonly $SELF: typeof store.$SELF; ++ readonly isWrappable: typeof store.isWrappable; ++ readonly unwrap: typeof store.unwrap; ++ readonly hooks: { ++ onStoreNodeUpdate: store.OnStoreNodeUpdate | null; ++ }; ++} | undefined; ++declare global { ++ var SolidStore$$: undefined | typeof DEV; ++} +diff --git a/store/types/modifiers.d.ts b/store/types/modifiers.d.ts +index 536b3b6b26fe6f739eaaf26bb5a3a9a35209854b..898d4b5838b47b7a5be0d2f45aa0413ec0eab3ea 100644 +--- a/store/types/modifiers.d.ts ++++ b/store/types/modifiers.d.ts +@@ -1,9 +1,6 @@ + export type ReconcileOptions = { +- key?: string | null; +- merge?: boolean; ++ key?: string | null; ++ merge?: boolean; + }; +-export declare function reconcile( +- value: T, +- options?: ReconcileOptions +-): (state: U) => T; ++export declare function reconcile(value: T, options?: ReconcileOptions): (state: U) => T; + export declare function produce(fn: (state: T) => void): (state: T) => T; +diff --git a/store/types/mutable.d.ts b/store/types/mutable.d.ts +index 517874eb25e6f4f8114b8893ee226f9d7552b991..3f7b39b08d1b3209e92e056505890f5570e9af34 100644 +--- a/store/types/mutable.d.ts ++++ b/store/types/mutable.d.ts +@@ -1,8 +1,5 @@ + import { StoreNode } from "./store.js"; +-export declare function createMutable( +- state: T, +- options?: { ++export declare function createMutable(state: T, options?: { + name?: string; +- } +-): T; ++}): T; + export declare function modifyMutable(state: T, modifier: (state: T) => T): void; +diff --git a/store/types/server.d.ts b/store/types/server.d.ts +index ba576a6fdffb8dce45bdcd29c6dac57c0a30767c..370a80a95fff1fbc63e5d8d9cbb2053bed34600a 100644 +--- a/store/types/server.d.ts ++++ b/store/types/server.d.ts +@@ -1,37 +1,17 @@ + import type { SetStoreFunction, Store } from "./store.js"; +-export type { +- ArrayFilterFn, +- DeepMutable, +- DeepReadonly, +- NotWrappable, +- Part, +- SetStoreFunction, +- SolidStore, +- Store, +- StoreNode, +- StorePathRange, +- StoreSetter +-} from "./store.js"; ++export type { ArrayFilterFn, DeepMutable, DeepReadonly, NotWrappable, Part, SetStoreFunction, SolidStore, Store, StoreNode, StorePathRange, StoreSetter } from "./store.js"; + export declare const $RAW: unique symbol; + export declare function isWrappable(obj: any): boolean; + export declare function unwrap(item: T): T; +-export declare function setProperty( +- state: any, +- property: PropertyKey, +- value: any, +- force?: boolean +-): void; ++export declare function setProperty(state: any, property: PropertyKey, value: any, force?: boolean): void; + export declare function updatePath(current: any, path: any[], traversed?: PropertyKey[]): void; + export declare function createStore(state: T | Store): [Store, SetStoreFunction]; + export declare function createMutable(state: T | Store): T; + export declare function modifyMutable(state: T, modifier: (state: T) => T): void; + type ReconcileOptions = { +- key?: string | null; +- merge?: boolean; ++ key?: string | null; ++ merge?: boolean; + }; +-export declare function reconcile( +- value: T, +- options?: ReconcileOptions +-): (state: U) => T; ++export declare function reconcile(value: T, options?: ReconcileOptions): (state: U) => T; + export declare function produce(fn: (state: T) => void): (state: T) => T; + export declare const DEV: undefined; +diff --git a/store/types/store.d.ts b/store/types/store.d.ts +index 3d4d89cfc106438467da82f17a9c738454ad6c87..57024d638a1999b2e424fa95b48e49b16a4ab724 100644 +--- a/store/types/store.d.ts ++++ b/store/types/store.d.ts +@@ -1,38 +1,22 @@ +-export declare const $RAW: unique symbol, +- $NODE: unique symbol, +- $HAS: unique symbol, +- $SELF: unique symbol; ++export declare const $RAW: unique symbol, $NODE: unique symbol, $HAS: unique symbol, $SELF: unique symbol; + export declare const DevHooks: { +- onStoreNodeUpdate: OnStoreNodeUpdate | null; ++ onStoreNodeUpdate: OnStoreNodeUpdate | null; + }; + type DataNode = { +- (): any; +- $(value?: any): void; ++ (): any; ++ $(value?: any): void; + }; + export type DataNodes = Record; +-export type OnStoreNodeUpdate = ( +- state: StoreNode, +- property: PropertyKey, +- value: StoreNode | NotWrappable, +- prev: StoreNode | NotWrappable +-) => void; ++export type OnStoreNodeUpdate = (state: StoreNode, property: PropertyKey, value: StoreNode | NotWrappable, prev: StoreNode | NotWrappable) => void; + export interface StoreNode { +- [$NODE]?: DataNodes; +- [key: PropertyKey]: any; ++ [$NODE]?: DataNodes; ++ [key: PropertyKey]: any; + } + export declare namespace SolidStore { +- interface Unwrappable {} ++ interface Unwrappable { ++ } + } +-export type NotWrappable = +- | string +- | number +- | bigint +- | symbol +- | boolean +- | Function +- | null +- | undefined +- | SolidStore.Unwrappable[keyof SolidStore.Unwrappable]; ++export type NotWrappable = string | number | bigint | symbol | boolean | Function | null | undefined | SolidStore.Unwrappable[keyof SolidStore.Unwrappable]; + export type Store = T; + export declare function isWrappable(obj: T | NotWrappable): obj is T; + /** +@@ -49,215 +33,74 @@ export declare function isWrappable(obj: T | NotWrappable): obj is T; + export declare function unwrap(item: T, set?: Set): T; + export declare function getNodes(target: StoreNode, symbol: typeof $NODE | typeof $HAS): DataNodes; + export declare function getNode(nodes: DataNodes, property: PropertyKey, value?: any): DataNode; +-export declare function proxyDescriptor( +- target: StoreNode, +- property: PropertyKey +-): TypedPropertyDescriptor | undefined; ++export declare function proxyDescriptor(target: StoreNode, property: PropertyKey): TypedPropertyDescriptor | undefined; + export declare function trackSelf(target: StoreNode): void; + export declare function ownKeys(target: StoreNode): (string | symbol)[]; +-export declare function setProperty( +- state: StoreNode, +- property: PropertyKey, +- value: any, +- deleting?: boolean +-): void; +-export declare function updatePath( +- current: StoreNode, +- path: any[], +- traversed?: PropertyKey[] +-): void; ++export declare function setProperty(state: StoreNode, property: PropertyKey, value: any, deleting?: boolean): void; ++export declare function updatePath(current: StoreNode, path: any[], traversed?: PropertyKey[]): void; + /** @deprecated */ +-export type DeepReadonly = 0 extends 1 & T +- ? T +- : T extends NotWrappable +- ? T +- : { +- readonly [K in keyof T]: DeepReadonly; +- }; ++export type DeepReadonly = 0 extends 1 & T ? T : T extends NotWrappable ? T : { ++ readonly [K in keyof T]: DeepReadonly; ++}; + /** @deprecated */ +-export type DeepMutable = 0 extends 1 & T +- ? T +- : T extends NotWrappable +- ? T +- : { +- -readonly [K in keyof T]: DeepMutable; +- }; +-export type CustomPartial = T extends readonly unknown[] +- ? "0" extends keyof T +- ? { +- [K in Extract]?: T[K]; +- } +- : { +- [x: number]: T[number]; +- } +- : Partial; ++export type DeepMutable = 0 extends 1 & T ? T : T extends NotWrappable ? T : { ++ -readonly [K in keyof T]: DeepMutable; ++}; ++export type CustomPartial = T extends readonly unknown[] ? "0" extends keyof T ? { ++ [K in Extract]?: T[K]; ++} : { ++ [x: number]: T[number]; ++} : Partial; + export type PickMutable = { +- [K in keyof T as (() => U extends { +- [V in K]: T[V]; +- } +- ? 1 +- : 2) extends () => U extends { +- -readonly [V in K]: T[V]; +- } +- ? 1 +- : 2 +- ? K +- : never]: T[K]; ++ [K in keyof T as (() => U extends { ++ [V in K]: T[V]; ++ } ? 1 : 2) extends () => U extends { ++ -readonly [V in K]: T[V]; ++ } ? 1 : 2 ? K : never]: T[K]; + }; + export type StorePathRange = { +- from?: number; +- to?: number; +- by?: number; ++ from?: number; ++ to?: number; ++ by?: number; + }; + export type ArrayFilterFn = (item: T, index: number) => boolean; +-export type StoreSetter = +- | T +- | CustomPartial +- | ((prevState: T, traversed: U) => T | CustomPartial); +-export type Part = KeyOf> = +- | K +- | ([K] extends [never] ? never : readonly K[]) +- | ([T] extends [readonly unknown[]] ? ArrayFilterFn | StorePathRange : never); ++export type StoreSetter = T | CustomPartial | ((prevState: T, traversed: U) => T | CustomPartial); ++export type Part = KeyOf> = K | ([K] extends [never] ? never : readonly K[]) | ([T] extends [readonly unknown[]] ? ArrayFilterFn | StorePathRange : never); + type W = Exclude; +-type KeyOf = number extends keyof T +- ? 0 extends 1 & T +- ? keyof T +- : [T] extends [never] +- ? never +- : [T] extends [readonly unknown[]] +- ? number +- : keyof T +- : keyof T; ++type KeyOf = number extends keyof T ? 0 extends 1 & T ? keyof T : [T] extends [never] ? never : [ ++ T ++] extends [readonly unknown[]] ? number : keyof T : keyof T; + type MutableKeyOf = KeyOf & keyof PickMutable; +-type Rest = KeyOf> = [T] extends [never] +- ? never +- : K extends MutableKeyOf +- ? [Part, ...RestSetterOrContinue] +- : K extends KeyOf +- ? [Part, ...RestContinue] +- : never; +-type RestContinue = 0 extends 1 & T +- ? [...Part[], StoreSetter] +- : Rest, U>; ++type Rest = KeyOf> = [T] extends [never] ? never : K extends MutableKeyOf ? [Part, ...RestSetterOrContinue] : K extends KeyOf ? [Part, ...RestContinue] : never; ++type RestContinue = 0 extends 1 & T ? [...Part[], StoreSetter] : Rest, U>; + type RestSetterOrContinue = [StoreSetter] | RestContinue; + export interface SetStoreFunction { +- < +- K1 extends KeyOf>, +- K2 extends KeyOf[K1]>>, +- K3 extends KeyOf[K1]>[K2]>>, +- K4 extends KeyOf[K1]>[K2]>[K3]>>, +- K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>>, +- K6 extends KeyOf[K1]>[K2]>[K3]>[K4]>[K5]>>, +- K7 extends MutableKeyOf[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>> +- >( +- k1: Part, K1>, +- k2: Part[K1]>, K2>, +- k3: Part[K1]>[K2]>, K3>, +- k4: Part[K1]>[K2]>[K3]>, K4>, +- k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, +- k6: Part[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, +- k7: Part[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>, K7>, +- setter: StoreSetter< +- W[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>[K7], +- [K7, K6, K5, K4, K3, K2, K1] +- > +- ): void; +- < +- K1 extends KeyOf>, +- K2 extends KeyOf[K1]>>, +- K3 extends KeyOf[K1]>[K2]>>, +- K4 extends KeyOf[K1]>[K2]>[K3]>>, +- K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>>, +- K6 extends MutableKeyOf[K1]>[K2]>[K3]>[K4]>[K5]>> +- >( +- k1: Part, K1>, +- k2: Part[K1]>, K2>, +- k3: Part[K1]>[K2]>, K3>, +- k4: Part[K1]>[K2]>[K3]>, K4>, +- k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, +- k6: Part[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, +- setter: StoreSetter[K1]>[K2]>[K3]>[K4]>[K5]>[K6], [K6, K5, K4, K3, K2, K1]> +- ): void; +- < +- K1 extends KeyOf>, +- K2 extends KeyOf[K1]>>, +- K3 extends KeyOf[K1]>[K2]>>, +- K4 extends KeyOf[K1]>[K2]>[K3]>>, +- K5 extends MutableKeyOf[K1]>[K2]>[K3]>[K4]>> +- >( +- k1: Part, K1>, +- k2: Part[K1]>, K2>, +- k3: Part[K1]>[K2]>, K3>, +- k4: Part[K1]>[K2]>[K3]>, K4>, +- k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, +- setter: StoreSetter[K1]>[K2]>[K3]>[K4]>[K5], [K5, K4, K3, K2, K1]> +- ): void; +- < +- K1 extends KeyOf>, +- K2 extends KeyOf[K1]>>, +- K3 extends KeyOf[K1]>[K2]>>, +- K4 extends MutableKeyOf[K1]>[K2]>[K3]>> +- >( +- k1: Part, K1>, +- k2: Part[K1]>, K2>, +- k3: Part[K1]>[K2]>, K3>, +- k4: Part[K1]>[K2]>[K3]>, K4>, +- setter: StoreSetter[K1]>[K2]>[K3]>[K4], [K4, K3, K2, K1]> +- ): void; +- < +- K1 extends KeyOf>, +- K2 extends KeyOf[K1]>>, +- K3 extends MutableKeyOf[K1]>[K2]>> +- >( +- k1: Part, K1>, +- k2: Part[K1]>, K2>, +- k3: Part[K1]>[K2]>, K3>, +- setter: StoreSetter[K1]>[K2]>[K3], [K3, K2, K1]> +- ): void; +- >, K2 extends MutableKeyOf[K1]>>>( +- k1: Part, K1>, +- k2: Part[K1]>, K2>, +- setter: StoreSetter[K1]>[K2], [K2, K1]> +- ): void; +- >>(k1: Part, K1>, setter: StoreSetter[K1], [K1]>): void; +- (setter: StoreSetter): void; +- < +- K1 extends KeyOf>, +- K2 extends KeyOf[K1]>>, +- K3 extends KeyOf[K1]>[K2]>>, +- K4 extends KeyOf[K1]>[K2]>[K3]>>, +- K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>>, +- K6 extends KeyOf[K1]>[K2]>[K3]>[K4]>[K5]>>, +- K7 extends KeyOf[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>> +- >( +- k1: Part, K1>, +- k2: Part[K1]>, K2>, +- k3: Part[K1]>[K2]>, K3>, +- k4: Part[K1]>[K2]>[K3]>, K4>, +- k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, +- k6: Part[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, +- k7: Part[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>, K7>, +- ...rest: Rest[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>[K7], [K7, K6, K5, K4, K3, K2, K1]> +- ): void; ++ >, K2 extends KeyOf[K1]>>, K3 extends KeyOf[K1]>[K2]>>, K4 extends KeyOf[K1]>[K2]>[K3]>>, K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>>, K6 extends KeyOf[K1]>[K2]>[K3]>[K4]>[K5]>>, K7 extends MutableKeyOf[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>>>(k1: Part, K1>, k2: Part[K1]>, K2>, k3: Part[K1]>[K2]>, K3>, k4: Part[K1]>[K2]>[K3]>, K4>, k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, k6: Part[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, k7: Part[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>, K7>, setter: StoreSetter[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>[K7], [ ++ K7, ++ K6, ++ K5, ++ K4, ++ K3, ++ K2, ++ K1 ++ ]>): void; ++ >, K2 extends KeyOf[K1]>>, K3 extends KeyOf[K1]>[K2]>>, K4 extends KeyOf[K1]>[K2]>[K3]>>, K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>>, K6 extends MutableKeyOf[K1]>[K2]>[K3]>[K4]>[K5]>>>(k1: Part, K1>, k2: Part[K1]>, K2>, k3: Part[K1]>[K2]>, K3>, k4: Part[K1]>[K2]>[K3]>, K4>, k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, k6: Part[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, setter: StoreSetter[K1]>[K2]>[K3]>[K4]>[K5]>[K6], [K6, K5, K4, K3, K2, K1]>): void; ++ >, K2 extends KeyOf[K1]>>, K3 extends KeyOf[K1]>[K2]>>, K4 extends KeyOf[K1]>[K2]>[K3]>>, K5 extends MutableKeyOf[K1]>[K2]>[K3]>[K4]>>>(k1: Part, K1>, k2: Part[K1]>, K2>, k3: Part[K1]>[K2]>, K3>, k4: Part[K1]>[K2]>[K3]>, K4>, k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, setter: StoreSetter[K1]>[K2]>[K3]>[K4]>[K5], [K5, K4, K3, K2, K1]>): void; ++ >, K2 extends KeyOf[K1]>>, K3 extends KeyOf[K1]>[K2]>>, K4 extends MutableKeyOf[K1]>[K2]>[K3]>>>(k1: Part, K1>, k2: Part[K1]>, K2>, k3: Part[K1]>[K2]>, K3>, k4: Part[K1]>[K2]>[K3]>, K4>, setter: StoreSetter[K1]>[K2]>[K3]>[K4], [K4, K3, K2, K1]>): void; ++ >, K2 extends KeyOf[K1]>>, K3 extends MutableKeyOf[K1]>[K2]>>>(k1: Part, K1>, k2: Part[K1]>, K2>, k3: Part[K1]>[K2]>, K3>, setter: StoreSetter[K1]>[K2]>[K3], [K3, K2, K1]>): void; ++ >, K2 extends MutableKeyOf[K1]>>>(k1: Part, K1>, k2: Part[K1]>, K2>, setter: StoreSetter[K1]>[K2], [K2, K1]>): void; ++ >>(k1: Part, K1>, setter: StoreSetter[K1], [K1]>): void; ++ (setter: StoreSetter): void; ++ >, K2 extends KeyOf[K1]>>, K3 extends KeyOf[K1]>[K2]>>, K4 extends KeyOf[K1]>[K2]>[K3]>>, K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>>, K6 extends KeyOf[K1]>[K2]>[K3]>[K4]>[K5]>>, K7 extends KeyOf[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>>>(k1: Part, K1>, k2: Part[K1]>, K2>, k3: Part[K1]>[K2]>, K3>, k4: Part[K1]>[K2]>[K3]>, K4>, k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, k6: Part[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, k7: Part[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>, K7>, ...rest: Rest[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>[K7], [K7, K6, K5, K4, K3, K2, K1]>): void; + } + /** + * Creates a reactive store that can be read through a proxy object and written with a setter function + * + * @description https://docs.solidjs.com/reference/store-utilities/create-store + */ +-export declare function createStore( +- ...[store, options]: {} extends T +- ? [ +- store?: T | Store, +- options?: { +- name?: string; +- } +- ] +- : [ +- store: T | Store, +- options?: { +- name?: string; +- } +- ] +-): [get: Store, set: SetStoreFunction]; ++export declare function createStore(...[store, options]: {} extends T ? [store?: T | Store, options?: { ++ name?: string; ++}] : [store: T | Store, options?: { ++ name?: string; ++}]): [get: Store, set: SetStoreFunction]; + export {}; +diff --git a/types/index.d.ts b/types/index.d.ts +index e93ca31f7a0db0e0aa0185cc86b155d903806e05..4bb20d6caf6f7c8fd895665c2055fe4b1019663f 100644 +--- a/types/index.d.ts ++++ b/types/index.d.ts +@@ -1,66 +1,5 @@ +-export { +- $DEVCOMP, +- $PROXY, +- $TRACK, +- batch, +- catchError, +- children, +- createComputed, +- createContext, +- createDeferred, +- createEffect, +- createMemo, +- createReaction, +- createRenderEffect, +- createResource, +- createRoot, +- createSelector, +- createSignal, +- enableExternalSource, +- enableScheduling, +- equalFn, +- getListener, +- getOwner, +- on, +- onCleanup, +- onError, +- onMount, +- runWithOwner, +- startTransition, +- untrack, +- useContext, +- useTransition +-} from "./reactive/signal.js"; +-export type { +- Accessor, +- AccessorArray, +- ChildrenReturn, +- Context, +- ContextProviderComponent, +- EffectFunction, +- EffectOptions, +- InitializedResource, +- InitializedResourceOptions, +- InitializedResourceReturn, +- MemoOptions, +- NoInfer, +- OnEffectFunction, +- OnOptions, +- Owner, +- ResolvedChildren, +- ResolvedJSXElement, +- Resource, +- ResourceActions, +- ResourceFetcher, +- ResourceFetcherInfo, +- ResourceOptions, +- ResourceReturn, +- ResourceSource, +- ReturnTypes, +- Setter, +- Signal, +- SignalOptions +-} from "./reactive/signal.js"; ++export { $DEVCOMP, $PROXY, $TRACK, batch, catchError, children, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, enableExternalSource, enableScheduling, equalFn, getListener, getOwner, on, onCleanup, onError, onMount, runWithOwner, startTransition, untrack, useContext, useTransition } from "./reactive/signal.js"; ++export type { Accessor, AccessorArray, ChildrenReturn, Context, ContextProviderComponent, EffectFunction, EffectOptions, InitializedResource, InitializedResourceOptions, InitializedResourceReturn, MemoOptions, NoInfer, OnEffectFunction, OnOptions, Owner, ResolvedChildren, ResolvedJSXElement, Resource, ResourceActions, ResourceFetcher, ResourceFetcherInfo, ResourceOptions, ResourceReturn, ResourceSource, ReturnTypes, Setter, Signal, SignalOptions } from "./reactive/signal.js"; + export * from "./reactive/observable.js"; + export * from "./reactive/scheduler.js"; + export * from "./reactive/array.js"; +@@ -68,20 +7,43 @@ export * from "./render/index.js"; + import type { JSX } from "./jsx.js"; + type JSXElement = JSX.Element; + export type { JSXElement, JSX }; +-import { registerGraph, writeSignal } from "./reactive/signal.js"; +-export declare const DEV: +- | { +- readonly hooks: { ++import * as signal from "./reactive/signal.js"; ++/** ++ * Development-only solid-js apis exposed for debugging, ++ * `undefined` in production or on the server. ++ */ ++export declare const DEV: { ++ /** currect version of solid-js */ ++ readonly version: "SOLID_VERSION"; ++ readonly getOwner: typeof signal.getOwner; ++ readonly getListener: typeof signal.getListener; ++ readonly $PROXY: typeof signal.$PROXY; ++ readonly $DEVCOMP: typeof signal.$DEVCOMP; ++ readonly $TRACK: typeof signal.$TRACK; ++ readonly hooks: { + afterUpdate: (() => void) | null; +- afterCreateOwner: ((owner: import("./reactive/signal.js").Owner) => void) | null; +- afterCreateSignal: +- | ((signal: import("./reactive/signal.js").SignalState) => void) +- | null; +- }; +- readonly writeSignal: typeof writeSignal; +- readonly registerGraph: typeof registerGraph; +- } +- | undefined; ++ afterCreateOwner: ((owner: signal.Owner) => void) | null; ++ afterCreateSignal: ((signal: signal.SignalState) => void) | null; ++ }; ++ readonly readSignal: typeof signal.readSignal; ++ readonly writeSignal: typeof signal.writeSignal; ++ readonly registerGraph: typeof signal.registerGraph; ++ readonly sharedConfig: { ++ context?: import("./render/hydration.js").HydrationContext; ++ resources?: { ++ [key: string]: any; ++ }; ++ load?: (id: string) => Promise | any; ++ has?: (id: string) => boolean; ++ gather?: (key: string) => void; ++ registry?: Map; ++ done?: boolean; ++ count?: number; ++ effects?: signal.Computation[]; ++ getContextId(): string; ++ getNextContextId(): string; ++ }; ++} | undefined; + declare global { +- var Solid$$: boolean; ++ var Solid$$: undefined | typeof DEV; + } +diff --git a/types/jsx.d.ts b/types/jsx.d.ts +index 2852436e1be7a3cfa713d90d5919349d6f31dcde..e7f494787b9bc1d3e5c3dd4a0d73db549d630768 100644 +--- a/types/jsx.d.ts ++++ b/types/jsx.d.ts +@@ -30,29 +30,30 @@ export namespace JSX { + } + + interface BoundEventHandler< +- T, +- E extends Event, +- EHandler extends EventHandler = EventHandler ++ T, ++ E extends Event, ++ EHandler extends EventHandler = EventHandler, + > { +- 0: (data: any, ...e: Parameters) => void; ++ 0: ( ++ data: any, ++ ...e: Parameters, ++ ) => void; + 1: any; + } + type EventHandlerUnion< + T, + E extends Event, +- EHandler extends EventHandler = EventHandler ++ EHandler extends EventHandler = EventHandler, + > = EHandler | BoundEventHandler; + + interface EventHandlerWithOptions> +- extends AddEventListenerOptions { ++ extends AddEventListenerOptions { + handleEvent: EHandler; + } + +- type EventHandlerWithOptionsUnion< +- T, +- E extends Event, +- EHandler extends EventHandler = EventHandler +- > = EHandler | EventHandlerWithOptions; ++ type EventHandlerWithOptionsUnion = EventHandler> = ++ | EHandler ++ | EventHandlerWithOptions; + + interface InputEventHandler { + ( +@@ -64,11 +65,7 @@ export namespace JSX { + } + ): void; + } +- type InputEventHandlerUnion = EventHandlerUnion< +- T, +- E, +- InputEventHandler +- >; ++ type InputEventHandlerUnion = EventHandlerUnion>; + + interface ChangeEventHandler { + ( +@@ -80,11 +77,7 @@ export namespace JSX { + } + ): void; + } +- type ChangeEventHandlerUnion = EventHandlerUnion< +- T, +- E, +- ChangeEventHandler +- >; ++ type ChangeEventHandlerUnion = EventHandlerUnion>; + + interface FocusEventHandler { + ( +@@ -96,11 +89,7 @@ export namespace JSX { + } + ): void; + } +- type FocusEventHandlerUnion = EventHandlerUnion< +- T, +- E, +- FocusEventHandler +- >; ++ type FocusEventHandlerUnion = EventHandlerUnion>; + + const SERIALIZABLE: unique symbol; + interface SerializableAttributeValue { +@@ -113,11 +102,9 @@ export namespace JSX { + } + interface CustomAttributes { + ref?: T | ((el: T) => void) | undefined; +- classList?: +- | { +- [k: string]: boolean | undefined; +- } +- | undefined; ++ classList?: { ++ [k: string]: boolean | undefined; ++ } | undefined; + $ServerOnly?: boolean | undefined; + } + type Accessor = () => T; +@@ -214,11 +201,9 @@ export namespace JSX { + "on:compositionstart"?: EventHandlerWithOptionsUnion | undefined; + "on:compositionupdate"?: EventHandlerWithOptionsUnion | undefined; + "on:focusout"?: +- | EventHandlerWithOptionsUnion> +- | undefined; ++ EventHandlerWithOptionsUnion> | undefined; + "on:focusin"?: +- | EventHandlerWithOptionsUnion> +- | undefined; ++ EventHandlerWithOptionsUnion> | undefined; + "on:encrypted"?: EventHandlerWithOptionsUnion | undefined; + "on:dragexit"?: EventHandlerWithOptionsUnion | undefined; + } +@@ -392,12 +377,10 @@ export namespace JSX { + "on:animationstart"?: EventHandlerWithOptionsUnion | undefined; + "on:auxclick"?: EventHandlerWithOptionsUnion | undefined; + "on:beforeinput"?: +- | EventHandlerWithOptionsUnion> +- | undefined; ++ EventHandlerWithOptionsUnion> | undefined; + "on:beforetoggle"?: EventHandlerWithOptionsUnion | undefined; + "on:blur"?: +- | EventHandlerWithOptionsUnion> +- | undefined; ++ EventHandlerWithOptionsUnion> | undefined; + "on:canplay"?: EventHandlerWithOptionsUnion | undefined; + "on:canplaythrough"?: EventHandlerWithOptionsUnion | undefined; + "on:change"?: EventHandlerWithOptionsUnion> | undefined; +@@ -416,12 +399,10 @@ export namespace JSX { + "on:ended"?: EventHandlerWithOptionsUnion | undefined; + "on:error"?: EventHandlerWithOptionsUnion | undefined; + "on:focus"?: +- | EventHandlerWithOptionsUnion> +- | undefined; ++ EventHandlerWithOptionsUnion> | undefined; + "on:gotpointercapture"?: EventHandlerWithOptionsUnion | undefined; + "on:input"?: +- | EventHandlerWithOptionsUnion> +- | undefined; ++ EventHandlerWithOptionsUnion> | undefined; + "on:invalid"?: EventHandlerWithOptionsUnion | undefined; + "on:keydown"?: EventHandlerWithOptionsUnion | undefined; + "on:keypress"?: EventHandlerWithOptionsUnion | undefined; +diff --git a/types/reactive/array.d.ts b/types/reactive/array.d.ts +index 379c23003e2b4fcd834e4375185e184014ba1773..2c27781ee86aa75212472087f0232b646022a06e 100644 +--- a/types/reactive/array.d.ts ++++ b/types/reactive/array.d.ts +@@ -29,13 +29,9 @@ SOFTWARE. + * + * @description https://docs.solidjs.com/reference/reactive-utilities/map-array + */ +-export declare function mapArray( +- list: Accessor, +- mapFn: (v: T, i: Accessor) => U, +- options?: { ++export declare function mapArray(list: Accessor, mapFn: (v: T, i: Accessor) => U, options?: { + fallback?: Accessor; +- } +-): () => U[]; ++}): () => U[]; + /** + * Reactively maps arrays by index instead of value - underlying helper for the `` control flow + * +@@ -43,10 +39,6 @@ export declare function mapArray( + * + * @description https://docs.solidjs.com/reference/reactive-utilities/index-array + */ +-export declare function indexArray( +- list: Accessor, +- mapFn: (v: Accessor, i: number) => U, +- options?: { ++export declare function indexArray(list: Accessor, mapFn: (v: Accessor, i: number) => U, options?: { + fallback?: Accessor; +- } +-): () => U[]; ++}): () => U[]; +diff --git a/types/reactive/observable.d.ts b/types/reactive/observable.d.ts +index cc16ce45d1c7cffd1e66551cac313d9af043545d..cbf4832d23dd9c1de9408d562edebc78246c5319 100644 +--- a/types/reactive/observable.d.ts ++++ b/types/reactive/observable.d.ts +@@ -1,22 +1,20 @@ + import { Accessor, Setter } from "./signal.js"; + declare global { +- interface SymbolConstructor { +- readonly observable: symbol; +- } ++ interface SymbolConstructor { ++ readonly observable: symbol; ++ } + } + interface Observable { +- subscribe(observer: ObservableObserver): { +- unsubscribe(): void; +- }; +- [Symbol.observable](): Observable; +-} +-export type ObservableObserver = +- | ((v: T) => void) +- | { +- next?: (v: T) => void; +- error?: (v: any) => void; +- complete?: (v: boolean) => void; ++ subscribe(observer: ObservableObserver): { ++ unsubscribe(): void; + }; ++ [Symbol.observable](): Observable; ++} ++export type ObservableObserver = ((v: T) => void) | { ++ next?: (v: T) => void; ++ error?: (v: any) => void; ++ complete?: (v: boolean) => void; ++}; + /** + * Creates a simple observable from a signal's accessor to be used with the `from` operator of observable libraries like e.g. rxjs + * ```typescript +@@ -28,15 +26,9 @@ export type ObservableObserver = + * description https://docs.solidjs.com/reference/reactive-utilities/observable + */ + export declare function observable(input: Accessor): Observable; +-export declare function from( +- producer: +- | ((setter: Setter) => () => void) +- | { +- subscribe: (fn: (v: T) => void) => +- | (() => void) +- | { +- unsubscribe: () => void; +- }; +- } +-): Accessor; ++export declare function from(producer: ((setter: Setter) => () => void) | { ++ subscribe: (fn: (v: T) => void) => (() => void) | { ++ unsubscribe: () => void; ++ }; ++}): Accessor; + export {}; +diff --git a/types/reactive/scheduler.d.ts b/types/reactive/scheduler.d.ts +index b4948c1ff20b4bfb7dd092de1e0f164f756bbb8b..a915c542fbbac2060fdf62d5e4366d11abeefd5a 100644 +--- a/types/reactive/scheduler.d.ts ++++ b/types/reactive/scheduler.d.ts +@@ -1,13 +1,10 @@ + export interface Task { +- id: number; +- fn: ((didTimeout: boolean) => void) | null; +- startTime: number; +- expirationTime: number; ++ id: number; ++ fn: ((didTimeout: boolean) => void) | null; ++ startTime: number; ++ expirationTime: number; + } +-export declare function requestCallback( +- fn: () => void, +- options?: { ++export declare function requestCallback(fn: () => void, options?: { + timeout: number; +- } +-): Task; ++}): Task; + export declare function cancelCallback(task: Task): void; +diff --git a/types/reactive/signal.d.ts b/types/reactive/signal.d.ts +index e7b46675f0f48123f6605ad21e431d7a0d2cf40a..3abae5f2ca1ff312abafb467440aaed323baf95a 100644 +--- a/types/reactive/signal.d.ts ++++ b/types/reactive/signal.d.ts +@@ -33,61 +33,58 @@ export declare var Owner: Owner | null; + export declare let Transition: TransitionState | null; + /** Object storing callbacks for debugging during development */ + export declare const DevHooks: { +- afterUpdate: (() => void) | null; +- afterCreateOwner: ((owner: Owner) => void) | null; +- afterCreateSignal: ((signal: SignalState) => void) | null; ++ afterUpdate: (() => void) | null; ++ afterCreateOwner: ((owner: Owner) => void) | null; ++ afterCreateSignal: ((signal: SignalState) => void) | null; + }; + export type ComputationState = 0 | 1 | 2; + export interface SourceMapValue { +- value: unknown; +- name?: string; +- graph?: Owner; ++ value: unknown; ++ name?: string; ++ graph?: Owner; + } + export interface SignalState extends SourceMapValue { +- value: T; +- observers: Computation[] | null; +- observerSlots: number[] | null; +- tValue?: T; +- comparator?: (prev: T, next: T) => boolean; ++ value: T; ++ observers: Computation[] | null; ++ observerSlots: number[] | null; ++ tValue?: T; ++ comparator?: (prev: T, next: T) => boolean; + } + export interface Owner { +- owned: Computation[] | null; +- cleanups: (() => void)[] | null; +- owner: Owner | null; +- context: any | null; +- sourceMap?: SourceMapValue[]; +- name?: string; ++ owned: Computation[] | null; ++ cleanups: (() => void)[] | null; ++ owner: Owner | null; ++ context: any | null; ++ sourceMap?: SourceMapValue[]; ++ name?: string; + } + export interface Computation extends Owner { +- fn: EffectFunction; +- state: ComputationState; +- tState?: ComputationState; +- sources: SignalState[] | null; +- sourceSlots: number[] | null; +- value?: Init; +- updatedAt: number | null; +- pure: boolean; +- user?: boolean; +- suspense?: SuspenseContextType; ++ fn: EffectFunction; ++ state: ComputationState; ++ tState?: ComputationState; ++ sources: SignalState[] | null; ++ sourceSlots: number[] | null; ++ value?: Init; ++ updatedAt: number | null; ++ pure: boolean; ++ user?: boolean; ++ suspense?: SuspenseContextType; + } + export interface TransitionState { +- sources: Set>; +- effects: Computation[]; +- promises: Set>; +- disposed: Set>; +- queue: Set>; +- scheduler?: (fn: () => void) => unknown; +- running: boolean; +- done?: Promise; +- resolve?: () => void; ++ sources: Set>; ++ effects: Computation[]; ++ promises: Set>; ++ disposed: Set>; ++ queue: Set>; ++ scheduler?: (fn: () => void) => unknown; ++ running: boolean; ++ done?: Promise; ++ resolve?: () => void; + } +-type ExternalSourceFactory = ( +- fn: EffectFunction, +- trigger: () => void +-) => ExternalSource; ++type ExternalSourceFactory = (fn: EffectFunction, trigger: () => void) => ExternalSource; + export interface ExternalSource { +- track: EffectFunction; +- dispose: () => void; ++ track: EffectFunction; ++ dispose: () => void; + } + export type RootFunction = (dispose: () => void) => T; + /** +@@ -102,16 +99,14 @@ export type RootFunction = (dispose: () => void) => T; + export declare function createRoot(fn: RootFunction, detachedOwner?: typeof Owner): T; + export type Accessor = () => T; + export type Setter = { +- ( +- ...args: undefined extends T ? [] : [value: Exclude | ((prev: T) => U)] +- ): undefined extends T ? undefined : U; +- (value: (prev: T) => U): U; +- (value: Exclude): U; +- (value: Exclude | ((prev: T) => U)): U; ++ (...args: undefined extends T ? [] : [value: Exclude | ((prev: T) => U)]): undefined extends T ? undefined : U; ++ (value: (prev: T) => U): U; ++ (value: Exclude): U; ++ (value: Exclude | ((prev: T) => U)): U; + }; + export type Signal = [get: Accessor, set: Setter]; + export interface SignalOptions extends MemoOptions { +- internal?: boolean; ++ internal?: boolean; + } + /** + * Creates a simple reactive state with a getter and setter +@@ -139,10 +134,11 @@ export interface SignalOptions extends MemoOptions { + export declare function createSignal(): Signal; + export declare function createSignal(value: T, options?: SignalOptions): Signal; + export interface BaseOptions { +- name?: string; ++ name?: string; + } + export type NoInfer = [T][T extends any ? 0 : never]; +-export interface EffectOptions extends BaseOptions {} ++export interface EffectOptions extends BaseOptions { ++} + export type EffectFunction = (v: Prev) => Next; + /** + * Creates a reactive computation that runs immediately before render, mainly used to write to other reactive primitives +@@ -159,14 +155,8 @@ export type EffectFunction = (v: Prev) => Next; + * + * @description https://docs.solidjs.com/reference/secondary-primitives/create-computed + */ +-export declare function createComputed( +- fn: EffectFunction, Next> +-): void; +-export declare function createComputed( +- fn: EffectFunction, +- value: Init, +- options?: EffectOptions +-): void; ++export declare function createComputed(fn: EffectFunction, Next>): void; ++export declare function createComputed(fn: EffectFunction, value: Init, options?: EffectOptions): void; + /** + * Creates a reactive computation that runs during the render phase as DOM elements are created and updated but not necessarily connected + * ```typescript +@@ -182,14 +172,8 @@ export declare function createComputed( + * + * @description https://docs.solidjs.com/reference/secondary-primitives/create-render-effect + */ +-export declare function createRenderEffect( +- fn: EffectFunction, Next> +-): void; +-export declare function createRenderEffect( +- fn: EffectFunction, +- value: Init, +- options?: EffectOptions +-): void; ++export declare function createRenderEffect(fn: EffectFunction, Next>): void; ++export declare function createRenderEffect(fn: EffectFunction, value: Init, options?: EffectOptions): void; + /** + * Creates a reactive computation that runs after the render phase + * ```typescript +@@ -205,16 +189,10 @@ export declare function createRenderEffect( + * + * @description https://docs.solidjs.com/reference/basic-reactivity/create-effect + */ +-export declare function createEffect( +- fn: EffectFunction, Next> +-): void; +-export declare function createEffect( +- fn: EffectFunction, +- value: Init, +- options?: EffectOptions & { ++export declare function createEffect(fn: EffectFunction, Next>): void; ++export declare function createEffect(fn: EffectFunction, value: Init, options?: EffectOptions & { + render?: boolean; +- } +-): void; ++}): void; + /** + * Creates a reactive computation that runs after the render phase with flexible tracking + * ```typescript +@@ -228,16 +206,13 @@ export declare function createEffect( + * + * @description https://docs.solidjs.com/reference/secondary-primitives/create-reaction + */ +-export declare function createReaction( +- onInvalidate: () => void, +- options?: EffectOptions +-): (tracking: () => void) => void; ++export declare function createReaction(onInvalidate: () => void, options?: EffectOptions): (tracking: () => void) => void; + export interface Memo extends SignalState, Computation { +- value: Next; +- tOwned?: Computation[]; ++ value: Next; ++ tOwned?: Computation[]; + } + export interface MemoOptions extends EffectOptions { +- equals?: false | ((prev: T, next: T) => boolean); ++ equals?: false | ((prev: T, next: T) => boolean); + } + /** + * Creates a readonly derived reactive memoized signal +@@ -254,84 +229,72 @@ export interface MemoOptions extends EffectOptions { + * + * @description https://docs.solidjs.com/reference/basic-reactivity/create-memo + */ +-export declare function createMemo( +- fn: EffectFunction, Next> +-): Accessor; +-export declare function createMemo( +- fn: EffectFunction, +- value: Init, +- options?: MemoOptions +-): Accessor; ++export declare function createMemo(fn: EffectFunction, Next>): Accessor; ++export declare function createMemo(fn: EffectFunction, value: Init, options?: MemoOptions): Accessor; + interface Unresolved { +- state: "unresolved"; +- loading: false; +- error: undefined; +- latest: undefined; +- (): undefined; ++ state: "unresolved"; ++ loading: false; ++ error: undefined; ++ latest: undefined; ++ (): undefined; + } + interface Pending { +- state: "pending"; +- loading: true; +- error: undefined; +- latest: undefined; +- (): undefined; ++ state: "pending"; ++ loading: true; ++ error: undefined; ++ latest: undefined; ++ (): undefined; + } + interface Ready { +- state: "ready"; +- loading: false; +- error: undefined; +- latest: T; +- (): T; ++ state: "ready"; ++ loading: false; ++ error: undefined; ++ latest: T; ++ (): T; + } + interface Refreshing { +- state: "refreshing"; +- loading: true; +- error: undefined; +- latest: T; +- (): T; ++ state: "refreshing"; ++ loading: true; ++ error: undefined; ++ latest: T; ++ (): T; + } + interface Errored { +- state: "errored"; +- loading: false; +- error: any; +- latest: never; +- (): never; ++ state: "errored"; ++ loading: false; ++ error: any; ++ latest: never; ++ (): never; + } + export type Resource = Unresolved | Pending | Ready | Refreshing | Errored; + export type InitializedResource = Ready | Refreshing | Errored; + export type ResourceActions = { +- mutate: Setter; +- refetch: (info?: R) => T | Promise | undefined | null; ++ mutate: Setter; ++ refetch: (info?: R) => T | Promise | undefined | null; + }; + export type ResourceSource = S | false | null | undefined | (() => S | false | null | undefined); +-export type ResourceFetcher = ( +- k: S, +- info: ResourceFetcherInfo +-) => T | Promise; ++export type ResourceFetcher = (k: S, info: ResourceFetcherInfo) => T | Promise; + export type ResourceFetcherInfo = { +- value: T | undefined; +- refetching: R | boolean; ++ value: T | undefined; ++ refetching: R | boolean; + }; + export type ResourceOptions = { +- initialValue?: T; +- name?: string; +- deferStream?: boolean; +- ssrLoadFrom?: "initial" | "server"; +- storage?: (init: T | undefined) => [Accessor, Setter]; +- onHydrated?: ( +- k: S | undefined, +- info: { +- value: T | undefined; +- } +- ) => void; ++ initialValue?: T; ++ name?: string; ++ deferStream?: boolean; ++ ssrLoadFrom?: "initial" | "server"; ++ storage?: (init: T | undefined) => [Accessor, Setter]; ++ onHydrated?: (k: S | undefined, info: { ++ value: T | undefined; ++ }) => void; + }; + export type InitializedResourceOptions = ResourceOptions & { +- initialValue: T; ++ initialValue: T; + }; + export type ResourceReturn = [Resource, ResourceActions]; + export type InitializedResourceReturn = [ +- InitializedResource, +- ResourceActions ++ InitializedResource, ++ ResourceActions + ]; + /** + * Creates a resource that wraps a repeated promise in a reactive pattern: +@@ -361,28 +324,14 @@ export type InitializedResourceReturn = [ + * + * @description https://docs.solidjs.com/reference/basic-reactivity/create-resource + */ +-export declare function createResource( +- fetcher: ResourceFetcher, +- options: InitializedResourceOptions, true> +-): InitializedResourceReturn; +-export declare function createResource( +- fetcher: ResourceFetcher, +- options?: ResourceOptions, true> +-): ResourceReturn; +-export declare function createResource( +- source: ResourceSource, +- fetcher: ResourceFetcher, +- options: InitializedResourceOptions, S> +-): InitializedResourceReturn; +-export declare function createResource( +- source: ResourceSource, +- fetcher: ResourceFetcher, +- options?: ResourceOptions, S> +-): ResourceReturn; ++export declare function createResource(fetcher: ResourceFetcher, options: InitializedResourceOptions, true>): InitializedResourceReturn; ++export declare function createResource(fetcher: ResourceFetcher, options?: ResourceOptions, true>): ResourceReturn; ++export declare function createResource(source: ResourceSource, fetcher: ResourceFetcher, options: InitializedResourceOptions, S>): InitializedResourceReturn; ++export declare function createResource(source: ResourceSource, fetcher: ResourceFetcher, options?: ResourceOptions, S>): ResourceReturn; + export interface DeferredOptions { +- equals?: false | ((prev: T, next: T) => boolean); +- name?: string; +- timeoutMs?: number; ++ equals?: false | ((prev: T, next: T) => boolean); ++ name?: string; ++ timeoutMs?: number; + } + /** + * Creates a reactive computation that only runs and notifies the reactive context when the browser is idle +@@ -397,10 +346,7 @@ export interface DeferredOptions { + * + * @description https://docs.solidjs.com/reference/secondary-primitives/create-deferred + */ +-export declare function createDeferred( +- source: Accessor, +- options?: DeferredOptions +-): Accessor; ++export declare function createDeferred(source: Accessor, options?: DeferredOptions): Accessor; + export type EqualityCheckerFunction = (a: U, b: T) => boolean; + /** + * Creates a conditional signal that only notifies subscribers when entering or exiting their key matching the value +@@ -426,11 +372,7 @@ export type EqualityCheckerFunction = (a: U, b: T) => boolean; + * + * @description https://docs.solidjs.com/reference/secondary-primitives/create-selector + */ +-export declare function createSelector( +- source: Accessor, +- fn?: EqualityCheckerFunction, +- options?: BaseOptions +-): (key: U) => boolean; ++export declare function createSelector(source: Accessor, fn?: EqualityCheckerFunction, options?: BaseOptions): (key: U) => boolean; + /** + * Holds changes inside the block before the reactive context is updated + * @param fn wraps the reactive updates that should be batched +@@ -448,28 +390,15 @@ export declare function batch(fn: Accessor): T; + */ + export declare function untrack(fn: Accessor): T; + /** @deprecated */ +-export type ReturnTypes = T extends readonly Accessor[] +- ? { +- [K in keyof T]: T[K] extends Accessor ? I : never; +- } +- : T extends Accessor +- ? I +- : never; +-export type AccessorArray = [ +- ...Extract< +- { +- [K in keyof T]: Accessor; +- }, +- readonly unknown[] +- > +-]; +-export type OnEffectFunction = ( +- input: S, +- prevInput: S | undefined, +- prev: Prev +-) => Next; ++export type ReturnTypes = T extends readonly Accessor[] ? { ++ [K in keyof T]: T[K] extends Accessor ? I : never; ++} : T extends Accessor ? I : never; ++export type AccessorArray = [...Extract<{ ++ [K in keyof T]: Accessor; ++}, readonly unknown[]>]; ++export type OnEffectFunction = (input: S, prevInput: S | undefined, prev: Prev) => Next; + export interface OnOptions { +- defer?: boolean; ++ defer?: boolean; + } + /** + * Makes dependencies of a computation explicit +@@ -497,22 +426,12 @@ export interface OnOptions { + * + * @description https://docs.solidjs.com/reference/reactive-utilities/on + */ +-export declare function on( +- deps: AccessorArray | Accessor, +- fn: OnEffectFunction, Next>, +- options?: OnOptions & { ++export declare function on(deps: AccessorArray | Accessor, fn: OnEffectFunction, Next>, options?: OnOptions & { + defer?: false; +- } +-): EffectFunction, NoInfer>; +-export declare function on( +- deps: AccessorArray | Accessor, +- fn: OnEffectFunction, Next>, +- options: +- | OnOptions +- | { +- defer: true; +- } +-): EffectFunction>; ++}): EffectFunction, NoInfer>; ++export declare function on(deps: AccessorArray | Accessor, fn: OnEffectFunction, Next>, options: OnOptions | { ++ defer: true; ++}): EffectFunction>; + /** + * Runs an effect only after initial render on mount + * @param fn an effect that should run only once on mount +@@ -566,19 +485,19 @@ export type Transition = [Accessor, (fn: () => void) => Promise]; + export declare function useTransition(): Transition; + export declare function resumeEffects(e: Computation[]): void; + export interface DevComponent extends Memo { +- props: T; +- name: string; +- component: (props: T) => unknown; ++ props: T; ++ name: string; ++ component: (props: T) => unknown; + } + export declare function devComponent(Comp: (props: P) => V, props: P): V; + export declare function registerGraph(value: SourceMapValue): void; + export type ContextProviderComponent = FlowComponent<{ +- value: T; ++ value: T; + }>; + export interface Context { +- id: symbol; +- Provider: ContextProviderComponent; +- defaultValue: T; ++ id: symbol; ++ Provider: ContextProviderComponent; ++ defaultValue: T; + } + /** + * Creates a Context to handle a state scoped for the children of a component +@@ -599,10 +518,7 @@ export interface Context { + * + * @description https://docs.solidjs.com/reference/component-apis/create-context + */ +-export declare function createContext( +- defaultValue?: undefined, +- options?: EffectOptions +-): Context; ++export declare function createContext(defaultValue?: undefined, options?: EffectOptions): Context; + export declare function createContext(defaultValue: T, options?: EffectOptions): Context; + /** + * Uses a context to receive a scoped state from a parent's Context.Provider +@@ -616,7 +532,7 @@ export declare function useContext(context: Context): T; + export type ResolvedJSXElement = Exclude; + export type ResolvedChildren = ResolvedJSXElement | ResolvedJSXElement[]; + export type ChildrenReturn = Accessor & { +- toArray: () => ResolvedJSXElement[]; ++ toArray: () => ResolvedJSXElement[]; + }; + /** + * Resolves child elements to help interact with children +@@ -628,29 +544,22 @@ export type ChildrenReturn = Accessor & { + */ + export declare function children(fn: Accessor): ChildrenReturn; + export type SuspenseContextType = { +- increment?: () => void; +- decrement?: () => void; +- inFallback?: () => boolean; +- effects?: Computation[]; +- resolved?: boolean; ++ increment?: () => void; ++ decrement?: () => void; ++ inFallback?: () => boolean; ++ effects?: Computation[]; ++ resolved?: boolean; + }; + type SuspenseContext = Context & { +- active?(): boolean; +- increment?(): void; +- decrement?(): void; ++ active?(): boolean; ++ increment?(): void; ++ decrement?(): void; + }; + declare let SuspenseContext: SuspenseContext; + export declare function getSuspenseContext(): SuspenseContext; +-export declare function enableExternalSource( +- factory: ExternalSourceFactory, +- untrack?: (fn: () => V) => V +-): void; ++export declare function enableExternalSource(factory: ExternalSourceFactory, untrack?: (fn: () => V) => V): void; + export declare function readSignal(this: SignalState | Memo): any; +-export declare function writeSignal( +- node: SignalState | Memo, +- value: any, +- isComp?: boolean +-): any; ++export declare function writeSignal(node: SignalState | Memo, value: any, isComp?: boolean): any; + /** + * @deprecated since version 1.7.0 and will be removed in next major - use catchError instead + * onError - run an effect whenever an error is thrown within the context of the child scopes +diff --git a/types/render/Suspense.d.ts b/types/render/Suspense.d.ts +index 561699209de7979518e10520a637f60fc91e0087..7cbe6ed253a4fd36b8498575fc46e83916301d84 100644 +--- a/types/render/Suspense.d.ts ++++ b/types/render/Suspense.d.ts +@@ -5,9 +5,9 @@ import type { JSX } from "../jsx.js"; + * @description https://docs.solidjs.com/reference/components/suspense-list + */ + export declare function SuspenseList(props: { +- children: JSX.Element; +- revealOrder: "forwards" | "backwards" | "together"; +- tail?: "collapsed" | "hidden"; ++ children: JSX.Element; ++ revealOrder: "forwards" | "backwards" | "together"; ++ tail?: "collapsed" | "hidden"; + }): JSX.Element; + /** + * Tracks all resources inside a component and renders a fallback until they are all resolved +@@ -21,6 +21,6 @@ export declare function SuspenseList(props: { + * @description https://docs.solidjs.com/reference/components/suspense + */ + export declare function Suspense(props: { +- fallback?: JSX.Element; +- children: JSX.Element; ++ fallback?: JSX.Element; ++ children: JSX.Element; + }): JSX.Element; +diff --git a/types/render/component.d.ts b/types/render/component.d.ts +index 10f7380c3f167862407fd12f8433f160b77ae789..572198c0b52d318d25a84b286849e33b9d52e4d6 100644 +--- a/types/render/component.d.ts ++++ b/types/render/component.d.ts +@@ -11,7 +11,7 @@ export type Component

= {}> = (props: P) => JSX.El + * would silently throw them away. + */ + export type VoidProps

= {}> = P & { +- children?: never; ++ children?: never; + }; + /** + * `VoidComponent` forbids the `children` prop. +@@ -25,7 +25,7 @@ export type VoidComponent

= {}> = Component = {}> = P & { +- children?: JSX.Element; ++ children?: JSX.Element; + }; + /** + * `ParentComponent` allows an optional `children` prop with the usual +@@ -40,7 +40,7 @@ export type ParentComponent

= {}> = Component are of the type `JSX.Element`. + */ + export type FlowProps

= {}, C = JSX.Element> = P & { +- children: C; ++ children: C; + }; + /** + * `FlowComponent` requires a `children` prop with the specified type. +@@ -48,9 +48,7 @@ export type FlowProps

= {}, C = JSX.Element> = P & + * typically a function that receives specific argument types. + * Note that all JSX are of the type `JSX.Element`. + */ +-export type FlowComponent

= {}, C = JSX.Element> = Component< +- FlowProps +->; ++export type FlowComponent

= {}, C = JSX.Element> = Component>; + /** @deprecated: use `ParentProps` instead */ + export type PropsWithChildren

= {}> = ParentProps

; + export type ValidComponent = keyof JSX.IntrinsicElements | Component | (string & {}); +@@ -61,87 +59,53 @@ export type ValidComponent = keyof JSX.IntrinsicElements | Component | (str + * ComponentProps // { mount?: Node; useShadow?: boolean; children: JSX.Element } + * ComponentProps<'div'> // JSX.HTMLAttributes + */ +-export type ComponentProps = T extends Component +- ? P +- : T extends keyof JSX.IntrinsicElements +- ? JSX.IntrinsicElements[T] +- : Record; ++export type ComponentProps = T extends Component ? P : T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] : Record; + /** + * Type of `props.ref`, for use in `Component` or `props` typing. + * + * @example Component<{ref: Ref}> + */ + export type Ref = T | ((val: T) => void); +-export declare function createComponent>( +- Comp: Component, +- props: T +-): JSX.Element; ++export declare function createComponent>(Comp: Component, props: T): JSX.Element; + type DistributeOverride = T extends undefined ? F : T; +-type Override = T extends any +- ? U extends any +- ? { +- [K in keyof T]: K extends keyof U ? DistributeOverride : T[K]; +- } & { +- [K in keyof U]: K extends keyof T ? DistributeOverride : U[K]; +- } +- : T & U +- : T & U; +-type OverrideSpread = T extends any +- ? { +- [K in keyof ({ ++type Override = T extends any ? U extends any ? { ++ [K in keyof T]: K extends keyof U ? DistributeOverride : T[K]; ++} & { ++ [K in keyof U]: K extends keyof T ? DistributeOverride : U[K]; ++} : T & U : T & U; ++type OverrideSpread = T extends any ? { ++ [K in keyof ({ + [K in keyof T]: any; +- } & { ++ } & { + [K in keyof U]?: any; +- } & { ++ } & { + [K in U extends any ? keyof U : keyof U]?: any; +- })]: K extends keyof T +- ? Exclude | T[K] +- : U extends any +- ? U[K & keyof U] +- : never; +- } +- : T & U; +-type Simplify = T extends any +- ? { +- [K in keyof T]: T[K]; +- } +- : T; ++ })]: K extends keyof T ? Exclude | T[K] : U extends any ? U[K & keyof U] : never; ++} : T & U; ++type Simplify = T extends any ? { ++ [K in keyof T]: T[K]; ++} : T; + type _MergeProps = T extends [ +- infer Next | (() => infer Next), +- ...infer Rest +-] +- ? _MergeProps> +- : T extends [...infer Rest, infer Next | (() => infer Next)] +- ? Override<_MergeProps, Next> +- : T extends [] +- ? Curr +- : T extends (infer I | (() => infer I))[] +- ? OverrideSpread +- : Curr; ++ infer Next | (() => infer Next), ++ ...infer Rest ++] ? _MergeProps> : T extends [...infer Rest, infer Next | (() => infer Next)] ? Override<_MergeProps, Next> : T extends [] ? Curr : T extends (infer I | (() => infer I))[] ? OverrideSpread : Curr; + export type MergeProps = Simplify<_MergeProps>; + export declare function mergeProps(...sources: T): MergeProps; + export type SplitProps = [ +- ...{ +- [P in keyof K]: P extends `${number}` +- ? Pick[number]> +- : never; +- }, +- { +- [P in keyof T as Exclude]: T[P]; +- } ++ ...{ ++ [P in keyof K]: P extends `${number}` ? Pick[number]> : never; ++ }, ++ { ++ [P in keyof T as Exclude]: T[P]; ++ } + ]; +-export declare function splitProps< +- T extends Record, +- K extends [readonly (keyof T)[], ...(readonly (keyof T)[])[]] +->(props: T, ...keys: K): SplitProps; +-export declare function lazy>( +- fn: () => Promise<{ +- default: T; +- }> +-): T & { +- preload: () => Promise<{ ++export declare function splitProps, K extends [readonly (keyof T)[], ...(readonly (keyof T)[])[]]>(props: T, ...keys: K): SplitProps; ++export declare function lazy>(fn: () => Promise<{ + default: T; +- }>; ++}>): T & { ++ preload: () => Promise<{ ++ default: T; ++ }>; + }; + export declare function createUniqueId(): string; + export {}; +diff --git a/types/render/flow.d.ts b/types/render/flow.d.ts +index 2095166db9e889eaded22761cdc8bbdecb09d4ef..fa3e1bab34d66cc48fe081dee4f3ad4d3f433758 100644 +--- a/types/render/flow.d.ts ++++ b/types/render/flow.d.ts +@@ -14,9 +14,9 @@ import type { JSX } from "../jsx.js"; + * @description https://docs.solidjs.com/reference/components/for + */ + export declare function For(props: { +- each: T | undefined | null | false; +- fallback?: JSX.Element; +- children: (item: T[number], index: Accessor) => U; ++ each: T | undefined | null | false; ++ fallback?: JSX.Element; ++ children: (item: T[number], index: Accessor) => U; + }): JSX.Element; + /** + * Non-keyed iteration over a list creating elements from its items +@@ -32,32 +32,26 @@ export declare function For(pro + * @description https://docs.solidjs.com/reference/components/index + */ + export declare function Index(props: { +- each: T | undefined | null | false; +- fallback?: JSX.Element; +- children: (item: Accessor, index: number) => U; ++ each: T | undefined | null | false; ++ fallback?: JSX.Element; ++ children: (item: Accessor, index: number) => U; + }): JSX.Element; + type RequiredParameter = T extends () => unknown ? never : T; + /** + * Conditionally render its children or an optional fallback component + * @description https://docs.solidjs.com/reference/components/show + */ +-export declare function Show< +- T, +- TRenderFunction extends (item: Accessor>) => JSX.Element +->(props: { +- when: T | undefined | null | false; +- keyed?: false; +- fallback?: JSX.Element; +- children: JSX.Element | RequiredParameter; ++export declare function Show>) => JSX.Element>(props: { ++ when: T | undefined | null | false; ++ keyed?: false; ++ fallback?: JSX.Element; ++ children: JSX.Element | RequiredParameter; + }): JSX.Element; +-export declare function Show< +- T, +- TRenderFunction extends (item: NonNullable) => JSX.Element +->(props: { +- when: T | undefined | null | false; +- keyed: true; +- fallback?: JSX.Element; +- children: JSX.Element | RequiredParameter; ++export declare function Show) => JSX.Element>(props: { ++ when: T | undefined | null | false; ++ keyed: true; ++ fallback?: JSX.Element; ++ children: JSX.Element | RequiredParameter; + }): JSX.Element; + /** + * Switches between content based on mutually exclusive conditions +@@ -74,13 +68,13 @@ export declare function Show< + * @description https://docs.solidjs.com/reference/components/switch-and-match + */ + export declare function Switch(props: { +- fallback?: JSX.Element; +- children: JSX.Element; ++ fallback?: JSX.Element; ++ children: JSX.Element; + }): JSX.Element; + export type MatchProps = { +- when: T | undefined | null | false; +- keyed?: boolean; +- children: JSX.Element | ((item: NonNullable | Accessor>) => JSX.Element); ++ when: T | undefined | null | false; ++ keyed?: boolean; ++ children: JSX.Element | ((item: NonNullable | Accessor>) => JSX.Element); + }; + /** + * Selects a content based on condition when inside a `` control flow +@@ -91,21 +85,15 @@ export type MatchProps = { + * ``` + * @description https://docs.solidjs.com/reference/components/switch-and-match + */ +-export declare function Match< +- T, +- TRenderFunction extends (item: Accessor>) => JSX.Element +->(props: { +- when: T | undefined | null | false; +- keyed?: false; +- children: JSX.Element | RequiredParameter; ++export declare function Match>) => JSX.Element>(props: { ++ when: T | undefined | null | false; ++ keyed?: false; ++ children: JSX.Element | RequiredParameter; + }): JSX.Element; +-export declare function Match< +- T, +- TRenderFunction extends (item: NonNullable) => JSX.Element +->(props: { +- when: T | undefined | null | false; +- keyed: true; +- children: JSX.Element | RequiredParameter; ++export declare function Match) => JSX.Element>(props: { ++ when: T | undefined | null | false; ++ keyed: true; ++ children: JSX.Element | RequiredParameter; + }): JSX.Element; + export declare function resetErrorBoundaries(): void; + /** +@@ -124,7 +112,7 @@ export declare function resetErrorBoundaries(): void; + * @description https://docs.solidjs.com/reference/components/error-boundary + */ + export declare function ErrorBoundary(props: { +- fallback: JSX.Element | ((err: any, reset: () => void) => JSX.Element); +- children: JSX.Element; ++ fallback: JSX.Element | ((err: any, reset: () => void) => JSX.Element); ++ children: JSX.Element; + }): JSX.Element; + export {}; +diff --git a/types/render/hydration.d.ts b/types/render/hydration.d.ts +index 53d2e4b189d1ced9266792d827a755f2c1af58e4..cc7c5b322c9016fd563f47f4fec7ce4bbbe5eac5 100644 +--- a/types/render/hydration.d.ts ++++ b/types/render/hydration.d.ts +@@ -1,22 +1,22 @@ + import { Computation } from "../reactive/signal.js"; + export type HydrationContext = { +- id: string; +- count: number; ++ id: string; ++ count: number; + }; + type SharedConfig = { +- context?: HydrationContext; +- resources?: { +- [key: string]: any; +- }; +- load?: (id: string) => Promise | any; +- has?: (id: string) => boolean; +- gather?: (key: string) => void; +- registry?: Map; +- done?: boolean; +- count?: number; +- effects?: Computation[]; +- getContextId(): string; +- getNextContextId(): string; ++ context?: HydrationContext; ++ resources?: { ++ [key: string]: any; ++ }; ++ load?: (id: string) => Promise | any; ++ has?: (id: string) => boolean; ++ gather?: (key: string) => void; ++ registry?: Map; ++ done?: boolean; ++ count?: number; ++ effects?: Computation[]; ++ getContextId(): string; ++ getNextContextId(): string; + }; + export declare const sharedConfig: SharedConfig; + export declare function setHydrateContext(context?: HydrationContext): void; +diff --git a/types/server/index.d.ts b/types/server/index.d.ts +index 13593881387503d24dcc452298ab2112a7c47044..2e608c8b7f823e1869f7d208fa40496c22e9df2c 100644 +--- a/types/server/index.d.ts ++++ b/types/server/index.d.ts +@@ -1,58 +1,3 @@ +-export { +- catchError, +- createRoot, +- createSignal, +- createComputed, +- createRenderEffect, +- createEffect, +- createReaction, +- createDeferred, +- createSelector, +- createMemo, +- getListener, +- onMount, +- onCleanup, +- onError, +- untrack, +- batch, +- on, +- children, +- createContext, +- useContext, +- getOwner, +- runWithOwner, +- equalFn, +- requestCallback, +- mapArray, +- indexArray, +- observable, +- from, +- $PROXY, +- $DEVCOMP, +- $TRACK, +- DEV, +- enableExternalSource +-} from "./reactive.js"; +-export { +- mergeProps, +- splitProps, +- createComponent, +- For, +- Index, +- Show, +- Switch, +- Match, +- ErrorBoundary, +- Suspense, +- SuspenseList, +- createResource, +- resetErrorBoundaries, +- enableScheduling, +- enableHydration, +- startTransition, +- useTransition, +- createUniqueId, +- lazy, +- sharedConfig +-} from "./rendering.js"; ++export { catchError, createRoot, createSignal, createComputed, createRenderEffect, createEffect, createReaction, createDeferred, createSelector, createMemo, getListener, onMount, onCleanup, onError, untrack, batch, on, children, createContext, useContext, getOwner, runWithOwner, equalFn, requestCallback, mapArray, indexArray, observable, from, $PROXY, $DEVCOMP, $TRACK, DEV, enableExternalSource } from "./reactive.js"; ++export { mergeProps, splitProps, createComponent, For, Index, Show, Switch, Match, ErrorBoundary, Suspense, SuspenseList, createResource, resetErrorBoundaries, enableScheduling, enableHydration, startTransition, useTransition, createUniqueId, lazy, sharedConfig } from "./rendering.js"; + export type { Component, Resource } from "./rendering.js"; +diff --git a/types/server/reactive.d.ts b/types/server/reactive.d.ts +index 50ea16a66036b71daf11c61fb09d6c7f0e27dd03..08ee495d35367a4e486b5fab83284c8d166b9543 100644 +--- a/types/server/reactive.d.ts ++++ b/types/server/reactive.d.ts +@@ -4,118 +4,87 @@ export declare const $TRACK: unique symbol; + export declare const $DEVCOMP: unique symbol; + export declare const DEV: undefined; + export type Accessor = () => T; +-export type Setter = undefined extends T +- ? (value?: (U extends Function ? never : U) | ((prev?: T) => U)) => U +- : (value: (U extends Function ? never : U) | ((prev: T) => U)) => U; ++export type Setter = undefined extends T ? (value?: (U extends Function ? never : U) | ((prev?: T) => U)) => U : (value: (U extends Function ? never : U) | ((prev: T) => U)) => U; + export type Signal = [get: Accessor, set: Setter]; + export declare function castError(err: unknown): Error; + export declare let Owner: Owner | null; + interface Owner { +- owner: Owner | null; +- context: any | null; +- owned: Owner[] | null; +- cleanups: (() => void)[] | null; ++ owner: Owner | null; ++ context: any | null; ++ owned: Owner[] | null; ++ cleanups: (() => void)[] | null; + } + export declare function createOwner(): Owner; +-export declare function createRoot( +- fn: (dispose: () => void) => T, +- detachedOwner?: typeof Owner +-): T; +-export declare function createSignal( +- value: T, +- options?: { ++export declare function createRoot(fn: (dispose: () => void) => T, detachedOwner?: typeof Owner): T; ++export declare function createSignal(value: T, options?: { + equals?: false | ((prev: T, next: T) => boolean); + name?: string; +- } +-): [get: () => T, set: (v: (T extends Function ? never : T) | ((prev: T) => T)) => T]; ++}): [get: () => T, set: (v: (T extends Function ? never : T) | ((prev: T) => T)) => T]; + export declare function createComputed(fn: (v?: T) => T, value?: T): void; + export declare const createRenderEffect: typeof createComputed; + export declare function createEffect(fn: (v?: T) => T, value?: T): void; + export declare function createReaction(fn: () => void): (fn: () => void) => void; + export declare function createMemo(fn: (v?: T) => T, value?: T): () => T; + export declare function createDeferred(source: () => T): () => T; +-export declare function createSelector( +- source: () => T, +- fn?: (k: T, value: T) => boolean +-): (k: T) => boolean; ++export declare function createSelector(source: () => T, fn?: (k: T, value: T) => boolean): (k: T) => boolean; + export declare function batch(fn: () => T): T; + export declare const untrack: typeof batch; +-export declare function on( +- deps: Array<() => T> | (() => T), +- fn: (value: Array | T, prev?: Array | T, prevResults?: U) => U, +- options?: { ++export declare function on(deps: Array<() => T> | (() => T), fn: (value: Array | T, prev?: Array | T, prevResults?: U) => U, options?: { + defer?: boolean; +- } +-): (prev?: U) => U | undefined; ++}): (prev?: U) => U | undefined; + export declare function onMount(fn: () => void): void; + export declare function onCleanup(fn: () => void): () => void; + export declare function cleanNode(node: Owner): void; + export declare function catchError(fn: () => T, handler: (err: Error) => void): T | undefined; + export declare function getListener(): null; + export interface Context { +- id: symbol; +- Provider: (props: { value: T; children: any }) => any; +- defaultValue?: T; ++ id: symbol; ++ Provider: (props: { ++ value: T; ++ children: any; ++ }) => any; ++ defaultValue?: T; + } + export declare function createContext(defaultValue?: T): Context; + export declare function useContext(context: Context): T; + export declare function getOwner(): Owner | null; + type ChildrenReturn = Accessor & { +- toArray: () => any[]; ++ toArray: () => any[]; + }; + export declare function children(fn: () => any): ChildrenReturn; + export declare function runWithOwner(o: typeof Owner, fn: () => T): T | undefined; + export interface Task { +- id: number; +- fn: ((didTimeout: boolean) => void) | null; +- startTime: number; +- expirationTime: number; ++ id: number; ++ fn: ((didTimeout: boolean) => void) | null; ++ startTime: number; ++ expirationTime: number; + } +-export declare function requestCallback( +- fn: () => void, +- options?: { ++export declare function requestCallback(fn: () => void, options?: { + timeout: number; +- } +-): Task; ++}): Task; + export declare function cancelCallback(task: Task): void; +-export declare function mapArray( +- list: Accessor, +- mapFn: (v: T, i: Accessor) => U, +- options?: { ++export declare function mapArray(list: Accessor, mapFn: (v: T, i: Accessor) => U, options?: { + fallback?: Accessor; +- } +-): () => U[]; +-export declare function indexArray( +- list: Accessor, +- mapFn: (v: Accessor, i: number) => U, +- options?: { ++}): () => U[]; ++export declare function indexArray(list: Accessor, mapFn: (v: Accessor, i: number) => U, options?: { + fallback?: Accessor; +- } +-): () => U[]; +-export type ObservableObserver = +- | ((v: T) => void) +- | { +- next: (v: T) => void; +- error?: (v: any) => void; +- complete?: (v: boolean) => void; +- }; ++}): () => U[]; ++export type ObservableObserver = ((v: T) => void) | { ++ next: (v: T) => void; ++ error?: (v: any) => void; ++ complete?: (v: boolean) => void; ++}; + export declare function observable(input: Accessor): { +- subscribe(observer: ObservableObserver): { +- unsubscribe(): void; +- }; +- [Symbol.observable](): any; ++ subscribe(observer: ObservableObserver): { ++ unsubscribe(): void; ++ }; ++ [Symbol.observable](): any; + }; +-export declare function from( +- producer: +- | ((setter: Setter) => () => void) +- | { +- subscribe: (fn: (v: T) => void) => +- | (() => void) +- | { +- unsubscribe: () => void; +- }; +- } +-): Accessor; ++export declare function from(producer: ((setter: Setter) => () => void) | { ++ subscribe: (fn: (v: T) => void) => (() => void) | { ++ unsubscribe: () => void; ++ }; ++}): Accessor; + export declare function enableExternalSource(factory: any): void; + /** + * @deprecated since version 1.7.0 and will be removed in next major - use catchError instead +diff --git a/types/server/rendering.d.ts b/types/server/rendering.d.ts +index 6dfd7e15aab738db796cd5e41a8b5763b17649f7..9cee7b421f78feb15210be84b1d3713a5b358dfe 100644 +--- a/types/server/rendering.d.ts ++++ b/types/server/rendering.d.ts +@@ -2,229 +2,158 @@ import { Accessor, Setter, Signal } from "./reactive.js"; + import type { JSX } from "../jsx.js"; + export type Component

= (props: P) => JSX.Element; + export type VoidProps

= P & { +- children?: never; ++ children?: never; + }; + export type VoidComponent

= Component>; + export type ParentProps

= P & { +- children?: JSX.Element; ++ children?: JSX.Element; + }; + export type ParentComponent

= Component>; + export type FlowProps

= P & { +- children: C; ++ children: C; + }; + export type FlowComponent

= Component>; + export type Ref = T | ((val: T) => void); + export type ValidComponent = keyof JSX.IntrinsicElements | Component | (string & {}); +-export type ComponentProps = T extends Component +- ? P +- : T extends keyof JSX.IntrinsicElements +- ? JSX.IntrinsicElements[T] +- : Record; ++export type ComponentProps = T extends Component ? P : T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] : Record; + type SharedConfig = { +- context?: HydrationContext; +- getContextId(): string; +- getNextContextId(): string; ++ context?: HydrationContext; ++ getContextId(): string; ++ getNextContextId(): string; + }; + export declare const sharedConfig: SharedConfig; + export declare function createUniqueId(): string; + export declare function createComponent(Comp: (props: T) => JSX.Element, props: T): JSX.Element; + export declare function mergeProps(source: T, source1: U): T & U; + export declare function mergeProps(source: T, source1: U, source2: V): T & U & V; +-export declare function mergeProps( +- source: T, +- source1: U, +- source2: V, +- source3: W +-): T & U & V & W; +-export declare function splitProps( +- props: T, +- ...keys: [K1[]] +-): [Pick, Omit]; +-export declare function splitProps( +- props: T, +- ...keys: [K1[], K2[]] +-): [Pick, Pick, Omit]; +-export declare function splitProps< +- T extends object, +- K1 extends keyof T, +- K2 extends keyof T, +- K3 extends keyof T +->( +- props: T, +- ...keys: [K1[], K2[], K3[]] +-): [Pick, Pick, Pick, Omit]; +-export declare function splitProps< +- T extends object, +- K1 extends keyof T, +- K2 extends keyof T, +- K3 extends keyof T, +- K4 extends keyof T +->( +- props: T, +- ...keys: [K1[], K2[], K3[], K4[]] +-): [Pick, Pick, Pick, Pick, Omit]; +-export declare function splitProps< +- T extends object, +- K1 extends keyof T, +- K2 extends keyof T, +- K3 extends keyof T, +- K4 extends keyof T, +- K5 extends keyof T +->( +- props: T, +- ...keys: [K1[], K2[], K3[], K4[], K5[]] +-): [ +- Pick, +- Pick, +- Pick, +- Pick, +- Pick, +- Omit ++export declare function mergeProps(source: T, source1: U, source2: V, source3: W): T & U & V & W; ++export declare function splitProps(props: T, ...keys: [K1[]]): [Pick, Omit]; ++export declare function splitProps(props: T, ...keys: [K1[], K2[]]): [Pick, Pick, Omit]; ++export declare function splitProps(props: T, ...keys: [K1[], K2[], K3[]]): [Pick, Pick, Pick, Omit]; ++export declare function splitProps(props: T, ...keys: [K1[], K2[], K3[], K4[]]): [Pick, Pick, Pick, Pick, Omit]; ++export declare function splitProps(props: T, ...keys: [K1[], K2[], K3[], K4[], K5[]]): [ ++ Pick, ++ Pick, ++ Pick, ++ Pick, ++ Pick, ++ Omit + ]; + export declare function For(props: { +- each: T[]; +- fallback?: string; +- children: (item: T, index: () => number) => string; ++ each: T[]; ++ fallback?: string; ++ children: (item: T, index: () => number) => string; + }): string | any[] | undefined; + export declare function Index(props: { +- each: T[]; +- fallback?: string; +- children: (item: () => T, index: number) => string; ++ each: T[]; ++ fallback?: string; ++ children: (item: () => T, index: number) => string; + }): string | any[] | undefined; + /** + * Conditionally render its children or an optional fallback component + * @description https://docs.solidjs.com/reference/components/show + */ + export declare function Show(props: { +- when: T | undefined | null | false; +- keyed?: boolean; +- fallback?: string; +- children: string | ((item: NonNullable | Accessor>) => string); ++ when: T | undefined | null | false; ++ keyed?: boolean; ++ fallback?: string; ++ children: string | ((item: NonNullable | Accessor>) => string); + }): string; + export declare function Switch(props: { +- fallback?: string; +- children: MatchProps | MatchProps[]; ++ fallback?: string; ++ children: MatchProps | MatchProps[]; + }): string; + type MatchProps = { +- when: T | false; +- keyed?: boolean; +- children: string | ((item: NonNullable | Accessor>) => string); ++ when: T | false; ++ keyed?: boolean; ++ children: string | ((item: NonNullable | Accessor>) => string); + }; + export declare function Match(props: MatchProps): MatchProps; + export declare function resetErrorBoundaries(): void; + export declare function ErrorBoundary(props: { +- fallback: string | ((err: any, reset: () => void) => string); +- children: string; +-}): +- | string +- | ((err: any, reset: () => void) => string) +- | { +- t: string; +- }; ++ fallback: string | ((err: any, reset: () => void) => string); ++ children: string; ++}): string | ((err: any, reset: () => void) => string) | { ++ t: string; ++}; + export interface Resource { +- (): T | undefined; +- state: "unresolved" | "pending" | "ready" | "refreshing" | "errored"; +- loading: boolean; +- error: any; +- latest: T | undefined; ++ (): T | undefined; ++ state: "unresolved" | "pending" | "ready" | "refreshing" | "errored"; ++ loading: boolean; ++ error: any; ++ latest: T | undefined; + } + type SuspenseContextType = { +- resources: Map< +- string, +- { +- loading: boolean; +- error: any; +- } +- >; +- completed: () => void; ++ resources: Map; ++ completed: () => void; + }; + export type ResourceActions = { +- mutate: Setter; +- refetch: (info?: unknown) => void; ++ mutate: Setter; ++ refetch: (info?: unknown) => void; + }; + export type ResourceReturn = [Resource, ResourceActions]; + export type ResourceSource = S | false | null | undefined | (() => S | false | null | undefined); + export type ResourceFetcher = (k: S, info: ResourceFetcherInfo) => T | Promise; + export type ResourceFetcherInfo = { +- value: T | undefined; +- refetching?: unknown; ++ value: T | undefined; ++ refetching?: unknown; + }; +-export type ResourceOptions = undefined extends T +- ? { +- initialValue?: T; +- name?: string; +- deferStream?: boolean; +- ssrLoadFrom?: "initial" | "server"; +- storage?: () => Signal; +- onHydrated?: (k: S, info: ResourceFetcherInfo) => void; +- } +- : { +- initialValue: T; +- name?: string; +- deferStream?: boolean; +- ssrLoadFrom?: "initial" | "server"; +- storage?: (v?: T) => Signal; +- onHydrated?: (k: S, info: ResourceFetcherInfo) => void; +- }; +-export declare function createResource( +- fetcher: ResourceFetcher, +- options?: ResourceOptions +-): ResourceReturn; +-export declare function createResource( +- fetcher: ResourceFetcher, +- options: ResourceOptions +-): ResourceReturn; +-export declare function createResource( +- source: ResourceSource, +- fetcher: ResourceFetcher, +- options?: ResourceOptions +-): ResourceReturn; +-export declare function createResource( +- source: ResourceSource, +- fetcher: ResourceFetcher, +- options: ResourceOptions +-): ResourceReturn; +-export declare function lazy>( +- fn: () => Promise<{ +- default: T; +- }> +-): T & { +- preload: () => Promise<{ ++export type ResourceOptions = undefined extends T ? { ++ initialValue?: T; ++ name?: string; ++ deferStream?: boolean; ++ ssrLoadFrom?: "initial" | "server"; ++ storage?: () => Signal; ++ onHydrated?: (k: S, info: ResourceFetcherInfo) => void; ++} : { ++ initialValue: T; ++ name?: string; ++ deferStream?: boolean; ++ ssrLoadFrom?: "initial" | "server"; ++ storage?: (v?: T) => Signal; ++ onHydrated?: (k: S, info: ResourceFetcherInfo) => void; ++}; ++export declare function createResource(fetcher: ResourceFetcher, options?: ResourceOptions): ResourceReturn; ++export declare function createResource(fetcher: ResourceFetcher, options: ResourceOptions): ResourceReturn; ++export declare function createResource(source: ResourceSource, fetcher: ResourceFetcher, options?: ResourceOptions): ResourceReturn; ++export declare function createResource(source: ResourceSource, fetcher: ResourceFetcher, options: ResourceOptions): ResourceReturn; ++export declare function lazy>(fn: () => Promise<{ + default: T; +- }>; ++}>): T & { ++ preload: () => Promise<{ ++ default: T; ++ }>; + }; + export declare function enableScheduling(): void; + export declare function enableHydration(): void; + export declare function startTransition(fn: () => any): void; + export declare function useTransition(): [() => boolean, (fn: () => any) => void]; + type HydrationContext = { +- id: string; +- count: number; +- serialize: (id: string, v: Promise | any, deferStream?: boolean) => void; +- nextRoot: (v: any) => string; +- replace: (id: string, replacement: () => any) => void; +- block: (p: Promise) => void; +- resources: Record; +- suspense: Record; +- registerFragment: (v: string) => (v?: string, err?: any) => boolean; +- lazy: Record>; +- async?: boolean; +- noHydrate: boolean; ++ id: string; ++ count: number; ++ serialize: (id: string, v: Promise | any, deferStream?: boolean) => void; ++ nextRoot: (v: any) => string; ++ replace: (id: string, replacement: () => any) => void; ++ block: (p: Promise) => void; ++ resources: Record; ++ suspense: Record; ++ registerFragment: (v: string) => (v?: string, err?: any) => boolean; ++ lazy: Record>; ++ async?: boolean; ++ noHydrate: boolean; + }; + export declare function SuspenseList(props: { +- children: string; +- revealOrder: "forwards" | "backwards" | "together"; +- tail?: "collapsed" | "hidden"; ++ children: string; ++ revealOrder: "forwards" | "backwards" | "together"; ++ tail?: "collapsed" | "hidden"; + }): string; +-export declare function Suspense(props: { fallback?: string; children: string }): +- | string +- | number +- | boolean +- | Node +- | JSX.ArrayElement +- | { +- t: string; +- } +- | null +- | undefined; ++export declare function Suspense(props: { ++ fallback?: string; ++ children: string; ++}): string | number | boolean | Node | JSX.ArrayElement | { ++ t: string; ++} | null | undefined; + export {}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cbe90f20..6393006e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + solid-js: + hash: awuoufac56epjy2o6csmf2mj74 + path: patches/solid-js.patch + importers: .: @@ -49,7 +54,7 @@ importers: version: 0.24.0 esbuild-plugin-solid: specifier: ^0.6.0 - version: 0.6.0(esbuild@0.24.0)(solid-js@1.9.3) + version: 0.6.0(esbuild@0.24.0)(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) eslint: specifier: ^9.16.0 version: 9.17.0 @@ -61,7 +66,7 @@ importers: version: 25.0.1 solid-js: specifier: ^1.9.3 - version: 1.9.3 + version: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) turbo: specifier: ^1.10.16 version: 1.13.4 @@ -73,7 +78,7 @@ importers: version: 6.0.3(@types/node@22.10.2) vite-plugin-solid: specifier: ^2.11.0 - version: 2.11.0(solid-js@1.9.3)(vite@6.0.3(@types/node@22.10.2)) + version: 2.11.0(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))(vite@6.0.3(@types/node@22.10.2)) vitest: specifier: ^2.1.8 version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1) @@ -91,7 +96,7 @@ importers: version: link:../../packages/overlay '@solid-primitives/timer': specifier: ^1.3.10 - version: 1.3.10(solid-js@1.9.3) + version: 1.3.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) devDependencies: solid-devtools: specifier: workspace:^ @@ -107,38 +112,37 @@ importers: version: link:../shared '@solid-primitives/bounds': specifier: ^0.0.122 - version: 0.0.122(solid-js@1.9.3) + version: 0.0.122(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/cursor': specifier: ^0.0.115 - version: 0.0.115(solid-js@1.9.3) + version: 0.0.115(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/event-bus': specifier: ^1.0.11 - version: 1.0.11(solid-js@1.9.3) + version: 1.0.11(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/event-listener': specifier: ^2.3.3 - version: 2.3.3(solid-js@1.9.3) + version: 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/keyboard': specifier: ^1.2.8 - version: 1.2.8(solid-js@1.9.3) + version: 1.2.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/platform': specifier: ^0.1.2 - version: 0.1.2(solid-js@1.9.3) + version: 0.1.2(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/rootless': specifier: ^1.4.5 - version: 1.4.5(solid-js@1.9.3) + version: 1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/scheduled': specifier: ^1.4.4 - version: 1.4.4(solid-js@1.9.3) + version: 1.4.4(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/static-store': specifier: ^0.0.8 - version: 0.0.8(solid-js@1.9.3) + version: 0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/utils': specifier: ^6.2.3 - version: 6.2.3(solid-js@1.9.3) - devDependencies: + version: 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) solid-js: - specifier: ^1.9.3 - version: 1.9.3 + specifier: ^1.9.0 + version: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) packages/extension: dependencies: @@ -153,13 +157,10 @@ importers: version: link:../shared '@solid-primitives/utils': specifier: ^6.2.3 - version: 6.2.3(solid-js@1.9.3) + version: 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) solid-devtools: specifier: workspace:^ version: link:../main - solid-js: - specifier: ^1.9.3 - version: 1.9.3 devDependencies: '@crxjs/vite-plugin': specifier: 2.0.0-beta.28 @@ -181,68 +182,67 @@ importers: version: link:../shared '@solid-primitives/context': specifier: ^0.2.3 - version: 0.2.3(solid-js@1.9.3) + version: 0.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/cursor': specifier: ^0.0.115 - version: 0.0.115(solid-js@1.9.3) + version: 0.0.115(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/date': specifier: ^2.0.24 - version: 2.0.24(solid-js@1.9.3) + version: 2.0.24(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/event-bus': specifier: ^1.0.11 - version: 1.0.11(solid-js@1.9.3) + version: 1.0.11(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/event-listener': specifier: ^2.3.3 - version: 2.3.3(solid-js@1.9.3) + version: 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/jsx-tokenizer': specifier: ^1.0.10 - version: 1.0.10(solid-js@1.9.3) + version: 1.0.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/keyboard': specifier: ^1.2.8 - version: 1.2.8(solid-js@1.9.3) + version: 1.2.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/keyed': specifier: ^1.2.3 - version: 1.2.3(solid-js@1.9.3) + version: 1.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/media': specifier: ^2.2.9 - version: 2.2.9(solid-js@1.9.3) + version: 2.2.9(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/mouse': specifier: ^2.0.20 - version: 2.0.20(solid-js@1.9.3) + version: 2.0.20(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/props': specifier: ^3.1.11 - version: 3.1.11(solid-js@1.9.3) + version: 3.1.11(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/range': specifier: ^0.1.18 - version: 0.1.18(solid-js@1.9.3) + version: 0.1.18(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/resize-observer': specifier: ^2.0.26 - version: 2.0.26(solid-js@1.9.3) + version: 2.0.26(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/scheduled': specifier: ^1.4.4 - version: 1.4.4(solid-js@1.9.3) + version: 1.4.4(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/static-store': specifier: ^0.0.8 - version: 0.0.8(solid-js@1.9.3) + version: 0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/styles': specifier: ^0.0.114 - version: 0.0.114(solid-js@1.9.3) + version: 0.0.114(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/timer': specifier: ^1.3.10 - version: 1.3.10(solid-js@1.9.3) + version: 1.3.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/utils': specifier: ^6.2.3 - version: 6.2.3(solid-js@1.9.3) + version: 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) clsx: specifier: ^2.1.1 version: 2.1.1 solid-headless: specifier: ^0.13.1 - version: 0.13.1(solid-js@1.9.3) - devDependencies: + version: 0.13.1(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) solid-js: - specifier: ^1.9.3 - version: 1.9.3 + specifier: ^1.9.0 + version: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) packages/logger: dependencies: @@ -257,11 +257,10 @@ importers: version: link:../shared '@solid-primitives/utils': specifier: ^6.2.3 - version: 6.2.3(solid-js@1.9.3) - devDependencies: + version: 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) solid-js: - specifier: ^1.9.3 - version: 1.9.3 + specifier: ^1.9.0 + version: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) packages/main: dependencies: @@ -282,7 +281,7 @@ importers: version: link:../shared solid-js: specifier: ^1.9.0 - version: 1.9.3 + version: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) vite: specifier: ^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 version: 6.0.3(@types/node@22.10.2) @@ -319,20 +318,19 @@ importers: version: link:../shared '@solid-primitives/cursor': specifier: ^0.0.115 - version: 0.0.115(solid-js@1.9.3) + version: 0.0.115(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/event-listener': specifier: ^2.3.3 - version: 2.3.3(solid-js@1.9.3) + version: 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/media': specifier: ^2.2.9 - version: 2.2.9(solid-js@1.9.3) + version: 2.2.9(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/utils': specifier: ^6.2.3 - version: 6.2.3(solid-js@1.9.3) - devDependencies: + version: 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) solid-js: - specifier: ^1.9.3 - version: 1.9.3 + specifier: ^1.9.0 + version: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) packages/shared: dependencies: @@ -341,35 +339,34 @@ importers: version: 0.17.0 '@solid-primitives/event-bus': specifier: ^1.0.11 - version: 1.0.11(solid-js@1.9.3) + version: 1.0.11(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/event-listener': specifier: ^2.3.3 - version: 2.3.3(solid-js@1.9.3) + version: 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/media': specifier: ^2.2.9 - version: 2.2.9(solid-js@1.9.3) + version: 2.2.9(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/refs': specifier: ^1.0.8 - version: 1.0.8(solid-js@1.9.3) + version: 1.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/rootless': specifier: ^1.4.5 - version: 1.4.5(solid-js@1.9.3) + version: 1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/scheduled': specifier: ^1.4.4 - version: 1.4.4(solid-js@1.9.3) + version: 1.4.4(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/static-store': specifier: ^0.0.8 - version: 0.0.8(solid-js@1.9.3) + version: 0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/styles': specifier: ^0.0.114 - version: 0.0.114(solid-js@1.9.3) + version: 0.0.114(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) '@solid-primitives/utils': specifier: ^6.2.3 - version: 6.2.3(solid-js@1.9.3) - devDependencies: + version: 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) solid-js: - specifier: ^1.9.3 - version: 1.9.3 + specifier: ^1.9.0 + version: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) packages: @@ -3179,132 +3176,132 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.28.1': optional: true - '@solid-primitives/bounds@0.0.122(solid-js@1.9.3)': + '@solid-primitives/bounds@0.0.122(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3) - '@solid-primitives/resize-observer': 2.0.26(solid-js@1.9.3) - '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/resize-observer': 2.0.26(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/context@0.2.3(solid-js@1.9.3)': + '@solid-primitives/context@0.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/cursor@0.0.115(solid-js@1.9.3)': + '@solid-primitives/cursor@0.0.115(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/date@2.0.24(solid-js@1.9.3)': + '@solid-primitives/date@2.0.24(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/memo': 1.3.10(solid-js@1.9.3) - '@solid-primitives/timer': 1.3.10(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/memo': 1.3.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/timer': 1.3.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/event-bus@1.0.11(solid-js@1.9.3)': + '@solid-primitives/event-bus@1.0.11(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/event-listener@2.3.3(solid-js@1.9.3)': + '@solid-primitives/event-listener@2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/jsx-tokenizer@1.0.10(solid-js@1.9.3)': + '@solid-primitives/jsx-tokenizer@1.0.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/keyboard@1.2.8(solid-js@1.9.3)': + '@solid-primitives/keyboard@1.2.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3) - '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/keyed@1.2.3(solid-js@1.9.3)': + '@solid-primitives/keyed@1.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/media@2.2.9(solid-js@1.9.3)': + '@solid-primitives/media@2.2.9(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3) - '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3) - '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/memo@1.3.10(solid-js@1.9.3)': + '@solid-primitives/memo@1.3.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/scheduled': 1.4.4(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/scheduled': 1.4.4(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/mouse@2.0.20(solid-js@1.9.3)': + '@solid-primitives/mouse@2.0.20(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3) - '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3) - '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/platform@0.1.2(solid-js@1.9.3)': + '@solid-primitives/platform@0.1.2(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/props@3.1.11(solid-js@1.9.3)': + '@solid-primitives/props@3.1.11(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/range@0.1.18(solid-js@1.9.3)': + '@solid-primitives/range@0.1.18(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/refs@1.0.8(solid-js@1.9.3)': + '@solid-primitives/refs@1.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/resize-observer@2.0.26(solid-js@1.9.3)': + '@solid-primitives/resize-observer@2.0.26(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3) - '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3) - '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/rootless@1.4.5(solid-js@1.9.3)': + '@solid-primitives/rootless@1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/scheduled@1.4.4(solid-js@1.9.3)': + '@solid-primitives/scheduled@1.4.4(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/static-store@0.0.8(solid-js@1.9.3)': + '@solid-primitives/static-store@0.0.8(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/styles@0.0.114(solid-js@1.9.3)': + '@solid-primitives/styles@0.0.114(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.3) - solid-js: 1.9.3 + '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + '@solid-primitives/utils': 6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/timer@1.3.10(solid-js@1.9.3)': + '@solid-primitives/timer@1.3.10(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) - '@solid-primitives/utils@6.2.3(solid-js@1.9.3)': + '@solid-primitives/utils@6.2.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))': dependencies: - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) '@total-typescript/ts-reset@0.6.1': {} @@ -3734,13 +3731,13 @@ snapshots: es-module-lexer@1.5.4: {} - esbuild-plugin-solid@0.6.0(esbuild@0.24.0)(solid-js@1.9.3): + esbuild-plugin-solid@0.6.0(esbuild@0.24.0)(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)): dependencies: '@babel/core': 7.26.0 '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) babel-preset-solid: 1.9.3(@babel/core@7.26.0) esbuild: 0.24.0 - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) transitivePeerDependencies: - supports-color @@ -4364,29 +4361,29 @@ snapshots: slash@3.0.0: {} - solid-headless@0.13.1(solid-js@1.9.3): + solid-headless@0.13.1(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)): dependencies: - solid-js: 1.9.3 - solid-use: 0.6.2(solid-js@1.9.3) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) + solid-use: 0.6.2(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) - solid-js@1.9.3: + solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74): dependencies: csstype: 3.1.3 seroval: 1.1.1 seroval-plugins: 1.1.1(seroval@1.1.1) - solid-refresh@0.6.3(solid-js@1.9.3): + solid-refresh@0.6.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)): dependencies: '@babel/generator': 7.26.3 '@babel/helper-module-imports': 7.25.9 '@babel/types': 7.26.3 - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) transitivePeerDependencies: - supports-color - solid-use@0.6.2(solid-js@1.9.3): + solid-use@0.6.2(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)): dependencies: - solid-js: 1.9.3 + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) source-map-js@1.2.1: {} @@ -4526,14 +4523,14 @@ snapshots: - supports-color - terser - vite-plugin-solid@2.11.0(solid-js@1.9.3)(vite@6.0.3(@types/node@22.10.2)): + vite-plugin-solid@2.11.0(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74))(vite@6.0.3(@types/node@22.10.2)): dependencies: '@babel/core': 7.26.0 '@types/babel__core': 7.20.5 babel-preset-solid: 1.9.3(@babel/core@7.26.0) merge-anything: 5.1.7 - solid-js: 1.9.3 - solid-refresh: 0.6.3(solid-js@1.9.3) + solid-js: 1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74) + solid-refresh: 0.6.3(solid-js@1.9.3(patch_hash=awuoufac56epjy2o6csmf2mj74)) vite: 6.0.3(@types/node@22.10.2) vitefu: 1.0.4(vite@6.0.3(@types/node@22.10.2)) transitivePeerDependencies: From c530d74035743cf145f17bf1685d2ad6283ce2fb Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Mon, 16 Dec 2024 11:35:44 +0100 Subject: [PATCH 2/3] WIP Adjust the setup to use the new solid-apis exposed through window --- packages/debugger/package.json | 2 +- .../src/dependency/test/collect.test.ts | 121 +++++++++--------- packages/debugger/src/index.ts | 2 +- packages/debugger/src/inspector/inspector.ts | 14 +- packages/debugger/src/inspector/serialize.ts | 3 +- packages/debugger/src/inspector/store.ts | 54 ++++---- .../src/inspector/test/index.test.tsx | 13 +- .../debugger/src/inspector/test/store.test.ts | 5 +- packages/debugger/src/locator/index.ts | 7 +- packages/debugger/src/main/index.ts | 63 +++++---- packages/debugger/src/main/observe.ts | 27 ++-- packages/debugger/src/main/roots.ts | 19 +-- packages/debugger/src/main/solid-api.ts | 9 -- .../debugger/src/main/test/update.test.ts | 7 +- packages/debugger/src/main/test/utils.test.ts | 19 ++- packages/debugger/src/main/types.ts | 51 +------- packages/debugger/src/main/utils.ts | 16 ++- packages/debugger/src/setup.ts | 112 ++++++++-------- .../src/structure/test/walker.test.tsx | 21 ++- packages/debugger/test_setup.ts | 11 ++ packages/debugger/vite.config.ts | 4 +- packages/extension/content/debugger.ts | 9 +- packages/extension/vite.config.ts | 8 +- packages/main/build.ts | 12 +- packages/main/src/env.d.ts | 1 - packages/main/src/setup.ts | 11 +- packages/overlay/build.ts | 14 +- packages/overlay/package.json | 8 +- packages/overlay/src/index.tsx | 80 ++++++------ packages/shared/src/primitives.ts | 2 +- 30 files changed, 330 insertions(+), 395 deletions(-) delete mode 100644 packages/debugger/src/main/solid-api.ts create mode 100644 packages/debugger/test_setup.ts diff --git a/packages/debugger/package.json b/packages/debugger/package.json index 818c9129..a80957fc 100644 --- a/packages/debugger/package.json +++ b/packages/debugger/package.json @@ -14,7 +14,7 @@ "url": "https://github.com/thetarnav/solid-devtools/issues" }, "private": false, - "sideEffects": false, + "sideEffects": true, "publishConfig": { "access": "public" }, diff --git a/packages/debugger/src/dependency/test/collect.test.ts b/packages/debugger/src/dependency/test/collect.test.ts index f925ca79..db0357fd 100644 --- a/packages/debugger/src/dependency/test/collect.test.ts +++ b/packages/debugger/src/dependency/test/collect.test.ts @@ -1,42 +1,39 @@ -import {batch, createComputed, createMemo, createRoot, createSignal} from 'solid-js' -import {beforeEach, describe, expect, it, vi} from 'vitest' +import * as s from 'solid-js' +import * as test from 'vitest' import {NodeType} from '../../main/constants.ts' import {ObjectType, getSdtId} from '../../main/id.ts' -import SolidApi from '../../main/solid-api.ts' import type {NodeID, Solid} from '../../main/types.ts' import {type SerializedDGraph, collectDependencyGraph} from '../collect.ts' -const {getOwner} = SolidApi - let mockLAST_ID = 0 -beforeEach(() => { +test.beforeEach(() => { mockLAST_ID = 0 }) -vi.mock('../../main/get-id', () => ({getNewSdtId: () => '#' + mockLAST_ID++})) +test.vi.mock('../../main/get-id', () => ({getNewSdtId: () => '#' + mockLAST_ID++})) -describe('collectDependencyGraph', () => { - it('should collect dependency graph', () => { +test.describe('collectDependencyGraph', () => { + test.it('should collect dependency graph', () => { let rootOwner!: Solid.Root let subRootOwner!: Solid.Root - const [e] = createSignal(0, {name: 's-e'}) + const [e] = s.createSignal(0, {name: 's-e'}) - createRoot(() => { - const [a] = createSignal(0, {name: 's-a'}) - const [b] = createSignal(0, {name: 's-b'}) - const [c] = createSignal(0, {name: 's-c'}) + s.createRoot(() => { + const [a] = s.createSignal(0, {name: 's-a'}) + const [b] = s.createSignal(0, {name: 's-b'}) + const [c] = s.createSignal(0, {name: 's-c'}) - const memoA = createMemo(() => a() + e(), null, {name: 'm-a'}) + const memoA = s.createMemo(() => a() + e(), null, {name: 'm-a'}) - rootOwner = getOwner()! as Solid.Root + rootOwner = Solid$$!.getOwner()! as Solid.Root - createRoot(_ => { - const [d] = createSignal(0, {name: 's-d'}) - const memoB = createMemo(() => b() + c(), null, {name: 'm-b'}) + s.createRoot(_ => { + const [d] = s.createSignal(0, {name: 's-d'}) + const memoB = s.createMemo(() => b() + c(), null, {name: 'm-b'}) - subRootOwner = getOwner()! as Solid.Root + subRootOwner = Solid$$!.getOwner()! as Solid.Root - createComputed( + s.createComputed( () => { memoA() memoB() @@ -81,7 +78,7 @@ describe('collectDependencyGraph', () => { }, }) - expect(result.graph, 'graph of computedOwner').toEqual({ + test.expect(result.graph, 'graph of computedOwner').toEqual({ [nodes.computedId]: { name: 'c', type: NodeType.Computation, @@ -148,7 +145,7 @@ describe('collectDependencyGraph', () => { }, } satisfies SerializedDGraph.Graph) - expect(result.graph, 'is JSON-serializable').toMatchObject( + test.expect(result.graph, 'is JSON-serializable').toMatchObject( JSON.parse(JSON.stringify(result.graph)) as any, ) @@ -158,7 +155,7 @@ describe('collectDependencyGraph', () => { }, }) - expect(result.graph).toEqual({ + test.expect(result.graph).toEqual({ [nodes.computedId]: { name: 'c', type: NodeType.Computation, @@ -168,7 +165,7 @@ describe('collectDependencyGraph', () => { graph: undefined, }, [nodes.memoAId]: { - name: expect.any(String), + name: test.expect.any(String), type: NodeType.Memo, depth: 1, sources: [nodes.signalAId, nodes.signalEId], @@ -176,7 +173,7 @@ describe('collectDependencyGraph', () => { graph: undefined, }, [nodes.signalAId]: { - name: expect.any(String), + name: test.expect.any(String), type: NodeType.Signal, depth: 1, observers: [nodes.memoAId], @@ -184,7 +181,7 @@ describe('collectDependencyGraph', () => { sources: undefined, }, [nodes.signalEId]: { - name: expect.any(String), + name: test.expect.any(String), type: NodeType.Signal, depth: 0, observers: [nodes.memoAId], @@ -193,24 +190,24 @@ describe('collectDependencyGraph', () => { }, } satisfies SerializedDGraph.Graph) - expect(result.graph, 'is JSON-serializable').toMatchObject( + test.expect(result.graph, 'is JSON-serializable').toMatchObject( JSON.parse(JSON.stringify(result.graph)) as any, ) }) - it('listens to visited nodes', () => { + test.it('listens to visited nodes', () => { const captured: NodeID[] = [] - const cb = vi.fn(a => captured.push(a)) + const cb = test.vi.fn(a => captured.push(a)) - createRoot(() => { - const [a, setA] = createSignal(0, {name: 's-a'}) - const [b, setB] = createSignal(0, {name: 's-b'}) - const [c, setC] = createSignal(0, {name: 's-c'}) - const [d, setD] = createSignal(0, {name: 's-d'}) + s.createRoot(() => { + const [a, setA] = s.createSignal(0, {name: 's-a'}) + const [b, setB] = s.createSignal(0, {name: 's-b'}) + const [c, setC] = s.createSignal(0, {name: 's-c'}) + const [d, setD] = s.createSignal(0, {name: 's-d'}) - const mA = createMemo(() => a() + b(), undefined, {name: 'm-a'}) + const mA = s.createMemo(() => a() + b(), undefined, {name: 'm-a'}) - createComputed( + s.createComputed( () => { c() d() @@ -219,7 +216,7 @@ describe('collectDependencyGraph', () => { {name: 'c-a'}, ) - createComputed( + s.createComputed( () => { mA() c() @@ -229,20 +226,20 @@ describe('collectDependencyGraph', () => { ) const nodes = (() => { - const [signalA, signalB, signalC, signalD] = getOwner()!.sourceMap as [ + const [signalA, signalB, signalC, signalD] = Solid$$!.getOwner()!.sourceMap as [ Solid.Signal, Solid.Signal, Solid.Signal, Solid.Signal, ] - const [memoA, computedA, computedB] = getOwner()!.owned as [ + const [memoA, computedA, computedB] = Solid$$!.getOwner()!.owned as [ Solid.Memo, Solid.Computation, Solid.Computation, ] return { - rootId: getSdtId(getOwner()!, ObjectType.Owner), + rootId: getSdtId(Solid$$!.getOwner()!, ObjectType.Owner), signalAId: getSdtId(signalA, ObjectType.Signal), signalBId: getSdtId(signalB, ObjectType.Signal), signalCId: getSdtId(signalC, ObjectType.Signal), @@ -256,7 +253,7 @@ describe('collectDependencyGraph', () => { const result = collectDependencyGraph(nodes.computedB, {onNodeUpdate: cb}) - expect(result.graph).toEqual({ + test.expect(result.graph).toEqual({ [nodes.computedBId]: { name: 'c-b', type: NodeType.Computation, @@ -299,47 +296,47 @@ describe('collectDependencyGraph', () => { }, } satisfies SerializedDGraph.Graph) - expect(cb).toHaveBeenCalledTimes(0) + test.expect(cb).toHaveBeenCalledTimes(0) setA(1) - expect(captured).toHaveLength(3) - expect(captured.includes(nodes.signalAId)).toBeTruthy() - expect(captured.includes(nodes.memoAId)).toBeTruthy() - expect(captured.includes(nodes.computedBId)).toBeTruthy() + test.expect(captured).toHaveLength(3) + test.expect(captured.includes(nodes.signalAId)).toBeTruthy() + test.expect(captured.includes(nodes.memoAId)).toBeTruthy() + test.expect(captured.includes(nodes.computedBId)).toBeTruthy() captured.length = 0 setB(1) - expect(captured).toHaveLength(3) - expect(captured.includes(nodes.signalBId)).toBeTruthy() - expect(captured.includes(nodes.memoAId)).toBeTruthy() - expect(captured.includes(nodes.computedBId)).toBeTruthy() + test.expect(captured).toHaveLength(3) + test.expect(captured.includes(nodes.signalBId)).toBeTruthy() + test.expect(captured.includes(nodes.memoAId)).toBeTruthy() + test.expect(captured.includes(nodes.computedBId)).toBeTruthy() captured.length = 0 setC(1) - expect(captured).toHaveLength(2) - expect(captured.includes(nodes.signalCId)).toBeTruthy() - expect(captured.includes(nodes.computedBId)).toBeTruthy() + test.expect(captured).toHaveLength(2) + test.expect(captured.includes(nodes.signalCId)).toBeTruthy() + test.expect(captured.includes(nodes.computedBId)).toBeTruthy() captured.length = 0 setD(1) - expect(captured.length).toBe(0) + test.expect(captured.length).toBe(0) - batch(() => { + s.batch(() => { setA(2) setB(2) setC(2) }) - expect(captured).toHaveLength(5) - expect(captured.includes(nodes.signalAId)).toBeTruthy() - expect(captured.includes(nodes.signalBId)).toBeTruthy() - expect(captured.includes(nodes.signalCId)).toBeTruthy() - expect(captured.includes(nodes.memoAId)).toBeTruthy() - expect(captured.includes(nodes.computedBId)).toBeTruthy() + test.expect(captured).toHaveLength(5) + test.expect(captured.includes(nodes.signalAId)).toBeTruthy() + test.expect(captured.includes(nodes.signalBId)).toBeTruthy() + test.expect(captured.includes(nodes.signalCId)).toBeTruthy() + test.expect(captured.includes(nodes.memoAId)).toBeTruthy() + test.expect(captured.includes(nodes.computedBId)).toBeTruthy() }) }) }) diff --git a/packages/debugger/src/index.ts b/packages/debugger/src/index.ts index 2f976013..42a1766b 100644 --- a/packages/debugger/src/index.ts +++ b/packages/debugger/src/index.ts @@ -6,7 +6,7 @@ export { observeValueUpdate, removeValueUpdateObserver, } from './main/observe.ts' -export {attachDebugger, createInternalRoot, unobserveAllRoots} from './main/roots.ts' +export {attachDebugger, unobserveAllRoots} from './main/roots.ts' export { getNodeName, getNodeType, diff --git a/packages/debugger/src/inspector/inspector.ts b/packages/debugger/src/inspector/inspector.ts index 5ecc6a39..71d512f6 100644 --- a/packages/debugger/src/inspector/inspector.ts +++ b/packages/debugger/src/inspector/inspector.ts @@ -4,7 +4,6 @@ import {parseLocationString} from '../locator/index.ts' import {NodeType, ValueItemType} from '../main/constants.ts' import {ObjectType, getSdtId} from '../main/id.ts' import {observeValueUpdate, removeValueUpdateObserver} from '../main/observe.ts' -import SolidAPI from '../main/solid-api.ts' import type {Mapped, NodeID, Solid, ValueItemID} from '../main/types.ts' import { getComponentRefreshNode, @@ -15,6 +14,7 @@ import { isSolidSignal, isSolidStore, markOwnerType, + onCleanup, } from '../main/utils.ts' import {encodeValue} from './serialize.ts' import {type InspectorUpdateMap, PropGetterState} from './types.ts' @@ -110,8 +110,8 @@ export class ObservedProps { Object.defineProperty(this.props, key, { get() { const value = get() - if (SolidAPI.getListener()) { - SolidAPI.onCleanup( + if (Solid$$!.getListener()) { + onCleanup( () => --o.n === 0 && self.onPropStateChange?.(key, PropGetterState.Stale), ) } @@ -175,8 +175,8 @@ const $INSPECTOR = Symbol('inspector') const typeToObjectTypeMap = { [NodeType.Signal]: ObjectType.Signal, - [NodeType.Memo]: ObjectType.Owner, - [NodeType.Store]: ObjectType.Store, + [NodeType.Memo]: ObjectType.Owner, + [NodeType.Store]: ObjectType.Store, } function mapSourceValue( @@ -211,7 +211,7 @@ function mapSourceValue( function mapProps(props: Solid.Component['props']) { // proxy props need to be checked for changes in keys - const isProxy = !!(props as any)[SolidAPI.$PROXY] + const isProxy = !!(props as any)[Solid$$!.$PROXY] const record: Mapped.Props['record'] = {} let checkProxyProps: (() => ReturnType) | undefined @@ -318,7 +318,7 @@ export const collectOwnerDetails = /*#__PURE__*/ untrackedCallback(function ( // get location from component.location (typeof location === 'string' && (location = parseLocationString(location))) || // get location from the babel plugin marks - ((location = SolidAPI.getOwnerLocation(owner)) && + ((location = SolidDevtools$$!.getOwnerLocation(owner)) && (location = parseLocationString(location))) ) { details.location = location diff --git a/packages/debugger/src/inspector/serialize.ts b/packages/debugger/src/inspector/serialize.ts index e17ec9dd..60102223 100644 --- a/packages/debugger/src/inspector/serialize.ts +++ b/packages/debugger/src/inspector/serialize.ts @@ -1,6 +1,5 @@ import {type FalsyValue} from '@solid-primitives/utils' import {getSdtId, ObjectType} from '../main/id.ts' -import SolidAPI from '../main/solid-api.ts' import {isStoreNode} from '../main/utils.ts' import { type EncodedValue, @@ -74,7 +73,7 @@ function encode(value: unknown): number { // Store Nodes else if (!ignoreNextStore && isStoreNode(value)) { // might still pass in a proxy - const node = SolidAPI.unwrap(value) + const node = SolidStore$$!.unwrap(value) // set unwrapped as seen as well if (node !== value) Seen.set(node, index) const id = getSdtId(node, ObjectType.StoreNode) diff --git a/packages/debugger/src/inspector/store.ts b/packages/debugger/src/inspector/store.ts index c9aebf12..3fa49b5d 100644 --- a/packages/debugger/src/inspector/store.ts +++ b/packages/debugger/src/inspector/store.ts @@ -1,9 +1,6 @@ import {getSdtId, ObjectType} from '../main/id.ts' -import SolidAPI from '../main/solid-api.ts' import type {NodeID, Solid} from '../types.ts' -const {isWrappable} = SolidAPI.STORE_DEV - export type StoreNodeProperty = `${NodeID}:${string}` /** * - `undefined` - property deleted; @@ -25,34 +22,37 @@ export function setOnStoreNodeUpdate(fn: OnNodeUpdate): void { OnNodeUpdate = fn } -// path solid global dev hook -SolidAPI.STORE_DEV.hooks.onStoreNodeUpdate = (node, property, value, prev) => { - if (!OnNodeUpdate || !Nodes.has(node) || typeof property === 'symbol') return +export function startObservingStores() { - property = property.toString() - const storeProperty: StoreNodeProperty = `${getSdtId( - node, - ObjectType.StoreNode, - )}:${property}` - // Update array length - if (property === 'length' && typeof value === 'number' && Array.isArray(node)) { - return OnNodeUpdate(storeProperty, value) - } - isWrappable(prev) && untrackStore(prev, storeProperty) - // Delete property - if (value === undefined) { - OnNodeUpdate(storeProperty, undefined) - } - // Update/Set property - else { - OnNodeUpdate(storeProperty, {value}) - isWrappable(value) && trackStore(value, storeProperty) + // path solid global dev hook + SolidStore$$!.hooks.onStoreNodeUpdate = (node, property, value, prev) => { + if (!OnNodeUpdate || !Nodes.has(node) || typeof property === 'symbol') return + + property = property.toString() + const storeProperty: StoreNodeProperty = `${getSdtId( + node, + ObjectType.StoreNode, + )}:${property}` + // Update array length + if (property === 'length' && typeof value === 'number' && Array.isArray(node)) { + return OnNodeUpdate(storeProperty, value) + } + SolidStore$$!.isWrappable(prev) && untrackStore(prev, storeProperty) + // Delete property + if (value === undefined) { + OnNodeUpdate(storeProperty, undefined) + } + // Update/Set property + else { + OnNodeUpdate(storeProperty, {value}) + SolidStore$$!.isWrappable(value) && trackStore(value, storeProperty) + } } } export function observeStoreNode(rootNode: Solid.StoreNode): VoidFunction { // might still pass in a proxy - rootNode = SolidAPI.unwrap(rootNode) + rootNode = SolidStore$$!.unwrap(rootNode) const symbol = Symbol('inspect-store') trackStore(rootNode, symbol) @@ -85,12 +85,12 @@ function forEachStoreProp( if (Array.isArray(node)) { for (let i = 0; i < node.length; i++) { const child = node[i] as Solid.StoreNode - isWrappable(child) && fn(i.toString(), child) + SolidStore$$!.isWrappable(child) && fn(i.toString(), child) } } else { for (const key in node) { const {value, get} = Object.getOwnPropertyDescriptor(node, key)! - if (!get && isWrappable(value)) fn(key, value) + if (!get && SolidStore$$!.isWrappable(value)) fn(key, value) } } } diff --git a/packages/debugger/src/inspector/test/index.test.tsx b/packages/debugger/src/inspector/test/index.test.tsx index ec4e97b6..074f67bd 100644 --- a/packages/debugger/src/inspector/test/index.test.tsx +++ b/packages/debugger/src/inspector/test/index.test.tsx @@ -8,12 +8,9 @@ import { } from 'solid-js' import {beforeEach, describe, expect, it, vi} from 'vitest' import {getObjectById, getSdtId, ObjectType} from '../../main/id.ts' -import SolidApi from '../../main/solid-api.ts' import {type Mapped, NodeType, PropGetterState, type Solid, ValueType} from '../../types.ts' import {collectOwnerDetails} from '../inspector.ts' -const {getOwner} = SolidApi - let mockLAST_ID = 0 beforeEach(() => { mockLAST_ID = 0 @@ -32,7 +29,7 @@ describe('collectOwnerDetails', () => { () => { const focused = createMemo( () => { - memo = getOwner()! + memo = Solid$$!.getOwner()! s() createSignal(div, {name: 'element'}) const m = createMemo(() => 0, undefined, {name: 'memo'}) @@ -99,7 +96,7 @@ describe('collectOwnerDetails', () => { children: JSX.Element nested: {foo: number; bar: string} }) => { - owner = getOwner()! + owner = Solid$$!.getOwner()! return

{props.children}
} createRenderEffect(() => ( @@ -153,7 +150,7 @@ describe('collectOwnerDetails', () => { createRoot(dispose => { let owner!: Solid.Owner const Button = (props: JSX.ButtonHTMLAttributes) => { - owner = getOwner()! + owner = Solid$$!.getOwner()! return } createRenderEffect(() => { @@ -210,7 +207,7 @@ describe('collectOwnerDetails', () => { const [count, setCount] = createSignal(0) createMemo(() => { - owner = getOwner()! + owner = Solid$$!.getOwner()! return count() }) @@ -242,7 +239,7 @@ describe('collectOwnerDetails', () => { it('listens to signal updates', () => { createRoot(dispose => { - const owner = getOwner()! + const owner = Solid$$!.getOwner()! const [, setCount] = createSignal(0) // id: "0" const [, setCount2] = createSignal(0) // id: "1" diff --git a/packages/debugger/src/inspector/test/store.test.ts b/packages/debugger/src/inspector/test/store.test.ts index 9f4dd495..a23bd806 100644 --- a/packages/debugger/src/inspector/test/store.test.ts +++ b/packages/debugger/src/inspector/test/store.test.ts @@ -2,15 +2,12 @@ import {createRoot} from 'solid-js' import {createMutable, createStore, modifyMutable, produce, reconcile, unwrap} from 'solid-js/store' import {beforeEach, describe, expect, it, vi} from 'vitest' import {ObjectType, getSdtId} from '../../main/id.ts' -import SolidApi from '../../main/solid-api.ts' import {isSolidStore} from '../../main/utils.ts' import {type Solid} from '../../types.ts' import {type OnNodeUpdate, type StoreNodeProperty, observeStoreNode, setOnStoreNodeUpdate} from '../store.ts' -const {getOwner} = SolidApi - const getOwnerStore = () => { - const owner = getOwner() + const owner = Solid$$!.getOwner() if (!owner) throw new Error('No owner') if (!owner.sourceMap) throw new Error('No sourceMap') const store = owner.sourceMap.find(isSolidStore) diff --git a/packages/debugger/src/locator/index.ts b/packages/debugger/src/locator/index.ts index a3b100f1..c79f3866 100644 --- a/packages/debugger/src/locator/index.ts +++ b/packages/debugger/src/locator/index.ts @@ -17,7 +17,6 @@ import { import type {Debugger} from '../main/index.ts' import * as registry from '../main/component-registry.ts' import {ObjectType, getObjectById} from '../main/id.ts' -import SolidAPI from '../main/solid-api.ts' import {type NodeID} from '../main/types.ts' import {createElementsOverlay} from './element-overlay.tsx' import { @@ -41,6 +40,7 @@ export function createLocator(props: { setLocatorEnabledSignal(signal: Accessor): void onComponentClick(componentId: NodeID, next: VoidFunction): void }) { + const [enabledByPressingSignal, setEnabledByPressingSignal] = createSignal((): boolean => false) props.setLocatorEnabledSignal(createMemo(() => enabledByPressingSignal()())) @@ -165,8 +165,9 @@ export function createLocator(props: { } // Enable the locator when the options were passed by the vite plugin - if (SolidAPI.locatorOptions) { - useLocator(SolidAPI.locatorOptions) + let locator_options = SolidDevtools$$!.get_locator_options() + if (locator_options) { + useLocator(locator_options) } return { diff --git a/packages/debugger/src/main/index.ts b/packages/debugger/src/main/index.ts index c4455806..f0766cb5 100644 --- a/packages/debugger/src/main/index.ts +++ b/packages/debugger/src/main/index.ts @@ -1,18 +1,19 @@ +import {batch, createComputed, createEffect, createMemo, createSignal} from 'solid-js' import {createEventBus, createGlobalEmitter, type GlobalEmitter} from '@solid-primitives/event-bus' import {createStaticStore} from '@solid-primitives/static-store' import {defer} from '@solid-primitives/utils' -import {batch, createComputed, createEffect, createMemo, createSignal} from 'solid-js' +import {error} from '@solid-devtools/shared/utils' import {createDependencyGraph, type DGraphUpdate} from '../dependency/index.ts' import {createInspector, type InspectorUpdate, type ToggleInspectedValueData} from '../inspector/index.ts' import {createLocator} from '../locator/index.ts' -import {type HighlightElementPayload} from '../locator/types.ts' +import {type HighlightElementPayload, type LocatorOptions} from '../locator/types.ts' import {createStructure, type StructureUpdates} from '../structure/index.ts' import {DebuggerModule, DEFAULT_MAIN_VIEW, DevtoolsMainView, TreeWalkerMode} from './constants.ts' import {getObjectById, getSdtId, ObjectType} from './id.ts' -import {createInternalRoot} from './roots.ts' -import SolidApi from './solid-api.ts' import {type Mapped, type NodeID} from './types.ts' import {createBatchedUpdateEmitter} from './utils.ts' +import {startObserve} from './observe.ts' +import {startObservingStores} from '../inspector/store.ts' export namespace Debugger { export type InspectedState = { @@ -53,7 +54,17 @@ export type DebuggerEmitter = { input: GlobalEmitter } -const plugin = createInternalRoot(() => { +let debugger_instance: undefined | ReturnType + +function createDebugger() { + + if (!globalThis.SolidDevtools$$) { + error(`Debugger hasn't found the exposed Solid Devtools API. Did you import the setup script?`) + } + + startObserve() + startObservingStores() + const hub: DebuggerEmitter = { output: createGlobalEmitter(), input: createGlobalEmitter(), @@ -259,26 +270,28 @@ const plugin = createInternalRoot(() => { } }) - /** - * Used for connecting debugger to devtools - */ - function useDebugger() { - return { - meta: { - versions: SolidApi.versions, - }, - enabled: debuggerEnabled, - toggleEnabled: (enabled: boolean) => void toggleModules('debugger', enabled), - on: hub.output.on, - listen: hub.output.listen, - emit: hub.input.emit, - } - } - return { - useDebugger, - useLocator: locator.useLocator, + meta: { + versions: SolidDevtools$$!.versions, + }, + enabled: debuggerEnabled, + toggleEnabled: (enabled: boolean) => void toggleModules('debugger', enabled), + on: hub.output.on, + listen: hub.output.listen, + emit: hub.input.emit, + locator, } -}) +} -export const {useDebugger, useLocator} = plugin + +/** + * Used for connecting debugger to devtools + */ +export function useDebugger() { + debugger_instance ??= createDebugger() + return debugger_instance +} + +export function useLocator(options: LocatorOptions) { + return useDebugger().locator.useLocator(options) +} diff --git a/packages/debugger/src/main/observe.ts b/packages/debugger/src/main/observe.ts index 9794421b..bc39e506 100644 --- a/packages/debugger/src/main/observe.ts +++ b/packages/debugger/src/main/observe.ts @@ -6,31 +6,26 @@ Dev hooks and observing reactive graph nodes import {chain, tryOnCleanup} from '@solid-primitives/utils' import {attachDebugger} from './roots.ts' -import SolidAPI from './solid-api.ts' import {type Solid, type ValueUpdateListener} from './types.ts' import {isSolidRoot} from './utils.ts' -for (const e of SolidAPI.getDevEvents()) { - attachDebugger(e.data) -} -// -// AFTER CREATE OWNER -// +const GraphUpdateListeners = new Set() + +export function startObserve() { -SolidAPI.DEV.hooks.afterCreateOwner = function (owner) { - if (isSolidRoot(owner)) { + for (const owner of SolidDevtools$$!.get_created_owners()) { attachDebugger(owner) } -} -// -// AFTER UPDATE -// - -const GraphUpdateListeners = new Set() + Solid$$!.hooks.afterCreateOwner = function (owner) { + if (isSolidRoot(owner)) { + attachDebugger(owner) + } + } -SolidAPI.DEV.hooks.afterUpdate = chain(GraphUpdateListeners) + Solid$$!.hooks.afterUpdate = chain(GraphUpdateListeners) +} /** * Runs the callback on every Solid Graph Update – whenever computations update because of a signal change. diff --git a/packages/debugger/src/main/roots.ts b/packages/debugger/src/main/roots.ts index 9c54091a..a78ec8f2 100644 --- a/packages/debugger/src/main/roots.ts +++ b/packages/debugger/src/main/roots.ts @@ -2,7 +2,6 @@ import {warn} from '@solid-devtools/shared/utils' import {clearComponentRegistry} from './component-registry.ts' import {NodeType} from './constants.ts' import {ObjectType, getSdtId} from './id.ts' -import SolidAPI from './solid-api.ts' import {type NodeID, type Solid} from './types.ts' import {isSolidRoot, onOwnerCleanup} from './utils.ts' @@ -62,8 +61,6 @@ function changeRootAttachment(root: Solid.Root, newParent: Solid.Owner | null): } } -let InternalRootCount = 0 - /** * Helps the debugger find and reattach an reactive owner created by `createRoot` to it's detached parent. * @@ -76,8 +73,7 @@ let InternalRootCount = 0 * attachDebugger(); * }); */ -export function attachDebugger(owner = SolidAPI.getOwner()): void { - if (InternalRootCount) return +export function attachDebugger(owner = Solid$$!.getOwner()): void { if (!owner) return warn('reatachOwner helper should be called synchronously in a reactive owner.') @@ -146,19 +142,6 @@ export function unobserveAllRoots(): void { clearComponentRegistry() } -/** - * Sold's `createRoot` primitive that won't be tracked by the debugger. - */ -export const createInternalRoot: typeof SolidAPI.createRoot = (fn, detachedOwner) => { - InternalRootCount++ - const r = SolidAPI.createRoot(dispose => { - ;(SolidAPI.getOwner() as Solid.Root).isInternal = true - return fn(dispose) - }, detachedOwner) - InternalRootCount-- - return r -} - /** * Finds the top-level root owner of a given owner. */ diff --git a/packages/debugger/src/main/solid-api.ts b/packages/debugger/src/main/solid-api.ts deleted file mode 100644 index c13bc084..00000000 --- a/packages/debugger/src/main/solid-api.ts +++ /dev/null @@ -1,9 +0,0 @@ -if (!globalThis.SolidDevtools$$) { - throw new Error( - `[solid-devtools]: Debugger hasn't found the exposed Solid Devtools API. Did you import the setup script?`, - ) -} - -const SolidApi = globalThis.SolidDevtools$$ - -export default SolidApi diff --git a/packages/debugger/src/main/test/update.test.ts b/packages/debugger/src/main/test/update.test.ts index 2326bb2a..9104514f 100644 --- a/packages/debugger/src/main/test/update.test.ts +++ b/packages/debugger/src/main/test/update.test.ts @@ -6,9 +6,6 @@ import { observeValueUpdate, removeValueUpdateObserver, } from '../observe.ts' -import solidApi from '../solid-api.ts' - -const {getOwner} = solidApi describe('addSolidUpdateListener', () => { it('listens to solid updates', () => @@ -50,7 +47,7 @@ describe('interceptComputationRerun', () => { return last_value }, 'init') - const owner = getOwner()!.owned![0]! + const owner = Solid$$!.getOwner()!.owned![0]! interceptComputationRerun(owner, (fn, prev) => { last_patched_prev = prev last_patched_value = fn() @@ -74,7 +71,7 @@ describe('observeValueUpdate', () => { it('patches signal', () => createRoot(dispose => { const [, setCount] = createSignal(0, {name: 's1'}) - const signal = getOwner()!.sourceMap![0]! + const signal = Solid$$!.getOwner()!.sourceMap![0]! const symbol = Symbol() let last_prev: unknown let last_value: unknown diff --git a/packages/debugger/src/main/test/utils.test.ts b/packages/debugger/src/main/test/utils.test.ts index e0c4250d..972c8dbe 100644 --- a/packages/debugger/src/main/test/utils.test.ts +++ b/packages/debugger/src/main/test/utils.test.ts @@ -1,41 +1,40 @@ import * as s from 'solid-js' import * as vi from 'vitest' import {NodeType} from '../constants.ts' -import api from '../solid-api.ts' import {type Solid} from '../types.ts' -import {getOwnerType} from '../utils.ts' +import {getOwnerType, onCleanup} from '../utils.ts' vi.describe('getOwnerType', () => { const tests = { Component: () => { let owner!: Solid.Owner s.createComponent(() => { - owner = api.getOwner()! + owner = Solid$$!.getOwner()! return '' }, {}) vi.expect(getOwnerType(owner)).toBe(NodeType.Component) }, Effect: () => { s.createEffect(() => { - vi.expect(getOwnerType(api.getOwner()!)).toBe(NodeType.Effect) + vi.expect(getOwnerType(Solid$$!.getOwner()!)).toBe(NodeType.Effect) }) }, Memo: () => { - s.createMemo(() => vi.expect(getOwnerType(api.getOwner()!)).toBe(NodeType.Memo)) + s.createMemo(() => vi.expect(getOwnerType(Solid$$!.getOwner()!)).toBe(NodeType.Memo)) }, Computation: () => { s.createComputed(() => - vi.expect(getOwnerType(api.getOwner()!)).toBe(NodeType.Computation), + vi.expect(getOwnerType(Solid$$!.getOwner()!)).toBe(NodeType.Computation), ) }, Render: () => { s.createRenderEffect(() => - vi.expect(getOwnerType(api.getOwner()!)).toBe(NodeType.Render), + vi.expect(getOwnerType(Solid$$!.getOwner()!)).toBe(NodeType.Render), ) }, Root: () => { s.createRoot(dispose => { - vi.expect(getOwnerType(api.getOwner()!)).toBe(NodeType.Root) + vi.expect(getOwnerType(Solid$$!.getOwner()!)).toBe(NodeType.Root) dispose() }) }, @@ -45,7 +44,7 @@ vi.describe('getOwnerType', () => { Ctx.Provider({ value: 1, get children() { - memo = api.getOwner()! + memo = Solid$$!.getOwner()! return '' }, }) @@ -65,7 +64,7 @@ vi.describe('getOwnerType', () => { dispose = d cb() }) - api.onCleanup(dispose) + onCleanup(dispose) }, memo: s.createMemo, effect: s.createEffect, diff --git a/packages/debugger/src/main/types.ts b/packages/debugger/src/main/types.ts index 73ce51e4..ad00920a 100644 --- a/packages/debugger/src/main/types.ts +++ b/packages/debugger/src/main/types.ts @@ -1,60 +1,11 @@ -import type * as SolidAPI from 'solid-js' -import type {$PROXY, DEV, getListener, getOwner, onCleanup, untrack} from 'solid-js' -import type * as StoreAPI from 'solid-js/store' -import type {DEV as STORE_DEV, unwrap} from 'solid-js/store' -import type * as WebAPI from 'solid-js/web' import type {EncodedValue, PropGetterState} from '../inspector/types.ts' -import type {LocatorOptions, SourceLocation} from '../locator/types.ts' +import type {SourceLocation} from '../locator/types.ts' import {NodeType, ValueItemType} from './constants.ts' // // EXPOSED SOLID API // -export const enum DevEventType { - RootCreated = 'RootCreated', -} - -export type DevEventDataMap = { - [DevEventType.RootCreated]: Solid.Owner -} - -export type StoredDevEvent = { - [K in keyof DevEventDataMap]: { - timestamp: number - type: K - data: DevEventDataMap[K] - } -}[keyof DevEventDataMap] - -declare global { - /** Solid DEV APIs exposed to the debugger by the setup script */ - var SolidDevtools$$: - | { - readonly Solid: typeof SolidAPI - readonly Store: typeof StoreAPI - readonly Web: typeof WebAPI - readonly DEV: NonNullable - readonly getOwner: typeof getOwner - readonly createRoot: typeof SolidAPI.createRoot - readonly getListener: typeof getListener - readonly onCleanup: typeof onCleanup - readonly $PROXY: typeof $PROXY - readonly untrack: typeof untrack - readonly STORE_DEV: NonNullable - readonly unwrap: typeof unwrap - readonly getDevEvents: () => StoredDevEvent[] - readonly locatorOptions: LocatorOptions | null - readonly versions: { - readonly client: string | null - readonly solid: string | null - readonly expectedSolid: string | null - } - readonly getOwnerLocation: (owner: Solid.Owner) => string | null - } - | undefined -} - // Additional "#" character is added to distinguish NodeID from string export type NodeID = `#${string}` diff --git a/packages/debugger/src/main/utils.ts b/packages/debugger/src/main/utils.ts index c45a123c..08871c05 100644 --- a/packages/debugger/src/main/utils.ts +++ b/packages/debugger/src/main/utils.ts @@ -1,13 +1,9 @@ import {trimString} from '@solid-devtools/shared/utils' import {type Emit} from '@solid-primitives/event-bus' import {throttle} from '@solid-primitives/scheduled' -import {$PROXY} from 'solid-js' import {NodeType} from './constants.ts' -import SolidAPI from './solid-api.ts' import {type Solid} from './types.ts' -const $NODE = SolidAPI.STORE_DEV.$NODE - export const isObject = (o: unknown): o is object => typeof o === 'object' && !!o export const isSolidOwner = ( @@ -27,11 +23,11 @@ export const isSolidMemo = (o: Readonly): o is Solid.Memo => export const isSolidComponent = (o: Readonly): o is Solid.Component => 'component' in o -export const isStoreNode = (o: object): o is Solid.StoreNode => $NODE in o +export const isStoreNode = (o: object): o is Solid.StoreNode => SolidStore$$!.$NODE in o export const isSolidStore = ( o: Solid.Owner | Solid.SourceMapValue | Solid.Store, -): o is Solid.Store => !('observers' in o) && 'value' in o && isObject(o.value) && $PROXY in o.value +): o is Solid.Store => !('observers' in o) && 'value' in o && isObject(o.value) && Solid$$!.$PROXY in o.value export const isSolidSignal = (o: Solid.SourceMapValue): o is Solid.Signal => 'value' in o && 'observers' in o && 'observerSlots' in o && 'comparator' in o @@ -97,6 +93,14 @@ export function isDisposed(o: Readonly): boolean { : (o as Solid.Root).isDisposed) } +export function onCleanup(fn: () => void) { + let owner = Solid$$!.getOwner() + if (owner) { + if (owner.cleanups === null) owner.cleanups = [fn] + else owner.cleanups.push(fn) + } +} + export function getComponentRefreshNode(owner: Readonly): Solid.Memo | null { const {owned} = owner let refresh: Solid.Owner diff --git a/packages/debugger/src/setup.ts b/packages/debugger/src/setup.ts index 98493193..734a8fa4 100644 --- a/packages/debugger/src/setup.ts +++ b/packages/debugger/src/setup.ts @@ -6,14 +6,9 @@ It also starts listening to Solid DEV events and stores them to be sent to the d */ -import {error} from '@solid-devtools/shared/utils' -import * as SolidAPI from 'solid-js' -import {$PROXY, DEV, createRoot, getListener, getOwner, onCleanup, untrack} from 'solid-js' -import * as StoreAPI from 'solid-js/store' -import {DEV as STORE_DEV, unwrap} from 'solid-js/store' -import * as WebAPI from 'solid-js/web' +import {error, warn} from '@solid-devtools/shared/utils' import type {LocatorOptions} from './locator/types.ts' -import {DevEventType, type Solid, type StoredDevEvent} from './main/types.ts' +import type {Solid} from './main/types.ts' const OwnerLocationMap = new WeakMap() @@ -22,7 +17,7 @@ const OwnerLocationMap = new WeakMap() * Used by the babel plugin. */ export function setOwnerLocation(location: string) { - const owner = getOwner() + const owner = Solid$$!.getOwner() owner && OwnerLocationMap.set(owner, location) } @@ -36,68 +31,71 @@ export function useLocator(options: LocatorOptions) { } let ClientVersion: string | null = null -let SolidVersion: string | null = null let ExpectedSolidVersion: string | null = null export function setClientVersion(version: string) { ClientVersion = version } - -export function setSolidVersion(version: string, expected: string) { - SolidVersion = version +export function setExpectedSolidVersion(expected: string) { ExpectedSolidVersion = expected } +export const setSolidVersion = setExpectedSolidVersion // back compat 0.24.1 -let DevEvents: StoredDevEvent[] | null = [] - -if (window.SolidDevtools$$) { - error('Debugger is already setup') +declare global { + /** Solid DEV APIs exposed to the debugger by the setup script */ + var SolidDevtools$$: undefined | { + get_created_owners(): Solid.Owner[] + get_locator_options(): LocatorOptions | null + versions: { + get_client(): string | null + get_solid(): string | null + get_expected_solid(): string | null + } + getOwnerLocation: (owner: Solid.Owner) => string | null + } } -if (!DEV || !STORE_DEV) { - error('SolidJS in not in development mode!') -} else { - window.SolidDevtools$$ = { - Solid: SolidAPI, - Store: StoreAPI, - Web: WebAPI, - DEV, - getOwner, - createRoot, - getListener, - onCleanup, - $PROXY, - untrack, - STORE_DEV, - unwrap, - getDevEvents() { - const events = DevEvents ?? [] - DevEvents = null - return events - }, - get locatorOptions() { - return PassedLocatorOptions - }, - versions: { - get client() { - return ClientVersion +export function setupSolidDevtools( + Solid$$: typeof globalThis.Solid$$, + SolidStore$$: typeof globalThis.SolidStore$$, +) { + + if (globalThis.SolidDevtools$$) { + warn('Debugger is already setup') + return + } + + if (!globalThis.Solid$$) { + error('SolidJS in not in development mode!') + } else { + + let created_owners: Solid.Owner[] | null = [] + + globalThis.SolidDevtools$$ = { + get_created_owners() { + let owners = created_owners ?? [] + created_owners = null + return owners }, - get solid() { - return SolidVersion + get_locator_options() { + return PassedLocatorOptions }, - get expectedSolid() { - return ExpectedSolidVersion + versions: { + get_client() { + return ClientVersion + }, + get_solid() { + return Solid$$!.version + }, + get_expected_solid() { + return ExpectedSolidVersion + }, }, - }, - getOwnerLocation, - } + getOwnerLocation, + } - DEV.hooks.afterCreateOwner = function (owner) { - if (!DevEvents) return - DevEvents.push({ - timestamp: Date.now(), - type: DevEventType.RootCreated, - data: owner, - }) + Solid$$!.hooks.afterCreateOwner = owner => { + created_owners?.push(owner) + } } } diff --git a/packages/debugger/src/structure/test/walker.test.tsx b/packages/debugger/src/structure/test/walker.test.tsx index 059b484c..0d277ddd 100644 --- a/packages/debugger/src/structure/test/walker.test.tsx +++ b/packages/debugger/src/structure/test/walker.test.tsx @@ -9,13 +9,10 @@ import { import {beforeEach, describe, expect, it, vi} from 'vitest' import {NodeType, TreeWalkerMode} from '../../main/constants.ts' import {$setSdtId, ObjectType, getSdtId} from '../../main/id.ts' -import SolidApi from '../../main/solid-api.ts' import {type Mapped, type Solid} from '../../main/types.ts' import {getNodeName} from '../../main/utils.ts' import {type ComputationUpdateHandler, walkSolidTree} from '../walker.ts' -const {getOwner} = SolidApi - let mockLAST_ID = 0 beforeEach(() => { mockLAST_ID = 0 @@ -42,7 +39,7 @@ describe('TreeWalkerMode.Owners', () => { { const [dispose, owner] = createRoot(_dispose => { mockTree() - return [_dispose, getOwner()! as Solid.Root] + return [_dispose, Solid$$!.getOwner()! as Solid.Root] }) const tree = walkSolidTree(owner, { @@ -113,7 +110,7 @@ describe('TreeWalkerMode.Owners', () => { {name: 'WRAPPER'}, ) - const rootOwner = getOwner()! as Solid.Root + const rootOwner = Solid$$!.getOwner()! as Solid.Root const tree = walkSolidTree(rootOwner, { rootId: $setSdtId(rootOwner, '#0'), onComputationUpdate: () => { @@ -172,11 +169,11 @@ describe('TreeWalkerMode.Owners', () => { let computedOwner!: Solid.Owner const [a, setA] = createSignal(0) createComputed(() => { - computedOwner = getOwner()! + computedOwner = Solid$$!.getOwner()! a() }) - const owner = getOwner()! as Solid.Root + const owner = Solid$$!.getOwner()! as Solid.Root walkSolidTree(owner, { onComputationUpdate: (...args) => capturedComputationUpdates.push(args), rootId: $setSdtId(owner, '#ff'), @@ -222,7 +219,7 @@ describe('TreeWalkerMode.Owners', () => { ) }) - const owner = getOwner()! as Solid.Root + const owner = Solid$$!.getOwner()! as Solid.Root const components: string[] = [] @@ -268,7 +265,7 @@ describe('TreeWalkerMode.Components', () => { const [a, set] = createSignal(0) createComputed(a) toTrigger.push(() => set(1)) - testComponents.push(getOwner()! as Solid.Component) + testComponents.push(Solid$$!.getOwner()! as Solid.Component) return createRoot(_ => (
{props.n === 0 ? 'end' : }
)) @@ -288,7 +285,7 @@ describe('TreeWalkerMode.Components', () => { ) }) - const owner = getOwner()! as Solid.Root + const owner = Solid$$!.getOwner()! as Solid.Root const computationUpdates: Parameters[] = [] @@ -374,7 +371,7 @@ describe('TreeWalkerMode.DOM', () => { const [a, set] = createSignal(0) createComputed(a) toTrigger.push(() => set(1)) - testComponents.push(getOwner()! as Solid.Component) + testComponents.push(Solid$$!.getOwner()! as Solid.Component) return createRoot(_ => (
{props.n === 0 ? 'end' : }
)) @@ -397,7 +394,7 @@ describe('TreeWalkerMode.DOM', () => { } createRenderEffect(() => ) - const owner = getOwner()! as Solid.Root + const owner = Solid$$!.getOwner()! as Solid.Root const computationUpdates: Parameters[] = [] diff --git a/packages/debugger/test_setup.ts b/packages/debugger/test_setup.ts new file mode 100644 index 00000000..84ebd788 --- /dev/null +++ b/packages/debugger/test_setup.ts @@ -0,0 +1,11 @@ +/* Run setup before importing the debugger */ +import * as solid from 'solid-js' +import * as store from 'solid-js/store' +import {setupSolidDevtools} from './src/setup.ts' +setupSolidDevtools(solid.DEV, store.DEV) + +import {startObserve} from './src/main/observe.ts' +startObserve() + +import {startObservingStores} from './src/inspector/store.ts' +startObservingStores() diff --git a/packages/debugger/vite.config.ts b/packages/debugger/vite.config.ts index f3340dda..80e2c725 100644 --- a/packages/debugger/vite.config.ts +++ b/packages/debugger/vite.config.ts @@ -1,6 +1,6 @@ -import {vitestFullConfig} from '../../configs/vitest.config' +import {vitestFullConfig} from '../../configs/vitest.config.ts' export default vitestFullConfig(c => { // setup needs to run before the tests to add solid-js api to the global scope - c.test!.setupFiles = './src/setup.ts' + c.test!.setupFiles = 'test_setup.ts' }) diff --git a/packages/extension/content/debugger.ts b/packages/extension/content/debugger.ts index b935d0ab..cef8aeeb 100644 --- a/packages/extension/content/debugger.ts +++ b/packages/extension/content/debugger.ts @@ -78,12 +78,15 @@ Expected version: ${title}@${expected_str}`) const debug = useDebugger() /* Check versions */ -warn_on_version_mismatch(debug.meta.versions.client, import.meta.env.EXPECTED_CLIENT, 'solid-devtools') -warn_on_version_mismatch(debug.meta.versions.solid, debug.meta.versions.expectedSolid, 'solid-js') +warn_on_version_mismatch(debug.meta.versions.get_client(), import.meta.env.EXPECTED_CLIENT, 'solid-devtools') +warn_on_version_mismatch(debug.meta.versions.get_solid(), debug.meta.versions.get_expected_solid(), 'solid-js') // in case of navigation/page reload, reset the locator mode state in the extension toContent('ResetPanel') -toContent('Debugger_Connected', debug.meta.versions) +toContent('Debugger_Connected', { + client: debug.meta.versions.get_client(), + solid: debug.meta.versions.get_solid(), +}) fromContent('DevtoolsOpened', () => debug.toggleEnabled(true)) fromContent('DevtoolsClosed', () => debug.toggleEnabled(false)) diff --git a/packages/extension/vite.config.ts b/packages/extension/vite.config.ts index c78cf5da..ba8ce27f 100644 --- a/packages/extension/vite.config.ts +++ b/packages/extension/vite.config.ts @@ -1,7 +1,6 @@ import * as crx from '@crxjs/vite-plugin' import * as fs from 'node:fs' import * as module from 'node:module' -import * as path from 'node:path' import * as assert from 'node:assert' import * as vite from 'vite' import solid from 'vite-plugin-solid' @@ -9,7 +8,6 @@ import ext_pkg from './package.json' import {icons} from './shared/icons.js' const require = module.createRequire(import.meta.url) -const cwd = process.cwd() const browser = process.env['BROWSER'] ?? 'chrome' assert.ok(browser === 'chrome' || browser === 'firefox') @@ -89,11 +87,7 @@ const sdt_version = JSON.stringify(sdt_pkg.version.match(/\d+.\d+.\d+/)![0]) const vite_config: vite.UserConfig = { server: {port: 3333}, resolve: { - alias: { - 'solid-js/web': path.resolve(cwd, 'node_modules/solid-js/web/dist/web.js'), - 'solid-js/store': path.resolve(cwd, 'node_modules/solid-js/store/dist/store.js'), - 'solid-js': path.resolve(cwd, 'node_modules/solid-js/dist/solid.js'), - }, + conditions: ['browser'] }, plugins: [ solid({dev: false, hot: false}), diff --git a/packages/main/build.ts b/packages/main/build.ts index afe188e5..3591ed53 100644 --- a/packages/main/build.ts +++ b/packages/main/build.ts @@ -1,11 +1,10 @@ -import * as path from 'node:path' -import * as url from 'node:url' -import * as esb from 'esbuild' +import * as path from 'node:path' +import * as url from 'node:url' +import * as esb from 'esbuild' -import pkg from './package.json' with {type: 'json'} -import solid_pkg from 'solid-js/package.json' with {type: 'json'} +import pkg from './package.json' with {type: 'json'} -import * as build from '../../build.ts' +import * as build from '../../build.ts' const filename = url.fileURLToPath(import.meta.url) @@ -42,7 +41,6 @@ async function main() { external: external, define: { 'process.env.CLIENT_VERSION': JSON.stringify(pkg.version), - 'process.env.SOLID_VERSION': JSON.stringify(solid_pkg.version), 'process.env.EXPECTED_SOLID_VERSION': JSON.stringify(pkg.peerDependencies['solid-js'].match(/\d+.\d+.\d+/)![0]), }, }, { diff --git a/packages/main/src/env.d.ts b/packages/main/src/env.d.ts index ba582a05..c52fc17b 100644 --- a/packages/main/src/env.d.ts +++ b/packages/main/src/env.d.ts @@ -3,7 +3,6 @@ declare global { namespace NodeJS { interface ProcessEnv { CLIENT_VERSION: string - SOLID_VERSION: string EXPECTED_SOLID_VERSION: string } } diff --git a/packages/main/src/setup.ts b/packages/main/src/setup.ts index 7465f9ff..7975e9bc 100644 --- a/packages/main/src/setup.ts +++ b/packages/main/src/setup.ts @@ -1,14 +1,17 @@ -import '@solid-devtools/debugger/setup' - +import * as solid from 'solid-js' +import * as store from 'solid-js/store' import { setClientVersion, setOwnerLocation, - setSolidVersion, + setExpectedSolidVersion, useLocator, + setupSolidDevtools, } from '@solid-devtools/debugger/setup' +setupSolidDevtools(solid.DEV, store.DEV) + setClientVersion(process.env.CLIENT_VERSION) -setSolidVersion(process.env.SOLID_VERSION, process.env.EXPECTED_SOLID_VERSION) +setExpectedSolidVersion(process.env.EXPECTED_SOLID_VERSION) /** * Set debugger locator module options. diff --git a/packages/overlay/build.ts b/packages/overlay/build.ts index b428dad7..0f8ac509 100644 --- a/packages/overlay/build.ts +++ b/packages/overlay/build.ts @@ -48,14 +48,12 @@ async function main() { '@nothing-but/utils', ] - const entries = [ - entry_index_filename, - entry_index_noop_filename, - ] - const esb_options: esb.BuildOptions[] = [{ ...common, - entryPoints: entries, + entryPoints: [ + entry_index_filename, + entry_index_noop_filename, + ], external: external, loader: {'.css': 'text'}, plugins: [ @@ -64,7 +62,9 @@ async function main() { ], }] - const ts_entries = entries + const ts_entries = [ + entry_index_filename, + ] await build.build(esb_options, ts_entries, is_dev) } diff --git a/packages/overlay/package.json b/packages/overlay/package.json index 9068a371..d2484dbc 100644 --- a/packages/overlay/package.json +++ b/packages/overlay/package.json @@ -28,17 +28,17 @@ "type": "module", "main": "./dist/index_noop.js", "module": "./dist/index_noop.js", - "types": "./dist/types/index.d.ts", + "types": "./dist/index.d.ts", "exports": { "browser": { "development": { - "types": "./dist/types/index.d.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" }, - "types": "./dist/types/index.d.ts", + "types": "./dist/index.d.ts", "default": "./dist/index_noop.js" }, - "types": "./dist/types/index.d.ts", + "types": "./dist/index.d.ts", "default": "./dist/index_noop.js" }, "scripts": { diff --git a/packages/overlay/src/index.tsx b/packages/overlay/src/index.tsx index e31f767c..97b3ed31 100644 --- a/packages/overlay/src/index.tsx +++ b/packages/overlay/src/index.tsx @@ -1,20 +1,29 @@ -import '@solid-devtools/debugger/setup' +/* Run setup before importing the debugger */ +import * as s from 'solid-js' +import * as store from 'solid-js/store' +import * as web from 'solid-js/web' +import {setupSolidDevtools} from '@solid-devtools/debugger/setup' +setupSolidDevtools(s.DEV, store.DEV) -import {num} from '@nothing-but/utils' +import * as num from '@nothing-but/utils/num' import {useDebugger} from '@solid-devtools/debugger/bundled' import {Icon, MountIcons} from '@solid-devtools/frontend' -import {useIsMobile, useIsTouch} from '@solid-devtools/shared/primitives' +import {useIsMobile, useIsTouch, atom} from '@solid-devtools/shared/primitives' import {createBodyCursor} from '@solid-primitives/cursor' import {makeEventListener} from '@solid-primitives/event-listener' -import * as s from 'solid-js' -import {Dynamic, Portal} from 'solid-js/web' import {Devtools} from './controller.tsx' import frontendStyles from '@solid-devtools/frontend/dist/styles.css' import overlayStyles from './styles.css' -export function attachDevtoolsOverlay(props: s.ComponentProps = {}): VoidFunction { - let dispose: VoidFunction | undefined +export type OverlayOptions = { + defaultOpen?: boolean + alwaysOpen?: boolean + noPadding?: boolean +} + +export function attachDevtoolsOverlay(props?: OverlayOptions): (() => void) { + let dispose: (() => void) | undefined setTimeout(() => { s.createRoot(_dispose => { @@ -28,55 +37,54 @@ export function attachDevtoolsOverlay(props: s.ComponentProps = } } -const Overlay: s.Component<{ - defaultOpen?: boolean - alwaysOpen?: boolean - noPadding?: boolean -}> = ({defaultOpen, alwaysOpen, noPadding}) => { +const Overlay: s.Component = ({defaultOpen, alwaysOpen, noPadding}) => { + const debug = useDebugger() - if (defaultOpen || alwaysOpen) debug.toggleEnabled(true) - const [isOpen, _setOpen] = s.createSignal(alwaysOpen || debug.enabled()) - const setOpen = alwaysOpen - ? () => { - /**/ - } - : (enabled: boolean) => { - s.batch(() => { - debug.toggleEnabled(enabled) - _setOpen(enabled) - }) - } + + if (defaultOpen || alwaysOpen) { + debug.toggleEnabled(true) + } + + const isOpen = atom(alwaysOpen || debug.enabled()) + function toggleOpen(enabled?: boolean) { + if (!alwaysOpen) { + enabled ??= !isOpen() + debug.toggleEnabled(enabled) + isOpen.set(enabled) + } + } const isMobile = useIsMobile() - const isTouch = useIsTouch() + const isTouch = useIsTouch() - const [progress, setProgress] = s.createSignal(0.5) - const [dragging, setDragging] = s.createSignal(false) - s.createComputed(() => setProgress(isMobile() ? 0.8 : 0.5)) + const progress = s.createMemo( + () => atom(isMobile() ? 0.8 : 0.5) + ) + const dragging = atom(false) makeEventListener(window, 'pointermove', e => { if (!dragging()) return const vh = window.innerHeight - setProgress(1 - num.clamp(e.y, 0, vh - 300) / vh) + progress().set(1 - num.clamp(e.y, 0, vh - 300) / vh) }) - makeEventListener(window, 'pointerup', setDragging.bind(void 0, false)) + makeEventListener(window, 'pointerup', () => dragging.set(false)) createBodyCursor(() => dragging() && 'row-resize') return ( - +
{!alwaysOpen && ( -