react-state-custom 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.es.js CHANGED
@@ -214,12 +214,12 @@ const y = J((t) => new W(t)), E = (t = "noname") => g(() => y(t), [t]), A = (t,
214
214
  let n = t.get(e);
215
215
  return n || t.set(e, n = (e?.name ?? "") + Math.random().toString()), n;
216
216
  };
217
- }(), z = (t) => [
217
+ }(), I = (t) => [
218
218
  ...Object.entries(t ?? {}).sort((e, n) => e[0].localeCompare(n[0])).flat()
219
219
  ].join("-"), le = ({ Wrapper: t = F }) => {
220
220
  const e = E("auto-ctx"), [n, a] = v({}), r = $(
221
221
  (s, c) => {
222
- const l = _(s), i = z(c);
222
+ const l = _(s), i = I(c);
223
223
  return a(({
224
224
  [l]: {
225
225
  Component: u = s,
@@ -321,10 +321,10 @@ const y = J((t) => new W(t)), E = (t = "noname") => g(() => y(t), [t]), A = (t,
321
321
  () => () => s(),
322
322
  [s]
323
323
  ), n;
324
- }, I = y.cache, q = ({}) => {
324
+ }, q = y.cache, z = ({}) => {
325
325
  const [t, e] = v("");
326
326
  return /* @__PURE__ */ m("div", { className: "main-panel", children: [
327
- /* @__PURE__ */ o("div", { className: "state-list", children: [...I.keys()].map((n) => JSON.parse(n)?.[0]).filter((n) => n != "auto-ctx").map((n) => /* @__PURE__ */ o(
327
+ /* @__PURE__ */ o("div", { className: "state-list", children: [...q.keys()].map((n) => JSON.parse(n)?.[0]).filter((n) => n != "auto-ctx").map((n) => /* @__PURE__ */ o(
328
328
  "div",
329
329
  {
330
330
  className: "state-key",
@@ -351,7 +351,7 @@ const y = J((t) => new W(t)), E = (t = "noname") => g(() => y(t), [t]), A = (t,
351
351
  value: n,
352
352
  name: "ROOT",
353
353
  expandLevel: 1,
354
- style: { height: "300px", overflow: "auto", resize: "vertical" }
354
+ style: {}
355
355
  }
356
356
  );
357
357
  }, x = (t, e = 10) => Object.fromEntries(
@@ -555,7 +555,7 @@ const y = J((t) => new W(t)), E = (t = "noname") => g(() => y(t), [t]), A = (t,
555
555
  /* @__PURE__ */ o("button", { className: "react-state-dev-btn", "data-active": n, onClick: () => a(!0), ...e, children: e?.children ?? "Toggle Dev Tool" }),
556
556
  /* @__PURE__ */ m("div", { className: "react-state-dev-container", "data-active": n, children: [
557
557
  /* @__PURE__ */ o("button", { className: "close-btn", onClick: () => a(!1), children: "[x]" }),
558
- /* @__PURE__ */ o(q, {})
558
+ /* @__PURE__ */ o(z, {})
559
559
  ] })
560
560
  ] });
561
561
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/state-utils/utils.ts","../src/state-utils/useArrayHash.ts","../src/state-utils/ctx.ts","../src/state-utils/createRootCtx.tsx","../src/state-utils/createAutoCtx.tsx","../src/state-utils/useQuickSubscribe.ts","../src/DevToolState.tsx","../src/DevTool.tsx"],"sourcesContent":["// Debounce function\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) & { cancel: any } {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n let fn: Function & { cancel: any } = function (...args: Parameters<T>): void {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n } as any;\n\n fn.cancel = () => clearTimeout(timeout!);\n\n return fn as any;\n}\n\n// Memoize function\nexport function memoize<T extends (...args: any[]) => any>(\n func: T\n): ((...args: Parameters<T>) => ReturnType<T>) & { cache: Map<string, ReturnType<T>> } {\n \n const cache = new Map<string, ReturnType<T>>();\n\n const cachedFunc: any = function (...args: Parameters<T>): ReturnType<T> {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key) as ReturnType<T>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n }\n\n cachedFunc.cache = cache;\n\n return cachedFunc\n}\n\n","import { useRef } from \"react\"\n\n\nconst randomHash = () => Math.random().toString().slice(2)\n\n/**\n * useArrayHash\n *\n * A custom hook that computes a stable hash for an array of values.\n * The hash changes only when the array's contents differ from the previous call.\n *\n * @param e - The input array to hash.\n * @returns A string hash that updates when the array changes.\n *\n * How it works:\n * - Tracks the previous array and its hash using a `useRef`.\n * - Compares the new array to the previous one by length and element equality.\n * - If any difference is detected, generates a new random hash.\n */\nexport const useArrayHash = (e: any[]): string => {\n\n const { current: { computedHash } } = useRef({\n /**\n * Getter for the computed hash function.\n *\n * - Initializes with an empty array and a random hash.\n * - Returns a function that compares the current array to the previous one.\n * - Updates the hash if any difference is detected.\n */\n get computedHash() {\n let currentValues: any[] = []\n let currentHash = randomHash()\n return (e: any[]) => {\n let isDiff = false\n\n // Check for differences in array existence, length, or elements.\n isDiff = isDiff || ((!e) != (!currentValues))\n isDiff = isDiff || (e?.length != currentValues?.length);\n isDiff = isDiff || (e.some((f, i) => f != currentValues[i]));\n\n // Update the hash if differences are found.\n currentValues = e;\n if (isDiff) {\n currentHash = randomHash()\n }\n\n return currentHash\n }\n }\n })\n\n return computedHash(e)\n}","import { debounce, memoize } from \"./utils\";\nimport { useEffect, useMemo, useState } from \"react\"\nimport { useArrayHash } from \"./useArrayHash\"\n\n\n\nclass DataEvent extends Event {\n constructor(\n public event: string,\n public value: any\n ) {\n super(event);\n }\n}\n\n/**\n * Generic context for managing shared state and event subscriptions.\n * @template D - The shape of the data managed by the context.\n */\nexport class Context<D> extends EventTarget {\n /**\n * Create a new Context instance.\n * @param name - The name of the context (for debugging).\n */\n constructor(public name: string) {\n console.log(\"[CONTEXT] %s\", name)\n // this.event.setMaxListeners(100)\n super();\n }\n\n // private event = new EventEmitter()\n\n /**\n * The current data held by the context.\n */\n public data: Partial<D> = {}\n /**\n * Registry for tracking active keys (for duplicate detection).\n */\n public registry = new Set<string>()\n\n /**\n * Publish a value to the context and notify subscribers if it changed.\n * @param key - The key to update.\n * @param value - The new value.\n */\n public publish(key: keyof D, value: D[typeof key] | undefined) {\n\n if (value != this.data[key]) {\n this.data[key] = value\n // console.count(\"[COUNT] \" + String(key))\n // this.event.emit(String(key), { value })\n this.dispatchEvent(new DataEvent(String(key), value))\n }\n }\n\n /**\n * Subscribe to changes for a specific key in the context.\n * @param key - The key to subscribe to.\n * @param _listener - Callback invoked with the new value.\n * @returns Unsubscribe function.\n */\n public subscribe(key: keyof D, _listener: (e: D[typeof key] | undefined) => void) {\n\n const listener = ({ event, value }: any) => {\n _listener(value)\n }\n\n this.addEventListener(String(key), listener)\n // console.log(\"listenerCount:\", String(key), this.event.listenerCount(String(key)))\n\n if (key in this.data) _listener(this.data[key])\n\n return () => (this.removeEventListener(String(key), listener), undefined)\n }\n\n}\n\n/**\n * Get or create a memoized Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const getContext = memoize((name: string) => new Context<any>(name))\n\n/**\n * Type alias for a function that returns a Context instance.\n */\nexport type getContext<D> = (e: string) => Context<D>\n\n/**\n * React hook to get a typed Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const useDataContext = <D>(name: string = \"noname\") => {\n\n const ctx = useMemo(() => getContext(name), [name])\n\n return ctx as any as Context<D>\n}\n\n/**\n * Internal hook to check for duplicate registry entries in a context.\n * Warns if any of the provided names are already registered.\n * @param ctx - The context instance.\n * @param names - Names to check and register.\n */\nconst useRegistryChecker = (ctx: Context<any> | undefined, ...names: string[]) => {\n // return;\n const stack = new Error(\"[ctx] useRegistryChecker failed \" + JSON.stringify({ names, ctx: ctx?.name ?? 'undefined' }))\n\n useEffect(\n () => {\n if (ctx) {\n if (names.some(name => ctx.registry.has(name))) {\n console.error(stack)\n }\n names.forEach(e => ctx.registry.add(e))\n\n // console.debug(\"[ctx] %s%s add datasource\", componentId, ctx.name, names)\n return () => {\n // console.debug(\"[ctx] %s %s remove datasource\", componentId, ctx.name, names)\n\n names.forEach(e => ctx.registry.delete(e))\n }\n }\n },\n [ctx, names.length]\n )\n\n}\n\n/**\n * React hook to publish a value to the context when it changes.\n * @param ctx - The context instance.\n * @param key - The key to update.\n * @param value - The new value.\n */\nexport const useDataSource = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, value: D[K] | undefined) => {\n //@ts-check\n useEffect(() => {\n if (ctx && ctx.data[key] != value) {\n\n ctx.publish(key, value)\n }\n }, [key, value, ctx])\n\n useRegistryChecker(ctx, key as any)\n}\n\n/**\n * React hook to subscribe to a context value, with optional debounce.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param debounceTime - Debounce time in ms (default 0).\n * @returns The current value for the key.\n */\nexport const useDataSubscribe = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, debounceTime = 0): D[K] | undefined => {\n //@ts-check\n const [{ value }, setState] = useState(() => ({ value: ctx?.data?.[key] }))\n\n useEffect(() => {\n if (ctx) {\n let callback = debounceTime == 0\n ? (value: any) => setState({ value } as any)\n : debounce((value: any) => setState({ value } as any), debounceTime)\n let unsub = ctx.subscribe(key, callback)\n value != ctx.data[key] && setState({ value: ctx.data[key] })\n return () => {\n unsub()\n }\n }\n }, [key, ctx])\n\n return ctx?.data[key]\n}\n\n/**\n * React hook to subscribe to a context value and transform it before returning.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param transform - Function to transform the value.\n * @returns The transformed value.\n */\nexport const useDataSubscribeWithTransform = <D, K extends keyof D, E>(ctx: Context<D> | undefined, key: K, transform: (e: D[K] | undefined) => E): E => {\n const [, setState] = useState(0)\n const result = useMemo(\n () => transform(ctx?.data[key]),\n [transform, ctx?.data[key]]\n )\n\n useEffect(() => {\n if (ctx) {\n let preValue = result\n let callback = () => {\n let newValue = transform(ctx.data[key])\n if (newValue != preValue) {\n preValue = newValue;\n setState(e => e + 1)\n };\n }\n let unsub = ctx.subscribe(key, callback)\n callback();\n return () => unsub()\n }\n }, [key, ctx])\n\n return result\n}\n\n/**\n * React hook to publish multiple values to the context.\n * @param ctx - The context instance.\n * @param entries - Array of [key, value] pairs to update.\n */\nexport const useDataSourceMultiple = <D, T extends readonly (keyof D)[]>(\n ctx: Context<D> | undefined,\n ...entries: { -readonly [P in keyof T]: [T[P], D[T[P]]] }\n) => {\n //@ts-check\n useEffect(() => {\n if (ctx) {\n for (let [key, value] of entries) {\n ctx.data[key] != value && ctx.publish(key, value)\n }\n }\n }, [ctx, useArrayHash(entries.flat())])\n\n useRegistryChecker(ctx, ...entries.map(e => e[0]) as any)\n\n}\n\n/**\n * React hook to subscribe to multiple context values.\n * @param ctx - The context instance.\n * @param keys - Keys to subscribe to.\n * @returns An object with the current values for the keys.\n */\nexport const useDataSubscribeMultiple = <D, K extends keyof D>(\n ctx: Context<D> | undefined,\n ...keys: K[]\n): Pick<D, K> => {\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n // console.log(\"DIFF\", keys.filter((e, i) => prevValues[i] != currentValues[i]))\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, 1)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n\n return Object\n .fromEntries(keys.map((key, index) => [key, returnValues[index]])) as any\n}\n\n/**\n * React hook to subscribe to multiple context values with throttling.\n * @param ctx - The context instance.\n * @param debounceTime - Debounce time in ms (default 50).\n * @param keys - Keys to subscribe to.\n * @returns Array of current values for the keys.\n */\nexport const useDataSubscribeMultipleWithDebounce = <D, K extends (keyof D)[]>(\n ctx: Context<D> | undefined,\n debounceTime = 50,\n ...keys: K\n): { [i in keyof K]: D[K[i]] | undefined } => {\n //@ts-check\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, debounceTime)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n return returnValues as any\n}\n\n\n\n","import { useEffect, useMemo } from \"react\"\nimport { useDataContext, useDataSourceMultiple, type Context } from \"./ctx\"\n\n\n\n/**\n * createRootCtx\n *\n * Factory that creates a headless \"Root\" component and companion hooks for a context namespace.\n * It derives a unique context name from a base `name` and a props object `U`, then publishes\n * a computed state `V` (from `useFn`) to that context.\n *\n * Usage (manual mounting):\n * ```\n * const { Root, useCtxState } = createRootCtx('user-state', useUserState)\n * ...\n * // Mount exactly one Root per unique props combination\n * <Root userId={id} />\n * ...\n * // Read anywhere ,using the same props shape\n * const user = useCtxState({ userId: id })\n *```\n * Strict vs lenient consumers:\n * - useCtxStateStrict(props) throws if a matching Root is not mounted.\n * - useCtxState(props) logs an error (after 1s) instead of throwing.\n *\n * Multiple instances safety:\n * - Mounting more than one Root with the same resolved context name throws (guards accidental duplicates).\n *\n * Name resolution notes:\n * - The context name is built from `name` + sorted key/value pairs of `props` (U), joined by \"-\".\n * - Prefer stable, primitive props to avoid collisions; if you need automation, pair with `createAutoCtx` and\n * mount a single <AutoRootCtx Wrapper={ErrorBoundary} /> at the app root so you don't manually mount `Root`.\n */\nexport const createRootCtx = <U extends object, V extends object>(name: string, useFn: (e: U) => V) => {\n\n const resolveCtxName = (e: U) => [\n name,\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n ].join(\"-\")\n\n let ctxMountedCheck = new Set<string>()\n\n\n const RootState: React.FC<U> = (e: U) => {\n const state = useFn(e)\n const ctxName = resolveCtxName(e)\n const ctx = useDataContext<V>(ctxName)\n const stack = useMemo(() => new Error().stack, [])\n\n useDataSourceMultiple(\n ctx,\n ...Object.entries(state) as any\n )\n\n useEffect(() => {\n if (ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext \" + ctxName + \" are mounted more than once\")\n err.stack = stack;\n throw err\n }\n ctxMountedCheck.add(ctxName)\n return () => { ctxMountedCheck.delete(ctxName) };\n })\n\n return <></>\n }\n\n RootState.displayName = `State[${useFn?.name??'??'}]`\n\n return {\n resolveCtxName,\n Root: RootState,\n /**\n * Strict consumer: throws if the corresponding Root for these props isn't mounted.\n * Use in development/tests to fail fast when wiring is incorrect.\n */\n useCtxStateStrict: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n throw err\n }\n }, [ctxName])\n\n return useDataContext<V>(ctxName)\n },\n /**\n * Lenient consumer: schedules a console.error if the Root isn't mounted instead of throwing.\n * Useful in production to avoid hard crashes while still surfacing misconfiguration.\n */\n useCtxState: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n let timeout = setTimeout(() => console.error(err), 1000)\n return () => clearTimeout(timeout)\n }\n }, [ctxMountedCheck.has(ctxName)])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","import { useEffect, useState, Fragment, useCallback } from \"react\"\nimport { useDataContext, useDataSourceMultiple, useDataSubscribe, type Context } from \"./ctx\"\nimport { createRootCtx } from \"./createRootCtx\"\n\n\n\n\n\n\nconst weakmapName = (function () {\n const weakmap = new WeakMap()\n\n return (e: any): string => {\n let result = weakmap.get(e);\n if (!result) {\n weakmap.set(e, result = (e?.name ?? \"\") + Math.random().toString())\n }\n return result\n }\n})()\n\n\nconst resolveName = (e: any) => [\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n].join(\"-\")\n\n/**\n * Inline docs: createAutoCtx + AutoRootCtx\n *\n * Quick start\n * 1) Mount <AutoRootCtx /> ONCE near your app root. Provide a Wrapper that acts like an ErrorBoundary to isolate and log errors.\n * Example: <AutoRootCtx Wrapper={MyErrorBoundary} />\n *\n * 2) Create auto contexts from your root context factories:\n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx('test-state', stateFn))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx('other-state', otherFn))\n * ```\n * 3) Use them in components:\n * ```\n * const ctx = useTestCtxState({ userId })\n * const { property1, property2 } = useDataSubscribeMultiple(ctx,'property1','property2')\n * // No need to mount the Root returned by createRootCtx directly — AutoRootCtx manages it for you.\n * ```\n * Notes\n * - AutoRootCtx must be mounted before any useCtxState hooks created by createAutoCtx run.\n * - Wrapper should be an ErrorBoundary-like component that simply renders {children}; no extra providers or layout required.\n * - For each unique params object (by stable stringified key), AutoRootCtx ensures a corresponding Root instance is rendered.\n */\n\nexport const AutoRootCtx = ({ Wrapper = Fragment }) => {\n\n const ctx = useDataContext<any>(\"auto-ctx\")\n\n\n const [state, setState] = useState<Record<string, { Component: React.FC, subState: Record<string, { params: any, counter: number }> }>>({})\n\n\n const subscribeRoot = useCallback(\n (Comp: any, params: any) => {\n const weakName = weakmapName(Comp);\n const key = resolveName(params);\n\n setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n [key]: {\n ...preState,\n counter: preState.counter + 1,\n },\n },\n }\n }));\n\n return () => setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n ...preState.counter > 1 ? {\n [key]: {\n ...preState,\n counter: preState.counter - 1,\n },\n } : {},\n },\n }\n }))\n\n },\n []\n )\n\n useDataSourceMultiple(ctx,\n [\"subscribe\", subscribeRoot],\n [\"state\", state],\n )\n\n\n return <>\n {Object.entries(state)\n .flatMap(([k1, { Component, subState }]) => Object\n .entries(subState)\n .map(([k2, { counter, params }]) => ({ key: k1 + k2, Component, params, counter }))\n .filter(e => e.counter > 0)\n .map(({ key, params, Component }) => <Wrapper key={key} >\n <Component {...params} />\n </Wrapper>)\n )\n }\n </>\n\n}\n\n/**\n * createAutoCtx\n *\n * Bridges a Root context (from createRootCtx) to the global AutoRootCtx renderer.\n * You do NOT mount the Root component yourself — just mount <AutoRootCtx /> once at the app root.\n *\n * Usage: \n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx(\n * 'test-state', \n * stateFn\n * ))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx(\n * 'other-state', \n * otherFn\n * ))\n * ```\n * \n * Then inside components:\n * ```\n * const ctxState = useTestCtxState({ any: 'params' })\n * ```\n * AutoRootCtx will subscribe/unsubscribe instances per unique params and render the appropriate Root under the hood.\n */\nexport const createAutoCtx = <U extends object, V extends object,>(\n { Root, useCtxState, useCtxStateStrict, resolveCtxName }: ReturnType<typeof createRootCtx<U, V>>,\n unmountTime = 0\n) => {\n\n return {\n\n useCtxState: (e: U): Context<V> => {\n\n const ctxName = resolveCtxName(e)\n\n const subscribe = useDataSubscribe(useDataContext<any>(\"auto-ctx\"), \"subscribe\")\n\n useEffect(() => {\n // Subscribe this component to an AutoRootCtx-managed Root instance keyed by e.\n // AutoRootCtx handles instance ref-counting and cleanup on unmount.\n if (unmountTime == 0) {\n return subscribe?.(Root, e)\n } else {\n let unsub = subscribe?.(Root, e)\n return () => setTimeout(unsub, unmountTime)\n }\n }, [subscribe, ctxName])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","\nimport { debounce } from \"./utils\";\nimport { useState, useMemo, useEffect } from \"react\";\nimport type { Context } from \"./ctx\";\n\n/**\n * useQuickSubscribe is a custom React hook for efficiently subscribing to specific properties of a context's data object.\n * \n * @template D - The shape of the context data.\n * @param {Context<D> | undefined} ctx - The context object containing data and a subscribe method.\n * @returns {Partial<D>} A proxy object that mirrors the context data, automatically subscribing to properties as they are accessed.\n *\n * This hook tracks which properties of the context data are accessed by the component and subscribes to updates for only those properties.\n * When any of the subscribed properties change, the hook triggers a re-render. Subscriptions are managed and cleaned up automatically\n * when the component unmounts or the context changes. This approach minimizes unnecessary re-renders and resource usage by only\n * subscribing to the data that the component actually uses.\n *\n * Example usage:\n * const {name} = useQuickSubscribe(userContext);\n * // Accessing name will subscribe to changes in 'name' only\n * return <div>{name}</div>;\n */\n\nexport const useQuickSubscribe = <D>(\n ctx: Context<D> | undefined\n): {\n [P in keyof D]?: D[P] | undefined;\n } => {\n\n const [, setCounter] = useState(0);\n\n const { proxy, finalGetter, openGetter, clean } = useMemo(\n () => {\n\n const allKeys = new Set<keyof D>()\n const allCompareValue: { [P in keyof D]?: D[P] | undefined; } = {}\n const allUnsub = new Map()\n\n const proxy = new Proxy(\n ctx?.data as any,\n {\n get(target, p) {\n if (isOpenGetter) {\n allKeys.add(p as keyof D)\n return allCompareValue[p as keyof D] = target[p];\n } else {\n throw new Error(\"now allow here\")\n }\n }\n }\n ) as any\n\n let isOpenGetter = true;\n\n\n let onChange = debounce(() => {\n if ([...allKeys.values()]\n .some(k => allCompareValue[k] != ctx?.data?.[k])) {\n setCounter(c => c + 1)\n }\n }, 0)\n\n let openGetter = () => {\n isOpenGetter = true\n allKeys.clear()\n }\n\n let finalGetter = () => {\n isOpenGetter = false;\n\n [...allKeys.values()]\n .filter(k => !allUnsub.has(k))\n .forEach(k => {\n allUnsub.set(k, ctx?.subscribe(k, onChange))\n });\n\n [...allUnsub.keys()]\n .filter(k => !allKeys.has(k))\n .forEach(k => {\n let unsub = allUnsub.get(k)\n unsub?.();\n allUnsub.delete(k);\n });\n\n }\n\n let clean = () => {\n openGetter();\n finalGetter();\n setCounter(c => c + 1)\n }\n\n return { proxy, finalGetter, openGetter, clean }\n },\n [ctx]\n )\n\n openGetter();\n\n setTimeout(finalGetter, 0)\n\n useEffect(\n () => () => clean(),\n [clean]\n )\n\n return proxy;\n\n\n};\n","import { getContext } from \"./state-utils/ctx\"\nimport React, { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport \"./devTool.css\"\n\nconst cache = getContext.cache\n\nexport const DevToolState = ({ }) => {\n const [selectedKey, setKey] = useState(\"\")\n return <div className=\"main-panel\">\n <div className=\"state-list\">\n {[...cache.keys()]\n .map(e => JSON.parse(e)?.[0])\n .filter(e => e != \"auto-ctx\")\n .map(e => <div\n className=\"state-key\"\n data-active={e == selectedKey}\n onClick={() => setKey(e)}>{e}\n </div>)}\n </div>\n <div className=\"state-view\" >\n <StateView dataKey={selectedKey} key={selectedKey} />\n </div>\n </div>\n}\n\nexport const StateView: React.FC<{ dataKey: string }> = ({ dataKey }) => {\n const ctx = getContext(dataKey)\n const [currentData, setCurrentData] = useState({ ...ctx?.data })\n\n useEffect(() => {\n let checkState = { ...currentData }\n let interval = setInterval(() => {\n\n let isDiff = false\n\n for (let i in ctx?.data) {\n if (ctx?.data?.[i] != checkState[i]) {\n checkState[i] = ctx?.data?.[i];\n isDiff = true;\n }\n }\n if (isDiff) setCurrentData({ ...checkState })\n }, 200)\n\n return () => clearInterval(interval)\n }, [ctx])\n\n return <JSONView\n value={currentData}\n name=\"ROOT\"\n expandLevel={1}\n style={{ height: \"300px\", overflow: \"auto\", resize: \"vertical\" }}\n />\n}\n\ntype JSONViewProps = {\n value: any,\n path?: string[],\n name?: string,\n expandRoot: Record<string, boolean>,\n setExpandRoot: Dispatch<SetStateAction<Record<string, boolean>>>,\n expandLevel: number | boolean,\n currentField?: any\n currentType?: any,\n isGrouped?: boolean,\n}\n\n\nconst splitArray = <T,>(array: T[], max = 10) => {\n return Object.fromEntries(\n new Array(Math.ceil((array.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? array.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map(keys => [`${keys.at(0)}..${keys.at(-1)}`, Object.fromEntries(\n keys.map(k => [k, array[k]])\n )])\n )\n}\n\n\nconst splitObject = (object: any, max = 10) => {\n const keys = Object.keys(object);\n return Object.fromEntries(\n Array(Math.ceil((keys.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? keys.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map((e) => e.map(i => keys.at(i)))\n .map(sortedKeys => [\n `${sortedKeys.at(0)?.slice(0, 15)}...${sortedKeys.at(-1)?.slice(0, 15)}`,\n Object.fromEntries(sortedKeys.map(key => [key, object[key as any]]))]\n )\n )\n}\n\n\nconst useExpandState = ({ path, expandLevel, expandRoot, setExpandRoot }: JSONViewProps) => {\n const expandKeys = path?.join(\"%\") ?? \"\";\n\n const defaultExpand = typeof expandLevel == \"boolean\"\n ? expandLevel\n : (typeof expandLevel == 'number' && expandLevel > 0)\n\n const isExpand = useMemo(\n () => expandRoot?.[expandKeys] ?? defaultExpand,\n [expandRoot?.[expandKeys], expandKeys]\n )\n\n const setExpand = useCallback(\n (value: boolean) => setExpandRoot((r: object) => ({ ...r, [expandKeys]: value })),\n [expandRoot, expandKeys]\n )\n\n return { isExpand, setExpand }\n\n}\n\nconst ChangeFlashWrappper: React.FC<React.ComponentProps<'div'> & { value: any, deepCompare?: boolean }> = ({ value, deepCompare = false, ...rest }) => {\n\n const ref = useRef<HTMLElement>(undefined)\n const refValue = useRef(value);\n\n useEffect(() => {\n if (ref.current) {\n let isDiff = deepCompare && value && refValue.current\n ? (\n Object.keys(value).length != Object.keys(refValue.current).length\n || Object.keys(value).some(key => value[key] != refValue.current[key])\n ) : value != refValue.current\n if (isDiff) {\n refValue.current = value;\n ref.current.classList.add('jv-updated');\n let t = requestAnimationFrame(() => ref.current?.classList.remove('jv-updated'));\n return () => cancelAnimationFrame(t)\n }\n }\n\n }, [value, deepCompare, ref])\n\n return <div {...rest} ref={ref as any} />\n}\n\nconst JSONViewObj: React.FC<JSONViewProps> = (props) => {\n\n const {\n currentField,\n value, path = [], name, expandRoot, setExpandRoot,\n expandLevel,\n isGrouped,\n } = props\n\n const isArray = value instanceof Array\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const childExpandLevel = typeof expandLevel == \"number\" ? expandLevel - 1 : expandLevel\n\n const shouldGroup = Object.entries(value).length > 10\n\n const groupedChilds = useMemo(\n () => shouldGroup\n ? (value instanceof Array) ? splitArray(value, 10) : splitObject(value, 10)\n : value,\n [value, shouldGroup, splitArray]\n )\n\n return (isExpand) ? <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n {currentField && <div>\n <div onClick={() => setExpand(false)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span>[-]</span>\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n </div>\n </div>}\n <div className=\"jv-value\">\n {Object\n .entries(groupedChilds)\n .map(([k, v], index) => <JSONViewCurr\n {...{\n name, expandRoot, setExpandRoot,\n expandLevel: childExpandLevel,\n value: v,\n isGrouped: shouldGroup,\n }}\n key={[...path, shouldGroup ? index : k].join(\"%\")}\n path={[...path, k]}\n />)}\n </div>\n {currentField && <div>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>}\n </ChangeFlashWrappper> : <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n <div>\n <div onClick={() => setExpand(true)}>\n <span className=\"jv-name\">{currentField}</span>\n {currentField && <span>:</span>}\n {currentField && <span>[+]</span>}\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n <span> ... </span>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>\n </div>\n </ChangeFlashWrappper>\n\n}\n\nconst StringViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}, lng={value?.length}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\n\nconst FunctionViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst DefaultValueView: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType}`}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">{String(value)}</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst JSONViewCurr: React.FC<Omit<JSONViewProps, 'currentField'>> = (props) => {\n\n const { value, path = [], name } = props\n\n const currentField = path.at(-1) ?? name ?? undefined;\n\n const currentType = typeof value\n\n switch (currentType) {\n case \"object\":\n return <JSONViewObj {...props} {...{ currentField, currentType }} />\n case \"string\":\n return <StringViewObj {...props} {...{ currentField, currentType }} />\n case \"function\":\n return <FunctionViewObj {...props} {...{ currentField, currentType }} />\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n case \"symbol\":\n case \"undefined\":\n default:\n return <DefaultValueView {...props} {...{ currentField, currentType }} />\n }\n}\n\nexport const JSONView: React.FC<{ value: any, name?: string, style?: any, expandLevel?: number | boolean }> = ({ value, name, style, expandLevel = false }) => {\n\n const [expandRoot, setExpandRoot] = useState<Record<string, boolean>>({})\n\n return <div className=\"jv-root\" style={style}>\n <JSONViewCurr\n path={[]}\n {...{ name, value, expandRoot, setExpandRoot, expandLevel }}\n />\n </div>\n}","import \"./devTool.css\"\nimport { useState } from \"react\"\nimport { DevToolState } from \"./DevToolState\";\n\n\nexport const DevToolContainer = ({ toggleButton = \"[x]\", ...props }) => {\n const [active, setActive] = useState(false);\n return <>\n <button className=\"react-state-dev-btn\" data-active={active} onClick={() => setActive(true)} {...props}>\n {props?.children ?? \"Toggle Dev Tool\"}\n </button>\n <div className=\"react-state-dev-container\" data-active={active}>\n <button className=\"close-btn\" onClick={() => setActive(false)}>\n [x]\n </button>\n <DevToolState />\n </div>\n </>\n}"],"names":["debounce","func","wait","timeout","fn","args","memoize","cache","cachedFunc","key","result","randomHash","useArrayHash","e","computedHash","useRef","currentValues","currentHash","isDiff","f","i","DataEvent","event","value","Context","name","_listener","listener","getContext","useDataContext","useMemo","useRegistryChecker","ctx","names","stack","useEffect","useDataSource","useDataSubscribe","debounceTime","setState","useState","callback","unsub","useDataSubscribeWithTransform","transform","preValue","newValue","useDataSourceMultiple","entries","useDataSubscribeMultiple","keys","setCounter","returnValues","prevValues","c","handles","firstCall","index","useDataSubscribeMultipleWithDebounce","createRootCtx","useFn","resolveCtxName","ctxMountedCheck","RootState","state","ctxName","err","jsx","Fragment","weakmapName","weakmap","resolveName","AutoRootCtx","Wrapper","subscribeRoot","useCallback","Comp","params","weakName","Component","preState","subState","k1","k2","counter","createAutoCtx","Root","useCtxState","useCtxStateStrict","unmountTime","subscribe","useQuickSubscribe","proxy","finalGetter","openGetter","clean","allKeys","allCompareValue","allUnsub","target","p","isOpenGetter","onChange","k","DevToolState","selectedKey","setKey","jsxs","StateView","dataKey","currentData","setCurrentData","checkState","interval","JSONView","splitArray","array","max","_","a","j","splitObject","object","sortedKeys","useExpandState","path","expandLevel","expandRoot","setExpandRoot","expandKeys","defaultExpand","isExpand","setExpand","r","ChangeFlashWrappper","deepCompare","rest","ref","refValue","t","JSONViewObj","props","currentField","isGrouped","isArray","childExpandLevel","shouldGroup","groupedChilds","v","createElement","JSONViewCurr","StringViewObj","currentType","useExpand","renderString","FunctionViewObj","DefaultValueView","style","DevToolContainer","toggleButton","active","setActive"],"mappings":";;AACO,SAASA,EACdC,GACAC,GACsD;AACtD,MAAIC,IAAgD,MAEhDC,IAAiC,YAAaC,GAA2B;AAC3E,IAAIF,KACF,aAAaA,CAAO,GAEtBA,IAAU,WAAW,MAAM;AACzB,MAAAF,EAAK,GAAGI,CAAI;AAAA,IACd,GAAGH,CAAI;AAAA,EACT;AAEA,SAAAE,EAAG,SAAS,MAAM,aAAaD,CAAQ,GAEhCC;AACT;AAGO,SAASE,EACdL,GACqF;AAErF,QAAMM,wBAAY,IAAA,GAEZC,IAAkB,YAAaH,GAAoC;AACvE,UAAMI,IAAM,KAAK,UAAUJ,CAAI;AAC/B,QAAIE,EAAM,IAAIE,CAAG;AACf,aAAOF,EAAM,IAAIE,CAAG;AAEtB,UAAMC,IAAST,EAAK,GAAGI,CAAI;AAC3B,WAAAE,EAAM,IAAIE,GAAKC,CAAM,GACdA;AAAA,EACT;AAEA,SAAAF,EAAW,QAAQD,GAEZC;AACT;ACtCA,MAAMG,IAAa,MAAM,KAAK,OAAA,EAAS,SAAA,EAAW,MAAM,CAAC,GAgB5CC,IAAe,CAACC,MAAqB;AAEhD,QAAM,EAAE,SAAS,EAAE,cAAAC,EAAA,EAAa,IAAMC,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ3C,IAAI,eAAe;AACjB,UAAIC,IAAuB,CAAA,GACvBC,IAAcN,EAAA;AAClB,aAAO,CAACE,MAAa;AACnB,YAAIK,IAAS;AAGb,eAAAA,IAASA,KAAY,CAACL,KAAO,CAACG,GAC9BE,IAASA,KAAWL,GAAG,UAAUG,GAAe,QAChDE,IAASA,KAAWL,EAAE,KAAK,CAACM,GAAGC,MAAMD,KAAKH,EAAcI,CAAC,CAAC,GAG1DJ,IAAgBH,GACZK,MACFD,IAAcN,EAAA,IAGTM;AAAA,MACT;AAAA,IACF;AAAA,EAAA,CACD;AAED,SAAOH,EAAaD,CAAC;AACvB;AC9CA,MAAMQ,UAAkB,MAAM;AAAA,EAC5B,YACSC,GACAC,GACP;AACA,UAAMD,CAAK,GAHJ,KAAA,QAAAA,GACA,KAAA,QAAAC;AAAA,EAGT;AACF;AAMO,MAAMC,UAAmB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1C,YAAmBC,GAAc;AAC/B,YAAQ,IAAI,gBAAgBA,CAAI,GAEhC,MAAA,GAHiB,KAAA,OAAAA;AAAA,EAInB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,OAAmB,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,+BAAe,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,QAAQhB,GAAcc,GAAkC;AAE7D,IAAIA,KAAS,KAAK,KAAKd,CAAG,MACxB,KAAK,KAAKA,CAAG,IAAIc,GAGjB,KAAK,cAAc,IAAIF,EAAU,OAAOZ,CAAG,GAAGc,CAAK,CAAC;AAAA,EAExD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,UAAUd,GAAciB,GAAmD;AAEhF,UAAMC,IAAW,CAAC,EAAE,OAAAL,GAAO,OAAAC,QAAiB;AAC1C,MAAAG,EAAUH,CAAK;AAAA,IACjB;AAEA,gBAAK,iBAAiB,OAAOd,CAAG,GAAGkB,CAAQ,GAGvClB,KAAO,KAAK,UAAgB,KAAK,KAAKA,CAAG,CAAC,GAEvC,OAAO,KAAK,oBAAoB,OAAOA,CAAG,GAAGkB,CAAQ,GAAG;AAAA,EACjE;AAEF;AAOO,MAAMC,IAAatB,EAAQ,CAACmB,MAAiB,IAAID,EAAaC,CAAI,CAAC,GAY7DI,IAAiB,CAAIJ,IAAe,aAEnCK,EAAQ,MAAMF,EAAWH,CAAI,GAAG,CAACA,CAAI,CAAC,GAW9CM,IAAqB,CAACC,MAAkCC,MAAoB;AAEhF,QAAMC,IAAQ,IAAI,MAAM,qCAAqC,KAAK,UAAU,EAAE,OAAAD,GAAO,KAAKD,GAAK,QAAQ,YAAA,CAAa,CAAC;AAErH,EAAAG;AAAA,IACE,MAAM;AACJ,UAAIH;AACF,eAAIC,EAAM,KAAK,CAAAR,MAAQO,EAAI,SAAS,IAAIP,CAAI,CAAC,KAC3C,QAAQ,MAAMS,CAAK,GAErBD,EAAM,QAAQ,CAAApB,MAAKmB,EAAI,SAAS,IAAInB,CAAC,CAAC,GAG/B,MAAM;AAGX,UAAAoB,EAAM,QAAQ,CAAApB,MAAKmB,EAAI,SAAS,OAAOnB,CAAC,CAAC;AAAA,QAC3C;AAAA,IAEJ;AAAA,IACA,CAACmB,GAAKC,EAAM,MAAM;AAAA,EAAA;AAGtB,GAQaG,KAAgB,CAAuBJ,GAA6BvB,GAAQc,MAA4B;AAEnH,EAAAY,EAAU,MAAM;AACd,IAAIH,KAAOA,EAAI,KAAKvB,CAAG,KAAKc,KAE1BS,EAAI,QAAQvB,GAAKc,CAAK;AAAA,EAE1B,GAAG,CAACd,GAAKc,GAAOS,CAAG,CAAC,GAEpBD,EAAmBC,GAAKvB,CAAU;AACpC,GASa4B,IAAmB,CAAuBL,GAA6BvB,GAAQ6B,IAAe,MAAwB;AAEjI,QAAM,CAAC,EAAE,OAAAf,KAASgB,CAAQ,IAAIC,EAAS,OAAO,EAAE,OAAOR,GAAK,OAAOvB,CAAG,IAAI;AAE1E,SAAA0B,EAAU,MAAM;AACd,QAAIH,GAAK;AACP,UAAIS,IAAWH,KAAgB,IAC3B,CAACf,MAAegB,EAAS,EAAE,OAAAhB,EAAAA,CAAc,IACzCvB,EAAS,CAACuB,MAAegB,EAAS,EAAE,OAAAhB,EAAAA,CAAc,GAAGe,CAAY,GACjEI,IAAQV,EAAI,UAAUvB,GAAKgC,CAAQ;AACvC,aAAAlB,KAASS,EAAI,KAAKvB,CAAG,KAAK8B,EAAS,EAAE,OAAOP,EAAI,KAAKvB,CAAG,EAAA,CAAG,GACpD,MAAM;AACX,QAAAiC,EAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAACjC,GAAKuB,CAAG,CAAC,GAENA,GAAK,KAAKvB,CAAG;AACtB,GASakC,KAAgC,CAA0BX,GAA6BvB,GAAQmC,MAA6C;AACvJ,QAAM,GAAGL,CAAQ,IAAIC,EAAS,CAAC,GACzB9B,IAASoB;AAAA,IACb,MAAMc,EAAUZ,GAAK,KAAKvB,CAAG,CAAC;AAAA,IAC9B,CAACmC,GAAWZ,GAAK,KAAKvB,CAAG,CAAC;AAAA,EAAA;AAG5B,SAAA0B,EAAU,MAAM;AACd,QAAIH,GAAK;AACP,UAAIa,IAAWnC,GACX+B,IAAW,MAAM;AACnB,YAAIK,IAAWF,EAAUZ,EAAI,KAAKvB,CAAG,CAAC;AACtC,QAAIqC,KAAYD,MACdA,IAAWC,GACXP,EAAS,CAAA1B,MAAKA,IAAI,CAAC;AAAA,MAEvB,GACI6B,IAAQV,EAAI,UAAUvB,GAAKgC,CAAQ;AACvC,aAAAA,EAAA,GACO,MAAMC,EAAA;AAAA,IACf;AAAA,EACF,GAAG,CAACjC,GAAKuB,CAAG,CAAC,GAENtB;AACT,GAOaqC,IAAwB,CACnCf,MACGgB,MACA;AAEH,EAAAb,EAAU,MAAM;AACd,QAAIH;AACF,eAAS,CAACvB,GAAKc,CAAK,KAAKyB;AACvB,QAAAhB,EAAI,KAAKvB,CAAG,KAAKc,KAASS,EAAI,QAAQvB,GAAKc,CAAK;AAAA,EAGtD,GAAG,CAACS,GAAKpB,EAAaoC,EAAQ,KAAA,CAAM,CAAC,CAAC,GAEtCjB,EAAmBC,GAAK,GAAGgB,EAAQ,IAAI,OAAKnC,EAAE,CAAC,CAAC,CAAQ;AAE1D,GAQaoC,KAA2B,CACtCjB,MACGkB,MACY;AACf,QAAM,GAAGC,CAAU,IAAIX,EAAS,CAAC,GAE3BY,IAAeF,EAAK,IAAI,OAAOlB,GAAK,OAAOvB,CAAG,CAAC;AAErD,SAAA0B,EAAU,MAAM;AACd,QAAIH,GAAK;AACP,UAAIqB,IAAaD;AACjB,YAAMX,IAAWzC,EAAS,MAAM;AAC9B,YAAIgB,IAAgBkC,EAAK,IAAI,OAAOlB,GAAK,OAAOvB,CAAG,CAAC;AACpD,QAAIyC,EAAK,KAAK,CAACzC,GAAKW,MAAMiC,EAAWjC,CAAC,KAAKJ,EAAcI,CAAC,CAAC,MAEzDiC,IAAarC,GACbmC,EAAW,CAAAG,MAAKA,IAAI,CAAC;AAAA,MAEzB,GAAG,CAAC;AAEJ,UAAIC,IAAUL,EAAK,IAAI,CAAAzC,MAAOuB,EAAI,UAAUvB,GAAKgC,CAAQ,CAAC,GAEtDe,IAAY,WAAWf,GAAU,CAAC;AAEtC,aAAO,MAAM;AACX,qBAAae,CAAS,GACtBf,EAAS,OAAA,GACTc,EAAQ,QAAQ,CAAAb,MAASA,EAAA,CAAO;AAAA,MAClC;AAAA,IAEF;AAAA,EACF,GAAG,CAACV,GAAK,GAAGkB,CAAI,CAAC,GAGV,OACJ,YAAYA,EAAK,IAAI,CAACzC,GAAKgD,MAAU,CAAChD,GAAK2C,EAAaK,CAAK,CAAC,CAAC,CAAC;AACrE,GASaC,KAAuC,CAClD1B,GACAM,IAAe,OACZY,MACyC;AAE5C,QAAM,GAAGC,CAAU,IAAIX,EAAS,CAAC,GAE3BY,IAAeF,EAAK,IAAI,OAAOlB,GAAK,OAAOvB,CAAG,CAAC;AAErD,SAAA0B,EAAU,MAAM;AACd,QAAIH,GAAK;AACP,UAAIqB,IAAaD;AACjB,YAAMX,IAAWzC,EAAS,MAAM;AAC9B,YAAIgB,IAAgBkC,EAAK,IAAI,OAAOlB,GAAK,OAAOvB,CAAG,CAAC;AACpD,QAAIyC,EAAK,KAAK,CAACzC,GAAKW,MAAMiC,EAAWjC,CAAC,KAAKJ,EAAcI,CAAC,CAAC,MACzDiC,IAAarC,GACbmC,EAAW,CAAAG,MAAKA,IAAI,CAAC;AAAA,MAEzB,GAAGhB,CAAY;AAEf,UAAIiB,IAAUL,EAAK,IAAI,CAAAzC,MAAOuB,EAAI,UAAUvB,GAAKgC,CAAQ,CAAC,GAEtDe,IAAY,WAAWf,GAAU,CAAC;AAEtC,aAAO,MAAM;AACX,qBAAae,CAAS,GACtBf,EAAS,OAAA,GACTc,EAAQ,QAAQ,CAAAb,MAASA,EAAA,CAAO;AAAA,MAClC;AAAA,IAEF;AAAA,EACF,GAAG,CAACV,GAAK,GAAGkB,CAAI,CAAC,GAEVE;AACT,GC7RaO,KAAgB,CAAqClC,GAAcmC,MAAuB;AAErG,QAAMC,IAAiB,CAAChD,MAAS;AAAA,IAC/BY;AAAA,IACA,GAAG,OACA,QAAQZ,KAAK,CAAA,CAAE,EACf,KAAK,CAACA,GAAGM,MAAMN,EAAE,CAAC,EAAE,cAAcM,EAAE,CAAC,CAAC,CAAC,EACvC,KAAA;AAAA,EAAK,EACR,KAAK,GAAG;AAEV,MAAI2C,wBAAsB,IAAA;AAG1B,QAAMC,IAAyB,CAAClD,MAAS;AACvC,UAAMmD,IAAQJ,EAAM/C,CAAC,GACfoD,IAAUJ,EAAehD,CAAC,GAC1BmB,IAAMH,EAAkBoC,CAAO,GAC/B/B,IAAQJ,EAAQ,MAAM,IAAI,QAAQ,OAAO,EAAE;AAEjD,WAAAiB;AAAA,MACEf;AAAA,MACA,GAAG,OAAO,QAAQgC,CAAK;AAAA,IAAA,GAGzB7B,EAAU,MAAM;AACd,UAAI2B,EAAgB,IAAIG,CAAO,GAAG;AAChC,cAAMC,IAAM,IAAI,MAAM,iBAAiBD,IAAU,6BAA6B;AAC9E,cAAAC,EAAI,QAAQhC,GACNgC;AAAA,MACR;AACA,aAAAJ,EAAgB,IAAIG,CAAO,GACpB,MAAM;AAAE,QAAAH,EAAgB,OAAOG,CAAO;AAAA,MAAE;AAAA,IACjD,CAAC,GAEM,gBAAAE,EAAAC,GAAA,EAAE;AAAA,EACX;AAEA,SAAAL,EAAU,cAAc,SAASH,GAAO,QAAM,IAAI,KAE3C;AAAA,IACL,gBAAAC;AAAA,IACA,MAAME;AAAA;AAAA;AAAA;AAAA;AAAA,IAKN,mBAAmB,CAAClD,MAAqB;AACvC,YAAMoD,IAAUJ,EAAehD,CAAC,GAE1BqB,IAAQJ,EAAQ,MAAM,IAAI,QAAQ,OAAO,EAAE;AAEjD,aAAAK,EAAU,MAAM;AACd,YAAI,CAAC2B,EAAgB,IAAIG,CAAO,GAAG;AACjC,gBAAMC,IAAM,IAAI,MAAM,kBAAkBD,IAAU,kBAAkB;AACpE,gBAAAC,EAAI,QAAQhC,GACNgC;AAAA,QACR;AAAA,MACF,GAAG,CAACD,CAAO,CAAC,GAELpC,EAAkBoC,CAAO;AAAA,IAClC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,aAAa,CAACpD,MAAqB;AACjC,YAAMoD,IAAUJ,EAAehD,CAAC,GAE1BqB,IAAQJ,EAAQ,MAAM,IAAI,QAAQ,OAAO,EAAE;AAEjD,aAAAK,EAAU,MAAM;AACd,YAAI,CAAC2B,EAAgB,IAAIG,CAAO,GAAG;AACjC,gBAAMC,IAAM,IAAI,MAAM,kBAAkBD,IAAU,kBAAkB;AACpE,UAAAC,EAAI,QAAQhC;AACZ,cAAI/B,IAAU,WAAW,MAAM,QAAQ,MAAM+D,CAAG,GAAG,GAAI;AACvD,iBAAO,MAAM,aAAa/D,CAAO;AAAA,QACnC;AAAA,MACF,GAAG,CAAC2D,EAAgB,IAAIG,CAAO,CAAC,CAAC,GAE1BpC,EAAkBoC,CAAO;AAAA,IAClC;AAAA,EAAA;AAEJ,GC3GMI,IAAe,2BAAY;AAC/B,QAAMC,wBAAc,QAAA;AAEpB,SAAO,CAAC,MAAmB;AACzB,QAAI5D,IAAS4D,EAAQ,IAAI,CAAC;AAC1B,WAAK5D,KACH4D,EAAQ,IAAI,GAAG5D,KAAU,GAAG,QAAQ,MAAM,KAAK,OAAA,EAAS,SAAA,CAAU,GAE7DA;AAAA,EACT;AACF,EAAA,GAGM6D,IAAc,CAAC1D,MAAW;AAAA,EAC9B,GAAG,OACA,QAAQA,KAAK,CAAA,CAAE,EACf,KAAK,CAACA,GAAGM,MAAMN,EAAE,CAAC,EAAE,cAAcM,EAAE,CAAC,CAAC,CAAC,EACvC,KAAA;AACL,EAAE,KAAK,GAAG,GA0BGqD,KAAc,CAAC,EAAE,SAAAC,IAAUL,QAAe;AAErD,QAAMpC,IAAMH,EAAoB,UAAU,GAGpC,CAACmC,GAAOzB,CAAQ,IAAIC,EAA8G,CAAA,CAAE,GAGpIkC,IAAgBC;AAAA,IACpB,CAACC,GAAWC,MAAgB;AAC1B,YAAMC,IAAWT,EAAYO,CAAI,GAC3BnE,IAAM8D,EAAYM,CAAM;AAE9B,aAAAtC,EAAS,CAAC;AAAA,QACR,CAACuC,IAAW;AAAA,UACV,WAAAC,IAAYH;AAAA,UACZ,UAAU;AAAA,YACR,CAACnE,IAAMuE,IAAW,EAAE,QAAAH,GAAQ,SAAS,EAAA;AAAA,YACrC,GAAGI;AAAA,UAAA,IACD,CAAA;AAAA,QAAC,IACH,CAAA;AAAA,QACJ,GAAGjB;AAAAA,MAAA,OACE;AAAA,QACL,GAAGA;AAAAA,QACH,CAACc,CAAQ,GAAG;AAAA,UACV,WAAAC;AAAA,UACA,UAAU;AAAA,YACR,GAAGE;AAAA,YACH,CAACxE,CAAG,GAAG;AAAA,cACL,GAAGuE;AAAA,cACH,SAASA,EAAS,UAAU;AAAA,YAAA;AAAA,UAC9B;AAAA,QACF;AAAA,MACF,EACA,GAEK,MAAMzC,EAAS,CAAC;AAAA,QACrB,CAACuC,IAAW;AAAA,UACV,WAAAC,IAAYH;AAAA,UACZ,UAAU;AAAA,YACR,CAACnE,IAAMuE,IAAW,EAAE,QAAAH,GAAQ,SAAS,EAAA;AAAA,YACrC,GAAGI;AAAA,UAAA,IACD,CAAA;AAAA,QAAC,IACH,CAAA;AAAA,QACJ,GAAGjB;AAAAA,MAAA,OACE;AAAA,QACL,GAAGA;AAAAA,QACH,CAACc,CAAQ,GAAG;AAAA,UACV,WAAAC;AAAA,UACA,UAAU;AAAA,YACR,GAAGE;AAAA,YACH,GAAGD,EAAS,UAAU,IAAI;AAAA,cACxB,CAACvE,CAAG,GAAG;AAAA,gBACL,GAAGuE;AAAA,gBACH,SAASA,EAAS,UAAU;AAAA,cAAA;AAAA,YAC9B,IACE,CAAA;AAAA,UAAC;AAAA,QACP;AAAA,MACF,EACA;AAAA,IAEJ;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,SAAAjC;AAAA,IAAsBf;AAAA,IACpB,CAAC,aAAa0C,CAAa;AAAA,IAC3B,CAAC,SAASV,CAAK;AAAA,EAAA,GAIV,gBAAAG,EAAAC,GAAA,EACJ,UAAA,OAAO,QAAQJ,CAAK,EAClB;AAAA,IAAQ,CAAC,CAACkB,GAAI,EAAE,WAAAH,GAAW,UAAAE,GAAU,MAAM,OACzC,QAAQA,CAAQ,EAChB,IAAI,CAAC,CAACE,GAAI,EAAE,SAAAC,GAAS,QAAAP,EAAA,CAAQ,OAAO,EAAE,KAAKK,IAAKC,GAAI,WAAAJ,GAAW,QAAAF,GAAQ,SAAAO,EAAA,EAAU,EACjF,OAAO,CAAAvE,MAAKA,EAAE,UAAU,CAAC,EACzB,IAAI,CAAC,EAAE,KAAAJ,GAAK,QAAAoE,GAAQ,WAAAE,EAAAA,MAAgB,gBAAAZ,EAACM,GAAA,EACpC,UAAA,gBAAAN,EAACY,GAAA,EAAW,GAAGF,EAAA,CAAQ,EAAA,GAD0BpE,CAEnD,CAAU;AAAA,EAAA,GAGhB;AAEF,GA0Ba4E,KAAgB,CAC3B,EAAE,MAAAC,GAAM,aAAAC,GAAa,mBAAAC,GAAmB,gBAAA3B,EAAA,GACxC4B,IAAc,OAGP;AAAA,EAEL,aAAa,CAAC5E,MAAqB;AAEjC,UAAMoD,IAAUJ,EAAehD,CAAC,GAE1B6E,IAAYrD,EAAiBR,EAAoB,UAAU,GAAG,WAAW;AAE/E,WAAAM,EAAU,MAAM;AAGd,UAAIsD,KAAe;AACjB,eAAOC,IAAYJ,GAAMzE,CAAC;AACrB;AACL,YAAI6B,IAAQgD,IAAYJ,GAAMzE,CAAC;AAC/B,eAAO,MAAM,WAAW6B,GAAO+C,CAAW;AAAA,MAC5C;AAAA,IACF,GAAG,CAACC,GAAWzB,CAAO,CAAC,GAEhBpC,EAAkBoC,CAAO;AAAA,EAClC;AAAA,ICrKS0B,KAAoB,CAC/B3D,MAGK;AAEL,QAAM,GAAGmB,CAAU,IAAIX,EAAS,CAAC,GAE3B,EAAE,OAAAoD,GAAO,aAAAC,GAAa,YAAAC,GAAY,OAAAC,MAAUjE;AAAA,IAChD,MAAM;AAEJ,YAAMkE,wBAAc,IAAA,GACdC,IAA0D,CAAA,GAC1DC,wBAAe,IAAA,GAEfN,IAAQ,IAAI;AAAA,QAChB5D,GAAK;AAAA,QACL;AAAA,UACE,IAAImE,GAAQC,GAAG;AACb,gBAAIC;AACF,qBAAAL,EAAQ,IAAII,CAAY,GACjBH,EAAgBG,CAAY,IAAID,EAAOC,CAAC;AAE/C,kBAAM,IAAI,MAAM,gBAAgB;AAAA,UAEpC;AAAA,QAAA;AAAA,MACF;AAGF,UAAIC,IAAe,IAGfC,IAAWtG,EAAS,MAAM;AAC5B,QAAI,CAAC,GAAGgG,EAAQ,OAAA,CAAQ,EACrB,KAAK,CAAAO,MAAKN,EAAgBM,CAAC,KAAKvE,GAAK,OAAOuE,CAAC,CAAC,KAC/CpD,EAAW,CAAAG,MAAKA,IAAI,CAAC;AAAA,MAEzB,GAAG,CAAC,GAEAwC,IAAa,MAAM;AACrB,QAAAO,IAAe,IACfL,EAAQ,MAAA;AAAA,MACV,GAEIH,IAAc,MAAM;AACtB,QAAAQ,IAAe,IAEf,CAAC,GAAGL,EAAQ,OAAA,CAAQ,EACjB,OAAO,CAAAO,MAAK,CAACL,EAAS,IAAIK,CAAC,CAAC,EAC5B,QAAQ,CAAAA,MAAK;AACZ,UAAAL,EAAS,IAAIK,GAAGvE,GAAK,UAAUuE,GAAGD,CAAQ,CAAC;AAAA,QAC7C,CAAC,GAEH,CAAC,GAAGJ,EAAS,KAAA,CAAM,EAChB,OAAO,CAAAK,MAAK,CAACP,EAAQ,IAAIO,CAAC,CAAC,EAC3B,QAAQ,CAAAA,MAAK;AAEZ,UADYL,EAAS,IAAIK,CAAC,IAC1B,GACAL,EAAS,OAAOK,CAAC;AAAA,QACnB,CAAC;AAAA,MAEL;AAQA,aAAO,EAAE,OAAAX,GAAO,aAAAC,GAAa,YAAAC,GAAY,OAN7B,MAAM;AAChBA,QAAAA,EAAAA,GACAD,EAAAA,GACA1C,EAAW,CAAAG,MAAKA,IAAI,CAAC;AAAA,MACvB,EAEyCyC;AAAAA,IAC3C;AAAA,IACA,CAAC/D,CAAG;AAAA,EAAA;AAGN,SAAA8D,EAAA,GAEA,WAAWD,GAAa,CAAC,GAEzB1D;AAAA,IACE,MAAM,MAAM4D,EAAA;AAAA,IACZ,CAACA,CAAK;AAAA,EAAA,GAGDH;AAGT,GCzGMrF,IAAQqB,EAAW,OAEZ4E,IAAe,CAAC,CAAA,MAAQ;AACjC,QAAM,CAACC,GAAaC,CAAM,IAAIlE,EAAS,EAAE;AACzC,SAAO,gBAAAmE,EAAC,OAAA,EAAI,WAAU,cAClB,UAAA;AAAA,IAAA,gBAAAxC,EAAC,OAAA,EAAI,WAAU,cACV,UAAA,CAAC,GAAG5D,EAAM,KAAA,CAAM,EACZ,IAAI,CAAAM,MAAK,KAAK,MAAMA,CAAC,IAAI,CAAC,CAAC,EAC3B,OAAO,OAAKA,KAAK,UAAU,EAC3B,IAAI,CAAAA,MAAK,gBAAAsD;AAAA,MAAC;AAAA,MAAA;AAAA,QACP,WAAU;AAAA,QACV,eAAatD,KAAK4F;AAAA,QAClB,SAAS,MAAMC,EAAO7F,CAAC;AAAA,QAAI,UAAAA;AAAA,MAAA;AAAA,IAAA,CACzB,GACd;AAAA,IACA,gBAAAsD,EAAC,SAAI,WAAU,cACX,4BAACyC,GAAA,EAAU,SAASH,EAAA,GAAkBA,CAAa,EAAA,CACvD;AAAA,EAAA,GACJ;AACJ,GAEaG,IAA2C,CAAC,EAAE,SAAAC,QAAc;AACrE,QAAM7E,IAAMJ,EAAWiF,CAAO,GACxB,CAACC,GAAaC,CAAc,IAAIvE,EAAS,EAAE,GAAGR,GAAK,MAAM;AAE/D,SAAAG,EAAU,MAAM;AACZ,QAAI6E,IAAa,EAAE,GAAGF,EAAA,GAClBG,IAAW,YAAY,MAAM;AAE7B,UAAI/F,IAAS;AAEb,eAASE,KAAKY,GAAK;AACf,QAAIA,GAAK,OAAOZ,CAAC,KAAK4F,EAAW5F,CAAC,MAC9B4F,EAAW5F,CAAC,IAAIY,GAAK,OAAOZ,CAAC,GAC7BF,IAAS;AAGjB,MAAIA,KAAQ6F,EAAe,EAAE,GAAGC,GAAY;AAAA,IAChD,GAAG,GAAG;AAEN,WAAO,MAAM,cAAcC,CAAQ;AAAA,EACvC,GAAG,CAACjF,CAAG,CAAC,GAED,gBAAAmC;AAAA,IAAC+C;AAAA,IAAA;AAAA,MACJ,OAAOJ;AAAA,MACP,MAAK;AAAA,MACL,aAAa;AAAA,MACb,OAAO,EAAE,QAAQ,SAAS,UAAU,QAAQ,QAAQ,WAAA;AAAA,IAAW;AAAA,EAAA;AAEvE,GAeMK,IAAa,CAAKC,GAAYC,IAAM,OAC/B,OAAO;AAAA,EACV,IAAI,MAAM,KAAK,MAAMD,EAAM,SAAS,KAAKC,CAAG,CAAC,EACxC,KAAK,CAAC,EACN;AAAA,IAAI,CAACC,GAAGlG,GAAGmG,MAAM,IAAI,MAAMnG,KAAKmG,EAAE,SAAS,IAAIH,EAAM,SAASC,IAAMA,CAAG,EACnE,KAAK,CAAC,EACN,IAAI,CAACC,GAAGE,MAAMpG,IAAIiG,IAAMG,CAAC;AAAA,EAAA,EAE7B,OAAO,CAAA3G,MAAKA,EAAE,MAAM,EACpB,IAAI,OAAQ,CAAC,GAAGqC,EAAK,GAAG,CAAC,CAAC,KAAKA,EAAK,GAAG,EAAE,CAAC,IAAI,OAAO;AAAA,IAClDA,EAAK,IAAI,CAAAqD,MAAK,CAACA,GAAGa,EAAMb,CAAC,CAAC,CAAC;AAAA,EAAA,CAC9B,CAAC;AAAA,GAKRkB,IAAc,CAACC,GAAaL,IAAM,OAAO;AAC3C,QAAMnE,IAAO,OAAO,KAAKwE,CAAM;AAC/B,SAAO,OAAO;AAAA,IACV,MAAM,KAAK,MAAMxE,EAAK,SAAS,KAAKmE,CAAG,CAAC,EACnC,KAAK,CAAC,EACN;AAAA,MAAI,CAACC,GAAGlG,GAAGmG,MAAM,IAAI,MAAMnG,KAAKmG,EAAE,SAAS,IAAIrE,EAAK,SAASmE,IAAMA,CAAG,EAClE,KAAK,CAAC,EACN,IAAI,CAACC,GAAGE,MAAMpG,IAAIiG,IAAMG,CAAC;AAAA,IAAA,EAE7B,OAAO,CAAA3G,MAAKA,EAAE,MAAM,EACpB,IAAI,CAACA,MAAMA,EAAE,IAAI,CAAAO,MAAK8B,EAAK,GAAG9B,CAAC,CAAC,CAAC,EACjC;AAAA,MAAI,CAAAuG,MAAc;AAAA,QACf,GAAGA,EAAW,GAAG,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,MAAMA,EAAW,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;AAAA,QACtE,OAAO,YAAYA,EAAW,IAAI,CAAAlH,MAAO,CAACA,GAAKiH,EAAOjH,CAAU,CAAC,CAAC,CAAC;AAAA,MAAA;AAAA,IAAC;AAAA,EACxE;AAEZ,GAGMmH,IAAiB,CAAC,EAAE,MAAAC,GAAM,aAAAC,GAAa,YAAAC,GAAY,eAAAC,QAAmC;AACxF,QAAMC,IAAaJ,GAAM,KAAK,GAAG,KAAK,IAEhCK,IAAgB,OAAOJ,KAAe,YACtCA,IACC,OAAOA,KAAe,YAAYA,IAAc,GAEjDK,IAAWrG;AAAA,IACb,MAAMiG,IAAaE,CAAU,KAAKC;AAAA,IAClC,CAACH,IAAaE,CAAU,GAAGA,CAAU;AAAA,EAAA,GAGnCG,IAAYzD;AAAA,IACd,CAACpD,MAAmByG,EAAc,CAACK,OAAe,EAAE,GAAGA,GAAG,CAACJ,CAAU,GAAG1G,EAAA,EAAQ;AAAA,IAChF,CAACwG,GAAYE,CAAU;AAAA,EAAA;AAG3B,SAAO,EAAE,UAAAE,GAAU,WAAAC,EAAA;AAEvB,GAEME,IAAqG,CAAC,EAAE,OAAA/G,GAAO,aAAAgH,IAAc,IAAO,GAAGC,QAAW;AAEpJ,QAAMC,IAAM1H,EAAoB,MAAS,GACnC2H,IAAW3H,EAAOQ,CAAK;AAE7B,SAAAY,EAAU,MAAM;AACZ,QAAIsG,EAAI,YACSF,KAAehH,KAASmH,EAAS,UAEtC,OAAO,KAAKnH,CAAK,EAAE,UAAU,OAAO,KAAKmH,EAAS,OAAO,EAAE,UACxD,OAAO,KAAKnH,CAAK,EAAE,KAAK,OAAOA,EAAMd,CAAG,KAAKiI,EAAS,QAAQjI,CAAG,CAAC,IACrEc,KAASmH,EAAS,UACd;AACR,MAAAA,EAAS,UAAUnH,GACnBkH,EAAI,QAAQ,UAAU,IAAI,YAAY;AACtC,UAAIE,IAAI,sBAAsB,MAAMF,EAAI,SAAS,UAAU,OAAO,YAAY,CAAC;AAC/E,aAAO,MAAM,qBAAqBE,CAAC;AAAA,IACvC;AAAA,EAGR,GAAG,CAACpH,GAAOgH,GAAaE,CAAG,CAAC,GAErB,gBAAAtE,EAAC,OAAA,EAAM,GAAGqE,GAAM,KAAAC,EAAA,CAAiB;AAC5C,GAEMG,IAAuC,CAACC,MAAU;AAEpD,QAAM;AAAA,IACF,cAAAC;AAAA,IACA,OAAAvH;AAAA,IAAO,MAAAsG,IAAO,CAAA;AAAA,IAAI,MAAApG;AAAA,IAAM,YAAAsG;AAAA,IAAY,eAAAC;AAAA,IACpC,aAAAF;AAAA,IACA,WAAAiB;AAAA,EAAA,IACAF,GAEEG,IAAUzH,aAAiB,OAE3B,EAAE,UAAA4G,GAAU,WAAAC,MAAcR,EAAeiB,CAAK,GAE9CI,IAAmB,OAAOnB,KAAe,WAAWA,IAAc,IAAIA,GAEtEoB,IAAc,OAAO,QAAQ3H,CAAK,EAAE,SAAS,IAE7C4H,IAAgBrH;AAAA,IAClB,MAAMoH,IACC3H,aAAiB,QAAS4F,EAAW5F,GAAO,EAAE,IAAIkG,EAAYlG,GAAO,EAAE,IACxEA;AAAA,IACN,CAACA,GAAO2H,GAAa/B,CAAU;AAAA,EAAA;AAGnC,SAAQgB,IAAY,gBAAAxB,EAAC2B,GAAA,EAAoB,WAAU,yBAAwB,OAAA/G,GAAc,aAAawH,GACjG,UAAA;AAAA,IAAAD,KAAgB,gBAAA3E,EAAC,SACd,UAAA,gBAAAwC,EAAC,OAAA,EAAI,SAAS,MAAMyB,EAAU,EAAK,GAC/B,UAAA;AAAA,MAAA,gBAAAjE,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA2E,GAAa;AAAA,MACxC,gBAAA3E,EAAC,UAAK,UAAA,IAAA,CAAC;AAAA,MACP,gBAAAA,EAAC,UAAK,UAAA,MAAA,CAAG;AAAA,MACT,gBAAAwC,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA;AAAA,QAAA,OAAO,KAAKpF,CAAK,EAAE;AAAA,QAAO;AAAA,MAAA,GAAO;AAAA,wBAC3D,QAAA,EAAK,UAAA;AAAA,QAAA;AAAA,QAAEyH,IAAU,MAAM;AAAA,QAAI;AAAA,MAAA,EAAA,CAAC;AAAA,IAAA,EAAA,CACjC,EAAA,CACJ;AAAA,IACA,gBAAA7E,EAAC,OAAA,EAAI,WAAU,YACV,iBACI,QAAQgF,CAAa,EACrB,IAAI,CAAC,CAAC5C,GAAG6C,CAAC,GAAG3F,MAAU,gBAAA4F;AAAA,MAACC;AAAA,MAAA;AAAA,QAEjB,MAAA7H;AAAA,QAAM,YAAAsG;AAAA,QAAY,eAAAC;AAAA,QAClB,aAAaiB;AAAA,QACb,OAAOG;AAAA,QACP,WAAWF;AAAA,QAEf,KAAK,CAAC,GAAGrB,GAAMqB,IAAczF,IAAQ8C,CAAC,EAAE,KAAK,GAAG;AAAA,QAChD,MAAM,CAAC,GAAGsB,GAAMtB,CAAC;AAAA,MAAA;AAAA,IAAA,CACnB,GACV;AAAA,IACCuC,KAAgB,gBAAA3E,EAAC,OAAA,EACd,UAAA,gBAAAwC,EAAC,QAAA,EAAK,UAAA;AAAA,MAAA;AAAA,MAAEqC,IAAU,MAAM;AAAA,MAAI;AAAA,IAAA,EAAA,CAAC,EAAA,CACjC;AAAA,EAAA,GACJ,IAAyB,gBAAA7E,EAACmE,GAAA,EAAoB,WAAU,yBAAwB,OAAA/G,GAAc,aAAawH,GACvG,UAAA,gBAAA5E,EAAC,OAAA,EACG,4BAAC,OAAA,EAAI,SAAS,MAAMiE,EAAU,EAAI,GAC9B,UAAA;AAAA,IAAA,gBAAAjE,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA2E,GAAa;AAAA,IACvCA,KAAgB,gBAAA3E,EAAC,QAAA,EAAK,UAAA,IAAA,CAAC;AAAA,IACvB2E,KAAgB,gBAAA3E,EAAC,QAAA,EAAK,UAAA,MAAA,CAAG;AAAA,IAC1B,gBAAAwC,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA;AAAA,MAAA,OAAO,KAAKpF,CAAK,EAAE;AAAA,MAAO;AAAA,IAAA,GAAO;AAAA,sBAC3D,QAAA,EAAK,UAAA;AAAA,MAAA;AAAA,MAAEyH,IAAU,MAAM;AAAA,MAAI;AAAA,IAAA,GAAC;AAAA,IAC7B,gBAAA7E,EAAC,UAAK,UAAA,QAAA,CAAK;AAAA,sBACV,QAAA,EAAK,UAAA;AAAA,MAAA;AAAA,MAAE6E,IAAU,MAAM;AAAA,MAAI;AAAA,IAAA,EAAA,CAAC;AAAA,EAAA,EAAA,CACjC,GACJ,GACJ;AAEJ,GAEMO,IAAyC,CAACV,MAAU;AAEtD,QAAM,EAAE,aAAAW,GAAa,cAAAV,GAAc,OAAAvH,EAAA,IAAWsH,GAExC,EAAE,UAAAV,GAAU,WAAAC,MAAcR,EAAeiB,CAAK,GAE9CY,IAAY,OAAOlI,CAAK,EAAE,SAAS,IAEnCmI,IAAeD,KAAa,CAACtB,IAC7B,GAAG,OAAO5G,CAAK,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM,OAAOA,CAAK,EAAE,MAAM,KAAK,EAAE,CAAC,KAC/D,OAAOA,CAAK;AAElB,SAAO,gBAAAoF;AAAA,IAAC2B;AAAA,IAAA;AAAA,MACJ,OAAOO,EAAM;AAAA,MACb,WAAW,qBAAqBW,CAAW,IAAIC,IAAY,cAAc,EAAE;AAAA,MAC3E,SAAS,MAAMrB,EAAU,CAACD,CAAQ;AAAA,MAClC,UAAA;AAAA,QAAA,gBAAAhE,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA2E,GAAa;AAAA,QACxC,gBAAA3E,EAAC,UAAK,UAAA,IAAA,CAAC;AAAA,QACP,gBAAAwC,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA;AAAA,UAAA6C;AAAA,UAAY;AAAA,UAAOjI,GAAO;AAAA,QAAA,GAAO;AAAA,QAC5D,gBAAAoF,EAAC,QAAA,EAAK,WAAU,YAAW,UAAA;AAAA,UAAA;AAAA,UAAE+C;AAAA,UAAa;AAAA,QAAA,GAAC;AAAA,QAC3C,gBAAAvF,EAAC,UAAK,UAAA,IAAA,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAEf,GAGMwF,IAA2C,CAACd,MAAU;AAExD,QAAM,EAAE,aAAAW,GAAa,cAAAV,GAAc,OAAAvH,EAAA,IAAWsH,GAExC,EAAE,UAAAV,GAAU,WAAAC,MAAcR,EAAeiB,CAAK,GAE9CY,IAAY,OAAOlI,CAAK,EAAE,SAAS,IAEnCmI,IAAeD,KAAa,CAACtB,IAC7B,GAAG,OAAO5G,CAAK,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM,OAAOA,CAAK,EAAE,MAAM,KAAK,EAAE,CAAC,KAC/D,OAAOA,CAAK;AAElB,SAAO,gBAAAoF;AAAA,IAAC2B;AAAA,IAAA;AAAA,MACJ,OAAOO,EAAM;AAAA,MACb,WAAW,qBAAqBW,CAAW,IAAIC,IAAY,cAAc,EAAE;AAAA,MAC3E,SAAS,MAAMrB,EAAU,CAACD,CAAQ;AAAA,MAClC,UAAA;AAAA,QAAA,gBAAAhE,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA2E,GAAa;AAAA,QACxC,gBAAA3E,EAAC,UAAK,UAAA,IAAA,CAAC;AAAA,QACP,gBAAAA,EAAC,QAAA,EAAK,WAAU,WAAW,UAAAqF,GAAY;AAAA,QACvC,gBAAA7C,EAAC,QAAA,EAAK,WAAU,YAAW,UAAA;AAAA,UAAA;AAAA,UAAE+C;AAAA,UAAa;AAAA,QAAA,GAAC;AAAA,QAC3C,gBAAAvF,EAAC,UAAK,UAAA,IAAA,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAEf,GAEMyF,IAA4C,CAACf,MAAU;AAEzD,QAAM,EAAE,aAAAW,GAAa,cAAAV,GAAc,OAAAvH,EAAA,IAAWsH;AAE9C,SAAO,gBAAAlC;AAAA,IAAC2B;AAAA,IAAA;AAAA,MACJ,OAAOO,EAAM;AAAA,MACb,WAAW,qBAAqBW,CAAW;AAAA,MAC3C,UAAA;AAAA,QAAA,gBAAArF,EAAC,QAAA,EAAK,WAAU,WAAW,UAAA2E,GAAa;AAAA,QACxC,gBAAA3E,EAAC,UAAK,UAAA,IAAA,CAAC;AAAA,QACP,gBAAAA,EAAC,QAAA,EAAK,WAAU,WAAW,UAAAqF,GAAY;AAAA,0BACtC,QAAA,EAAK,WAAU,YAAY,UAAA,OAAOjI,CAAK,GAAE;AAAA,QAC1C,gBAAA4C,EAAC,UAAK,UAAA,IAAA,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAEf,GAEMmF,IAA8D,CAACT,MAAU;AAE3E,QAAM,EAAE,OAAAtH,GAAO,MAAAsG,IAAO,CAAA,GAAI,MAAApG,MAASoH,GAE7BC,IAAejB,EAAK,GAAG,EAAE,KAAKpG,KAAQ,QAEtC+H,IAAc,OAAOjI;AAE3B,UAAQiI,GAAA;AAAA,IACJ,KAAK;AACD,aAAO,gBAAArF,EAACyE,KAAa,GAAGC,GAAa,cAAAC,GAAc,aAAAU,GAAe;AAAA,IACtE,KAAK;AACD,aAAO,gBAAArF,EAACoF,KAAe,GAAGV,GAAa,cAAAC,GAAc,aAAAU,GAAe;AAAA,IACxE,KAAK;AACD,aAAO,gBAAArF,EAACwF,KAAiB,GAAGd,GAAa,cAAAC,GAAc,aAAAU,GAAe;AAAA,IAC1E,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACI,aAAO,gBAAArF,EAACyF,KAAmB,GAAGf,GAAa,cAAAC,GAAc,aAAAU,GAAe;AAAA,EAAA;AAEpF,GAEatC,IAAiG,CAAC,EAAE,OAAA3F,GAAO,MAAAE,GAAM,OAAAoI,GAAO,aAAA/B,IAAc,SAAY;AAE3J,QAAM,CAACC,GAAYC,CAAa,IAAIxF,EAAkC,CAAA,CAAE;AAExE,SAAO,gBAAA2B,EAAC,OAAA,EAAI,WAAU,WAAU,OAAA0F,GAC5B,UAAA,gBAAA1F;AAAA,IAACmF;AAAA,IAAA;AAAA,MACG,MAAM,CAAA;AAAA,MACA,MAAA7H;AAAA,MAAM,OAAAF;AAAA,MAAO,YAAAwG;AAAA,MAAY,eAAAC;AAAA,MAAe,aAAAF;AAAA,IAAY;AAAA,EAAA,GAElE;AACJ,GCtTagC,KAAmB,CAAC,EAAE,cAAAC,IAAe,OAAO,GAAGlB,QAAY;AACpE,QAAM,CAACmB,GAAQC,CAAS,IAAIzH,EAAS,EAAK;AAC1C,SAAO,gBAAAmE,EAAAvC,GAAA,EACH,UAAA;AAAA,IAAA,gBAAAD,EAAC,UAAA,EAAO,WAAU,uBAAsB,eAAa6F,GAAQ,SAAS,MAAMC,EAAU,EAAI,GAAI,GAAGpB,GAC5F,UAAAA,GAAO,YAAY,mBACxB;AAAA,IACA,gBAAAlC,EAAC,OAAA,EAAI,WAAU,6BAA4B,eAAaqD,GACpD,UAAA;AAAA,MAAA,gBAAA7F,EAAC,UAAA,EAAO,WAAU,aAAY,SAAS,MAAM8F,EAAU,EAAK,GAAG,UAAA,MAAA,CAE/D;AAAA,wBACCzD,GAAA,CAAA,CAAa;AAAA,IAAA,EAAA,CAClB;AAAA,EAAA,GACJ;AACJ;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/state-utils/utils.ts","../src/state-utils/useArrayHash.ts","../src/state-utils/ctx.ts","../src/state-utils/createRootCtx.tsx","../src/state-utils/createAutoCtx.tsx","../src/state-utils/useQuickSubscribe.ts","../src/DevToolState.tsx","../src/DevTool.tsx"],"sourcesContent":["// Debounce function\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) & { cancel: any } {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n let fn: Function & { cancel: any } = function (...args: Parameters<T>): void {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n } as any;\n\n fn.cancel = () => clearTimeout(timeout!);\n\n return fn as any;\n}\n\n// Memoize function\nexport function memoize<T extends (...args: any[]) => any>(\n func: T\n): ((...args: Parameters<T>) => ReturnType<T>) & { cache: Map<string, ReturnType<T>> } {\n \n const cache = new Map<string, ReturnType<T>>();\n\n const cachedFunc: any = function (...args: Parameters<T>): ReturnType<T> {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key) as ReturnType<T>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n }\n\n cachedFunc.cache = cache;\n\n return cachedFunc\n}\n\n","import { useRef } from \"react\"\n\n\nconst randomHash = () => Math.random().toString().slice(2)\n\n/**\n * useArrayHash\n *\n * A custom hook that computes a stable hash for an array of values.\n * The hash changes only when the array's contents differ from the previous call.\n *\n * @param e - The input array to hash.\n * @returns A string hash that updates when the array changes.\n *\n * How it works:\n * - Tracks the previous array and its hash using a `useRef`.\n * - Compares the new array to the previous one by length and element equality.\n * - If any difference is detected, generates a new random hash.\n */\nexport const useArrayHash = (e: any[]): string => {\n\n const { current: { computedHash } } = useRef({\n /**\n * Getter for the computed hash function.\n *\n * - Initializes with an empty array and a random hash.\n * - Returns a function that compares the current array to the previous one.\n * - Updates the hash if any difference is detected.\n */\n get computedHash() {\n let currentValues: any[] = []\n let currentHash = randomHash()\n return (e: any[]) => {\n let isDiff = false\n\n // Check for differences in array existence, length, or elements.\n isDiff = isDiff || ((!e) != (!currentValues))\n isDiff = isDiff || (e?.length != currentValues?.length);\n isDiff = isDiff || (e.some((f, i) => f != currentValues[i]));\n\n // Update the hash if differences are found.\n currentValues = e;\n if (isDiff) {\n currentHash = randomHash()\n }\n\n return currentHash\n }\n }\n })\n\n return computedHash(e)\n}","import { debounce, memoize } from \"./utils\";\nimport { useEffect, useMemo, useState } from \"react\"\nimport { useArrayHash } from \"./useArrayHash\"\n\n\n\nclass DataEvent extends Event {\n constructor(\n public event: string,\n public value: any\n ) {\n super(event);\n }\n}\n\n/**\n * Generic context for managing shared state and event subscriptions.\n * @template D - The shape of the data managed by the context.\n */\nexport class Context<D> extends EventTarget {\n /**\n * Create a new Context instance.\n * @param name - The name of the context (for debugging).\n */\n constructor(public name: string) {\n console.log(\"[CONTEXT] %s\", name)\n // this.event.setMaxListeners(100)\n super();\n }\n\n // private event = new EventEmitter()\n\n /**\n * The current data held by the context.\n */\n public data: Partial<D> = {}\n /**\n * Registry for tracking active keys (for duplicate detection).\n */\n public registry = new Set<string>()\n\n /**\n * Publish a value to the context and notify subscribers if it changed.\n * @param key - The key to update.\n * @param value - The new value.\n */\n public publish(key: keyof D, value: D[typeof key] | undefined) {\n\n if (value != this.data[key]) {\n this.data[key] = value\n // console.count(\"[COUNT] \" + String(key))\n // this.event.emit(String(key), { value })\n this.dispatchEvent(new DataEvent(String(key), value))\n }\n }\n\n /**\n * Subscribe to changes for a specific key in the context.\n * @param key - The key to subscribe to.\n * @param _listener - Callback invoked with the new value.\n * @returns Unsubscribe function.\n */\n public subscribe(key: keyof D, _listener: (e: D[typeof key] | undefined) => void) {\n\n const listener = ({ event, value }: any) => {\n _listener(value)\n }\n\n this.addEventListener(String(key), listener)\n // console.log(\"listenerCount:\", String(key), this.event.listenerCount(String(key)))\n\n if (key in this.data) _listener(this.data[key])\n\n return () => (this.removeEventListener(String(key), listener), undefined)\n }\n\n}\n\n/**\n * Get or create a memoized Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const getContext = memoize((name: string) => new Context<any>(name))\n\n/**\n * Type alias for a function that returns a Context instance.\n */\nexport type getContext<D> = (e: string) => Context<D>\n\n/**\n * React hook to get a typed Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const useDataContext = <D>(name: string = \"noname\") => {\n\n const ctx = useMemo(() => getContext(name), [name])\n\n return ctx as any as Context<D>\n}\n\n/**\n * Internal hook to check for duplicate registry entries in a context.\n * Warns if any of the provided names are already registered.\n * @param ctx - The context instance.\n * @param names - Names to check and register.\n */\nconst useRegistryChecker = (ctx: Context<any> | undefined, ...names: string[]) => {\n // return;\n const stack = new Error(\"[ctx] useRegistryChecker failed \" + JSON.stringify({ names, ctx: ctx?.name ?? 'undefined' }))\n\n useEffect(\n () => {\n if (ctx) {\n if (names.some(name => ctx.registry.has(name))) {\n console.error(stack)\n }\n names.forEach(e => ctx.registry.add(e))\n\n // console.debug(\"[ctx] %s%s add datasource\", componentId, ctx.name, names)\n return () => {\n // console.debug(\"[ctx] %s %s remove datasource\", componentId, ctx.name, names)\n\n names.forEach(e => ctx.registry.delete(e))\n }\n }\n },\n [ctx, names.length]\n )\n\n}\n\n/**\n * React hook to publish a value to the context when it changes.\n * @param ctx - The context instance.\n * @param key - The key to update.\n * @param value - The new value.\n */\nexport const useDataSource = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, value: D[K] | undefined) => {\n //@ts-check\n useEffect(() => {\n if (ctx && ctx.data[key] != value) {\n\n ctx.publish(key, value)\n }\n }, [key, value, ctx])\n\n useRegistryChecker(ctx, key as any)\n}\n\n/**\n * React hook to subscribe to a context value, with optional debounce.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param debounceTime - Debounce time in ms (default 0).\n * @returns The current value for the key.\n */\nexport const useDataSubscribe = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, debounceTime = 0): D[K] | undefined => {\n //@ts-check\n const [{ value }, setState] = useState(() => ({ value: ctx?.data?.[key] }))\n\n useEffect(() => {\n if (ctx) {\n let callback = debounceTime == 0\n ? (value: any) => setState({ value } as any)\n : debounce((value: any) => setState({ value } as any), debounceTime)\n let unsub = ctx.subscribe(key, callback)\n value != ctx.data[key] && setState({ value: ctx.data[key] })\n return () => {\n unsub()\n }\n }\n }, [key, ctx])\n\n return ctx?.data[key]\n}\n\n/**\n * React hook to subscribe to a context value and transform it before returning.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param transform - Function to transform the value.\n * @returns The transformed value.\n */\nexport const useDataSubscribeWithTransform = <D, K extends keyof D, E>(ctx: Context<D> | undefined, key: K, transform: (e: D[K] | undefined) => E): E => {\n const [, setState] = useState(0)\n const result = useMemo(\n () => transform(ctx?.data[key]),\n [transform, ctx?.data[key]]\n )\n\n useEffect(() => {\n if (ctx) {\n let preValue = result\n let callback = () => {\n let newValue = transform(ctx.data[key])\n if (newValue != preValue) {\n preValue = newValue;\n setState(e => e + 1)\n };\n }\n let unsub = ctx.subscribe(key, callback)\n callback();\n return () => unsub()\n }\n }, [key, ctx])\n\n return result\n}\n\n/**\n * React hook to publish multiple values to the context.\n * @param ctx - The context instance.\n * @param entries - Array of [key, value] pairs to update.\n */\nexport const useDataSourceMultiple = <D, T extends readonly (keyof D)[]>(\n ctx: Context<D> | undefined,\n ...entries: { -readonly [P in keyof T]: [T[P], D[T[P]]] }\n) => {\n //@ts-check\n useEffect(() => {\n if (ctx) {\n for (let [key, value] of entries) {\n ctx.data[key] != value && ctx.publish(key, value)\n }\n }\n }, [ctx, useArrayHash(entries.flat())])\n\n useRegistryChecker(ctx, ...entries.map(e => e[0]) as any)\n\n}\n\n/**\n * React hook to subscribe to multiple context values.\n * @param ctx - The context instance.\n * @param keys - Keys to subscribe to.\n * @returns An object with the current values for the keys.\n */\nexport const useDataSubscribeMultiple = <D, K extends keyof D>(\n ctx: Context<D> | undefined,\n ...keys: K[]\n): Pick<D, K> => {\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n // console.log(\"DIFF\", keys.filter((e, i) => prevValues[i] != currentValues[i]))\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, 1)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n\n return Object\n .fromEntries(keys.map((key, index) => [key, returnValues[index]])) as any\n}\n\n/**\n * React hook to subscribe to multiple context values with throttling.\n * @param ctx - The context instance.\n * @param debounceTime - Debounce time in ms (default 50).\n * @param keys - Keys to subscribe to.\n * @returns Array of current values for the keys.\n */\nexport const useDataSubscribeMultipleWithDebounce = <D, K extends (keyof D)[]>(\n ctx: Context<D> | undefined,\n debounceTime = 50,\n ...keys: K\n): { [i in keyof K]: D[K[i]] | undefined } => {\n //@ts-check\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, debounceTime)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n return returnValues as any\n}\n\n\n\n","import { useEffect, useMemo } from \"react\"\nimport { useDataContext, useDataSourceMultiple, type Context } from \"./ctx\"\n\n\n\n/**\n * createRootCtx\n *\n * Factory that creates a headless \"Root\" component and companion hooks for a context namespace.\n * It derives a unique context name from a base `name` and a props object `U`, then publishes\n * a computed state `V` (from `useFn`) to that context.\n *\n * Usage (manual mounting):\n * ```\n * const { Root, useCtxState } = createRootCtx('user-state', useUserState)\n * ...\n * // Mount exactly one Root per unique props combination\n * <Root userId={id} />\n * ...\n * // Read anywhere ,using the same props shape\n * const user = useCtxState({ userId: id })\n *```\n * Strict vs lenient consumers:\n * - useCtxStateStrict(props) throws if a matching Root is not mounted.\n * - useCtxState(props) logs an error (after 1s) instead of throwing.\n *\n * Multiple instances safety:\n * - Mounting more than one Root with the same resolved context name throws (guards accidental duplicates).\n *\n * Name resolution notes:\n * - The context name is built from `name` + sorted key/value pairs of `props` (U), joined by \"-\".\n * - Prefer stable, primitive props to avoid collisions; if you need automation, pair with `createAutoCtx` and\n * mount a single <AutoRootCtx Wrapper={ErrorBoundary} /> at the app root so you don't manually mount `Root`.\n */\nexport const createRootCtx = <U extends object, V extends object>(name: string, useFn: (e: U) => V) => {\n\n const resolveCtxName = (e: U) => [\n name,\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n ].join(\"-\")\n\n let ctxMountedCheck = new Set<string>()\n\n\n const RootState: React.FC<U> = (e: U) => {\n const state = useFn(e)\n const ctxName = resolveCtxName(e)\n const ctx = useDataContext<V>(ctxName)\n const stack = useMemo(() => new Error().stack, [])\n\n useDataSourceMultiple(\n ctx,\n ...Object.entries(state) as any\n )\n\n useEffect(() => {\n if (ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext \" + ctxName + \" are mounted more than once\")\n err.stack = stack;\n throw err\n }\n ctxMountedCheck.add(ctxName)\n return () => { ctxMountedCheck.delete(ctxName) };\n })\n\n return <></>\n }\n\n RootState.displayName = `State[${useFn?.name??'??'}]`\n\n return {\n resolveCtxName,\n Root: RootState,\n /**\n * Strict consumer: throws if the corresponding Root for these props isn't mounted.\n * Use in development/tests to fail fast when wiring is incorrect.\n */\n useCtxStateStrict: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n throw err\n }\n }, [ctxName])\n\n return useDataContext<V>(ctxName)\n },\n /**\n * Lenient consumer: schedules a console.error if the Root isn't mounted instead of throwing.\n * Useful in production to avoid hard crashes while still surfacing misconfiguration.\n */\n useCtxState: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n let timeout = setTimeout(() => console.error(err), 1000)\n return () => clearTimeout(timeout)\n }\n }, [ctxMountedCheck.has(ctxName)])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","import { useEffect, useState, Fragment, useCallback } from \"react\"\nimport { useDataContext, useDataSourceMultiple, useDataSubscribe, type Context } from \"./ctx\"\nimport { createRootCtx } from \"./createRootCtx\"\n\n\n\n\n\n\nconst weakmapName = (function () {\n const weakmap = new WeakMap()\n\n return (e: any): string => {\n let result = weakmap.get(e);\n if (!result) {\n weakmap.set(e, result = (e?.name ?? \"\") + Math.random().toString())\n }\n return result\n }\n})()\n\n\nconst resolveName = (e: any) => [\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n].join(\"-\")\n\n/**\n * Inline docs: createAutoCtx + AutoRootCtx\n *\n * Quick start\n * 1) Mount <AutoRootCtx /> ONCE near your app root. Provide a Wrapper that acts like an ErrorBoundary to isolate and log errors.\n * Example: <AutoRootCtx Wrapper={MyErrorBoundary} />\n *\n * 2) Create auto contexts from your root context factories:\n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx('test-state', stateFn))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx('other-state', otherFn))\n * ```\n * 3) Use them in components:\n * ```\n * const ctx = useTestCtxState({ userId })\n * const { property1, property2 } = useDataSubscribeMultiple(ctx,'property1','property2')\n * // No need to mount the Root returned by createRootCtx directly — AutoRootCtx manages it for you.\n * ```\n * Notes\n * - AutoRootCtx must be mounted before any useCtxState hooks created by createAutoCtx run.\n * - Wrapper should be an ErrorBoundary-like component that simply renders {children}; no extra providers or layout required.\n * - For each unique params object (by stable stringified key), AutoRootCtx ensures a corresponding Root instance is rendered.\n */\n\nexport const AutoRootCtx = ({ Wrapper = Fragment }) => {\n\n const ctx = useDataContext<any>(\"auto-ctx\")\n\n\n const [state, setState] = useState<Record<string, { Component: React.FC, subState: Record<string, { params: any, counter: number }> }>>({})\n\n\n const subscribeRoot = useCallback(\n (Comp: any, params: any) => {\n const weakName = weakmapName(Comp);\n const key = resolveName(params);\n\n setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n [key]: {\n ...preState,\n counter: preState.counter + 1,\n },\n },\n }\n }));\n\n return () => setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n ...preState.counter > 1 ? {\n [key]: {\n ...preState,\n counter: preState.counter - 1,\n },\n } : {},\n },\n }\n }))\n\n },\n []\n )\n\n useDataSourceMultiple(ctx,\n [\"subscribe\", subscribeRoot],\n [\"state\", state],\n )\n\n\n return <>\n {Object.entries(state)\n .flatMap(([k1, { Component, subState }]) => Object\n .entries(subState)\n .map(([k2, { counter, params }]) => ({ key: k1 + k2, Component, params, counter }))\n .filter(e => e.counter > 0)\n .map(({ key, params, Component }) => <Wrapper key={key} >\n <Component {...params} />\n </Wrapper>)\n )\n }\n </>\n\n}\n\n/**\n * createAutoCtx\n *\n * Bridges a Root context (from createRootCtx) to the global AutoRootCtx renderer.\n * You do NOT mount the Root component yourself — just mount <AutoRootCtx /> once at the app root.\n *\n * Usage: \n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx(\n * 'test-state', \n * stateFn\n * ))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx(\n * 'other-state', \n * otherFn\n * ))\n * ```\n * \n * Then inside components:\n * ```\n * const ctxState = useTestCtxState({ any: 'params' })\n * ```\n * AutoRootCtx will subscribe/unsubscribe instances per unique params and render the appropriate Root under the hood.\n */\nexport const createAutoCtx = <U extends object, V extends object,>(\n { Root, useCtxState, useCtxStateStrict, resolveCtxName }: ReturnType<typeof createRootCtx<U, V>>,\n unmountTime = 0\n) => {\n\n return {\n\n useCtxState: (e: U): Context<V> => {\n\n const ctxName = resolveCtxName(e)\n\n const subscribe = useDataSubscribe(useDataContext<any>(\"auto-ctx\"), \"subscribe\")\n\n useEffect(() => {\n // Subscribe this component to an AutoRootCtx-managed Root instance keyed by e.\n // AutoRootCtx handles instance ref-counting and cleanup on unmount.\n if (unmountTime == 0) {\n return subscribe?.(Root, e)\n } else {\n let unsub = subscribe?.(Root, e)\n return () => setTimeout(unsub, unmountTime)\n }\n }, [subscribe, ctxName])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","\nimport { debounce } from \"./utils\";\nimport { useState, useMemo, useEffect } from \"react\";\nimport type { Context } from \"./ctx\";\n\n/**\n * useQuickSubscribe is a custom React hook for efficiently subscribing to specific properties of a context's data object.\n * \n * @template D - The shape of the context data.\n * @param {Context<D> | undefined} ctx - The context object containing data and a subscribe method.\n * @returns {Partial<D>} A proxy object that mirrors the context data, automatically subscribing to properties as they are accessed.\n *\n * This hook tracks which properties of the context data are accessed by the component and subscribes to updates for only those properties.\n * When any of the subscribed properties change, the hook triggers a re-render. Subscriptions are managed and cleaned up automatically\n * when the component unmounts or the context changes. This approach minimizes unnecessary re-renders and resource usage by only\n * subscribing to the data that the component actually uses.\n *\n * Example usage:\n * const {name} = useQuickSubscribe(userContext);\n * // Accessing name will subscribe to changes in 'name' only\n * return <div>{name}</div>;\n */\n\nexport const useQuickSubscribe = <D>(\n ctx: Context<D> | undefined\n): {\n [P in keyof D]?: D[P] | undefined;\n } => {\n\n const [, setCounter] = useState(0);\n\n const { proxy, finalGetter, openGetter, clean } = useMemo(\n () => {\n\n const allKeys = new Set<keyof D>()\n const allCompareValue: { [P in keyof D]?: D[P] | undefined; } = {}\n const allUnsub = new Map()\n\n const proxy = new Proxy(\n ctx?.data as any,\n {\n get(target, p) {\n if (isOpenGetter) {\n allKeys.add(p as keyof D)\n return allCompareValue[p as keyof D] = target[p];\n } else {\n throw new Error(\"now allow here\")\n }\n }\n }\n ) as any\n\n let isOpenGetter = true;\n\n\n let onChange = debounce(() => {\n if ([...allKeys.values()]\n .some(k => allCompareValue[k] != ctx?.data?.[k])) {\n setCounter(c => c + 1)\n }\n }, 0)\n\n let openGetter = () => {\n isOpenGetter = true\n allKeys.clear()\n }\n\n let finalGetter = () => {\n isOpenGetter = false;\n\n [...allKeys.values()]\n .filter(k => !allUnsub.has(k))\n .forEach(k => {\n allUnsub.set(k, ctx?.subscribe(k, onChange))\n });\n\n [...allUnsub.keys()]\n .filter(k => !allKeys.has(k))\n .forEach(k => {\n let unsub = allUnsub.get(k)\n unsub?.();\n allUnsub.delete(k);\n });\n\n }\n\n let clean = () => {\n openGetter();\n finalGetter();\n setCounter(c => c + 1)\n }\n\n return { proxy, finalGetter, openGetter, clean }\n },\n [ctx]\n )\n\n openGetter();\n\n setTimeout(finalGetter, 0)\n\n useEffect(\n () => () => clean(),\n [clean]\n )\n\n return proxy;\n\n\n};\n","import { getContext } from \"./state-utils/ctx\"\nimport React, { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport \"./devTool.css\"\n\nconst cache = getContext.cache\n\nexport const DevToolState = ({ }) => {\n const [selectedKey, setKey] = useState(\"\")\n return <div className=\"main-panel\">\n <div className=\"state-list\">\n {[...cache.keys()]\n .map(e => JSON.parse(e)?.[0])\n .filter(e => e != \"auto-ctx\")\n .map(e => <div\n className=\"state-key\"\n data-active={e == selectedKey}\n onClick={() => setKey(e)}>{e}\n </div>)}\n </div>\n <div className=\"state-view\" >\n <StateView dataKey={selectedKey} key={selectedKey} />\n </div>\n </div>\n}\n\nexport const StateView: React.FC<{ dataKey: string }> = ({ dataKey }) => {\n const ctx = getContext(dataKey)\n const [currentData, setCurrentData] = useState({ ...ctx?.data })\n\n useEffect(() => {\n let checkState = { ...currentData }\n let interval = setInterval(() => {\n\n let isDiff = false\n\n for (let i in ctx?.data) {\n if (ctx?.data?.[i] != checkState[i]) {\n checkState[i] = ctx?.data?.[i];\n isDiff = true;\n }\n }\n if (isDiff) setCurrentData({ ...checkState })\n }, 200)\n\n return () => clearInterval(interval)\n }, [ctx])\n\n return <JSONView\n value={currentData}\n name=\"ROOT\"\n expandLevel={1}\n style={{ }}\n />\n}\n\ntype JSONViewProps = {\n value: any,\n path?: string[],\n name?: string,\n expandRoot: Record<string, boolean>,\n setExpandRoot: Dispatch<SetStateAction<Record<string, boolean>>>,\n expandLevel: number | boolean,\n currentField?: any\n currentType?: any,\n isGrouped?: boolean,\n}\n\n\nconst splitArray = <T,>(array: T[], max = 10) => {\n return Object.fromEntries(\n new Array(Math.ceil((array.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? array.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map(keys => [`${keys.at(0)}..${keys.at(-1)}`, Object.fromEntries(\n keys.map(k => [k, array[k]])\n )])\n )\n}\n\n\nconst splitObject = (object: any, max = 10) => {\n const keys = Object.keys(object);\n return Object.fromEntries(\n Array(Math.ceil((keys.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? keys.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map((e) => e.map(i => keys.at(i)))\n .map(sortedKeys => [\n `${sortedKeys.at(0)?.slice(0, 15)}...${sortedKeys.at(-1)?.slice(0, 15)}`,\n Object.fromEntries(sortedKeys.map(key => [key, object[key as any]]))]\n )\n )\n}\n\n\nconst useExpandState = ({ path, expandLevel, expandRoot, setExpandRoot }: JSONViewProps) => {\n const expandKeys = path?.join(\"%\") ?? \"\";\n\n const defaultExpand = typeof expandLevel == \"boolean\"\n ? expandLevel\n : (typeof expandLevel == 'number' && expandLevel > 0)\n\n const isExpand = useMemo(\n () => expandRoot?.[expandKeys] ?? defaultExpand,\n [expandRoot?.[expandKeys], expandKeys]\n )\n\n const setExpand = useCallback(\n (value: boolean) => setExpandRoot((r: object) => ({ ...r, [expandKeys]: value })),\n [expandRoot, expandKeys]\n )\n\n return { isExpand, setExpand }\n\n}\n\nconst ChangeFlashWrappper: React.FC<React.ComponentProps<'div'> & { value: any, deepCompare?: boolean }> = ({ value, deepCompare = false, ...rest }) => {\n\n const ref = useRef<HTMLElement>(undefined)\n const refValue = useRef(value);\n\n useEffect(() => {\n if (ref.current) {\n let isDiff = deepCompare && value && refValue.current\n ? (\n Object.keys(value).length != Object.keys(refValue.current).length\n || Object.keys(value).some(key => value[key] != refValue.current[key])\n ) : value != refValue.current\n if (isDiff) {\n refValue.current = value;\n ref.current.classList.add('jv-updated');\n let t = requestAnimationFrame(() => ref.current?.classList.remove('jv-updated'));\n return () => cancelAnimationFrame(t)\n }\n }\n\n }, [value, deepCompare, ref])\n\n return <div {...rest} ref={ref as any} />\n}\n\nconst JSONViewObj: React.FC<JSONViewProps> = (props) => {\n\n const {\n currentField,\n value, path = [], name, expandRoot, setExpandRoot,\n expandLevel,\n isGrouped,\n } = props\n\n const isArray = value instanceof Array\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const childExpandLevel = typeof expandLevel == \"number\" ? expandLevel - 1 : expandLevel\n\n const shouldGroup = Object.entries(value).length > 10\n\n const groupedChilds = useMemo(\n () => shouldGroup\n ? (value instanceof Array) ? splitArray(value, 10) : splitObject(value, 10)\n : value,\n [value, shouldGroup, splitArray]\n )\n\n return (isExpand) ? <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n {currentField && <div>\n <div onClick={() => setExpand(false)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span>[-]</span>\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n </div>\n </div>}\n <div className=\"jv-value\">\n {Object\n .entries(groupedChilds)\n .map(([k, v], index) => <JSONViewCurr\n {...{\n name, expandRoot, setExpandRoot,\n expandLevel: childExpandLevel,\n value: v,\n isGrouped: shouldGroup,\n }}\n key={[...path, shouldGroup ? index : k].join(\"%\")}\n path={[...path, k]}\n />)}\n </div>\n {currentField && <div>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>}\n </ChangeFlashWrappper> : <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n <div>\n <div onClick={() => setExpand(true)}>\n <span className=\"jv-name\">{currentField}</span>\n {currentField && <span>:</span>}\n {currentField && <span>[+]</span>}\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n <span> ... </span>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>\n </div>\n </ChangeFlashWrappper>\n\n}\n\nconst StringViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}, lng={value?.length}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\n\nconst FunctionViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst DefaultValueView: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType}`}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">{String(value)}</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst JSONViewCurr: React.FC<Omit<JSONViewProps, 'currentField'>> = (props) => {\n\n const { value, path = [], name } = props\n\n const currentField = path.at(-1) ?? name ?? undefined;\n\n const currentType = typeof value\n\n switch (currentType) {\n case \"object\":\n return <JSONViewObj {...props} {...{ currentField, currentType }} />\n case \"string\":\n return <StringViewObj {...props} {...{ currentField, currentType }} />\n case \"function\":\n return <FunctionViewObj {...props} {...{ currentField, currentType }} />\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n case \"symbol\":\n case \"undefined\":\n default:\n return <DefaultValueView {...props} {...{ currentField, currentType }} />\n }\n}\n\nexport const JSONView: React.FC<{ value: any, name?: string, style?: any, expandLevel?: number | boolean }> = ({ value, name, style, expandLevel = false }) => {\n\n const [expandRoot, setExpandRoot] = useState<Record<string, boolean>>({})\n\n return <div className=\"jv-root\" style={style}>\n <JSONViewCurr\n path={[]}\n {...{ name, value, expandRoot, setExpandRoot, expandLevel }}\n />\n </div>\n}","import \"./devTool.css\"\nimport { useState } from \"react\"\nimport { DevToolState } from \"./DevToolState\";\n\n\nexport const DevToolContainer = ({ toggleButton = \"[x]\", ...props }) => {\n const [active, setActive] = useState(false);\n return <>\n <button className=\"react-state-dev-btn\" data-active={active} onClick={() => setActive(true)} {...props}>\n {props?.children ?? \"Toggle Dev Tool\"}\n </button>\n <div className=\"react-state-dev-container\" data-active={active}>\n <button className=\"close-btn\" onClick={() => setActive(false)}>\n [x]\n </button>\n <DevToolState />\n </div>\n </>\n}"],"names":["debounce","func","wait","timeout","fn","args","memoize","cache","cachedFunc","key","result","randomHash","useArrayHash","e","computedHash","useRef","currentValues","currentHash","isDiff","f","i","DataEvent","event","value","Context","name","_listener","listener","getContext","useDataContext","useMemo","useRegistryChecker","ctx","names","stack","useEffect","useDataSource","useDataSubscribe","debounceTime","setState","useState","callback","unsub","useDataSubscribeWithTransform","transform","preValue","newValue","useDataSourceMultiple","entries","useDataSubscribeMultiple","keys","setCounter","returnValues","prevValues","c","handles","firstCall","index","useDataSubscribeMultipleWithDebounce","createRootCtx","useFn","resolveCtxName","ctxMountedCheck","RootState","state","ctxName","err","jsx","Fragment","weakmapName","weakmap","resolveName","AutoRootCtx","Wrapper","subscribeRoot","useCallback","Comp","params","weakName","Component","preState","subState","k1","k2","counter","createAutoCtx","Root","useCtxState","useCtxStateStrict","unmountTime","subscribe","useQuickSubscribe","proxy","finalGetter","openGetter","clean","allKeys","allCompareValue","allUnsub","target","p","isOpenGetter","onChange","k","DevToolState","selectedKey","setKey","jsxs","StateView","dataKey","currentData","setCurrentData","checkState","interval","JSONView","splitArray","array","max","_","a","j","splitObject","object","sortedKeys","useExpandState","path","expandLevel","expandRoot","setExpandRoot","expandKeys","defaultExpand","isExpand","setExpand","r","ChangeFlashWrappper","deepCompare","rest","ref","refValue","t","JSONViewObj","props","currentField","isGrouped","isArray","childExpandLevel","shouldGroup","groupedChilds","v","createElement","JSONViewCurr","StringViewObj","currentType","useExpand","renderString","FunctionViewObj","DefaultValueView","style","DevToolContainer","toggleButton","active","setActive"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(h,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("react"),require("react/jsx-runtime")):typeof define=="function"&&define.amd?define(["exports","react","react/jsx-runtime"],i):(h=typeof globalThis<"u"?globalThis:h||self,i(h.RState={},h.React,h.jsxRuntime))})(this,function(h,i,c){"use strict";function E(t,e){let s=null,n=function(...a){s&&clearTimeout(s),s=setTimeout(()=>{t(...a)},e)};return n.cancel=()=>clearTimeout(s),n}function $(t){const e=new Map,s=function(...n){const a=JSON.stringify(n);if(e.has(a))return e.get(a);const r=t(...n);return e.set(a,r),r};return s.cache=e,s}const O=()=>Math.random().toString().slice(2),y=t=>{const{current:{computedHash:e}}=i.useRef({get computedHash(){let s=[],n=O();return a=>{let r=!1;return r=r||!a!=!s,r=r||a?.length!=s?.length,r=r||a.some((l,o)=>l!=s[o]),s=a,r&&(n=O()),n}}});return e(t)};class F extends Event{constructor(e,s){super(e),this.event=e,this.value=s}}class D extends EventTarget{constructor(e){console.log("[CONTEXT] %s",e),super(),this.name=e}data={};registry=new Set;publish(e,s){s!=this.data[e]&&(this.data[e]=s,this.dispatchEvent(new F(String(e),s)))}subscribe(e,s){const n=({event:a,value:r})=>{s(r)};return this.addEventListener(String(e),n),e in this.data&&s(this.data[e]),()=>(this.removeEventListener(String(e),n),void 0)}}const C=$(t=>new D(t)),S=(t="noname")=>i.useMemo(()=>C(t),[t]),T=(t,...e)=>{const s=new Error("[ctx] useRegistryChecker failed "+JSON.stringify({names:e,ctx:t?.name??"undefined"}));i.useEffect(()=>{if(t)return e.some(n=>t.registry.has(n))&&console.error(s),e.forEach(n=>t.registry.add(n)),()=>{e.forEach(n=>t.registry.delete(n))}},[t,e.length])},G=(t,e,s)=>{i.useEffect(()=>{t&&t.data[e]!=s&&t.publish(e,s)},[e,s,t]),T(t,e)},M=(t,e,s=0)=>{const[{value:n},a]=i.useState(()=>({value:t?.data?.[e]}));return i.useEffect(()=>{if(t){let r=s==0?o=>a({value:o}):E(o=>a({value:o}),s),l=t.subscribe(e,r);return n!=t.data[e]&&a({value:t.data[e]}),()=>{l()}}},[e,t]),t?.data[e]},x=(t,e,s)=>{const[,n]=i.useState(0),a=i.useMemo(()=>s(t?.data[e]),[s,t?.data[e]]);return i.useEffect(()=>{if(t){let r=a,l=()=>{let u=s(t.data[e]);u!=r&&(r=u,n(d=>d+1))},o=t.subscribe(e,l);return l(),()=>o()}},[e,t]),a},N=(t,...e)=>{i.useEffect(()=>{if(t)for(let[s,n]of e)t.data[s]!=n&&t.publish(s,n)},[t,y(e.flat())]),T(t,...e.map(s=>s[0]))},H=(t,...e)=>{const[,s]=i.useState(0),n=e.map(a=>t?.data?.[a]);return i.useEffect(()=>{if(t){let a=n;const r=E(()=>{let u=e.map(d=>t?.data?.[d]);e.some((d,f)=>a[f]!=u[f])&&(a=u,s(d=>d+1))},1);let l=e.map(u=>t.subscribe(u,r)),o=setTimeout(r,1);return()=>{clearTimeout(o),r.cancel(),l.forEach(u=>u())}}},[t,...e]),Object.fromEntries(e.map((a,r)=>[a,n[r]]))},J=(t,e=50,...s)=>{const[,n]=i.useState(0),a=s.map(r=>t?.data?.[r]);return i.useEffect(()=>{if(t){let r=a;const l=E(()=>{let d=s.map(f=>t?.data?.[f]);s.some((f,p)=>r[p]!=d[p])&&(r=d,n(f=>f+1))},e);let o=s.map(d=>t.subscribe(d,l)),u=setTimeout(l,1);return()=>{clearTimeout(u),l.cancel(),o.forEach(d=>d())}}},[t,...s]),a},W=(t,e)=>{const s=r=>[t,...Object.entries(r??{}).sort((l,o)=>l[0].localeCompare(o[0])).flat()].join("-");let n=new Set;const a=r=>{const l=e(r),o=s(r),u=S(o),d=i.useMemo(()=>new Error().stack,[]);return N(u,...Object.entries(l)),i.useEffect(()=>{if(n.has(o)){const f=new Error("RootContext "+o+" are mounted more than once");throw f.stack=d,f}return n.add(o),()=>{n.delete(o)}}),c.jsx(c.Fragment,{})};return a.displayName=`State[${e?.name??"??"}]`,{resolveCtxName:s,Root:a,useCtxStateStrict:r=>{const l=s(r),o=i.useMemo(()=>new Error().stack,[]);return i.useEffect(()=>{if(!n.has(l)){const u=new Error("RootContext ["+l+"] is not mounted");throw u.stack=o,u}},[l]),S(l)},useCtxState:r=>{const l=s(r),o=i.useMemo(()=>new Error().stack,[]);return i.useEffect(()=>{if(!n.has(l)){const u=new Error("RootContext ["+l+"] is not mounted");u.stack=o;let d=setTimeout(()=>console.error(u),1e3);return()=>clearTimeout(d)}},[n.has(l)]),S(l)}}},L=function(){const t=new WeakMap;return e=>{let s=t.get(e);return s||t.set(e,s=(e?.name??"")+Math.random().toString()),s}}(),q=t=>[...Object.entries(t??{}).sort((e,s)=>e[0].localeCompare(s[0])).flat()].join("-"),K=({Wrapper:t=i.Fragment})=>{const e=S("auto-ctx"),[s,n]=i.useState({}),a=i.useCallback((r,l)=>{const o=L(r),u=q(l);return n(({[o]:{Component:d=r,subState:{[u]:f={params:l,counter:0},...p}={}}={},...v})=>({...v,[o]:{Component:d,subState:{...p,[u]:{...f,counter:f.counter+1}}}})),()=>n(({[o]:{Component:d=r,subState:{[u]:f={params:l,counter:0},...p}={}}={},...v})=>({...v,[o]:{Component:d,subState:{...p,...f.counter>1?{[u]:{...f,counter:f.counter-1}}:{}}}}))},[]);return N(e,["subscribe",a],["state",s]),c.jsx(c.Fragment,{children:Object.entries(s).flatMap(([r,{Component:l,subState:o}])=>Object.entries(o).map(([u,{counter:d,params:f}])=>({key:r+u,Component:l,params:f,counter:d})).filter(u=>u.counter>0).map(({key:u,params:d,Component:f})=>c.jsx(t,{children:c.jsx(f,{...d})},u)))})},_=({Root:t,useCtxState:e,useCtxStateStrict:s,resolveCtxName:n},a=0)=>({useCtxState:r=>{const l=n(r),o=M(S("auto-ctx"),"subscribe");return i.useEffect(()=>{if(a==0)return o?.(t,r);{let u=o?.(t,r);return()=>setTimeout(u,a)}},[o,l]),S(l)}}),z=t=>{const[,e]=i.useState(0),{proxy:s,finalGetter:n,openGetter:a,clean:r}=i.useMemo(()=>{const l=new Set,o={},u=new Map,d=new Proxy(t?.data,{get(b,m){if(f)return l.add(m),o[m]=b[m];throw new Error("now allow here")}});let f=!0,p=E(()=>{[...l.values()].some(b=>o[b]!=t?.data?.[b])&&e(b=>b+1)},0),v=()=>{f=!0,l.clear()},g=()=>{f=!1,[...l.values()].filter(b=>!u.has(b)).forEach(b=>{u.set(b,t?.subscribe(b,p))}),[...u.keys()].filter(b=>!l.has(b)).forEach(b=>{u.get(b)?.(),u.delete(b)})};return{proxy:d,finalGetter:g,openGetter:v,clean:()=>{v(),g(),e(b=>b+1)}}},[t]);return a(),setTimeout(n,0),i.useEffect(()=>()=>r(),[r]),s},I=C.cache,P=({})=>{const[t,e]=i.useState("");return c.jsxs("div",{className:"main-panel",children:[c.jsx("div",{className:"state-list",children:[...I.keys()].map(s=>JSON.parse(s)?.[0]).filter(s=>s!="auto-ctx").map(s=>c.jsx("div",{className:"state-key","data-active":s==t,onClick:()=>e(s),children:s}))}),c.jsx("div",{className:"state-view",children:c.jsx(Q,{dataKey:t},t)})]})},Q=({dataKey:t})=>{const e=C(t),[s,n]=i.useState({...e?.data});return i.useEffect(()=>{let a={...s},r=setInterval(()=>{let l=!1;for(let o in e?.data)e?.data?.[o]!=a[o]&&(a[o]=e?.data?.[o],l=!0);l&&n({...a})},200);return()=>clearInterval(r)},[e]),c.jsx(R,{value:s,name:"ROOT",expandLevel:1,style:{height:"300px",overflow:"auto",resize:"vertical"}})},V=(t,e=10)=>Object.fromEntries(new Array(Math.ceil((t.length+1)/e)).fill(0).map((s,n,a)=>new Array(n==a.length-1?t.length%e:e).fill(0).map((r,l)=>n*e+l)).filter(s=>s.length).map(s=>[`${s.at(0)}..${s.at(-1)}`,Object.fromEntries(s.map(n=>[n,t[n]]))])),B=(t,e=10)=>{const s=Object.keys(t);return Object.fromEntries(Array(Math.ceil((s.length+1)/e)).fill(0).map((n,a,r)=>new Array(a==r.length-1?s.length%e:e).fill(0).map((l,o)=>a*e+o)).filter(n=>n.length).map(n=>n.map(a=>s.at(a))).map(n=>[`${n.at(0)?.slice(0,15)}...${n.at(-1)?.slice(0,15)}`,Object.fromEntries(n.map(a=>[a,t[a]]))]))},w=({path:t,expandLevel:e,expandRoot:s,setExpandRoot:n})=>{const a=t?.join("%")??"",r=typeof e=="boolean"?e:typeof e=="number"&&e>0,l=i.useMemo(()=>s?.[a]??r,[s?.[a],a]),o=i.useCallback(u=>n(d=>({...d,[a]:u})),[s,a]);return{isExpand:l,setExpand:o}},j=({value:t,deepCompare:e=!1,...s})=>{const n=i.useRef(void 0),a=i.useRef(t);return i.useEffect(()=>{if(n.current&&(e&&t&&a.current?Object.keys(t).length!=Object.keys(a.current).length||Object.keys(t).some(l=>t[l]!=a.current[l]):t!=a.current)){a.current=t,n.current.classList.add("jv-updated");let l=requestAnimationFrame(()=>n.current?.classList.remove("jv-updated"));return()=>cancelAnimationFrame(l)}},[t,e,n]),c.jsx("div",{...s,ref:n})},U=t=>{const{currentField:e,value:s,path:n=[],name:a,expandRoot:r,setExpandRoot:l,expandLevel:o,isGrouped:u}=t,d=s instanceof Array,{isExpand:f,setExpand:p}=w(t),v=typeof o=="number"?o-1:o,g=Object.entries(s).length>10,k=i.useMemo(()=>g?s instanceof Array?V(s,10):B(s,10):s,[s,g,V]);return f?c.jsxs(j,{className:"jv-field jv-field-obj",value:s,deepCompare:u,children:[e&&c.jsx("div",{children:c.jsxs("div",{onClick:()=>p(!1),children:[c.jsx("span",{className:"jv-name",children:e}),c.jsx("span",{children:":"}),c.jsx("span",{children:"[-]"}),c.jsxs("span",{className:"jv-type",children:[Object.keys(s).length," items "]}),c.jsxs("span",{children:[" ",d?"[":"{"," "]})]})}),c.jsx("div",{className:"jv-value",children:Object.entries(k).map(([b,m],te)=>i.createElement(A,{name:a,expandRoot:r,setExpandRoot:l,expandLevel:v,value:m,isGrouped:g,key:[...n,g?te:b].join("%"),path:[...n,b]}))}),e&&c.jsx("div",{children:c.jsxs("span",{children:[" ",d?"]":"}"," "]})})]}):c.jsx(j,{className:"jv-field jv-field-obj",value:s,deepCompare:u,children:c.jsx("div",{children:c.jsxs("div",{onClick:()=>p(!0),children:[c.jsx("span",{className:"jv-name",children:e}),e&&c.jsx("span",{children:":"}),e&&c.jsx("span",{children:"[+]"}),c.jsxs("span",{className:"jv-type",children:[Object.keys(s).length," items "]}),c.jsxs("span",{children:[" ",d?"[":"{"," "]}),c.jsx("span",{children:" ... "}),c.jsxs("span",{children:[" ",d?"]":"}"," "]})]})})})},X=t=>{const{currentType:e,currentField:s,value:n}=t,{isExpand:a,setExpand:r}=w(t),l=String(n).length>50,o=l&&!a?`${String(n).slice(0,15)}...${String(n).slice(-15,-1)}`:String(n);return c.jsxs(j,{value:t.value,className:`jv-field jv-field-${e} ${l?"jv-cursor":""}`,onClick:()=>r(!a),children:[c.jsx("span",{className:"jv-name",children:s}),c.jsx("span",{children:":"}),c.jsxs("span",{className:"jv-type",children:[e,", lng=",n?.length]}),c.jsxs("span",{className:"jv-value",children:['"',o,'"']}),c.jsx("span",{children:","})]})},Y=t=>{const{currentType:e,currentField:s,value:n}=t,{isExpand:a,setExpand:r}=w(t),l=String(n).length>50,o=l&&!a?`${String(n).slice(0,15)}...${String(n).slice(-15,-1)}`:String(n);return c.jsxs(j,{value:t.value,className:`jv-field jv-field-${e} ${l?"jv-cursor":""}`,onClick:()=>r(!a),children:[c.jsx("span",{className:"jv-name",children:s}),c.jsx("span",{children:":"}),c.jsx("span",{className:"jv-type",children:e}),c.jsxs("span",{className:"jv-value",children:['"',o,'"']}),c.jsx("span",{children:","})]})},Z=t=>{const{currentType:e,currentField:s,value:n}=t;return c.jsxs(j,{value:t.value,className:`jv-field jv-field-${e}`,children:[c.jsx("span",{className:"jv-name",children:s}),c.jsx("span",{children:":"}),c.jsx("span",{className:"jv-type",children:e}),c.jsx("span",{className:"jv-value",children:String(n)}),c.jsx("span",{children:","})]})},A=t=>{const{value:e,path:s=[],name:n}=t,a=s.at(-1)??n??void 0,r=typeof e;switch(r){case"object":return c.jsx(U,{...t,currentField:a,currentType:r});case"string":return c.jsx(X,{...t,currentField:a,currentType:r});case"function":return c.jsx(Y,{...t,currentField:a,currentType:r});case"number":case"boolean":case"bigint":case"symbol":case"undefined":default:return c.jsx(Z,{...t,currentField:a,currentType:r})}},R=({value:t,name:e,style:s,expandLevel:n=!1})=>{const[a,r]=i.useState({});return c.jsx("div",{className:"jv-root",style:s,children:c.jsx(A,{path:[],name:e,value:t,expandRoot:a,setExpandRoot:r,expandLevel:n})})},ee=({toggleButton:t="[x]",...e})=>{const[s,n]=i.useState(!1);return c.jsxs(c.Fragment,{children:[c.jsx("button",{className:"react-state-dev-btn","data-active":s,onClick:()=>n(!0),...e,children:e?.children??"Toggle Dev Tool"}),c.jsxs("div",{className:"react-state-dev-container","data-active":s,children:[c.jsx("button",{className:"close-btn",onClick:()=>n(!1),children:"[x]"}),c.jsx(P,{})]})]})};h.AutoRootCtx=K,h.Context=D,h.DevToolContainer=ee,h.createAutoCtx=_,h.createRootCtx=W,h.getContext=C,h.useArrayHash=y,h.useDataContext=S,h.useDataSource=G,h.useDataSourceMultiple=N,h.useDataSubscribe=M,h.useDataSubscribeMultiple=H,h.useDataSubscribeMultipleWithDebounce=J,h.useDataSubscribeWithTransform=x,h.useQuickSubscribe=z,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})});
1
+ (function(h,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("react"),require("react/jsx-runtime")):typeof define=="function"&&define.amd?define(["exports","react","react/jsx-runtime"],i):(h=typeof globalThis<"u"?globalThis:h||self,i(h.RState={},h.React,h.jsxRuntime))})(this,function(h,i,c){"use strict";function E(t,e){let s=null,n=function(...a){s&&clearTimeout(s),s=setTimeout(()=>{t(...a)},e)};return n.cancel=()=>clearTimeout(s),n}function $(t){const e=new Map,s=function(...n){const a=JSON.stringify(n);if(e.has(a))return e.get(a);const r=t(...n);return e.set(a,r),r};return s.cache=e,s}const O=()=>Math.random().toString().slice(2),y=t=>{const{current:{computedHash:e}}=i.useRef({get computedHash(){let s=[],n=O();return a=>{let r=!1;return r=r||!a!=!s,r=r||a?.length!=s?.length,r=r||a.some((l,o)=>l!=s[o]),s=a,r&&(n=O()),n}}});return e(t)};class F extends Event{constructor(e,s){super(e),this.event=e,this.value=s}}class D extends EventTarget{constructor(e){console.log("[CONTEXT] %s",e),super(),this.name=e}data={};registry=new Set;publish(e,s){s!=this.data[e]&&(this.data[e]=s,this.dispatchEvent(new F(String(e),s)))}subscribe(e,s){const n=({event:a,value:r})=>{s(r)};return this.addEventListener(String(e),n),e in this.data&&s(this.data[e]),()=>(this.removeEventListener(String(e),n),void 0)}}const C=$(t=>new D(t)),S=(t="noname")=>i.useMemo(()=>C(t),[t]),T=(t,...e)=>{const s=new Error("[ctx] useRegistryChecker failed "+JSON.stringify({names:e,ctx:t?.name??"undefined"}));i.useEffect(()=>{if(t)return e.some(n=>t.registry.has(n))&&console.error(s),e.forEach(n=>t.registry.add(n)),()=>{e.forEach(n=>t.registry.delete(n))}},[t,e.length])},G=(t,e,s)=>{i.useEffect(()=>{t&&t.data[e]!=s&&t.publish(e,s)},[e,s,t]),T(t,e)},M=(t,e,s=0)=>{const[{value:n},a]=i.useState(()=>({value:t?.data?.[e]}));return i.useEffect(()=>{if(t){let r=s==0?o=>a({value:o}):E(o=>a({value:o}),s),l=t.subscribe(e,r);return n!=t.data[e]&&a({value:t.data[e]}),()=>{l()}}},[e,t]),t?.data[e]},x=(t,e,s)=>{const[,n]=i.useState(0),a=i.useMemo(()=>s(t?.data[e]),[s,t?.data[e]]);return i.useEffect(()=>{if(t){let r=a,l=()=>{let u=s(t.data[e]);u!=r&&(r=u,n(d=>d+1))},o=t.subscribe(e,l);return l(),()=>o()}},[e,t]),a},N=(t,...e)=>{i.useEffect(()=>{if(t)for(let[s,n]of e)t.data[s]!=n&&t.publish(s,n)},[t,y(e.flat())]),T(t,...e.map(s=>s[0]))},H=(t,...e)=>{const[,s]=i.useState(0),n=e.map(a=>t?.data?.[a]);return i.useEffect(()=>{if(t){let a=n;const r=E(()=>{let u=e.map(d=>t?.data?.[d]);e.some((d,f)=>a[f]!=u[f])&&(a=u,s(d=>d+1))},1);let l=e.map(u=>t.subscribe(u,r)),o=setTimeout(r,1);return()=>{clearTimeout(o),r.cancel(),l.forEach(u=>u())}}},[t,...e]),Object.fromEntries(e.map((a,r)=>[a,n[r]]))},J=(t,e=50,...s)=>{const[,n]=i.useState(0),a=s.map(r=>t?.data?.[r]);return i.useEffect(()=>{if(t){let r=a;const l=E(()=>{let d=s.map(f=>t?.data?.[f]);s.some((f,p)=>r[p]!=d[p])&&(r=d,n(f=>f+1))},e);let o=s.map(d=>t.subscribe(d,l)),u=setTimeout(l,1);return()=>{clearTimeout(u),l.cancel(),o.forEach(d=>d())}}},[t,...s]),a},W=(t,e)=>{const s=r=>[t,...Object.entries(r??{}).sort((l,o)=>l[0].localeCompare(o[0])).flat()].join("-");let n=new Set;const a=r=>{const l=e(r),o=s(r),u=S(o),d=i.useMemo(()=>new Error().stack,[]);return N(u,...Object.entries(l)),i.useEffect(()=>{if(n.has(o)){const f=new Error("RootContext "+o+" are mounted more than once");throw f.stack=d,f}return n.add(o),()=>{n.delete(o)}}),c.jsx(c.Fragment,{})};return a.displayName=`State[${e?.name??"??"}]`,{resolveCtxName:s,Root:a,useCtxStateStrict:r=>{const l=s(r),o=i.useMemo(()=>new Error().stack,[]);return i.useEffect(()=>{if(!n.has(l)){const u=new Error("RootContext ["+l+"] is not mounted");throw u.stack=o,u}},[l]),S(l)},useCtxState:r=>{const l=s(r),o=i.useMemo(()=>new Error().stack,[]);return i.useEffect(()=>{if(!n.has(l)){const u=new Error("RootContext ["+l+"] is not mounted");u.stack=o;let d=setTimeout(()=>console.error(u),1e3);return()=>clearTimeout(d)}},[n.has(l)]),S(l)}}},L=function(){const t=new WeakMap;return e=>{let s=t.get(e);return s||t.set(e,s=(e?.name??"")+Math.random().toString()),s}}(),q=t=>[...Object.entries(t??{}).sort((e,s)=>e[0].localeCompare(s[0])).flat()].join("-"),K=({Wrapper:t=i.Fragment})=>{const e=S("auto-ctx"),[s,n]=i.useState({}),a=i.useCallback((r,l)=>{const o=L(r),u=q(l);return n(({[o]:{Component:d=r,subState:{[u]:f={params:l,counter:0},...p}={}}={},...v})=>({...v,[o]:{Component:d,subState:{...p,[u]:{...f,counter:f.counter+1}}}})),()=>n(({[o]:{Component:d=r,subState:{[u]:f={params:l,counter:0},...p}={}}={},...v})=>({...v,[o]:{Component:d,subState:{...p,...f.counter>1?{[u]:{...f,counter:f.counter-1}}:{}}}}))},[]);return N(e,["subscribe",a],["state",s]),c.jsx(c.Fragment,{children:Object.entries(s).flatMap(([r,{Component:l,subState:o}])=>Object.entries(o).map(([u,{counter:d,params:f}])=>({key:r+u,Component:l,params:f,counter:d})).filter(u=>u.counter>0).map(({key:u,params:d,Component:f})=>c.jsx(t,{children:c.jsx(f,{...d})},u)))})},_=({Root:t,useCtxState:e,useCtxStateStrict:s,resolveCtxName:n},a=0)=>({useCtxState:r=>{const l=n(r),o=M(S("auto-ctx"),"subscribe");return i.useEffect(()=>{if(a==0)return o?.(t,r);{let u=o?.(t,r);return()=>setTimeout(u,a)}},[o,l]),S(l)}}),I=t=>{const[,e]=i.useState(0),{proxy:s,finalGetter:n,openGetter:a,clean:r}=i.useMemo(()=>{const l=new Set,o={},u=new Map,d=new Proxy(t?.data,{get(b,m){if(f)return l.add(m),o[m]=b[m];throw new Error("now allow here")}});let f=!0,p=E(()=>{[...l.values()].some(b=>o[b]!=t?.data?.[b])&&e(b=>b+1)},0),v=()=>{f=!0,l.clear()},g=()=>{f=!1,[...l.values()].filter(b=>!u.has(b)).forEach(b=>{u.set(b,t?.subscribe(b,p))}),[...u.keys()].filter(b=>!l.has(b)).forEach(b=>{u.get(b)?.(),u.delete(b)})};return{proxy:d,finalGetter:g,openGetter:v,clean:()=>{v(),g(),e(b=>b+1)}}},[t]);return a(),setTimeout(n,0),i.useEffect(()=>()=>r(),[r]),s},P=C.cache,Q=({})=>{const[t,e]=i.useState("");return c.jsxs("div",{className:"main-panel",children:[c.jsx("div",{className:"state-list",children:[...P.keys()].map(s=>JSON.parse(s)?.[0]).filter(s=>s!="auto-ctx").map(s=>c.jsx("div",{className:"state-key","data-active":s==t,onClick:()=>e(s),children:s}))}),c.jsx("div",{className:"state-view",children:c.jsx(z,{dataKey:t},t)})]})},z=({dataKey:t})=>{const e=C(t),[s,n]=i.useState({...e?.data});return i.useEffect(()=>{let a={...s},r=setInterval(()=>{let l=!1;for(let o in e?.data)e?.data?.[o]!=a[o]&&(a[o]=e?.data?.[o],l=!0);l&&n({...a})},200);return()=>clearInterval(r)},[e]),c.jsx(R,{value:s,name:"ROOT",expandLevel:1,style:{}})},V=(t,e=10)=>Object.fromEntries(new Array(Math.ceil((t.length+1)/e)).fill(0).map((s,n,a)=>new Array(n==a.length-1?t.length%e:e).fill(0).map((r,l)=>n*e+l)).filter(s=>s.length).map(s=>[`${s.at(0)}..${s.at(-1)}`,Object.fromEntries(s.map(n=>[n,t[n]]))])),B=(t,e=10)=>{const s=Object.keys(t);return Object.fromEntries(Array(Math.ceil((s.length+1)/e)).fill(0).map((n,a,r)=>new Array(a==r.length-1?s.length%e:e).fill(0).map((l,o)=>a*e+o)).filter(n=>n.length).map(n=>n.map(a=>s.at(a))).map(n=>[`${n.at(0)?.slice(0,15)}...${n.at(-1)?.slice(0,15)}`,Object.fromEntries(n.map(a=>[a,t[a]]))]))},w=({path:t,expandLevel:e,expandRoot:s,setExpandRoot:n})=>{const a=t?.join("%")??"",r=typeof e=="boolean"?e:typeof e=="number"&&e>0,l=i.useMemo(()=>s?.[a]??r,[s?.[a],a]),o=i.useCallback(u=>n(d=>({...d,[a]:u})),[s,a]);return{isExpand:l,setExpand:o}},j=({value:t,deepCompare:e=!1,...s})=>{const n=i.useRef(void 0),a=i.useRef(t);return i.useEffect(()=>{if(n.current&&(e&&t&&a.current?Object.keys(t).length!=Object.keys(a.current).length||Object.keys(t).some(l=>t[l]!=a.current[l]):t!=a.current)){a.current=t,n.current.classList.add("jv-updated");let l=requestAnimationFrame(()=>n.current?.classList.remove("jv-updated"));return()=>cancelAnimationFrame(l)}},[t,e,n]),c.jsx("div",{...s,ref:n})},U=t=>{const{currentField:e,value:s,path:n=[],name:a,expandRoot:r,setExpandRoot:l,expandLevel:o,isGrouped:u}=t,d=s instanceof Array,{isExpand:f,setExpand:p}=w(t),v=typeof o=="number"?o-1:o,g=Object.entries(s).length>10,k=i.useMemo(()=>g?s instanceof Array?V(s,10):B(s,10):s,[s,g,V]);return f?c.jsxs(j,{className:"jv-field jv-field-obj",value:s,deepCompare:u,children:[e&&c.jsx("div",{children:c.jsxs("div",{onClick:()=>p(!1),children:[c.jsx("span",{className:"jv-name",children:e}),c.jsx("span",{children:":"}),c.jsx("span",{children:"[-]"}),c.jsxs("span",{className:"jv-type",children:[Object.keys(s).length," items "]}),c.jsxs("span",{children:[" ",d?"[":"{"," "]})]})}),c.jsx("div",{className:"jv-value",children:Object.entries(k).map(([b,m],te)=>i.createElement(A,{name:a,expandRoot:r,setExpandRoot:l,expandLevel:v,value:m,isGrouped:g,key:[...n,g?te:b].join("%"),path:[...n,b]}))}),e&&c.jsx("div",{children:c.jsxs("span",{children:[" ",d?"]":"}"," "]})})]}):c.jsx(j,{className:"jv-field jv-field-obj",value:s,deepCompare:u,children:c.jsx("div",{children:c.jsxs("div",{onClick:()=>p(!0),children:[c.jsx("span",{className:"jv-name",children:e}),e&&c.jsx("span",{children:":"}),e&&c.jsx("span",{children:"[+]"}),c.jsxs("span",{className:"jv-type",children:[Object.keys(s).length," items "]}),c.jsxs("span",{children:[" ",d?"[":"{"," "]}),c.jsx("span",{children:" ... "}),c.jsxs("span",{children:[" ",d?"]":"}"," "]})]})})})},X=t=>{const{currentType:e,currentField:s,value:n}=t,{isExpand:a,setExpand:r}=w(t),l=String(n).length>50,o=l&&!a?`${String(n).slice(0,15)}...${String(n).slice(-15,-1)}`:String(n);return c.jsxs(j,{value:t.value,className:`jv-field jv-field-${e} ${l?"jv-cursor":""}`,onClick:()=>r(!a),children:[c.jsx("span",{className:"jv-name",children:s}),c.jsx("span",{children:":"}),c.jsxs("span",{className:"jv-type",children:[e,", lng=",n?.length]}),c.jsxs("span",{className:"jv-value",children:['"',o,'"']}),c.jsx("span",{children:","})]})},Y=t=>{const{currentType:e,currentField:s,value:n}=t,{isExpand:a,setExpand:r}=w(t),l=String(n).length>50,o=l&&!a?`${String(n).slice(0,15)}...${String(n).slice(-15,-1)}`:String(n);return c.jsxs(j,{value:t.value,className:`jv-field jv-field-${e} ${l?"jv-cursor":""}`,onClick:()=>r(!a),children:[c.jsx("span",{className:"jv-name",children:s}),c.jsx("span",{children:":"}),c.jsx("span",{className:"jv-type",children:e}),c.jsxs("span",{className:"jv-value",children:['"',o,'"']}),c.jsx("span",{children:","})]})},Z=t=>{const{currentType:e,currentField:s,value:n}=t;return c.jsxs(j,{value:t.value,className:`jv-field jv-field-${e}`,children:[c.jsx("span",{className:"jv-name",children:s}),c.jsx("span",{children:":"}),c.jsx("span",{className:"jv-type",children:e}),c.jsx("span",{className:"jv-value",children:String(n)}),c.jsx("span",{children:","})]})},A=t=>{const{value:e,path:s=[],name:n}=t,a=s.at(-1)??n??void 0,r=typeof e;switch(r){case"object":return c.jsx(U,{...t,currentField:a,currentType:r});case"string":return c.jsx(X,{...t,currentField:a,currentType:r});case"function":return c.jsx(Y,{...t,currentField:a,currentType:r});case"number":case"boolean":case"bigint":case"symbol":case"undefined":default:return c.jsx(Z,{...t,currentField:a,currentType:r})}},R=({value:t,name:e,style:s,expandLevel:n=!1})=>{const[a,r]=i.useState({});return c.jsx("div",{className:"jv-root",style:s,children:c.jsx(A,{path:[],name:e,value:t,expandRoot:a,setExpandRoot:r,expandLevel:n})})},ee=({toggleButton:t="[x]",...e})=>{const[s,n]=i.useState(!1);return c.jsxs(c.Fragment,{children:[c.jsx("button",{className:"react-state-dev-btn","data-active":s,onClick:()=>n(!0),...e,children:e?.children??"Toggle Dev Tool"}),c.jsxs("div",{className:"react-state-dev-container","data-active":s,children:[c.jsx("button",{className:"close-btn",onClick:()=>n(!1),children:"[x]"}),c.jsx(Q,{})]})]})};h.AutoRootCtx=K,h.Context=D,h.DevToolContainer=ee,h.createAutoCtx=_,h.createRootCtx=W,h.getContext=C,h.useArrayHash=y,h.useDataContext=S,h.useDataSource=G,h.useDataSourceMultiple=N,h.useDataSubscribe=M,h.useDataSubscribeMultiple=H,h.useDataSubscribeMultipleWithDebounce=J,h.useDataSubscribeWithTransform=x,h.useQuickSubscribe=I,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/state-utils/utils.ts","../src/state-utils/useArrayHash.ts","../src/state-utils/ctx.ts","../src/state-utils/createRootCtx.tsx","../src/state-utils/createAutoCtx.tsx","../src/state-utils/useQuickSubscribe.ts","../src/DevToolState.tsx","../src/DevTool.tsx"],"sourcesContent":["// Debounce function\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) & { cancel: any } {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n let fn: Function & { cancel: any } = function (...args: Parameters<T>): void {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n } as any;\n\n fn.cancel = () => clearTimeout(timeout!);\n\n return fn as any;\n}\n\n// Memoize function\nexport function memoize<T extends (...args: any[]) => any>(\n func: T\n): ((...args: Parameters<T>) => ReturnType<T>) & { cache: Map<string, ReturnType<T>> } {\n \n const cache = new Map<string, ReturnType<T>>();\n\n const cachedFunc: any = function (...args: Parameters<T>): ReturnType<T> {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key) as ReturnType<T>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n }\n\n cachedFunc.cache = cache;\n\n return cachedFunc\n}\n\n","import { useRef } from \"react\"\n\n\nconst randomHash = () => Math.random().toString().slice(2)\n\n/**\n * useArrayHash\n *\n * A custom hook that computes a stable hash for an array of values.\n * The hash changes only when the array's contents differ from the previous call.\n *\n * @param e - The input array to hash.\n * @returns A string hash that updates when the array changes.\n *\n * How it works:\n * - Tracks the previous array and its hash using a `useRef`.\n * - Compares the new array to the previous one by length and element equality.\n * - If any difference is detected, generates a new random hash.\n */\nexport const useArrayHash = (e: any[]): string => {\n\n const { current: { computedHash } } = useRef({\n /**\n * Getter for the computed hash function.\n *\n * - Initializes with an empty array and a random hash.\n * - Returns a function that compares the current array to the previous one.\n * - Updates the hash if any difference is detected.\n */\n get computedHash() {\n let currentValues: any[] = []\n let currentHash = randomHash()\n return (e: any[]) => {\n let isDiff = false\n\n // Check for differences in array existence, length, or elements.\n isDiff = isDiff || ((!e) != (!currentValues))\n isDiff = isDiff || (e?.length != currentValues?.length);\n isDiff = isDiff || (e.some((f, i) => f != currentValues[i]));\n\n // Update the hash if differences are found.\n currentValues = e;\n if (isDiff) {\n currentHash = randomHash()\n }\n\n return currentHash\n }\n }\n })\n\n return computedHash(e)\n}","import { debounce, memoize } from \"./utils\";\nimport { useEffect, useMemo, useState } from \"react\"\nimport { useArrayHash } from \"./useArrayHash\"\n\n\n\nclass DataEvent extends Event {\n constructor(\n public event: string,\n public value: any\n ) {\n super(event);\n }\n}\n\n/**\n * Generic context for managing shared state and event subscriptions.\n * @template D - The shape of the data managed by the context.\n */\nexport class Context<D> extends EventTarget {\n /**\n * Create a new Context instance.\n * @param name - The name of the context (for debugging).\n */\n constructor(public name: string) {\n console.log(\"[CONTEXT] %s\", name)\n // this.event.setMaxListeners(100)\n super();\n }\n\n // private event = new EventEmitter()\n\n /**\n * The current data held by the context.\n */\n public data: Partial<D> = {}\n /**\n * Registry for tracking active keys (for duplicate detection).\n */\n public registry = new Set<string>()\n\n /**\n * Publish a value to the context and notify subscribers if it changed.\n * @param key - The key to update.\n * @param value - The new value.\n */\n public publish(key: keyof D, value: D[typeof key] | undefined) {\n\n if (value != this.data[key]) {\n this.data[key] = value\n // console.count(\"[COUNT] \" + String(key))\n // this.event.emit(String(key), { value })\n this.dispatchEvent(new DataEvent(String(key), value))\n }\n }\n\n /**\n * Subscribe to changes for a specific key in the context.\n * @param key - The key to subscribe to.\n * @param _listener - Callback invoked with the new value.\n * @returns Unsubscribe function.\n */\n public subscribe(key: keyof D, _listener: (e: D[typeof key] | undefined) => void) {\n\n const listener = ({ event, value }: any) => {\n _listener(value)\n }\n\n this.addEventListener(String(key), listener)\n // console.log(\"listenerCount:\", String(key), this.event.listenerCount(String(key)))\n\n if (key in this.data) _listener(this.data[key])\n\n return () => (this.removeEventListener(String(key), listener), undefined)\n }\n\n}\n\n/**\n * Get or create a memoized Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const getContext = memoize((name: string) => new Context<any>(name))\n\n/**\n * Type alias for a function that returns a Context instance.\n */\nexport type getContext<D> = (e: string) => Context<D>\n\n/**\n * React hook to get a typed Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const useDataContext = <D>(name: string = \"noname\") => {\n\n const ctx = useMemo(() => getContext(name), [name])\n\n return ctx as any as Context<D>\n}\n\n/**\n * Internal hook to check for duplicate registry entries in a context.\n * Warns if any of the provided names are already registered.\n * @param ctx - The context instance.\n * @param names - Names to check and register.\n */\nconst useRegistryChecker = (ctx: Context<any> | undefined, ...names: string[]) => {\n // return;\n const stack = new Error(\"[ctx] useRegistryChecker failed \" + JSON.stringify({ names, ctx: ctx?.name ?? 'undefined' }))\n\n useEffect(\n () => {\n if (ctx) {\n if (names.some(name => ctx.registry.has(name))) {\n console.error(stack)\n }\n names.forEach(e => ctx.registry.add(e))\n\n // console.debug(\"[ctx] %s%s add datasource\", componentId, ctx.name, names)\n return () => {\n // console.debug(\"[ctx] %s %s remove datasource\", componentId, ctx.name, names)\n\n names.forEach(e => ctx.registry.delete(e))\n }\n }\n },\n [ctx, names.length]\n )\n\n}\n\n/**\n * React hook to publish a value to the context when it changes.\n * @param ctx - The context instance.\n * @param key - The key to update.\n * @param value - The new value.\n */\nexport const useDataSource = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, value: D[K] | undefined) => {\n //@ts-check\n useEffect(() => {\n if (ctx && ctx.data[key] != value) {\n\n ctx.publish(key, value)\n }\n }, [key, value, ctx])\n\n useRegistryChecker(ctx, key as any)\n}\n\n/**\n * React hook to subscribe to a context value, with optional debounce.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param debounceTime - Debounce time in ms (default 0).\n * @returns The current value for the key.\n */\nexport const useDataSubscribe = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, debounceTime = 0): D[K] | undefined => {\n //@ts-check\n const [{ value }, setState] = useState(() => ({ value: ctx?.data?.[key] }))\n\n useEffect(() => {\n if (ctx) {\n let callback = debounceTime == 0\n ? (value: any) => setState({ value } as any)\n : debounce((value: any) => setState({ value } as any), debounceTime)\n let unsub = ctx.subscribe(key, callback)\n value != ctx.data[key] && setState({ value: ctx.data[key] })\n return () => {\n unsub()\n }\n }\n }, [key, ctx])\n\n return ctx?.data[key]\n}\n\n/**\n * React hook to subscribe to a context value and transform it before returning.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param transform - Function to transform the value.\n * @returns The transformed value.\n */\nexport const useDataSubscribeWithTransform = <D, K extends keyof D, E>(ctx: Context<D> | undefined, key: K, transform: (e: D[K] | undefined) => E): E => {\n const [, setState] = useState(0)\n const result = useMemo(\n () => transform(ctx?.data[key]),\n [transform, ctx?.data[key]]\n )\n\n useEffect(() => {\n if (ctx) {\n let preValue = result\n let callback = () => {\n let newValue = transform(ctx.data[key])\n if (newValue != preValue) {\n preValue = newValue;\n setState(e => e + 1)\n };\n }\n let unsub = ctx.subscribe(key, callback)\n callback();\n return () => unsub()\n }\n }, [key, ctx])\n\n return result\n}\n\n/**\n * React hook to publish multiple values to the context.\n * @param ctx - The context instance.\n * @param entries - Array of [key, value] pairs to update.\n */\nexport const useDataSourceMultiple = <D, T extends readonly (keyof D)[]>(\n ctx: Context<D> | undefined,\n ...entries: { -readonly [P in keyof T]: [T[P], D[T[P]]] }\n) => {\n //@ts-check\n useEffect(() => {\n if (ctx) {\n for (let [key, value] of entries) {\n ctx.data[key] != value && ctx.publish(key, value)\n }\n }\n }, [ctx, useArrayHash(entries.flat())])\n\n useRegistryChecker(ctx, ...entries.map(e => e[0]) as any)\n\n}\n\n/**\n * React hook to subscribe to multiple context values.\n * @param ctx - The context instance.\n * @param keys - Keys to subscribe to.\n * @returns An object with the current values for the keys.\n */\nexport const useDataSubscribeMultiple = <D, K extends keyof D>(\n ctx: Context<D> | undefined,\n ...keys: K[]\n): Pick<D, K> => {\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n // console.log(\"DIFF\", keys.filter((e, i) => prevValues[i] != currentValues[i]))\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, 1)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n\n return Object\n .fromEntries(keys.map((key, index) => [key, returnValues[index]])) as any\n}\n\n/**\n * React hook to subscribe to multiple context values with throttling.\n * @param ctx - The context instance.\n * @param debounceTime - Debounce time in ms (default 50).\n * @param keys - Keys to subscribe to.\n * @returns Array of current values for the keys.\n */\nexport const useDataSubscribeMultipleWithDebounce = <D, K extends (keyof D)[]>(\n ctx: Context<D> | undefined,\n debounceTime = 50,\n ...keys: K\n): { [i in keyof K]: D[K[i]] | undefined } => {\n //@ts-check\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, debounceTime)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n return returnValues as any\n}\n\n\n\n","import { useEffect, useMemo } from \"react\"\nimport { useDataContext, useDataSourceMultiple, type Context } from \"./ctx\"\n\n\n\n/**\n * createRootCtx\n *\n * Factory that creates a headless \"Root\" component and companion hooks for a context namespace.\n * It derives a unique context name from a base `name` and a props object `U`, then publishes\n * a computed state `V` (from `useFn`) to that context.\n *\n * Usage (manual mounting):\n * ```\n * const { Root, useCtxState } = createRootCtx('user-state', useUserState)\n * ...\n * // Mount exactly one Root per unique props combination\n * <Root userId={id} />\n * ...\n * // Read anywhere ,using the same props shape\n * const user = useCtxState({ userId: id })\n *```\n * Strict vs lenient consumers:\n * - useCtxStateStrict(props) throws if a matching Root is not mounted.\n * - useCtxState(props) logs an error (after 1s) instead of throwing.\n *\n * Multiple instances safety:\n * - Mounting more than one Root with the same resolved context name throws (guards accidental duplicates).\n *\n * Name resolution notes:\n * - The context name is built from `name` + sorted key/value pairs of `props` (U), joined by \"-\".\n * - Prefer stable, primitive props to avoid collisions; if you need automation, pair with `createAutoCtx` and\n * mount a single <AutoRootCtx Wrapper={ErrorBoundary} /> at the app root so you don't manually mount `Root`.\n */\nexport const createRootCtx = <U extends object, V extends object>(name: string, useFn: (e: U) => V) => {\n\n const resolveCtxName = (e: U) => [\n name,\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n ].join(\"-\")\n\n let ctxMountedCheck = new Set<string>()\n\n\n const RootState: React.FC<U> = (e: U) => {\n const state = useFn(e)\n const ctxName = resolveCtxName(e)\n const ctx = useDataContext<V>(ctxName)\n const stack = useMemo(() => new Error().stack, [])\n\n useDataSourceMultiple(\n ctx,\n ...Object.entries(state) as any\n )\n\n useEffect(() => {\n if (ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext \" + ctxName + \" are mounted more than once\")\n err.stack = stack;\n throw err\n }\n ctxMountedCheck.add(ctxName)\n return () => { ctxMountedCheck.delete(ctxName) };\n })\n\n return <></>\n }\n\n RootState.displayName = `State[${useFn?.name??'??'}]`\n\n return {\n resolveCtxName,\n Root: RootState,\n /**\n * Strict consumer: throws if the corresponding Root for these props isn't mounted.\n * Use in development/tests to fail fast when wiring is incorrect.\n */\n useCtxStateStrict: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n throw err\n }\n }, [ctxName])\n\n return useDataContext<V>(ctxName)\n },\n /**\n * Lenient consumer: schedules a console.error if the Root isn't mounted instead of throwing.\n * Useful in production to avoid hard crashes while still surfacing misconfiguration.\n */\n useCtxState: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n let timeout = setTimeout(() => console.error(err), 1000)\n return () => clearTimeout(timeout)\n }\n }, [ctxMountedCheck.has(ctxName)])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","import { useEffect, useState, Fragment, useCallback } from \"react\"\nimport { useDataContext, useDataSourceMultiple, useDataSubscribe, type Context } from \"./ctx\"\nimport { createRootCtx } from \"./createRootCtx\"\n\n\n\n\n\n\nconst weakmapName = (function () {\n const weakmap = new WeakMap()\n\n return (e: any): string => {\n let result = weakmap.get(e);\n if (!result) {\n weakmap.set(e, result = (e?.name ?? \"\") + Math.random().toString())\n }\n return result\n }\n})()\n\n\nconst resolveName = (e: any) => [\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n].join(\"-\")\n\n/**\n * Inline docs: createAutoCtx + AutoRootCtx\n *\n * Quick start\n * 1) Mount <AutoRootCtx /> ONCE near your app root. Provide a Wrapper that acts like an ErrorBoundary to isolate and log errors.\n * Example: <AutoRootCtx Wrapper={MyErrorBoundary} />\n *\n * 2) Create auto contexts from your root context factories:\n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx('test-state', stateFn))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx('other-state', otherFn))\n * ```\n * 3) Use them in components:\n * ```\n * const ctx = useTestCtxState({ userId })\n * const { property1, property2 } = useDataSubscribeMultiple(ctx,'property1','property2')\n * // No need to mount the Root returned by createRootCtx directly — AutoRootCtx manages it for you.\n * ```\n * Notes\n * - AutoRootCtx must be mounted before any useCtxState hooks created by createAutoCtx run.\n * - Wrapper should be an ErrorBoundary-like component that simply renders {children}; no extra providers or layout required.\n * - For each unique params object (by stable stringified key), AutoRootCtx ensures a corresponding Root instance is rendered.\n */\n\nexport const AutoRootCtx = ({ Wrapper = Fragment }) => {\n\n const ctx = useDataContext<any>(\"auto-ctx\")\n\n\n const [state, setState] = useState<Record<string, { Component: React.FC, subState: Record<string, { params: any, counter: number }> }>>({})\n\n\n const subscribeRoot = useCallback(\n (Comp: any, params: any) => {\n const weakName = weakmapName(Comp);\n const key = resolveName(params);\n\n setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n [key]: {\n ...preState,\n counter: preState.counter + 1,\n },\n },\n }\n }));\n\n return () => setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n ...preState.counter > 1 ? {\n [key]: {\n ...preState,\n counter: preState.counter - 1,\n },\n } : {},\n },\n }\n }))\n\n },\n []\n )\n\n useDataSourceMultiple(ctx,\n [\"subscribe\", subscribeRoot],\n [\"state\", state],\n )\n\n\n return <>\n {Object.entries(state)\n .flatMap(([k1, { Component, subState }]) => Object\n .entries(subState)\n .map(([k2, { counter, params }]) => ({ key: k1 + k2, Component, params, counter }))\n .filter(e => e.counter > 0)\n .map(({ key, params, Component }) => <Wrapper key={key} >\n <Component {...params} />\n </Wrapper>)\n )\n }\n </>\n\n}\n\n/**\n * createAutoCtx\n *\n * Bridges a Root context (from createRootCtx) to the global AutoRootCtx renderer.\n * You do NOT mount the Root component yourself — just mount <AutoRootCtx /> once at the app root.\n *\n * Usage: \n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx(\n * 'test-state', \n * stateFn\n * ))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx(\n * 'other-state', \n * otherFn\n * ))\n * ```\n * \n * Then inside components:\n * ```\n * const ctxState = useTestCtxState({ any: 'params' })\n * ```\n * AutoRootCtx will subscribe/unsubscribe instances per unique params and render the appropriate Root under the hood.\n */\nexport const createAutoCtx = <U extends object, V extends object,>(\n { Root, useCtxState, useCtxStateStrict, resolveCtxName }: ReturnType<typeof createRootCtx<U, V>>,\n unmountTime = 0\n) => {\n\n return {\n\n useCtxState: (e: U): Context<V> => {\n\n const ctxName = resolveCtxName(e)\n\n const subscribe = useDataSubscribe(useDataContext<any>(\"auto-ctx\"), \"subscribe\")\n\n useEffect(() => {\n // Subscribe this component to an AutoRootCtx-managed Root instance keyed by e.\n // AutoRootCtx handles instance ref-counting and cleanup on unmount.\n if (unmountTime == 0) {\n return subscribe?.(Root, e)\n } else {\n let unsub = subscribe?.(Root, e)\n return () => setTimeout(unsub, unmountTime)\n }\n }, [subscribe, ctxName])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","\nimport { debounce } from \"./utils\";\nimport { useState, useMemo, useEffect } from \"react\";\nimport type { Context } from \"./ctx\";\n\n/**\n * useQuickSubscribe is a custom React hook for efficiently subscribing to specific properties of a context's data object.\n * \n * @template D - The shape of the context data.\n * @param {Context<D> | undefined} ctx - The context object containing data and a subscribe method.\n * @returns {Partial<D>} A proxy object that mirrors the context data, automatically subscribing to properties as they are accessed.\n *\n * This hook tracks which properties of the context data are accessed by the component and subscribes to updates for only those properties.\n * When any of the subscribed properties change, the hook triggers a re-render. Subscriptions are managed and cleaned up automatically\n * when the component unmounts or the context changes. This approach minimizes unnecessary re-renders and resource usage by only\n * subscribing to the data that the component actually uses.\n *\n * Example usage:\n * const {name} = useQuickSubscribe(userContext);\n * // Accessing name will subscribe to changes in 'name' only\n * return <div>{name}</div>;\n */\n\nexport const useQuickSubscribe = <D>(\n ctx: Context<D> | undefined\n): {\n [P in keyof D]?: D[P] | undefined;\n } => {\n\n const [, setCounter] = useState(0);\n\n const { proxy, finalGetter, openGetter, clean } = useMemo(\n () => {\n\n const allKeys = new Set<keyof D>()\n const allCompareValue: { [P in keyof D]?: D[P] | undefined; } = {}\n const allUnsub = new Map()\n\n const proxy = new Proxy(\n ctx?.data as any,\n {\n get(target, p) {\n if (isOpenGetter) {\n allKeys.add(p as keyof D)\n return allCompareValue[p as keyof D] = target[p];\n } else {\n throw new Error(\"now allow here\")\n }\n }\n }\n ) as any\n\n let isOpenGetter = true;\n\n\n let onChange = debounce(() => {\n if ([...allKeys.values()]\n .some(k => allCompareValue[k] != ctx?.data?.[k])) {\n setCounter(c => c + 1)\n }\n }, 0)\n\n let openGetter = () => {\n isOpenGetter = true\n allKeys.clear()\n }\n\n let finalGetter = () => {\n isOpenGetter = false;\n\n [...allKeys.values()]\n .filter(k => !allUnsub.has(k))\n .forEach(k => {\n allUnsub.set(k, ctx?.subscribe(k, onChange))\n });\n\n [...allUnsub.keys()]\n .filter(k => !allKeys.has(k))\n .forEach(k => {\n let unsub = allUnsub.get(k)\n unsub?.();\n allUnsub.delete(k);\n });\n\n }\n\n let clean = () => {\n openGetter();\n finalGetter();\n setCounter(c => c + 1)\n }\n\n return { proxy, finalGetter, openGetter, clean }\n },\n [ctx]\n )\n\n openGetter();\n\n setTimeout(finalGetter, 0)\n\n useEffect(\n () => () => clean(),\n [clean]\n )\n\n return proxy;\n\n\n};\n","import { getContext } from \"./state-utils/ctx\"\nimport React, { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport \"./devTool.css\"\n\nconst cache = getContext.cache\n\nexport const DevToolState = ({ }) => {\n const [selectedKey, setKey] = useState(\"\")\n return <div className=\"main-panel\">\n <div className=\"state-list\">\n {[...cache.keys()]\n .map(e => JSON.parse(e)?.[0])\n .filter(e => e != \"auto-ctx\")\n .map(e => <div\n className=\"state-key\"\n data-active={e == selectedKey}\n onClick={() => setKey(e)}>{e}\n </div>)}\n </div>\n <div className=\"state-view\" >\n <StateView dataKey={selectedKey} key={selectedKey} />\n </div>\n </div>\n}\n\nexport const StateView: React.FC<{ dataKey: string }> = ({ dataKey }) => {\n const ctx = getContext(dataKey)\n const [currentData, setCurrentData] = useState({ ...ctx?.data })\n\n useEffect(() => {\n let checkState = { ...currentData }\n let interval = setInterval(() => {\n\n let isDiff = false\n\n for (let i in ctx?.data) {\n if (ctx?.data?.[i] != checkState[i]) {\n checkState[i] = ctx?.data?.[i];\n isDiff = true;\n }\n }\n if (isDiff) setCurrentData({ ...checkState })\n }, 200)\n\n return () => clearInterval(interval)\n }, [ctx])\n\n return <JSONView\n value={currentData}\n name=\"ROOT\"\n expandLevel={1}\n style={{ height: \"300px\", overflow: \"auto\", resize: \"vertical\" }}\n />\n}\n\ntype JSONViewProps = {\n value: any,\n path?: string[],\n name?: string,\n expandRoot: Record<string, boolean>,\n setExpandRoot: Dispatch<SetStateAction<Record<string, boolean>>>,\n expandLevel: number | boolean,\n currentField?: any\n currentType?: any,\n isGrouped?: boolean,\n}\n\n\nconst splitArray = <T,>(array: T[], max = 10) => {\n return Object.fromEntries(\n new Array(Math.ceil((array.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? array.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map(keys => [`${keys.at(0)}..${keys.at(-1)}`, Object.fromEntries(\n keys.map(k => [k, array[k]])\n )])\n )\n}\n\n\nconst splitObject = (object: any, max = 10) => {\n const keys = Object.keys(object);\n return Object.fromEntries(\n Array(Math.ceil((keys.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? keys.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map((e) => e.map(i => keys.at(i)))\n .map(sortedKeys => [\n `${sortedKeys.at(0)?.slice(0, 15)}...${sortedKeys.at(-1)?.slice(0, 15)}`,\n Object.fromEntries(sortedKeys.map(key => [key, object[key as any]]))]\n )\n )\n}\n\n\nconst useExpandState = ({ path, expandLevel, expandRoot, setExpandRoot }: JSONViewProps) => {\n const expandKeys = path?.join(\"%\") ?? \"\";\n\n const defaultExpand = typeof expandLevel == \"boolean\"\n ? expandLevel\n : (typeof expandLevel == 'number' && expandLevel > 0)\n\n const isExpand = useMemo(\n () => expandRoot?.[expandKeys] ?? defaultExpand,\n [expandRoot?.[expandKeys], expandKeys]\n )\n\n const setExpand = useCallback(\n (value: boolean) => setExpandRoot((r: object) => ({ ...r, [expandKeys]: value })),\n [expandRoot, expandKeys]\n )\n\n return { isExpand, setExpand }\n\n}\n\nconst ChangeFlashWrappper: React.FC<React.ComponentProps<'div'> & { value: any, deepCompare?: boolean }> = ({ value, deepCompare = false, ...rest }) => {\n\n const ref = useRef<HTMLElement>(undefined)\n const refValue = useRef(value);\n\n useEffect(() => {\n if (ref.current) {\n let isDiff = deepCompare && value && refValue.current\n ? (\n Object.keys(value).length != Object.keys(refValue.current).length\n || Object.keys(value).some(key => value[key] != refValue.current[key])\n ) : value != refValue.current\n if (isDiff) {\n refValue.current = value;\n ref.current.classList.add('jv-updated');\n let t = requestAnimationFrame(() => ref.current?.classList.remove('jv-updated'));\n return () => cancelAnimationFrame(t)\n }\n }\n\n }, [value, deepCompare, ref])\n\n return <div {...rest} ref={ref as any} />\n}\n\nconst JSONViewObj: React.FC<JSONViewProps> = (props) => {\n\n const {\n currentField,\n value, path = [], name, expandRoot, setExpandRoot,\n expandLevel,\n isGrouped,\n } = props\n\n const isArray = value instanceof Array\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const childExpandLevel = typeof expandLevel == \"number\" ? expandLevel - 1 : expandLevel\n\n const shouldGroup = Object.entries(value).length > 10\n\n const groupedChilds = useMemo(\n () => shouldGroup\n ? (value instanceof Array) ? splitArray(value, 10) : splitObject(value, 10)\n : value,\n [value, shouldGroup, splitArray]\n )\n\n return (isExpand) ? <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n {currentField && <div>\n <div onClick={() => setExpand(false)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span>[-]</span>\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n </div>\n </div>}\n <div className=\"jv-value\">\n {Object\n .entries(groupedChilds)\n .map(([k, v], index) => <JSONViewCurr\n {...{\n name, expandRoot, setExpandRoot,\n expandLevel: childExpandLevel,\n value: v,\n isGrouped: shouldGroup,\n }}\n key={[...path, shouldGroup ? index : k].join(\"%\")}\n path={[...path, k]}\n />)}\n </div>\n {currentField && <div>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>}\n </ChangeFlashWrappper> : <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n <div>\n <div onClick={() => setExpand(true)}>\n <span className=\"jv-name\">{currentField}</span>\n {currentField && <span>:</span>}\n {currentField && <span>[+]</span>}\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n <span> ... </span>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>\n </div>\n </ChangeFlashWrappper>\n\n}\n\nconst StringViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}, lng={value?.length}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\n\nconst FunctionViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst DefaultValueView: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType}`}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">{String(value)}</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst JSONViewCurr: React.FC<Omit<JSONViewProps, 'currentField'>> = (props) => {\n\n const { value, path = [], name } = props\n\n const currentField = path.at(-1) ?? name ?? undefined;\n\n const currentType = typeof value\n\n switch (currentType) {\n case \"object\":\n return <JSONViewObj {...props} {...{ currentField, currentType }} />\n case \"string\":\n return <StringViewObj {...props} {...{ currentField, currentType }} />\n case \"function\":\n return <FunctionViewObj {...props} {...{ currentField, currentType }} />\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n case \"symbol\":\n case \"undefined\":\n default:\n return <DefaultValueView {...props} {...{ currentField, currentType }} />\n }\n}\n\nexport const JSONView: React.FC<{ value: any, name?: string, style?: any, expandLevel?: number | boolean }> = ({ value, name, style, expandLevel = false }) => {\n\n const [expandRoot, setExpandRoot] = useState<Record<string, boolean>>({})\n\n return <div className=\"jv-root\" style={style}>\n <JSONViewCurr\n path={[]}\n {...{ name, value, expandRoot, setExpandRoot, expandLevel }}\n />\n </div>\n}","import \"./devTool.css\"\nimport { useState } from \"react\"\nimport { DevToolState } from \"./DevToolState\";\n\n\nexport const DevToolContainer = ({ toggleButton = \"[x]\", ...props }) => {\n const [active, setActive] = useState(false);\n return <>\n <button className=\"react-state-dev-btn\" data-active={active} onClick={() => setActive(true)} {...props}>\n {props?.children ?? \"Toggle Dev Tool\"}\n </button>\n <div className=\"react-state-dev-container\" data-active={active}>\n <button className=\"close-btn\" onClick={() => setActive(false)}>\n [x]\n </button>\n <DevToolState />\n </div>\n </>\n}"],"names":["debounce","func","wait","timeout","fn","args","memoize","cache","cachedFunc","key","result","randomHash","useArrayHash","e","computedHash","useRef","currentValues","currentHash","isDiff","f","i","DataEvent","event","value","Context","name","_listener","listener","getContext","useDataContext","useMemo","useRegistryChecker","ctx","names","stack","useEffect","useDataSource","useDataSubscribe","debounceTime","setState","useState","callback","unsub","useDataSubscribeWithTransform","transform","preValue","newValue","useDataSourceMultiple","entries","useDataSubscribeMultiple","keys","setCounter","returnValues","prevValues","c","handles","firstCall","index","useDataSubscribeMultipleWithDebounce","createRootCtx","useFn","resolveCtxName","ctxMountedCheck","RootState","state","ctxName","err","jsx","Fragment","weakmapName","weakmap","resolveName","AutoRootCtx","Wrapper","subscribeRoot","useCallback","Comp","params","weakName","Component","preState","subState","k1","k2","counter","createAutoCtx","Root","useCtxState","useCtxStateStrict","unmountTime","subscribe","useQuickSubscribe","proxy","finalGetter","openGetter","clean","allKeys","allCompareValue","allUnsub","target","p","isOpenGetter","onChange","k","DevToolState","selectedKey","setKey","jsxs","StateView","dataKey","currentData","setCurrentData","checkState","interval","JSONView","splitArray","array","max","_","j","splitObject","object","a","sortedKeys","useExpandState","path","expandLevel","expandRoot","setExpandRoot","expandKeys","defaultExpand","isExpand","setExpand","r","ChangeFlashWrappper","deepCompare","rest","ref","refValue","t","JSONViewObj","props","currentField","isGrouped","isArray","childExpandLevel","shouldGroup","groupedChilds","v","createElement","JSONViewCurr","StringViewObj","currentType","useExpand","renderString","FunctionViewObj","DefaultValueView","style","DevToolContainer","toggleButton","active","setActive"],"mappings":"iUACO,SAASA,EACdC,EACAC,EACsD,CACtD,IAAIC,EAAgD,KAEhDC,EAAiC,YAAaC,EAA2B,CACvEF,GACF,aAAaA,CAAO,EAEtBA,EAAU,WAAW,IAAM,CACzBF,EAAK,GAAGI,CAAI,CACd,EAAGH,CAAI,CACT,EAEA,OAAAE,EAAG,OAAS,IAAM,aAAaD,CAAQ,EAEhCC,CACT,CAGO,SAASE,EACdL,EACqF,CAErF,MAAMM,MAAY,IAEZC,EAAkB,YAAaH,EAAoC,CACvE,MAAMI,EAAM,KAAK,UAAUJ,CAAI,EAC/B,GAAIE,EAAM,IAAIE,CAAG,EACf,OAAOF,EAAM,IAAIE,CAAG,EAEtB,MAAMC,EAAST,EAAK,GAAGI,CAAI,EAC3B,OAAAE,EAAM,IAAIE,EAAKC,CAAM,EACdA,CACT,EAEA,OAAAF,EAAW,MAAQD,EAEZC,CACT,CCtCA,MAAMG,EAAa,IAAM,KAAK,OAAA,EAAS,SAAA,EAAW,MAAM,CAAC,EAgB5CC,EAAgBC,GAAqB,CAEhD,KAAM,CAAE,QAAS,CAAE,aAAAC,CAAA,CAAa,EAAMC,EAAAA,OAAO,CAQ3C,IAAI,cAAe,CACjB,IAAIC,EAAuB,CAAA,EACvBC,EAAcN,EAAA,EAClB,OAAQE,GAAa,CACnB,IAAIK,EAAS,GAGb,OAAAA,EAASA,GAAY,CAACL,GAAO,CAACG,EAC9BE,EAASA,GAAWL,GAAG,QAAUG,GAAe,OAChDE,EAASA,GAAWL,EAAE,KAAK,CAACM,EAAGC,IAAMD,GAAKH,EAAcI,CAAC,CAAC,EAG1DJ,EAAgBH,EACZK,IACFD,EAAcN,EAAA,GAGTM,CACT,CACF,CAAA,CACD,EAED,OAAOH,EAAaD,CAAC,CACvB,EC9CA,MAAMQ,UAAkB,KAAM,CAC5B,YACSC,EACAC,EACP,CACA,MAAMD,CAAK,EAHJ,KAAA,MAAAA,EACA,KAAA,MAAAC,CAGT,CACF,CAMO,MAAMC,UAAmB,WAAY,CAK1C,YAAmBC,EAAc,CAC/B,QAAQ,IAAI,eAAgBA,CAAI,EAEhC,MAAA,EAHiB,KAAA,KAAAA,CAInB,CAOO,KAAmB,CAAA,EAInB,aAAe,IAOf,QAAQhB,EAAcc,EAAkC,CAEzDA,GAAS,KAAK,KAAKd,CAAG,IACxB,KAAK,KAAKA,CAAG,EAAIc,EAGjB,KAAK,cAAc,IAAIF,EAAU,OAAOZ,CAAG,EAAGc,CAAK,CAAC,EAExD,CAQO,UAAUd,EAAciB,EAAmD,CAEhF,MAAMC,EAAW,CAAC,CAAE,MAAAL,EAAO,MAAAC,KAAiB,CAC1CG,EAAUH,CAAK,CACjB,EAEA,YAAK,iBAAiB,OAAOd,CAAG,EAAGkB,CAAQ,EAGvClB,KAAO,KAAK,QAAgB,KAAK,KAAKA,CAAG,CAAC,EAEvC,KAAO,KAAK,oBAAoB,OAAOA,CAAG,EAAGkB,CAAQ,EAAG,OACjE,CAEF,CAOO,MAAMC,EAAatB,EAASmB,GAAiB,IAAID,EAAaC,CAAI,CAAC,EAY7DI,EAAiB,CAAIJ,EAAe,WAEnCK,EAAAA,QAAQ,IAAMF,EAAWH,CAAI,EAAG,CAACA,CAAI,CAAC,EAW9CM,EAAqB,CAACC,KAAkCC,IAAoB,CAEhF,MAAMC,EAAQ,IAAI,MAAM,mCAAqC,KAAK,UAAU,CAAE,MAAAD,EAAO,IAAKD,GAAK,MAAQ,WAAA,CAAa,CAAC,EAErHG,EAAAA,UACE,IAAM,CACJ,GAAIH,EACF,OAAIC,EAAM,KAAKR,GAAQO,EAAI,SAAS,IAAIP,CAAI,CAAC,GAC3C,QAAQ,MAAMS,CAAK,EAErBD,EAAM,QAAQpB,GAAKmB,EAAI,SAAS,IAAInB,CAAC,CAAC,EAG/B,IAAM,CAGXoB,EAAM,QAAQpB,GAAKmB,EAAI,SAAS,OAAOnB,CAAC,CAAC,CAC3C,CAEJ,EACA,CAACmB,EAAKC,EAAM,MAAM,CAAA,CAGtB,EAQaG,EAAgB,CAAuBJ,EAA6BvB,EAAQc,IAA4B,CAEnHY,EAAAA,UAAU,IAAM,CACVH,GAAOA,EAAI,KAAKvB,CAAG,GAAKc,GAE1BS,EAAI,QAAQvB,EAAKc,CAAK,CAE1B,EAAG,CAACd,EAAKc,EAAOS,CAAG,CAAC,EAEpBD,EAAmBC,EAAKvB,CAAU,CACpC,EASa4B,EAAmB,CAAuBL,EAA6BvB,EAAQ6B,EAAe,IAAwB,CAEjI,KAAM,CAAC,CAAE,MAAAf,GAASgB,CAAQ,EAAIC,EAAAA,SAAS,KAAO,CAAE,MAAOR,GAAK,OAAOvB,CAAG,GAAI,EAE1E0B,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIH,EAAK,CACP,IAAIS,EAAWH,GAAgB,EAC1Bf,GAAegB,EAAS,CAAE,MAAAhB,CAAAA,CAAc,EACzCvB,EAAUuB,GAAegB,EAAS,CAAE,MAAAhB,CAAAA,CAAc,EAAGe,CAAY,EACjEI,EAAQV,EAAI,UAAUvB,EAAKgC,CAAQ,EACvC,OAAAlB,GAASS,EAAI,KAAKvB,CAAG,GAAK8B,EAAS,CAAE,MAAOP,EAAI,KAAKvB,CAAG,CAAA,CAAG,EACpD,IAAM,CACXiC,EAAA,CACF,CACF,CACF,EAAG,CAACjC,EAAKuB,CAAG,CAAC,EAENA,GAAK,KAAKvB,CAAG,CACtB,EASakC,EAAgC,CAA0BX,EAA6BvB,EAAQmC,IAA6C,CACvJ,KAAM,EAAGL,CAAQ,EAAIC,EAAAA,SAAS,CAAC,EACzB9B,EAASoB,EAAAA,QACb,IAAMc,EAAUZ,GAAK,KAAKvB,CAAG,CAAC,EAC9B,CAACmC,EAAWZ,GAAK,KAAKvB,CAAG,CAAC,CAAA,EAG5B0B,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIH,EAAK,CACP,IAAIa,EAAWnC,EACX+B,EAAW,IAAM,CACnB,IAAIK,EAAWF,EAAUZ,EAAI,KAAKvB,CAAG,CAAC,EAClCqC,GAAYD,IACdA,EAAWC,EACXP,EAAS1B,GAAKA,EAAI,CAAC,EAEvB,EACI6B,EAAQV,EAAI,UAAUvB,EAAKgC,CAAQ,EACvC,OAAAA,EAAA,EACO,IAAMC,EAAA,CACf,CACF,EAAG,CAACjC,EAAKuB,CAAG,CAAC,EAENtB,CACT,EAOaqC,EAAwB,CACnCf,KACGgB,IACA,CAEHb,EAAAA,UAAU,IAAM,CACd,GAAIH,EACF,OAAS,CAACvB,EAAKc,CAAK,IAAKyB,EACvBhB,EAAI,KAAKvB,CAAG,GAAKc,GAASS,EAAI,QAAQvB,EAAKc,CAAK,CAGtD,EAAG,CAACS,EAAKpB,EAAaoC,EAAQ,KAAA,CAAM,CAAC,CAAC,EAEtCjB,EAAmBC,EAAK,GAAGgB,EAAQ,OAASnC,EAAE,CAAC,CAAC,CAAQ,CAE1D,EAQaoC,EAA2B,CACtCjB,KACGkB,IACY,CACf,KAAM,EAAGC,CAAU,EAAIX,EAAAA,SAAS,CAAC,EAE3BY,EAAeF,EAAK,OAAWlB,GAAK,OAAOvB,CAAG,CAAC,EAErD0B,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIH,EAAK,CACP,IAAIqB,EAAaD,EACjB,MAAMX,EAAWzC,EAAS,IAAM,CAC9B,IAAIgB,EAAgBkC,EAAK,OAAWlB,GAAK,OAAOvB,CAAG,CAAC,EAChDyC,EAAK,KAAK,CAACzC,EAAKW,IAAMiC,EAAWjC,CAAC,GAAKJ,EAAcI,CAAC,CAAC,IAEzDiC,EAAarC,EACbmC,EAAWG,GAAKA,EAAI,CAAC,EAEzB,EAAG,CAAC,EAEJ,IAAIC,EAAUL,EAAK,IAAIzC,GAAOuB,EAAI,UAAUvB,EAAKgC,CAAQ,CAAC,EAEtDe,EAAY,WAAWf,EAAU,CAAC,EAEtC,MAAO,IAAM,CACX,aAAae,CAAS,EACtBf,EAAS,OAAA,EACTc,EAAQ,QAAQb,GAASA,EAAA,CAAO,CAClC,CAEF,CACF,EAAG,CAACV,EAAK,GAAGkB,CAAI,CAAC,EAGV,OACJ,YAAYA,EAAK,IAAI,CAACzC,EAAKgD,IAAU,CAAChD,EAAK2C,EAAaK,CAAK,CAAC,CAAC,CAAC,CACrE,EASaC,EAAuC,CAClD1B,EACAM,EAAe,MACZY,IACyC,CAE5C,KAAM,EAAGC,CAAU,EAAIX,EAAAA,SAAS,CAAC,EAE3BY,EAAeF,EAAK,OAAWlB,GAAK,OAAOvB,CAAG,CAAC,EAErD0B,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIH,EAAK,CACP,IAAIqB,EAAaD,EACjB,MAAMX,EAAWzC,EAAS,IAAM,CAC9B,IAAIgB,EAAgBkC,EAAK,OAAWlB,GAAK,OAAOvB,CAAG,CAAC,EAChDyC,EAAK,KAAK,CAACzC,EAAKW,IAAMiC,EAAWjC,CAAC,GAAKJ,EAAcI,CAAC,CAAC,IACzDiC,EAAarC,EACbmC,EAAWG,GAAKA,EAAI,CAAC,EAEzB,EAAGhB,CAAY,EAEf,IAAIiB,EAAUL,EAAK,IAAIzC,GAAOuB,EAAI,UAAUvB,EAAKgC,CAAQ,CAAC,EAEtDe,EAAY,WAAWf,EAAU,CAAC,EAEtC,MAAO,IAAM,CACX,aAAae,CAAS,EACtBf,EAAS,OAAA,EACTc,EAAQ,QAAQb,GAASA,EAAA,CAAO,CAClC,CAEF,CACF,EAAG,CAACV,EAAK,GAAGkB,CAAI,CAAC,EAEVE,CACT,EC7RaO,EAAgB,CAAqClC,EAAcmC,IAAuB,CAErG,MAAMC,EAAkBhD,GAAS,CAC/BY,EACA,GAAG,OACA,QAAQZ,GAAK,CAAA,CAAE,EACf,KAAK,CAACA,EAAGM,IAAMN,EAAE,CAAC,EAAE,cAAcM,EAAE,CAAC,CAAC,CAAC,EACvC,KAAA,CAAK,EACR,KAAK,GAAG,EAEV,IAAI2C,MAAsB,IAG1B,MAAMC,EAA0BlD,GAAS,CACvC,MAAMmD,EAAQJ,EAAM/C,CAAC,EACfoD,EAAUJ,EAAehD,CAAC,EAC1BmB,EAAMH,EAAkBoC,CAAO,EAC/B/B,EAAQJ,EAAAA,QAAQ,IAAM,IAAI,QAAQ,MAAO,EAAE,EAEjD,OAAAiB,EACEf,EACA,GAAG,OAAO,QAAQgC,CAAK,CAAA,EAGzB7B,EAAAA,UAAU,IAAM,CACd,GAAI2B,EAAgB,IAAIG,CAAO,EAAG,CAChC,MAAMC,EAAM,IAAI,MAAM,eAAiBD,EAAU,6BAA6B,EAC9E,MAAAC,EAAI,MAAQhC,EACNgC,CACR,CACA,OAAAJ,EAAgB,IAAIG,CAAO,EACpB,IAAM,CAAEH,EAAgB,OAAOG,CAAO,CAAE,CACjD,CAAC,EAEME,EAAAA,IAAAC,EAAAA,SAAA,EAAE,CACX,EAEA,OAAAL,EAAU,YAAc,SAASH,GAAO,MAAM,IAAI,IAE3C,CACL,eAAAC,EACA,KAAME,EAKN,kBAAoBlD,GAAqB,CACvC,MAAMoD,EAAUJ,EAAehD,CAAC,EAE1BqB,EAAQJ,EAAAA,QAAQ,IAAM,IAAI,QAAQ,MAAO,EAAE,EAEjDK,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC2B,EAAgB,IAAIG,CAAO,EAAG,CACjC,MAAMC,EAAM,IAAI,MAAM,gBAAkBD,EAAU,kBAAkB,EACpE,MAAAC,EAAI,MAAQhC,EACNgC,CACR,CACF,EAAG,CAACD,CAAO,CAAC,EAELpC,EAAkBoC,CAAO,CAClC,EAKA,YAAcpD,GAAqB,CACjC,MAAMoD,EAAUJ,EAAehD,CAAC,EAE1BqB,EAAQJ,EAAAA,QAAQ,IAAM,IAAI,QAAQ,MAAO,EAAE,EAEjDK,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC2B,EAAgB,IAAIG,CAAO,EAAG,CACjC,MAAMC,EAAM,IAAI,MAAM,gBAAkBD,EAAU,kBAAkB,EACpEC,EAAI,MAAQhC,EACZ,IAAI/B,EAAU,WAAW,IAAM,QAAQ,MAAM+D,CAAG,EAAG,GAAI,EACvD,MAAO,IAAM,aAAa/D,CAAO,CACnC,CACF,EAAG,CAAC2D,EAAgB,IAAIG,CAAO,CAAC,CAAC,EAE1BpC,EAAkBoC,CAAO,CAClC,CAAA,CAEJ,EC3GMI,EAAe,UAAY,CAC/B,MAAMC,MAAc,QAEpB,OAAQ,GAAmB,CACzB,IAAI5D,EAAS4D,EAAQ,IAAI,CAAC,EAC1B,OAAK5D,GACH4D,EAAQ,IAAI,EAAG5D,GAAU,GAAG,MAAQ,IAAM,KAAK,OAAA,EAAS,SAAA,CAAU,EAE7DA,CACT,CACF,EAAA,EAGM6D,EAAe1D,GAAW,CAC9B,GAAG,OACA,QAAQA,GAAK,CAAA,CAAE,EACf,KAAK,CAACA,EAAGM,IAAMN,EAAE,CAAC,EAAE,cAAcM,EAAE,CAAC,CAAC,CAAC,EACvC,KAAA,CACL,EAAE,KAAK,GAAG,EA0BGqD,EAAc,CAAC,CAAE,QAAAC,EAAUL,EAAAA,YAAe,CAErD,MAAMpC,EAAMH,EAAoB,UAAU,EAGpC,CAACmC,EAAOzB,CAAQ,EAAIC,EAAAA,SAA8G,CAAA,CAAE,EAGpIkC,EAAgBC,EAAAA,YACpB,CAACC,EAAWC,IAAgB,CAC1B,MAAMC,EAAWT,EAAYO,CAAI,EAC3BnE,EAAM8D,EAAYM,CAAM,EAE9B,OAAAtC,EAAS,CAAC,CACR,CAACuC,GAAW,CACV,UAAAC,EAAYH,EACZ,SAAU,CACR,CAACnE,GAAMuE,EAAW,CAAE,OAAAH,EAAQ,QAAS,CAAA,EACrC,GAAGI,CAAA,EACD,CAAA,CAAC,EACH,CAAA,EACJ,GAAGjB,CAAA,KACE,CACL,GAAGA,EACH,CAACc,CAAQ,EAAG,CACV,UAAAC,EACA,SAAU,CACR,GAAGE,EACH,CAACxE,CAAG,EAAG,CACL,GAAGuE,EACH,QAASA,EAAS,QAAU,CAAA,CAC9B,CACF,CACF,EACA,EAEK,IAAMzC,EAAS,CAAC,CACrB,CAACuC,GAAW,CACV,UAAAC,EAAYH,EACZ,SAAU,CACR,CAACnE,GAAMuE,EAAW,CAAE,OAAAH,EAAQ,QAAS,CAAA,EACrC,GAAGI,CAAA,EACD,CAAA,CAAC,EACH,CAAA,EACJ,GAAGjB,CAAA,KACE,CACL,GAAGA,EACH,CAACc,CAAQ,EAAG,CACV,UAAAC,EACA,SAAU,CACR,GAAGE,EACH,GAAGD,EAAS,QAAU,EAAI,CACxB,CAACvE,CAAG,EAAG,CACL,GAAGuE,EACH,QAASA,EAAS,QAAU,CAAA,CAC9B,EACE,CAAA,CAAC,CACP,CACF,EACA,CAEJ,EACA,CAAA,CAAC,EAGH,OAAAjC,EAAsBf,EACpB,CAAC,YAAa0C,CAAa,EAC3B,CAAC,QAASV,CAAK,CAAA,EAIVG,EAAAA,IAAAC,EAAAA,SAAA,CACJ,SAAA,OAAO,QAAQJ,CAAK,EAClB,QAAQ,CAAC,CAACkB,EAAI,CAAE,UAAAH,EAAW,SAAAE,EAAU,IAAM,OACzC,QAAQA,CAAQ,EAChB,IAAI,CAAC,CAACE,EAAI,CAAE,QAAAC,EAAS,OAAAP,CAAA,CAAQ,KAAO,CAAE,IAAKK,EAAKC,EAAI,UAAAJ,EAAW,OAAAF,EAAQ,QAAAO,CAAA,EAAU,EACjF,OAAOvE,GAAKA,EAAE,QAAU,CAAC,EACzB,IAAI,CAAC,CAAE,IAAAJ,EAAK,OAAAoE,EAAQ,UAAAE,CAAAA,IAAgBZ,MAACM,EAAA,CACpC,SAAAN,EAAAA,IAACY,EAAA,CAAW,GAAGF,CAAA,CAAQ,CAAA,EAD0BpE,CAEnD,CAAU,CAAA,EAGhB,CAEF,EA0Ba4E,EAAgB,CAC3B,CAAE,KAAAC,EAAM,YAAAC,EAAa,kBAAAC,EAAmB,eAAA3B,CAAA,EACxC4B,EAAc,KAGP,CAEL,YAAc5E,GAAqB,CAEjC,MAAMoD,EAAUJ,EAAehD,CAAC,EAE1B6E,EAAYrD,EAAiBR,EAAoB,UAAU,EAAG,WAAW,EAE/EM,OAAAA,EAAAA,UAAU,IAAM,CAGd,GAAIsD,GAAe,EACjB,OAAOC,IAAYJ,EAAMzE,CAAC,EACrB,CACL,IAAI6B,EAAQgD,IAAYJ,EAAMzE,CAAC,EAC/B,MAAO,IAAM,WAAW6B,EAAO+C,CAAW,CAC5C,CACF,EAAG,CAACC,EAAWzB,CAAO,CAAC,EAEhBpC,EAAkBoC,CAAO,CAClC,CAAA,GCrKS0B,EACX3D,GAGK,CAEL,KAAM,EAAGmB,CAAU,EAAIX,EAAAA,SAAS,CAAC,EAE3B,CAAE,MAAAoD,EAAO,YAAAC,EAAa,WAAAC,EAAY,MAAAC,GAAUjE,EAAAA,QAChD,IAAM,CAEJ,MAAMkE,MAAc,IACdC,EAA0D,CAAA,EAC1DC,MAAe,IAEfN,EAAQ,IAAI,MAChB5D,GAAK,KACL,CACE,IAAImE,EAAQC,EAAG,CACb,GAAIC,EACF,OAAAL,EAAQ,IAAII,CAAY,EACjBH,EAAgBG,CAAY,EAAID,EAAOC,CAAC,EAE/C,MAAM,IAAI,MAAM,gBAAgB,CAEpC,CAAA,CACF,EAGF,IAAIC,EAAe,GAGfC,EAAWtG,EAAS,IAAM,CACxB,CAAC,GAAGgG,EAAQ,OAAA,CAAQ,EACrB,KAAKO,GAAKN,EAAgBM,CAAC,GAAKvE,GAAK,OAAOuE,CAAC,CAAC,GAC/CpD,EAAWG,GAAKA,EAAI,CAAC,CAEzB,EAAG,CAAC,EAEAwC,EAAa,IAAM,CACrBO,EAAe,GACfL,EAAQ,MAAA,CACV,EAEIH,EAAc,IAAM,CACtBQ,EAAe,GAEf,CAAC,GAAGL,EAAQ,OAAA,CAAQ,EACjB,OAAOO,GAAK,CAACL,EAAS,IAAIK,CAAC,CAAC,EAC5B,QAAQA,GAAK,CACZL,EAAS,IAAIK,EAAGvE,GAAK,UAAUuE,EAAGD,CAAQ,CAAC,CAC7C,CAAC,EAEH,CAAC,GAAGJ,EAAS,KAAA,CAAM,EAChB,OAAOK,GAAK,CAACP,EAAQ,IAAIO,CAAC,CAAC,EAC3B,QAAQA,GAAK,CACAL,EAAS,IAAIK,CAAC,IAC1B,EACAL,EAAS,OAAOK,CAAC,CACnB,CAAC,CAEL,EAQA,MAAO,CAAE,MAAAX,EAAO,YAAAC,EAAa,WAAAC,EAAY,MAN7B,IAAM,CAChBA,EAAAA,EACAD,EAAAA,EACA1C,EAAWG,GAAKA,EAAI,CAAC,CACvB,CAEyCyC,CAC3C,EACA,CAAC/D,CAAG,CAAA,EAGN,OAAA8D,EAAA,EAEA,WAAWD,EAAa,CAAC,EAEzB1D,EAAAA,UACE,IAAM,IAAM4D,EAAA,EACZ,CAACA,CAAK,CAAA,EAGDH,CAGT,ECzGMrF,EAAQqB,EAAW,MAEZ4E,EAAe,CAAC,CAAA,IAAQ,CACjC,KAAM,CAACC,EAAaC,CAAM,EAAIlE,EAAAA,SAAS,EAAE,EACzC,OAAOmE,EAAAA,KAAC,MAAA,CAAI,UAAU,aAClB,SAAA,CAAAxC,EAAAA,IAAC,MAAA,CAAI,UAAU,aACV,SAAA,CAAC,GAAG5D,EAAM,KAAA,CAAM,EACZ,IAAIM,GAAK,KAAK,MAAMA,CAAC,IAAI,CAAC,CAAC,EAC3B,UAAYA,GAAK,UAAU,EAC3B,IAAIA,GAAKsD,EAAAA,IAAC,MAAA,CACP,UAAU,YACV,cAAatD,GAAK4F,EAClB,QAAS,IAAMC,EAAO7F,CAAC,EAAI,SAAAA,CAAA,CAAA,CACzB,EACd,EACAsD,EAAAA,IAAC,OAAI,UAAU,aACX,eAACyC,EAAA,CAAU,QAASH,CAAA,EAAkBA,CAAa,CAAA,CACvD,CAAA,EACJ,CACJ,EAEaG,EAA2C,CAAC,CAAE,QAAAC,KAAc,CACrE,MAAM7E,EAAMJ,EAAWiF,CAAO,EACxB,CAACC,EAAaC,CAAc,EAAIvE,EAAAA,SAAS,CAAE,GAAGR,GAAK,KAAM,EAE/DG,OAAAA,EAAAA,UAAU,IAAM,CACZ,IAAI6E,EAAa,CAAE,GAAGF,CAAA,EAClBG,EAAW,YAAY,IAAM,CAE7B,IAAI/F,EAAS,GAEb,QAASE,KAAKY,GAAK,KACXA,GAAK,OAAOZ,CAAC,GAAK4F,EAAW5F,CAAC,IAC9B4F,EAAW5F,CAAC,EAAIY,GAAK,OAAOZ,CAAC,EAC7BF,EAAS,IAGbA,GAAQ6F,EAAe,CAAE,GAAGC,EAAY,CAChD,EAAG,GAAG,EAEN,MAAO,IAAM,cAAcC,CAAQ,CACvC,EAAG,CAACjF,CAAG,CAAC,EAEDmC,EAAAA,IAAC+C,EAAA,CACJ,MAAOJ,EACP,KAAK,OACL,YAAa,EACb,MAAO,CAAE,OAAQ,QAAS,SAAU,OAAQ,OAAQ,UAAA,CAAW,CAAA,CAEvE,EAeMK,EAAa,CAAKC,EAAYC,EAAM,KAC/B,OAAO,YACV,IAAI,MAAM,KAAK,MAAMD,EAAM,OAAS,GAAKC,CAAG,CAAC,EACxC,KAAK,CAAC,EACN,IAAI,CAACC,EAAGlG,EAAG,IAAM,IAAI,MAAMA,GAAK,EAAE,OAAS,EAAIgG,EAAM,OAASC,EAAMA,CAAG,EACnE,KAAK,CAAC,EACN,IAAI,CAACC,EAAGC,IAAMnG,EAAIiG,EAAME,CAAC,CAAA,EAE7B,OAAO1G,GAAKA,EAAE,MAAM,EACpB,OAAY,CAAC,GAAGqC,EAAK,GAAG,CAAC,CAAC,KAAKA,EAAK,GAAG,EAAE,CAAC,GAAI,OAAO,YAClDA,EAAK,IAAIqD,GAAK,CAACA,EAAGa,EAAMb,CAAC,CAAC,CAAC,CAAA,CAC9B,CAAC,CAAA,EAKRiB,EAAc,CAACC,EAAaJ,EAAM,KAAO,CAC3C,MAAMnE,EAAO,OAAO,KAAKuE,CAAM,EAC/B,OAAO,OAAO,YACV,MAAM,KAAK,MAAMvE,EAAK,OAAS,GAAKmE,CAAG,CAAC,EACnC,KAAK,CAAC,EACN,IAAI,CAACC,EAAGlG,EAAGsG,IAAM,IAAI,MAAMtG,GAAKsG,EAAE,OAAS,EAAIxE,EAAK,OAASmE,EAAMA,CAAG,EAClE,KAAK,CAAC,EACN,IAAI,CAACC,EAAGC,IAAMnG,EAAIiG,EAAME,CAAC,CAAA,EAE7B,OAAO1G,GAAKA,EAAE,MAAM,EACpB,IAAKA,GAAMA,EAAE,IAAIO,GAAK8B,EAAK,GAAG9B,CAAC,CAAC,CAAC,EACjC,IAAIuG,GAAc,CACf,GAAGA,EAAW,GAAG,CAAC,GAAG,MAAM,EAAG,EAAE,CAAC,MAAMA,EAAW,GAAG,EAAE,GAAG,MAAM,EAAG,EAAE,CAAC,GACtE,OAAO,YAAYA,EAAW,IAAIlH,GAAO,CAACA,EAAKgH,EAAOhH,CAAU,CAAC,CAAC,CAAC,CAAA,CAAC,CACxE,CAEZ,EAGMmH,EAAiB,CAAC,CAAE,KAAAC,EAAM,YAAAC,EAAa,WAAAC,EAAY,cAAAC,KAAmC,CACxF,MAAMC,EAAaJ,GAAM,KAAK,GAAG,GAAK,GAEhCK,EAAgB,OAAOJ,GAAe,UACtCA,EACC,OAAOA,GAAe,UAAYA,EAAc,EAEjDK,EAAWrG,EAAAA,QACb,IAAMiG,IAAaE,CAAU,GAAKC,EAClC,CAACH,IAAaE,CAAU,EAAGA,CAAU,CAAA,EAGnCG,EAAYzD,EAAAA,YACbpD,GAAmByG,EAAeK,IAAe,CAAE,GAAGA,EAAG,CAACJ,CAAU,EAAG1G,CAAA,EAAQ,EAChF,CAACwG,EAAYE,CAAU,CAAA,EAG3B,MAAO,CAAE,SAAAE,EAAU,UAAAC,CAAA,CAEvB,EAEME,EAAqG,CAAC,CAAE,MAAA/G,EAAO,YAAAgH,EAAc,GAAO,GAAGC,KAAW,CAEpJ,MAAMC,EAAM1H,EAAAA,OAAoB,MAAS,EACnC2H,EAAW3H,EAAAA,OAAOQ,CAAK,EAE7BY,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAIsG,EAAI,UACSF,GAAehH,GAASmH,EAAS,QAEtC,OAAO,KAAKnH,CAAK,EAAE,QAAU,OAAO,KAAKmH,EAAS,OAAO,EAAE,QACxD,OAAO,KAAKnH,CAAK,EAAE,QAAYA,EAAMd,CAAG,GAAKiI,EAAS,QAAQjI,CAAG,CAAC,EACrEc,GAASmH,EAAS,SACd,CACRA,EAAS,QAAUnH,EACnBkH,EAAI,QAAQ,UAAU,IAAI,YAAY,EACtC,IAAIE,EAAI,sBAAsB,IAAMF,EAAI,SAAS,UAAU,OAAO,YAAY,CAAC,EAC/E,MAAO,IAAM,qBAAqBE,CAAC,CACvC,CAGR,EAAG,CAACpH,EAAOgH,EAAaE,CAAG,CAAC,EAErBtE,EAAAA,IAAC,MAAA,CAAM,GAAGqE,EAAM,IAAAC,CAAA,CAAiB,CAC5C,EAEMG,EAAwCC,GAAU,CAEpD,KAAM,CACF,aAAAC,EACA,MAAAvH,EAAO,KAAAsG,EAAO,CAAA,EAAI,KAAApG,EAAM,WAAAsG,EAAY,cAAAC,EACpC,YAAAF,EACA,UAAAiB,CAAA,EACAF,EAEEG,EAAUzH,aAAiB,MAE3B,CAAE,SAAA4G,EAAU,UAAAC,GAAcR,EAAeiB,CAAK,EAE9CI,EAAmB,OAAOnB,GAAe,SAAWA,EAAc,EAAIA,EAEtEoB,EAAc,OAAO,QAAQ3H,CAAK,EAAE,OAAS,GAE7C4H,EAAgBrH,EAAAA,QAClB,IAAMoH,EACC3H,aAAiB,MAAS4F,EAAW5F,EAAO,EAAE,EAAIiG,EAAYjG,EAAO,EAAE,EACxEA,EACN,CAACA,EAAO2H,EAAa/B,CAAU,CAAA,EAGnC,OAAQgB,EAAYxB,OAAC2B,EAAA,CAAoB,UAAU,wBAAwB,MAAA/G,EAAc,YAAawH,EACjG,SAAA,CAAAD,GAAgB3E,EAAAA,IAAC,OACd,SAAAwC,EAAAA,KAAC,MAAA,CAAI,QAAS,IAAMyB,EAAU,EAAK,EAC/B,SAAA,CAAAjE,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAA2E,EAAa,EACxC3E,EAAAA,IAAC,QAAK,SAAA,GAAA,CAAC,EACPA,EAAAA,IAAC,QAAK,SAAA,KAAA,CAAG,EACTwC,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAW,SAAA,CAAA,OAAO,KAAKpF,CAAK,EAAE,OAAO,SAAA,EAAO,SAC3D,OAAA,CAAK,SAAA,CAAA,IAAEyH,EAAU,IAAM,IAAI,GAAA,CAAA,CAAC,CAAA,CAAA,CACjC,CAAA,CACJ,EACA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,WACV,gBACI,QAAQgF,CAAa,EACrB,IAAI,CAAC,CAAC5C,EAAG6C,CAAC,EAAG3F,KAAU4F,EAAAA,cAACC,EAAA,CAEjB,KAAA7H,EAAM,WAAAsG,EAAY,cAAAC,EAClB,YAAaiB,EACb,MAAOG,EACP,UAAWF,EAEf,IAAK,CAAC,GAAGrB,EAAMqB,EAAczF,GAAQ8C,CAAC,EAAE,KAAK,GAAG,EAChD,KAAM,CAAC,GAAGsB,EAAMtB,CAAC,CAAA,CAAA,CACnB,EACV,EACCuC,GAAgB3E,EAAAA,IAAC,MAAA,CACd,SAAAwC,OAAC,OAAA,CAAK,SAAA,CAAA,IAAEqC,EAAU,IAAM,IAAI,GAAA,CAAA,CAAC,CAAA,CACjC,CAAA,EACJ,EAAyB7E,MAACmE,EAAA,CAAoB,UAAU,wBAAwB,MAAA/G,EAAc,YAAawH,EACvG,SAAA5E,EAAAA,IAAC,MAAA,CACG,gBAAC,MAAA,CAAI,QAAS,IAAMiE,EAAU,EAAI,EAC9B,SAAA,CAAAjE,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAA2E,EAAa,EACvCA,GAAgB3E,EAAAA,IAAC,OAAA,CAAK,SAAA,GAAA,CAAC,EACvB2E,GAAgB3E,EAAAA,IAAC,OAAA,CAAK,SAAA,KAAA,CAAG,EAC1BwC,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAW,SAAA,CAAA,OAAO,KAAKpF,CAAK,EAAE,OAAO,SAAA,EAAO,SAC3D,OAAA,CAAK,SAAA,CAAA,IAAEyH,EAAU,IAAM,IAAI,GAAA,EAAC,EAC7B7E,EAAAA,IAAC,QAAK,SAAA,OAAA,CAAK,SACV,OAAA,CAAK,SAAA,CAAA,IAAE6E,EAAU,IAAM,IAAI,GAAA,CAAA,CAAC,CAAA,CAAA,CACjC,EACJ,EACJ,CAEJ,EAEMO,EAA0CV,GAAU,CAEtD,KAAM,CAAE,YAAAW,EAAa,aAAAV,EAAc,MAAAvH,CAAA,EAAWsH,EAExC,CAAE,SAAAV,EAAU,UAAAC,GAAcR,EAAeiB,CAAK,EAE9CY,EAAY,OAAOlI,CAAK,EAAE,OAAS,GAEnCmI,EAAeD,GAAa,CAACtB,EAC7B,GAAG,OAAO5G,CAAK,EAAE,MAAM,EAAG,EAAE,CAAC,MAAM,OAAOA,CAAK,EAAE,MAAM,IAAK,EAAE,CAAC,GAC/D,OAAOA,CAAK,EAElB,OAAOoF,EAAAA,KAAC2B,EAAA,CACJ,MAAOO,EAAM,MACb,UAAW,qBAAqBW,CAAW,IAAIC,EAAY,YAAc,EAAE,GAC3E,QAAS,IAAMrB,EAAU,CAACD,CAAQ,EAClC,SAAA,CAAAhE,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAA2E,EAAa,EACxC3E,EAAAA,IAAC,QAAK,SAAA,GAAA,CAAC,EACPwC,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAW,SAAA,CAAA6C,EAAY,SAAOjI,GAAO,MAAA,EAAO,EAC5DoF,EAAAA,KAAC,OAAA,CAAK,UAAU,WAAW,SAAA,CAAA,IAAE+C,EAAa,GAAA,EAAC,EAC3CvF,EAAAA,IAAC,QAAK,SAAA,GAAA,CAAC,CAAA,CAAA,CAAA,CAEf,EAGMwF,EAA4Cd,GAAU,CAExD,KAAM,CAAE,YAAAW,EAAa,aAAAV,EAAc,MAAAvH,CAAA,EAAWsH,EAExC,CAAE,SAAAV,EAAU,UAAAC,GAAcR,EAAeiB,CAAK,EAE9CY,EAAY,OAAOlI,CAAK,EAAE,OAAS,GAEnCmI,EAAeD,GAAa,CAACtB,EAC7B,GAAG,OAAO5G,CAAK,EAAE,MAAM,EAAG,EAAE,CAAC,MAAM,OAAOA,CAAK,EAAE,MAAM,IAAK,EAAE,CAAC,GAC/D,OAAOA,CAAK,EAElB,OAAOoF,EAAAA,KAAC2B,EAAA,CACJ,MAAOO,EAAM,MACb,UAAW,qBAAqBW,CAAW,IAAIC,EAAY,YAAc,EAAE,GAC3E,QAAS,IAAMrB,EAAU,CAACD,CAAQ,EAClC,SAAA,CAAAhE,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAA2E,EAAa,EACxC3E,EAAAA,IAAC,QAAK,SAAA,GAAA,CAAC,EACPA,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAAqF,EAAY,EACvC7C,EAAAA,KAAC,OAAA,CAAK,UAAU,WAAW,SAAA,CAAA,IAAE+C,EAAa,GAAA,EAAC,EAC3CvF,EAAAA,IAAC,QAAK,SAAA,GAAA,CAAC,CAAA,CAAA,CAAA,CAEf,EAEMyF,EAA6Cf,GAAU,CAEzD,KAAM,CAAE,YAAAW,EAAa,aAAAV,EAAc,MAAAvH,CAAA,EAAWsH,EAE9C,OAAOlC,EAAAA,KAAC2B,EAAA,CACJ,MAAOO,EAAM,MACb,UAAW,qBAAqBW,CAAW,GAC3C,SAAA,CAAArF,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAA2E,EAAa,EACxC3E,EAAAA,IAAC,QAAK,SAAA,GAAA,CAAC,EACPA,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAAqF,EAAY,QACtC,OAAA,CAAK,UAAU,WAAY,SAAA,OAAOjI,CAAK,EAAE,EAC1C4C,EAAAA,IAAC,QAAK,SAAA,GAAA,CAAC,CAAA,CAAA,CAAA,CAEf,EAEMmF,EAA+DT,GAAU,CAE3E,KAAM,CAAE,MAAAtH,EAAO,KAAAsG,EAAO,CAAA,EAAI,KAAApG,GAASoH,EAE7BC,EAAejB,EAAK,GAAG,EAAE,GAAKpG,GAAQ,OAEtC+H,EAAc,OAAOjI,EAE3B,OAAQiI,EAAA,CACJ,IAAK,SACD,OAAOrF,EAAAA,IAACyE,GAAa,GAAGC,EAAa,aAAAC,EAAc,YAAAU,EAAe,EACtE,IAAK,SACD,OAAOrF,EAAAA,IAACoF,GAAe,GAAGV,EAAa,aAAAC,EAAc,YAAAU,EAAe,EACxE,IAAK,WACD,OAAOrF,EAAAA,IAACwF,GAAiB,GAAGd,EAAa,aAAAC,EAAc,YAAAU,EAAe,EAC1E,IAAK,SACL,IAAK,UACL,IAAK,SACL,IAAK,SACL,IAAK,YACL,QACI,OAAOrF,EAAAA,IAACyF,GAAmB,GAAGf,EAAa,aAAAC,EAAc,YAAAU,EAAe,CAAA,CAEpF,EAEatC,EAAiG,CAAC,CAAE,MAAA3F,EAAO,KAAAE,EAAM,MAAAoI,EAAO,YAAA/B,EAAc,MAAY,CAE3J,KAAM,CAACC,EAAYC,CAAa,EAAIxF,EAAAA,SAAkC,CAAA,CAAE,EAExE,OAAO2B,EAAAA,IAAC,MAAA,CAAI,UAAU,UAAU,MAAA0F,EAC5B,SAAA1F,EAAAA,IAACmF,EAAA,CACG,KAAM,CAAA,EACA,KAAA7H,EAAM,MAAAF,EAAO,WAAAwG,EAAY,cAAAC,EAAe,YAAAF,CAAY,CAAA,EAElE,CACJ,ECtTagC,GAAmB,CAAC,CAAE,aAAAC,EAAe,MAAO,GAAGlB,KAAY,CACpE,KAAM,CAACmB,EAAQC,CAAS,EAAIzH,EAAAA,SAAS,EAAK,EAC1C,OAAOmE,EAAAA,KAAAvC,WAAA,CACH,SAAA,CAAAD,EAAAA,IAAC,SAAA,CAAO,UAAU,sBAAsB,cAAa6F,EAAQ,QAAS,IAAMC,EAAU,EAAI,EAAI,GAAGpB,EAC5F,SAAAA,GAAO,UAAY,kBACxB,EACAlC,EAAAA,KAAC,MAAA,CAAI,UAAU,4BAA4B,cAAaqD,EACpD,SAAA,CAAA7F,EAAAA,IAAC,SAAA,CAAO,UAAU,YAAY,QAAS,IAAM8F,EAAU,EAAK,EAAG,SAAA,KAAA,CAE/D,QACCzD,EAAA,CAAA,CAAa,CAAA,CAAA,CAClB,CAAA,EACJ,CACJ"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/state-utils/utils.ts","../src/state-utils/useArrayHash.ts","../src/state-utils/ctx.ts","../src/state-utils/createRootCtx.tsx","../src/state-utils/createAutoCtx.tsx","../src/state-utils/useQuickSubscribe.ts","../src/DevToolState.tsx","../src/DevTool.tsx"],"sourcesContent":["// Debounce function\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) & { cancel: any } {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n let fn: Function & { cancel: any } = function (...args: Parameters<T>): void {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n } as any;\n\n fn.cancel = () => clearTimeout(timeout!);\n\n return fn as any;\n}\n\n// Memoize function\nexport function memoize<T extends (...args: any[]) => any>(\n func: T\n): ((...args: Parameters<T>) => ReturnType<T>) & { cache: Map<string, ReturnType<T>> } {\n \n const cache = new Map<string, ReturnType<T>>();\n\n const cachedFunc: any = function (...args: Parameters<T>): ReturnType<T> {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key) as ReturnType<T>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n }\n\n cachedFunc.cache = cache;\n\n return cachedFunc\n}\n\n","import { useRef } from \"react\"\n\n\nconst randomHash = () => Math.random().toString().slice(2)\n\n/**\n * useArrayHash\n *\n * A custom hook that computes a stable hash for an array of values.\n * The hash changes only when the array's contents differ from the previous call.\n *\n * @param e - The input array to hash.\n * @returns A string hash that updates when the array changes.\n *\n * How it works:\n * - Tracks the previous array and its hash using a `useRef`.\n * - Compares the new array to the previous one by length and element equality.\n * - If any difference is detected, generates a new random hash.\n */\nexport const useArrayHash = (e: any[]): string => {\n\n const { current: { computedHash } } = useRef({\n /**\n * Getter for the computed hash function.\n *\n * - Initializes with an empty array and a random hash.\n * - Returns a function that compares the current array to the previous one.\n * - Updates the hash if any difference is detected.\n */\n get computedHash() {\n let currentValues: any[] = []\n let currentHash = randomHash()\n return (e: any[]) => {\n let isDiff = false\n\n // Check for differences in array existence, length, or elements.\n isDiff = isDiff || ((!e) != (!currentValues))\n isDiff = isDiff || (e?.length != currentValues?.length);\n isDiff = isDiff || (e.some((f, i) => f != currentValues[i]));\n\n // Update the hash if differences are found.\n currentValues = e;\n if (isDiff) {\n currentHash = randomHash()\n }\n\n return currentHash\n }\n }\n })\n\n return computedHash(e)\n}","import { debounce, memoize } from \"./utils\";\nimport { useEffect, useMemo, useState } from \"react\"\nimport { useArrayHash } from \"./useArrayHash\"\n\n\n\nclass DataEvent extends Event {\n constructor(\n public event: string,\n public value: any\n ) {\n super(event);\n }\n}\n\n/**\n * Generic context for managing shared state and event subscriptions.\n * @template D - The shape of the data managed by the context.\n */\nexport class Context<D> extends EventTarget {\n /**\n * Create a new Context instance.\n * @param name - The name of the context (for debugging).\n */\n constructor(public name: string) {\n console.log(\"[CONTEXT] %s\", name)\n // this.event.setMaxListeners(100)\n super();\n }\n\n // private event = new EventEmitter()\n\n /**\n * The current data held by the context.\n */\n public data: Partial<D> = {}\n /**\n * Registry for tracking active keys (for duplicate detection).\n */\n public registry = new Set<string>()\n\n /**\n * Publish a value to the context and notify subscribers if it changed.\n * @param key - The key to update.\n * @param value - The new value.\n */\n public publish(key: keyof D, value: D[typeof key] | undefined) {\n\n if (value != this.data[key]) {\n this.data[key] = value\n // console.count(\"[COUNT] \" + String(key))\n // this.event.emit(String(key), { value })\n this.dispatchEvent(new DataEvent(String(key), value))\n }\n }\n\n /**\n * Subscribe to changes for a specific key in the context.\n * @param key - The key to subscribe to.\n * @param _listener - Callback invoked with the new value.\n * @returns Unsubscribe function.\n */\n public subscribe(key: keyof D, _listener: (e: D[typeof key] | undefined) => void) {\n\n const listener = ({ event, value }: any) => {\n _listener(value)\n }\n\n this.addEventListener(String(key), listener)\n // console.log(\"listenerCount:\", String(key), this.event.listenerCount(String(key)))\n\n if (key in this.data) _listener(this.data[key])\n\n return () => (this.removeEventListener(String(key), listener), undefined)\n }\n\n}\n\n/**\n * Get or create a memoized Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const getContext = memoize((name: string) => new Context<any>(name))\n\n/**\n * Type alias for a function that returns a Context instance.\n */\nexport type getContext<D> = (e: string) => Context<D>\n\n/**\n * React hook to get a typed Context instance by name.\n * @param name - The context name.\n * @returns The Context instance.\n */\nexport const useDataContext = <D>(name: string = \"noname\") => {\n\n const ctx = useMemo(() => getContext(name), [name])\n\n return ctx as any as Context<D>\n}\n\n/**\n * Internal hook to check for duplicate registry entries in a context.\n * Warns if any of the provided names are already registered.\n * @param ctx - The context instance.\n * @param names - Names to check and register.\n */\nconst useRegistryChecker = (ctx: Context<any> | undefined, ...names: string[]) => {\n // return;\n const stack = new Error(\"[ctx] useRegistryChecker failed \" + JSON.stringify({ names, ctx: ctx?.name ?? 'undefined' }))\n\n useEffect(\n () => {\n if (ctx) {\n if (names.some(name => ctx.registry.has(name))) {\n console.error(stack)\n }\n names.forEach(e => ctx.registry.add(e))\n\n // console.debug(\"[ctx] %s%s add datasource\", componentId, ctx.name, names)\n return () => {\n // console.debug(\"[ctx] %s %s remove datasource\", componentId, ctx.name, names)\n\n names.forEach(e => ctx.registry.delete(e))\n }\n }\n },\n [ctx, names.length]\n )\n\n}\n\n/**\n * React hook to publish a value to the context when it changes.\n * @param ctx - The context instance.\n * @param key - The key to update.\n * @param value - The new value.\n */\nexport const useDataSource = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, value: D[K] | undefined) => {\n //@ts-check\n useEffect(() => {\n if (ctx && ctx.data[key] != value) {\n\n ctx.publish(key, value)\n }\n }, [key, value, ctx])\n\n useRegistryChecker(ctx, key as any)\n}\n\n/**\n * React hook to subscribe to a context value, with optional debounce.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param debounceTime - Debounce time in ms (default 0).\n * @returns The current value for the key.\n */\nexport const useDataSubscribe = <D, K extends keyof D>(ctx: Context<D> | undefined, key: K, debounceTime = 0): D[K] | undefined => {\n //@ts-check\n const [{ value }, setState] = useState(() => ({ value: ctx?.data?.[key] }))\n\n useEffect(() => {\n if (ctx) {\n let callback = debounceTime == 0\n ? (value: any) => setState({ value } as any)\n : debounce((value: any) => setState({ value } as any), debounceTime)\n let unsub = ctx.subscribe(key, callback)\n value != ctx.data[key] && setState({ value: ctx.data[key] })\n return () => {\n unsub()\n }\n }\n }, [key, ctx])\n\n return ctx?.data[key]\n}\n\n/**\n * React hook to subscribe to a context value and transform it before returning.\n * @param ctx - The context instance.\n * @param key - The key to subscribe to.\n * @param transform - Function to transform the value.\n * @returns The transformed value.\n */\nexport const useDataSubscribeWithTransform = <D, K extends keyof D, E>(ctx: Context<D> | undefined, key: K, transform: (e: D[K] | undefined) => E): E => {\n const [, setState] = useState(0)\n const result = useMemo(\n () => transform(ctx?.data[key]),\n [transform, ctx?.data[key]]\n )\n\n useEffect(() => {\n if (ctx) {\n let preValue = result\n let callback = () => {\n let newValue = transform(ctx.data[key])\n if (newValue != preValue) {\n preValue = newValue;\n setState(e => e + 1)\n };\n }\n let unsub = ctx.subscribe(key, callback)\n callback();\n return () => unsub()\n }\n }, [key, ctx])\n\n return result\n}\n\n/**\n * React hook to publish multiple values to the context.\n * @param ctx - The context instance.\n * @param entries - Array of [key, value] pairs to update.\n */\nexport const useDataSourceMultiple = <D, T extends readonly (keyof D)[]>(\n ctx: Context<D> | undefined,\n ...entries: { -readonly [P in keyof T]: [T[P], D[T[P]]] }\n) => {\n //@ts-check\n useEffect(() => {\n if (ctx) {\n for (let [key, value] of entries) {\n ctx.data[key] != value && ctx.publish(key, value)\n }\n }\n }, [ctx, useArrayHash(entries.flat())])\n\n useRegistryChecker(ctx, ...entries.map(e => e[0]) as any)\n\n}\n\n/**\n * React hook to subscribe to multiple context values.\n * @param ctx - The context instance.\n * @param keys - Keys to subscribe to.\n * @returns An object with the current values for the keys.\n */\nexport const useDataSubscribeMultiple = <D, K extends keyof D>(\n ctx: Context<D> | undefined,\n ...keys: K[]\n): Pick<D, K> => {\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n // console.log(\"DIFF\", keys.filter((e, i) => prevValues[i] != currentValues[i]))\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, 1)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n\n return Object\n .fromEntries(keys.map((key, index) => [key, returnValues[index]])) as any\n}\n\n/**\n * React hook to subscribe to multiple context values with throttling.\n * @param ctx - The context instance.\n * @param debounceTime - Debounce time in ms (default 50).\n * @param keys - Keys to subscribe to.\n * @returns Array of current values for the keys.\n */\nexport const useDataSubscribeMultipleWithDebounce = <D, K extends (keyof D)[]>(\n ctx: Context<D> | undefined,\n debounceTime = 50,\n ...keys: K\n): { [i in keyof K]: D[K[i]] | undefined } => {\n //@ts-check\n const [, setCounter] = useState(0)\n\n const returnValues = keys.map(key => ctx?.data?.[key])\n\n useEffect(() => {\n if (ctx) {\n let prevValues = returnValues\n const callback = debounce(() => {\n let currentValues = keys.map(key => ctx?.data?.[key])\n if (keys.some((key, i) => prevValues[i] != currentValues[i])) {\n prevValues = currentValues\n setCounter(c => c + 1)\n }\n }, debounceTime)\n\n let handles = keys.map(key => ctx.subscribe(key, callback))\n\n let firstCall = setTimeout(callback, 1);\n\n return () => {\n clearTimeout(firstCall)\n callback.cancel();\n handles.forEach(unsub => unsub())\n }\n\n }\n }, [ctx, ...keys])\n\n return returnValues as any\n}\n\n\n\n","import { useEffect, useMemo } from \"react\"\nimport { useDataContext, useDataSourceMultiple, type Context } from \"./ctx\"\n\n\n\n/**\n * createRootCtx\n *\n * Factory that creates a headless \"Root\" component and companion hooks for a context namespace.\n * It derives a unique context name from a base `name` and a props object `U`, then publishes\n * a computed state `V` (from `useFn`) to that context.\n *\n * Usage (manual mounting):\n * ```\n * const { Root, useCtxState } = createRootCtx('user-state', useUserState)\n * ...\n * // Mount exactly one Root per unique props combination\n * <Root userId={id} />\n * ...\n * // Read anywhere ,using the same props shape\n * const user = useCtxState({ userId: id })\n *```\n * Strict vs lenient consumers:\n * - useCtxStateStrict(props) throws if a matching Root is not mounted.\n * - useCtxState(props) logs an error (after 1s) instead of throwing.\n *\n * Multiple instances safety:\n * - Mounting more than one Root with the same resolved context name throws (guards accidental duplicates).\n *\n * Name resolution notes:\n * - The context name is built from `name` + sorted key/value pairs of `props` (U), joined by \"-\".\n * - Prefer stable, primitive props to avoid collisions; if you need automation, pair with `createAutoCtx` and\n * mount a single <AutoRootCtx Wrapper={ErrorBoundary} /> at the app root so you don't manually mount `Root`.\n */\nexport const createRootCtx = <U extends object, V extends object>(name: string, useFn: (e: U) => V) => {\n\n const resolveCtxName = (e: U) => [\n name,\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n ].join(\"-\")\n\n let ctxMountedCheck = new Set<string>()\n\n\n const RootState: React.FC<U> = (e: U) => {\n const state = useFn(e)\n const ctxName = resolveCtxName(e)\n const ctx = useDataContext<V>(ctxName)\n const stack = useMemo(() => new Error().stack, [])\n\n useDataSourceMultiple(\n ctx,\n ...Object.entries(state) as any\n )\n\n useEffect(() => {\n if (ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext \" + ctxName + \" are mounted more than once\")\n err.stack = stack;\n throw err\n }\n ctxMountedCheck.add(ctxName)\n return () => { ctxMountedCheck.delete(ctxName) };\n })\n\n return <></>\n }\n\n RootState.displayName = `State[${useFn?.name??'??'}]`\n\n return {\n resolveCtxName,\n Root: RootState,\n /**\n * Strict consumer: throws if the corresponding Root for these props isn't mounted.\n * Use in development/tests to fail fast when wiring is incorrect.\n */\n useCtxStateStrict: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n throw err\n }\n }, [ctxName])\n\n return useDataContext<V>(ctxName)\n },\n /**\n * Lenient consumer: schedules a console.error if the Root isn't mounted instead of throwing.\n * Useful in production to avoid hard crashes while still surfacing misconfiguration.\n */\n useCtxState: (e: U): Context<V> => {\n const ctxName = resolveCtxName(e)\n\n const stack = useMemo(() => new Error().stack, [])\n\n useEffect(() => {\n if (!ctxMountedCheck.has(ctxName)) {\n const err = new Error(\"RootContext [\" + ctxName + \"] is not mounted\")\n err.stack = stack;\n let timeout = setTimeout(() => console.error(err), 1000)\n return () => clearTimeout(timeout)\n }\n }, [ctxMountedCheck.has(ctxName)])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","import { useEffect, useState, Fragment, useCallback } from \"react\"\nimport { useDataContext, useDataSourceMultiple, useDataSubscribe, type Context } from \"./ctx\"\nimport { createRootCtx } from \"./createRootCtx\"\n\n\n\n\n\n\nconst weakmapName = (function () {\n const weakmap = new WeakMap()\n\n return (e: any): string => {\n let result = weakmap.get(e);\n if (!result) {\n weakmap.set(e, result = (e?.name ?? \"\") + Math.random().toString())\n }\n return result\n }\n})()\n\n\nconst resolveName = (e: any) => [\n ...Object\n .entries(e ?? {})\n .sort((e, f) => e[0].localeCompare(f[0]))\n .flat()\n].join(\"-\")\n\n/**\n * Inline docs: createAutoCtx + AutoRootCtx\n *\n * Quick start\n * 1) Mount <AutoRootCtx /> ONCE near your app root. Provide a Wrapper that acts like an ErrorBoundary to isolate and log errors.\n * Example: <AutoRootCtx Wrapper={MyErrorBoundary} />\n *\n * 2) Create auto contexts from your root context factories:\n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx('test-state', stateFn))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx('other-state', otherFn))\n * ```\n * 3) Use them in components:\n * ```\n * const ctx = useTestCtxState({ userId })\n * const { property1, property2 } = useDataSubscribeMultiple(ctx,'property1','property2')\n * // No need to mount the Root returned by createRootCtx directly — AutoRootCtx manages it for you.\n * ```\n * Notes\n * - AutoRootCtx must be mounted before any useCtxState hooks created by createAutoCtx run.\n * - Wrapper should be an ErrorBoundary-like component that simply renders {children}; no extra providers or layout required.\n * - For each unique params object (by stable stringified key), AutoRootCtx ensures a corresponding Root instance is rendered.\n */\n\nexport const AutoRootCtx = ({ Wrapper = Fragment }) => {\n\n const ctx = useDataContext<any>(\"auto-ctx\")\n\n\n const [state, setState] = useState<Record<string, { Component: React.FC, subState: Record<string, { params: any, counter: number }> }>>({})\n\n\n const subscribeRoot = useCallback(\n (Comp: any, params: any) => {\n const weakName = weakmapName(Comp);\n const key = resolveName(params);\n\n setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n [key]: {\n ...preState,\n counter: preState.counter + 1,\n },\n },\n }\n }));\n\n return () => setState(({\n [weakName]: {\n Component = Comp,\n subState: {\n [key]: preState = { params, counter: 0 },\n ...subState\n } = {}\n } = {},\n ...state\n }) => ({\n ...state,\n [weakName]: {\n Component,\n subState: {\n ...subState,\n ...preState.counter > 1 ? {\n [key]: {\n ...preState,\n counter: preState.counter - 1,\n },\n } : {},\n },\n }\n }))\n\n },\n []\n )\n\n useDataSourceMultiple(ctx,\n [\"subscribe\", subscribeRoot],\n [\"state\", state],\n )\n\n\n return <>\n {Object.entries(state)\n .flatMap(([k1, { Component, subState }]) => Object\n .entries(subState)\n .map(([k2, { counter, params }]) => ({ key: k1 + k2, Component, params, counter }))\n .filter(e => e.counter > 0)\n .map(({ key, params, Component }) => <Wrapper key={key} >\n <Component {...params} />\n </Wrapper>)\n )\n }\n </>\n\n}\n\n/**\n * createAutoCtx\n *\n * Bridges a Root context (from createRootCtx) to the global AutoRootCtx renderer.\n * You do NOT mount the Root component yourself — just mount <AutoRootCtx /> once at the app root.\n *\n * Usage: \n * ```\n * const { useCtxState: useTestCtxState } = createAutoCtx(createRootCtx(\n * 'test-state', \n * stateFn\n * ))\n * const { useCtxState: useOtherCtxState } = createAutoCtx(createRootCtx(\n * 'other-state', \n * otherFn\n * ))\n * ```\n * \n * Then inside components:\n * ```\n * const ctxState = useTestCtxState({ any: 'params' })\n * ```\n * AutoRootCtx will subscribe/unsubscribe instances per unique params and render the appropriate Root under the hood.\n */\nexport const createAutoCtx = <U extends object, V extends object,>(\n { Root, useCtxState, useCtxStateStrict, resolveCtxName }: ReturnType<typeof createRootCtx<U, V>>,\n unmountTime = 0\n) => {\n\n return {\n\n useCtxState: (e: U): Context<V> => {\n\n const ctxName = resolveCtxName(e)\n\n const subscribe = useDataSubscribe(useDataContext<any>(\"auto-ctx\"), \"subscribe\")\n\n useEffect(() => {\n // Subscribe this component to an AutoRootCtx-managed Root instance keyed by e.\n // AutoRootCtx handles instance ref-counting and cleanup on unmount.\n if (unmountTime == 0) {\n return subscribe?.(Root, e)\n } else {\n let unsub = subscribe?.(Root, e)\n return () => setTimeout(unsub, unmountTime)\n }\n }, [subscribe, ctxName])\n\n return useDataContext<V>(ctxName)\n }\n }\n}","\nimport { debounce } from \"./utils\";\nimport { useState, useMemo, useEffect } from \"react\";\nimport type { Context } from \"./ctx\";\n\n/**\n * useQuickSubscribe is a custom React hook for efficiently subscribing to specific properties of a context's data object.\n * \n * @template D - The shape of the context data.\n * @param {Context<D> | undefined} ctx - The context object containing data and a subscribe method.\n * @returns {Partial<D>} A proxy object that mirrors the context data, automatically subscribing to properties as they are accessed.\n *\n * This hook tracks which properties of the context data are accessed by the component and subscribes to updates for only those properties.\n * When any of the subscribed properties change, the hook triggers a re-render. Subscriptions are managed and cleaned up automatically\n * when the component unmounts or the context changes. This approach minimizes unnecessary re-renders and resource usage by only\n * subscribing to the data that the component actually uses.\n *\n * Example usage:\n * const {name} = useQuickSubscribe(userContext);\n * // Accessing name will subscribe to changes in 'name' only\n * return <div>{name}</div>;\n */\n\nexport const useQuickSubscribe = <D>(\n ctx: Context<D> | undefined\n): {\n [P in keyof D]?: D[P] | undefined;\n } => {\n\n const [, setCounter] = useState(0);\n\n const { proxy, finalGetter, openGetter, clean } = useMemo(\n () => {\n\n const allKeys = new Set<keyof D>()\n const allCompareValue: { [P in keyof D]?: D[P] | undefined; } = {}\n const allUnsub = new Map()\n\n const proxy = new Proxy(\n ctx?.data as any,\n {\n get(target, p) {\n if (isOpenGetter) {\n allKeys.add(p as keyof D)\n return allCompareValue[p as keyof D] = target[p];\n } else {\n throw new Error(\"now allow here\")\n }\n }\n }\n ) as any\n\n let isOpenGetter = true;\n\n\n let onChange = debounce(() => {\n if ([...allKeys.values()]\n .some(k => allCompareValue[k] != ctx?.data?.[k])) {\n setCounter(c => c + 1)\n }\n }, 0)\n\n let openGetter = () => {\n isOpenGetter = true\n allKeys.clear()\n }\n\n let finalGetter = () => {\n isOpenGetter = false;\n\n [...allKeys.values()]\n .filter(k => !allUnsub.has(k))\n .forEach(k => {\n allUnsub.set(k, ctx?.subscribe(k, onChange))\n });\n\n [...allUnsub.keys()]\n .filter(k => !allKeys.has(k))\n .forEach(k => {\n let unsub = allUnsub.get(k)\n unsub?.();\n allUnsub.delete(k);\n });\n\n }\n\n let clean = () => {\n openGetter();\n finalGetter();\n setCounter(c => c + 1)\n }\n\n return { proxy, finalGetter, openGetter, clean }\n },\n [ctx]\n )\n\n openGetter();\n\n setTimeout(finalGetter, 0)\n\n useEffect(\n () => () => clean(),\n [clean]\n )\n\n return proxy;\n\n\n};\n","import { getContext } from \"./state-utils/ctx\"\nimport React, { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport \"./devTool.css\"\n\nconst cache = getContext.cache\n\nexport const DevToolState = ({ }) => {\n const [selectedKey, setKey] = useState(\"\")\n return <div className=\"main-panel\">\n <div className=\"state-list\">\n {[...cache.keys()]\n .map(e => JSON.parse(e)?.[0])\n .filter(e => e != \"auto-ctx\")\n .map(e => <div\n className=\"state-key\"\n data-active={e == selectedKey}\n onClick={() => setKey(e)}>{e}\n </div>)}\n </div>\n <div className=\"state-view\" >\n <StateView dataKey={selectedKey} key={selectedKey} />\n </div>\n </div>\n}\n\nexport const StateView: React.FC<{ dataKey: string }> = ({ dataKey }) => {\n const ctx = getContext(dataKey)\n const [currentData, setCurrentData] = useState({ ...ctx?.data })\n\n useEffect(() => {\n let checkState = { ...currentData }\n let interval = setInterval(() => {\n\n let isDiff = false\n\n for (let i in ctx?.data) {\n if (ctx?.data?.[i] != checkState[i]) {\n checkState[i] = ctx?.data?.[i];\n isDiff = true;\n }\n }\n if (isDiff) setCurrentData({ ...checkState })\n }, 200)\n\n return () => clearInterval(interval)\n }, [ctx])\n\n return <JSONView\n value={currentData}\n name=\"ROOT\"\n expandLevel={1}\n style={{ }}\n />\n}\n\ntype JSONViewProps = {\n value: any,\n path?: string[],\n name?: string,\n expandRoot: Record<string, boolean>,\n setExpandRoot: Dispatch<SetStateAction<Record<string, boolean>>>,\n expandLevel: number | boolean,\n currentField?: any\n currentType?: any,\n isGrouped?: boolean,\n}\n\n\nconst splitArray = <T,>(array: T[], max = 10) => {\n return Object.fromEntries(\n new Array(Math.ceil((array.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? array.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map(keys => [`${keys.at(0)}..${keys.at(-1)}`, Object.fromEntries(\n keys.map(k => [k, array[k]])\n )])\n )\n}\n\n\nconst splitObject = (object: any, max = 10) => {\n const keys = Object.keys(object);\n return Object.fromEntries(\n Array(Math.ceil((keys.length + 1) / max))\n .fill(0)\n .map((_, i, a) => new Array(i == a.length - 1 ? keys.length % max : max)\n .fill(0)\n .map((_, j) => i * max + j)\n )\n .filter(e => e.length)\n .map((e) => e.map(i => keys.at(i)))\n .map(sortedKeys => [\n `${sortedKeys.at(0)?.slice(0, 15)}...${sortedKeys.at(-1)?.slice(0, 15)}`,\n Object.fromEntries(sortedKeys.map(key => [key, object[key as any]]))]\n )\n )\n}\n\n\nconst useExpandState = ({ path, expandLevel, expandRoot, setExpandRoot }: JSONViewProps) => {\n const expandKeys = path?.join(\"%\") ?? \"\";\n\n const defaultExpand = typeof expandLevel == \"boolean\"\n ? expandLevel\n : (typeof expandLevel == 'number' && expandLevel > 0)\n\n const isExpand = useMemo(\n () => expandRoot?.[expandKeys] ?? defaultExpand,\n [expandRoot?.[expandKeys], expandKeys]\n )\n\n const setExpand = useCallback(\n (value: boolean) => setExpandRoot((r: object) => ({ ...r, [expandKeys]: value })),\n [expandRoot, expandKeys]\n )\n\n return { isExpand, setExpand }\n\n}\n\nconst ChangeFlashWrappper: React.FC<React.ComponentProps<'div'> & { value: any, deepCompare?: boolean }> = ({ value, deepCompare = false, ...rest }) => {\n\n const ref = useRef<HTMLElement>(undefined)\n const refValue = useRef(value);\n\n useEffect(() => {\n if (ref.current) {\n let isDiff = deepCompare && value && refValue.current\n ? (\n Object.keys(value).length != Object.keys(refValue.current).length\n || Object.keys(value).some(key => value[key] != refValue.current[key])\n ) : value != refValue.current\n if (isDiff) {\n refValue.current = value;\n ref.current.classList.add('jv-updated');\n let t = requestAnimationFrame(() => ref.current?.classList.remove('jv-updated'));\n return () => cancelAnimationFrame(t)\n }\n }\n\n }, [value, deepCompare, ref])\n\n return <div {...rest} ref={ref as any} />\n}\n\nconst JSONViewObj: React.FC<JSONViewProps> = (props) => {\n\n const {\n currentField,\n value, path = [], name, expandRoot, setExpandRoot,\n expandLevel,\n isGrouped,\n } = props\n\n const isArray = value instanceof Array\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const childExpandLevel = typeof expandLevel == \"number\" ? expandLevel - 1 : expandLevel\n\n const shouldGroup = Object.entries(value).length > 10\n\n const groupedChilds = useMemo(\n () => shouldGroup\n ? (value instanceof Array) ? splitArray(value, 10) : splitObject(value, 10)\n : value,\n [value, shouldGroup, splitArray]\n )\n\n return (isExpand) ? <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n {currentField && <div>\n <div onClick={() => setExpand(false)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span>[-]</span>\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n </div>\n </div>}\n <div className=\"jv-value\">\n {Object\n .entries(groupedChilds)\n .map(([k, v], index) => <JSONViewCurr\n {...{\n name, expandRoot, setExpandRoot,\n expandLevel: childExpandLevel,\n value: v,\n isGrouped: shouldGroup,\n }}\n key={[...path, shouldGroup ? index : k].join(\"%\")}\n path={[...path, k]}\n />)}\n </div>\n {currentField && <div>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>}\n </ChangeFlashWrappper> : <ChangeFlashWrappper className=\"jv-field jv-field-obj\" value={value} deepCompare={isGrouped}>\n <div>\n <div onClick={() => setExpand(true)}>\n <span className=\"jv-name\">{currentField}</span>\n {currentField && <span>:</span>}\n {currentField && <span>[+]</span>}\n <span className=\"jv-type\">{Object.keys(value).length} items </span>\n <span> {isArray ? \"[\" : \"{\"} </span>\n <span> ... </span>\n <span> {isArray ? \"]\" : \"}\"} </span>\n </div>\n </div>\n </ChangeFlashWrappper>\n\n}\n\nconst StringViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}, lng={value?.length}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\n\nconst FunctionViewObj: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n const { isExpand, setExpand } = useExpandState(props)\n\n const useExpand = String(value).length > 50\n\n const renderString = useExpand && !isExpand\n ? `${String(value).slice(0, 15)}...${String(value).slice(-15, -1)}`\n : String(value)\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType} ${useExpand ? 'jv-cursor' : ''}`}\n onClick={() => setExpand(!isExpand)}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">\"{renderString}\"</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst DefaultValueView: React.FC<JSONViewProps> = (props) => {\n\n const { currentType, currentField, value, } = props\n\n return <ChangeFlashWrappper\n value={props.value}\n className={`jv-field jv-field-${currentType}`}>\n <span className=\"jv-name\">{currentField}</span>\n <span>:</span>\n <span className=\"jv-type\">{currentType}</span>\n <span className=\"jv-value\">{String(value)}</span>\n <span>,</span>\n </ChangeFlashWrappper>\n}\n\nconst JSONViewCurr: React.FC<Omit<JSONViewProps, 'currentField'>> = (props) => {\n\n const { value, path = [], name } = props\n\n const currentField = path.at(-1) ?? name ?? undefined;\n\n const currentType = typeof value\n\n switch (currentType) {\n case \"object\":\n return <JSONViewObj {...props} {...{ currentField, currentType }} />\n case \"string\":\n return <StringViewObj {...props} {...{ currentField, currentType }} />\n case \"function\":\n return <FunctionViewObj {...props} {...{ currentField, currentType }} />\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n case \"symbol\":\n case \"undefined\":\n default:\n return <DefaultValueView {...props} {...{ currentField, currentType }} />\n }\n}\n\nexport const JSONView: React.FC<{ value: any, name?: string, style?: any, expandLevel?: number | boolean }> = ({ value, name, style, expandLevel = false }) => {\n\n const [expandRoot, setExpandRoot] = useState<Record<string, boolean>>({})\n\n return <div className=\"jv-root\" style={style}>\n <JSONViewCurr\n path={[]}\n {...{ name, value, expandRoot, setExpandRoot, expandLevel }}\n />\n </div>\n}","import \"./devTool.css\"\nimport { useState } from \"react\"\nimport { DevToolState } from \"./DevToolState\";\n\n\nexport const DevToolContainer = ({ toggleButton = \"[x]\", ...props }) => {\n const [active, setActive] = useState(false);\n return <>\n <button className=\"react-state-dev-btn\" data-active={active} onClick={() => setActive(true)} {...props}>\n {props?.children ?? \"Toggle Dev Tool\"}\n </button>\n <div className=\"react-state-dev-container\" data-active={active}>\n <button className=\"close-btn\" onClick={() => setActive(false)}>\n [x]\n </button>\n <DevToolState />\n </div>\n </>\n}"],"names":["debounce","func","wait","timeout","fn","args","memoize","cache","cachedFunc","key","result","randomHash","useArrayHash","e","computedHash","useRef","currentValues","currentHash","isDiff","f","i","DataEvent","event","value","Context","name","_listener","listener","getContext","useDataContext","useMemo","useRegistryChecker","ctx","names","stack","useEffect","useDataSource","useDataSubscribe","debounceTime","setState","useState","callback","unsub","useDataSubscribeWithTransform","transform","preValue","newValue","useDataSourceMultiple","entries","useDataSubscribeMultiple","keys","setCounter","returnValues","prevValues","c","handles","firstCall","index","useDataSubscribeMultipleWithDebounce","createRootCtx","useFn","resolveCtxName","ctxMountedCheck","RootState","state","ctxName","err","jsx","Fragment","weakmapName","weakmap","resolveName","AutoRootCtx","Wrapper","subscribeRoot","useCallback","Comp","params","weakName","Component","preState","subState","k1","k2","counter","createAutoCtx","Root","useCtxState","useCtxStateStrict","unmountTime","subscribe","useQuickSubscribe","proxy","finalGetter","openGetter","clean","allKeys","allCompareValue","allUnsub","target","p","isOpenGetter","onChange","k","DevToolState","selectedKey","setKey","jsxs","StateView","dataKey","currentData","setCurrentData","checkState","interval","JSONView","splitArray","array","max","_","j","splitObject","object","a","sortedKeys","useExpandState","path","expandLevel","expandRoot","setExpandRoot","expandKeys","defaultExpand","isExpand","setExpand","r","ChangeFlashWrappper","deepCompare","rest","ref","refValue","t","JSONViewObj","props","currentField","isGrouped","isArray","childExpandLevel","shouldGroup","groupedChilds","v","createElement","JSONViewCurr","StringViewObj","currentType","useExpand","renderString","FunctionViewObj","DefaultValueView","style","DevToolContainer","toggleButton","active","setActive"],"mappings":"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"}
@@ -1 +1 @@
1
- :root{color-scheme:light dark}.react-state-dev-btn{position:fixed;bottom:30px;right:30px;transition:opacity .3s}.react-state-dev-btn[data-active=true]{opacity:0;pointer-events:none}.react-state-dev-container{--color: light-dark(#333b3c, #efefec);--bg-color: light-dark(#f9f9f9, #212121);color:var(--color);background-color:var(--bg-color);position:fixed;bottom:0;right:0;left:0;opacity:0;pointer-events:none;transition:opacity .3s,transform .3s;transform:translateY(100%);padding:10px}.react-state-dev-container[data-active=true]{opacity:1;pointer-events:all;transform:translateY(0)}.react-state-dev-container .close-btn{position:absolute;top:-20px;right:0}.react-state-dev-container .main-panel{display:flex;flex-direction:row;gap:.2em}.react-state-dev-container .main-panel .state-list{max-width:150px}.react-state-dev-container .main-panel .state-list .state-key{cursor:pointer;padding:.2em;border-bottom:solid 1px}.react-state-dev-container .main-panel .state-list .state-key[data-active=true]{background-color:light-dark(#0003,#fff3)}.react-state-dev-container .main-panel .state-view{flex:1}.jv-root{font-family:monospace;-webkit-user-select:none;user-select:none}.jv-root .jv-name{opacity:.8}.jv-root .jv-type{opacity:.5;font-size:smaller;padding-inline:.4em}.jv-root .jv-cursor{cursor:pointer}.jv-root .jv-field{margin-block:1px}.jv-root .jv-field .jv-field{transition:border-color 1s,background-color 1s;border-color:#0000;background-color:#0000;border-width:1px;border-style:solid}.jv-root .jv-field .jv-field.jv-updated{transition:border-color 0s,background-color 0s;border-color:red;background-color:#f001}.jv-root .jv-field-obj>.jv-value{padding-inline-start:1em;margin-inline-start:.6em;border-inline-start:solid 1px #8888}.jv-root .jv-field-obj>:first-child>:first-child>.jv-name{cursor:pointer}.jv-root .jv-field-obj{--lv: 0}.jv-root .jv-field-obj .jv-field-obj{--lv: 1}.jv-root .jv-field-obj .jv-field-obj .jv-field-obj{--lv: 2}.jv-root .jv-field-obj .jv-field-obj .jv-field-obj .jv-field-obj{--lv: 3}.jv-root .jv-field-obj .jv-field-obj .jv-field-obj .jv-field-obj .jv-field-obj{--lv: 4}.jv-root .jv-field-obj>:first-child{container-type:scroll-state;position:sticky;top:calc(var(--lv, 0) * 1.25em);z-index:calc(10 - var(--lv, 0))}@container scroll-state(stuck: top){.jv-root .jv-field-obj>:first-child>div{background-color:var(--bg-color);border-bottom:solid 1px #8884;font-weight:700}}.jv-root .jv-field-string>:is(.jv-type,.jv-value){color:orange}.jv-root .jv-field-number>:is(.jv-type,.jv-value){color:red}.jv-root .jv-field-boolean>:is(.jv-type,.jv-value){color:#08f}.jv-root .jv-field-function>:is(.jv-type,.jv-value){color:#08f}
1
+ :root{color-scheme:light dark}.react-state-dev-btn{position:fixed;bottom:30px;right:30px;transition:opacity .3s}.react-state-dev-btn[data-active=true]{opacity:0;pointer-events:none}.react-state-dev-container{--color: light-dark(#333b3c, #efefec);--bg-color: light-dark(#f9f9f9, #212121);align-items:stretch;font-size:14px;color:var(--color);background-color:var(--bg-color);position:fixed;bottom:0;right:0;left:0;opacity:0;pointer-events:none;transition:opacity .3s,transform .3s;transform:translateY(100%);padding:.5em}.react-state-dev-container[data-active=true]{opacity:1;pointer-events:all;transform:translateY(0)}.react-state-dev-container .close-btn{position:absolute;top:-20px;right:0}.react-state-dev-container .main-panel{display:flex;flex-direction:row;gap:1em;padding:1em;resize:vertical;min-height:200px;max-height:60vh;background-color:#8882;overflow:hidden;justify-items:stretch}.react-state-dev-container .main-panel .state-list{max-width:50%;min-width:100px;overflow:auto;align-self:stretch;resize:horizontal}.react-state-dev-container .main-panel .state-list .state-key{cursor:pointer;padding:.2em;border-bottom:solid 1px #8884;font-family:monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.react-state-dev-container .main-panel .state-list .state-key[data-active=true]{background-color:light-dark(#0003,#fff3)}.react-state-dev-container .main-panel .state-view{flex:1;overflow:auto;border-inline-start:solid 1px #8888;padding-inline-start:1em}.jv-root{font-family:monospace;-webkit-user-select:none;user-select:none}.jv-root .jv-name{opacity:.8}.jv-root .jv-type{opacity:.5;font-size:smaller;padding-inline:.4em}.jv-root .jv-cursor{cursor:pointer}.jv-root .jv-field{margin-block:1px}.jv-root .jv-field .jv-field{transition:border-color 1s,background-color 1s;border-color:#0000;background-color:#0000;border-width:1px;border-style:solid}.jv-root .jv-field .jv-field.jv-updated{transition:border-color 0s,background-color 0s;border-color:red;background-color:#f001}.jv-root .jv-field-obj>.jv-value{padding-inline-start:1em;margin-inline-start:.6em;border-inline-start:solid 1px #8888}.jv-root .jv-field-obj>:first-child>:first-child>.jv-name{cursor:pointer}.jv-root .jv-field-obj{--lv: 0}.jv-root .jv-field-obj .jv-field-obj{--lv: 1}.jv-root .jv-field-obj .jv-field-obj .jv-field-obj{--lv: 2}.jv-root .jv-field-obj .jv-field-obj .jv-field-obj .jv-field-obj{--lv: 3}.jv-root .jv-field-obj .jv-field-obj .jv-field-obj .jv-field-obj .jv-field-obj{--lv: 4}.jv-root .jv-field-obj>:first-child{container-type:scroll-state;position:sticky;top:calc(var(--lv, 0) * 1.25em);z-index:calc(10 - var(--lv, 0))}@container scroll-state(stuck: top){.jv-root .jv-field-obj>:first-child>div{background-color:var(--bg-color);border-bottom:solid 1px #8884;font-weight:700}}.jv-root .jv-field-string>:is(.jv-type,.jv-value){color:orange}.jv-root .jv-field-number>:is(.jv-type,.jv-value){color:red}.jv-root .jv-field-boolean>:is(.jv-type,.jv-value){color:#08f}.jv-root .jv-field-function>:is(.jv-type,.jv-value){color:#08f}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-state-custom",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "The `react-state-custom` library provides a powerful set of tools for managing shared state in React applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.umd.js",
package/src/DevTool.css CHANGED
@@ -18,6 +18,8 @@
18
18
  .react-state-dev-container {
19
19
  --color: light-dark(#333b3c, #efefec);
20
20
  --bg-color: light-dark(#f9f9f9, #212121);
21
+ align-items: stretch;
22
+ font-size: 14px;
21
23
  color: var(--color);
22
24
  background-color: var(--bg-color);
23
25
  position: fixed;
@@ -28,7 +30,7 @@
28
30
  pointer-events: none;
29
31
  transition: opacity 0.3s, transform 0.3s;
30
32
  transform: translateY(100%);
31
- padding: 10px;
33
+ padding: 0.5em;
32
34
 
33
35
  &[data-active="true"] {
34
36
  opacity: 1;
@@ -45,26 +47,43 @@
45
47
  .main-panel {
46
48
  display: flex;
47
49
  flex-direction: row;
48
- gap: 0.2em;
50
+ gap: 1em;
51
+ padding: 1em;
52
+ resize: vertical;
53
+ min-height: 200px;
54
+ max-height: 60vh;
55
+ background-color: #8882;
56
+ overflow: hidden;
57
+ justify-items: stretch;
49
58
 
50
59
  .state-list {
51
- max-width: 150px;
60
+ max-width: 50%;
61
+ min-width: 100px;
62
+ overflow: auto;
63
+ align-self: stretch;
64
+ resize: horizontal;
52
65
 
53
66
  .state-key {
54
67
  cursor: pointer;
55
68
  padding: 0.2em;
56
- border-bottom: solid 1px;
69
+ border-bottom: solid 1px #8884;
70
+ font-family: monospace;
71
+ overflow: hidden;
72
+ text-overflow: ellipsis;
73
+ white-space: nowrap;
57
74
 
58
75
  &[data-active="true"] {
59
76
  background-color: light-dark(#0003, #fff3);
60
77
  }
61
78
  }
62
79
 
63
- .filter {}
64
80
  }
65
81
 
66
82
  .state-view {
67
83
  flex: 1;
84
+ overflow: auto;
85
+ border-inline-start: solid 1px #8888;;
86
+ padding-inline-start: 1em;
68
87
  }
69
88
  }
70
89
  }
@@ -49,7 +49,7 @@ export const StateView: React.FC<{ dataKey: string }> = ({ dataKey }) => {
49
49
  value={currentData}
50
50
  name="ROOT"
51
51
  expandLevel={1}
52
- style={{ height: "300px", overflow: "auto", resize: "vertical" }}
52
+ style={{ }}
53
53
  />
54
54
  }
55
55
 
package/src/Test.tsx CHANGED
@@ -41,7 +41,7 @@ const { useCtxState: useDevAdvanceCtx } = createAutoCtx(
41
41
  increase: useCallback(() => setState(f => {
42
42
  setCounter(c => {
43
43
  setHistory(h => [...h, f]);
44
- setHistoryMap(m => ({ ...m, ['state--' + c]: {f,d: Date.now()} }));
44
+ setHistoryMap(m => ({ ...m, ['state--' + c]: { f, d: Date.now() } }));
45
45
  return c + 1
46
46
  })
47
47
  return f + 1
@@ -49,7 +49,7 @@ const { useCtxState: useDevAdvanceCtx } = createAutoCtx(
49
49
  decrease: useCallback(() => setState(f => {
50
50
  setCounter(c => {
51
51
  setHistory(h => [...h, f]);
52
- setHistoryMap(m => ({ ...m, ['state--' + c]: {f,d: Date.now()} }));
52
+ setHistoryMap(m => ({ ...m, ['state--' + c]: { f, d: Date.now() } }));
53
53
  return c + 1
54
54
  })
55
55
  return f - 1
@@ -64,6 +64,18 @@ export const Test = ({ }) => {
64
64
  const { state, decrease, increase } = useQuickSubscribe(useDevCtx({}))
65
65
  const { state: advState, computed: advComputed, increase: advIncreaser, decrease: advDecrise } = useQuickSubscribe(useDevAdvanceCtx({ id: "name" }))
66
66
 
67
+ useDevAdvanceCtx({ id: "2123132" })
68
+ useDevAdvanceCtx({ id: "dfgfd" })
69
+ useDevAdvanceCtx({ id: "443" })
70
+ useDevAdvanceCtx({ id: "w3sef" })
71
+ useDevAdvanceCtx({ id: "erere" })
72
+ useDevAdvanceCtx({ id: "sdfdsf" })
73
+ useDevAdvanceCtx({ id: "asdasd" })
74
+ useDevAdvanceCtx({ id: "66666" })
75
+ useDevAdvanceCtx({ id: "dddd" })
76
+ useDevAdvanceCtx({ id: "eeeee" })
77
+ useDevAdvanceCtx({ id: "44444" })
78
+ useDevAdvanceCtx({ id: ";;;;" })
67
79
 
68
80
  return <div>
69
81
  <hr />