{"version":3,"sources":["jsdelivr-header.js","/npm/react-charm@1.0.26/src/react-charm.js"],"names":[],"mappings":"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","file":"/npm/react-charm@1.0.26/src/react-charm.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/react-charm@1.0.26/src/react-charm.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import {\n  useMemo,\n  useState,\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useCallback,\n  memo,\n  createElement\n} from \"react\";\nimport produce from \"immer\";\n\nconst context = {\n  state: {},\n  subscribers: new Set(),\n  watchers: new Set(),\n  prevState: undefined\n};\nlet callbackCache = new WeakMap();\nlet cachedSelectors = {};\nconst stateProxy = new Proxy(\n  {},\n  {\n    get(target, name) {\n      return context.state[name];\n    },\n    ownKeys: function() {\n      return Object.keys(context.state);\n    },\n    getOwnPropertyDescriptor: function() {\n      return { enumerable: true, configurable: true };\n    }\n  }\n);\nlet setStateScopes = 0;\nlet shouldNotify = false;\n\nexport function useStates(...selectors) {\n  const isUnmountRef = useRef(false);\n  const onUnmountRef = useRef();\n  const selectorsRef = useRef();\n  const lastErrorRef = useRef();\n  const currentStatesRef = useRef();\n  const [, forceRerender] = useState();\n\n  if (lastErrorRef.current) {\n    const error = lastErrorRef.current;\n    lastErrorRef.current = undefined;\n    throw error;\n  }\n\n  selectorsRef.current = selectors;\n  const getStates = useCallback(() => {\n    return selectorsRef.current.length\n      ? selectorsRef.current.map((selector, index) => {\n          try {\n            return typeof selector === \"function\"\n              ? selector.__type === \"prop\"\n                ? selector()\n                : selector(context.state)\n              : Array.isArray(selector)\n              ? selector.reduce((prev, prop) => prev[prop], context.state)\n              : context.state[selector];\n          } catch (ex) {\n            lastErrorRef.current = ex;\n            return currentStatesRef.current\n              ? currentStatesRef.current[index]\n              : undefined;\n          }\n        })\n      : [];\n  }, []);\n  const checkForUpdate = useCallback(() => {\n    if (isUnmountRef.current || !selectorsRef.current.length) return;\n    const nextStates = getStates();\n    if (\n      currentStatesRef.current.every(\n        (item, index) => nextStates[index] === item\n      )\n    ) {\n      return;\n    }\n    currentStatesRef.current = nextStates;\n    forceRerender({});\n  }, [getStates]);\n\n  useLayoutEffect(\n    () => () => {\n      isUnmountRef.current = true;\n      onUnmountRef.current && onUnmountRef.current();\n    },\n    []\n  );\n\n  useEffect(() => {\n    const unsubscribe = subscribe(checkForUpdate);\n    checkForUpdate();\n    onUnmountRef.current = unsubscribe;\n  }, [checkForUpdate]);\n\n  currentStatesRef.current = getStates();\n\n  return currentStatesRef.current;\n}\n\nexport function dispatch(action, ...args) {\n  if (context.executionContext) {\n    throw new Error(\"dispatch must be called outside action execution\");\n  }\n  return executeAction(action, ...args);\n}\n\nexport function getState(selectors) {\n  if (selectors) {\n    if (typeof selectors === \"function\") return selectors(context.state);\n\n    return Object.entries(selectors).reduce((result, [key, selector]) => {\n      result[key] = getSelector(selector, key)(context.state);\n      return result;\n    }, {});\n  }\n  return context.state;\n}\n\nexport function initState(state = {}) {\n  setState(draft => {\n    Object.keys(state).forEach(key => {\n      if (key in context.state) return;\n      draft[key] = state[key];\n    });\n  });\n}\n\nexport function setState(nextState, notify = true, modifier) {\n  try {\n    setStateScopes++;\n    if (!context.prevState) {\n      context.prevState = context.state;\n    }\n    if (typeof nextState === \"function\") {\n      // we use same mutation context for all mutator\n      if (context.mutationContext) {\n        nextState = nextState(context.mutationContext);\n      } else {\n        nextState = produce(context.state, draft => {\n          context.mutationContext = draft;\n          nextState(context.mutationContext);\n          callWatchers();\n        });\n      }\n    }\n    if (nextState !== context.state) {\n      context.state = nextState;\n      // notify change\n      if (notify) {\n        shouldNotify = true;\n      }\n\n      callWatchers();\n    }\n  } finally {\n    setStateScopes--;\n    if (!setStateScopes) {\n      delete context.mutationContext;\n      const tempPrevState = context.prevState;\n      delete context.prevState;\n      if (shouldNotify) {\n        shouldNotify = false;\n        for (const subscriber of context.subscribers) {\n          subscriber(context.state, modifier || setState, tempPrevState);\n        }\n      }\n    }\n  }\n}\n\nexport function reset() {\n  Object.values(cachedSelectors).forEach(selector => {\n    delete selector.__prevValue;\n  });\n  for (const watcher of context.watchers) {\n    delete watcher.__selectors;\n  }\n  context.state = {};\n  delete context.prevState;\n  context.watchers.clear();\n  context.subscribers.clear();\n  callbackCache = new WeakMap();\n  cachedSelectors = {};\n}\n\nexport function subscribe(subscriber) {\n  context.subscribers.add(subscriber);\n\n  return () => {\n    context.subscribers.delete(subscriber);\n  };\n}\n\nexport function unsubscribeAll() {\n  context.subscribers.clear();\n}\n\nexport function getCallback(callback) {\n  let cachedCallback = callbackCache.get(callback);\n\n  if (!cachedCallback) {\n    cachedCallback = (...args) => executeAction(callback, ...args);\n    callbackCache.set(callback, cachedCallback);\n  }\n\n  return cachedCallback;\n}\n\nexport function useActions(...actions) {\n  return actions.map(getCallback);\n}\n\nexport function withStates(stateMap) {\n  const entries = Object.entries(stateMap);\n  return comp => {\n    const memoizedComp = memo(comp);\n    return props => {\n      const stateValues = useStates(\n        ...entries.map(([key, selector]) =>\n          typeof selector === \"function\"\n            ? state => selector(state, props)\n            : getSelector(selector, key)\n        )\n      );\n      const nextProps = {};\n      entries.forEach((entry, index) => {\n        nextProps[entry[0]] = stateValues[index];\n      });\n\n      Object.assign(nextProps, props);\n\n      return createElement(memoizedComp, nextProps);\n    };\n  };\n}\n\nexport function withActions(actionMap) {\n  const entries = Object.entries(actionMap);\n  return comp => {\n    // create memoized component\n    const memoizedComp = memo(comp);\n    // return wrapped component\n    return props => {\n      const callbacks = useMemo(\n        () =>\n          entries.map(entry =>\n            getCallback((context, ...args) => {\n              context.props = props;\n              entry[1](context, ...args);\n            })\n          ),\n        [props]\n      );\n      const nextProps = {};\n      entries.forEach((entry, index) => {\n        nextProps[entry[0]] = callbacks[index];\n      });\n\n      Object.assign(nextProps, props);\n\n      return createElement(memoizedComp, nextProps);\n    };\n  };\n}\n\nexport function withDispatch(actions = {}) {\n  if (Array.isArray(actions)) {\n    actions = { one: actions };\n  }\n\n  let { one = [], many = [] } = actions;\n  if (typeof one === \"function\") {\n    one = [one];\n  }\n\n  if (typeof many === \"function\") {\n    many = [many];\n  }\n\n  return comp => {\n    const memoizedComp = memo(comp);\n\n    return props => {\n      const prevArgsRef = useRef([]);\n\n      useEffect(() => {\n        one.forEach(action => {\n          executeAction(context => {\n            context.props = props;\n            return executeAction(action);\n          });\n        });\n      }, []);\n\n      useEffect(() => {\n        many.forEach((item, index) => {\n          const [action, argsResolver] = Array.isArray(item) ? item : [item];\n          const currentArgs = argsResolver\n            ? [].concat(argsResolver(props))\n            : undefined;\n          const prevArgs = prevArgsRef.current[index];\n          if (prevArgs && currentArgs && arrayEqual(currentArgs, prevArgs))\n            return;\n          prevArgsRef.current[index] = currentArgs;\n          executeAction(context => {\n            context.props = props;\n            return executeAction(action, ...(currentArgs || []));\n          });\n        });\n      });\n\n      return createElement(memoizedComp, props);\n    };\n  };\n}\n\nexport function compose(...functions) {\n  if (functions.length === 0) {\n    return arg => arg;\n  }\n\n  if (functions.length === 1) {\n    return functions[0];\n  }\n\n  return functions.reduce((a, b) => (...args) => a(b(...args)));\n}\n\n/**\n * unlikely subscribe function, stateMutator will be called when any action dispatched\n * on(action, stateMutator)\n * on([action1, action2], stateMutator)\n * on([\n *  [action1, stateMutator1],\n *  [action2, stateMutator2]\n * ])\n */\nexport function on(...args) {\n  if (context.executionContext) {\n    throw new Error(\n      \"Cannot register state mutator inside action calling context\"\n    );\n  }\n\n  const pairs = [];\n  /**\n   * on([action1, action2], stateMutator)\n   * on(\n   *  [action1, stateMutator1],\n   *  [action2, stateMutator2]\n   * )\n   */\n  if (Array.isArray(args[0])) {\n    /**\n     * on([action1, action2], stateMutator)\n     */\n    if (typeof args[1] === \"function\") {\n      pairs.push(...args[0].map(action => [action, args[1]]));\n    } else {\n      /**\n       * on(\n       *  [action1, stateMutator1],\n       *  [action2, stateMutator2]\n       * )\n       */\n      pairs.push(...args[0]);\n    }\n  } else {\n    pairs.push(args);\n  }\n\n  pairs.forEach(([action, stateMutator]) => {\n    if (!action.__subscribers) {\n      action.__subscribers = new Set();\n    }\n    action.__subscribers.add(stateMutator);\n  });\n\n  return () => {\n    pairs.forEach(([action, stateMutator]) =>\n      action.__subscribers.delete(stateMutator)\n    );\n  };\n}\n\nexport function watch(selector, watcher) {\n  context.watchers.add(watcher);\n  if (!watcher.__selectors) {\n    watcher.__selectors = new Set();\n  }\n  if (Array.isArray(selector)) {\n    selector.forEach(item => watcher.__selectors.add(item));\n  } else {\n    watcher.__selectors.add(selector);\n  }\n}\n\nfunction executeAction(action, ...args) {\n  if (Array.isArray(action)) {\n    return executeAction(...action.flat(10), ...args);\n  }\n\n  function callActionSubscribers() {\n    if (action.__subscribers) {\n      context.executionContext.type = action;\n      for (const subscriber of action.__subscribers) {\n        subscriber(context.executionContext);\n      }\n    }\n  }\n\n  if (!context.executionContext) {\n    // create new execution context\n    const executionContext = (context.executionContext = {\n      action: executeAction,\n      effect: executeEffect\n    });\n    try {\n      let result = undefined;\n      setState(\n        draft => {\n          executionContext.state = draft;\n          result =\n            // action can be any thing\n            typeof action === \"function\"\n              ? action(executionContext, ...args)\n              : undefined;\n\n          callActionSubscribers();\n        },\n        true,\n        action\n      );\n      return result;\n    } finally {\n      delete context.executionContext;\n    }\n  }\n\n  try {\n    return action(context.executionContext, ...args);\n  } finally {\n    callActionSubscribers();\n  }\n}\n\nexport const store = {\n  getState,\n  dispatch,\n  subscribe\n};\n\nexport function hoc(...callbacks) {\n  return callbacks.reduce(\n    (nextHoc, callback) => Component => {\n      const MemoComponent = memo(Component);\n\n      return props => {\n        // callback requires props and Comp, it must return React element\n        if (callback.length > 1) {\n          return callback(props, MemoComponent);\n        }\n        let newProps = callback(props);\n        if (newProps === false) return null;\n        if (!newProps) {\n          newProps = props;\n        }\n\n        return createElement(MemoComponent, newProps);\n      };\n    },\n    Component => Component\n  );\n}\n\nfunction executeEffect(effect, ...args) {\n  return effect(\n    {\n      state: stateProxy,\n      effect: executeEffect,\n      action: executeAction\n    },\n    ...args\n  );\n}\n\n/**\n * async(promise:Promise, onSuccess:Function, onFailure:Function)\n * async(promise:Promise, stateProp:String)\n * async(promiseFactory:Function, args:Object[])\n * async(promiseFactory:Function, options:Object, ...factoryArgs:Object[])\n * @param inputArgs\n * @return {Promise<*|*|*|*|undefined>}\n */\nexecuteEffect.async = async function async(...inputArgs) {\n  if (typeof inputArgs[0] !== \"function\" && inputArgs[0] && inputArgs[0].then) {\n    // async(promise, ...)\n    if (typeof inputArgs[1] === \"function\") {\n      // async(promise, onSuccess, onFailure)\n      return async(() => inputArgs[0], {\n        onSuccess: inputArgs[1],\n        onFailure: inputArgs[2]\n      });\n    }\n\n    if (typeof inputArgs[1] === \"string\") {\n      // async(promise, stateProp)\n      return async(() => inputArgs[0], { stateProp: inputArgs[1] });\n    }\n    return async(() => inputArgs[0], ...inputArgs.slice(1));\n  }\n\n  if (Array.isArray(inputArgs[1])) {\n    // async(factory, args)\n    return async(inputArgs[0], { args: inputArgs[1] });\n  }\n\n  const [promiseFactory, options, ...extraArgs] = inputArgs;\n\n  let {\n    stateProp,\n    transform = x => x,\n    payload,\n    singleton,\n    onSuccess,\n    onFailure,\n    args = []\n  } = options || {};\n\n  if (payload) {\n    transform = x => x.payload;\n  }\n\n  try {\n    // dont execute twice\n    if (\n      singleton &&\n      stateProp &&\n      context.state[stateProp] &&\n      context.state[stateProp].status === \"loading\"\n    ) {\n      return;\n    }\n\n    if (stateProp) {\n      setState(draft => {\n        draft[stateProp] = transform({\n          status: \"loading\",\n          loading: true\n        });\n      });\n    }\n\n    const payload = await promiseFactory(...args, ...extraArgs);\n\n    onSuccess && executeAction(onSuccess, payload);\n\n    if (stateProp) {\n      setState(draft => {\n        draft[stateProp] = transform({\n          status: \"success\",\n          success: true,\n          payload\n        });\n      });\n    }\n  } catch (error) {\n    onFailure && executeAction(onFailure, error);\n\n    if (stateProp) {\n      setState(draft => {\n        draft[stateProp] = transform({\n          status: \"failure\",\n          failure: true,\n          error\n        });\n      });\n    }\n  }\n};\n\nfunction getSelector(selector, defaultProp) {\n  if (typeof selector === \"function\") return selector;\n  if (selector === true) return getSelector(defaultProp);\n  if (selector in cachedSelectors) return cachedSelectors[selector];\n  return (cachedSelectors[selector] = state => state[selector]);\n}\n\nfunction callWatchers() {\n  if (!context.watchers.size) return;\n  if (context.callingWatchers) return;\n  context.callingWatchers = true;\n  try {\n    setState(draft => {\n      for (const watcher of context.watchers) {\n        let hasChange = false;\n        for (const selector of watcher.__selectors) {\n          const currentValue = selector(draft);\n          if (selector.__prevValue !== currentValue) {\n            hasChange = true;\n            selector.__prevValue = currentValue;\n          }\n        }\n\n        if (hasChange) {\n          executeAction(watcher);\n        }\n      }\n    });\n  } finally {\n    context.callingWatchers = false;\n  }\n}\n\nfunction arrayEqual(a, b) {\n  return a.length === b.length && a.every((i, index) => i === b[index]);\n}\n"]}