{"version":3,"file":"main.mjs","sources":["../lib/main.tsx"],"sourcesContent":["import React, {\n  Fragment,\n  hydrate,\n  render,\n  useContext,\n  useEffect,\n  useState,\n} from \"react\";\nimport { isNode } from \"sosse/uni\";\n\nconst emptyFunc = () => {};\n\ntype Options<T> = {\n  id: string;\n  component: () => T;\n  container?: Function;\n  suspense?: Function;\n  lazy?: boolean;\n  ssr?: boolean;\n  wrapper?: any[];\n};\n\ntype ThenArg<T> = T extends PromiseLike<infer U> ? U : T;\n\nlet components: Record<string, any> = {};\nconst injectCache: Record<string, any> = {};\n\nexport const preload = async function () {\n  const importPromises = [];\n  for (const [id, { component, ssr }] of Object.entries(injectCache)) {\n    if (!ssr) {\n      continue;\n    }\n\n    const importPromise = (async () => {\n      components[id] = await component();\n    })();\n\n    importPromises.push(importPromise);\n  }\n\n  await Promise.all(importPromises);\n};\n\nexport const inject = function ({\n  logInjects = process.env.NODE_ENV !== \"production\",\n} = {}) {\n  let jsonElList = document.getElementsByClassName(`sosse-interactive`);\n  if (jsonElList.length === 0) {\n    return;\n  }\n\n  const componentPromises: Record<string, any> = {};\n\n  const jsonEls = Array.from(jsonElList);\n  jsonEls.forEach(async (el) => {\n    const id = el[\"dataset\"].interactive;\n    const { component, ssr, suspense, lazy, wrapper } = injectCache[id];\n    const ASuspense = suspense;\n\n    componentPromises[id] =\n      componentPromises[id] ||\n      (async () => {\n        let ComponentPromise = component();\n        return ASuspense\n          ? React.lazy(async () => ({ default: await ComponentPromise }))\n          : await ComponentPromise;\n      })();\n\n    const LoadingComponent = await componentPromises[id];\n    const containerEl = el.nextElementSibling;\n\n    const aInject = function () {\n      if (logInjects) {\n        console.info(\"Injected: \" + id);\n      }\n\n      const props = JSON.parse(el.innerHTML);\n      let vdom = <LoadingComponent {...props} />;\n      if (wrapper.length) {\n        for (const Wrapper of wrapper) {\n          vdom = <Wrapper>{vdom}</Wrapper>;\n        }\n      }\n      if (ASuspense) {\n        vdom = <ASuspense>{vdom}</ASuspense>;\n      }\n      const injector = ssr ? hydrate : render;\n      injector(vdom, containerEl);\n    };\n\n    if (lazy) {\n      new IntersectionObserver(([entry], obs) => {\n        if (!entry.isIntersecting) return;\n        obs.unobserve(containerEl);\n        aInject();\n      }).observe(containerEl);\n    } else {\n      aInject();\n    }\n  });\n};\n\nconst defaultContainer = function ({ children }) {\n  return <div>{children}</div>;\n};\n\nexport const interactive = function <T, C = ThenArg<T>>({\n  id,\n  container = defaultContainer,\n  component,\n  suspense,\n  lazy = false,\n  ssr = false,\n  wrapper = [],\n}: Options<T>): C {\n  if (suspense && ssr) {\n    console.warn(\"Using suspense and ssr together isn't supported\");\n  }\n\n  lazy = lazy && typeof IntersectionObserver === \"function\";\n\n  injectCache[id] = {\n    component,\n    ssr,\n    suspense: !ssr && suspense,\n    lazy,\n    wrapper,\n  };\n\n  if (isNode) {\n    const Container = container;\n\n    return function (props) {\n      const Component = components[id];\n\n      return (\n        <Fragment>\n          <script\n            type=\"application/json\"\n            class=\"sosse-interactive\"\n            data-interactive={id}\n            dangerouslySetInnerHTML={{ __html: JSON.stringify(props) }}\n          />\n          <Container>{ssr && <Component {...props} />}</Container>\n        </Fragment>\n      );\n    } as any;\n  } else {\n    return emptyFunc as any;\n  }\n};\n\nconst defaultSerializer = function (value) {\n  return JSON.stringify(value);\n};\n\nconst defaultDeserializer = function (value) {\n  return JSON.parse(value);\n};\n\nexport const valueRef = function <T = any>(\n  value?: T\n): {\n  value: T;\n  update?: (newValue: T) => void;\n} {\n  return {\n    value,\n  };\n};\n\nexport const hydratedContext = function ({\n  id,\n  context,\n  ref = valueRef(),\n  serialize = defaultSerializer,\n  deserialize = defaultDeserializer,\n}): any {\n  const elClass = \"sosse-context-\" + id;\n\n  if (isNode) {\n    return function () {\n      const value = useContext(context);\n\n      return (\n        <script\n          type=\"application/json\"\n          class={elClass}\n          dangerouslySetInnerHTML={{ __html: serialize(value) }}\n        />\n      );\n    };\n  } else {\n    const el = document.getElementsByClassName(elClass);\n    if (el[0]) {\n      ref.value = deserialize(el[0].innerHTML);\n    }\n\n    const subs = [];\n    ref.update = function (newValue) {\n      this.value = newValue;\n      for (const sub of subs) {\n        sub();\n      }\n    };\n    const Context = context;\n\n    const comp = function ({ children }) {\n      const [_, setValue] = useState({});\n\n      useEffect(function () {\n        subs.push(function () {\n          setValue({});\n        });\n      }, []);\n\n      return <Context.Provider value={ref.value}>{children}</Context.Provider>;\n    };\n\n    return comp;\n  }\n};\n"],"names":["emptyFunc","components","injectCache","preload","importPromises","id","component","ssr","importPromise","push","Object","entries","Promise","all","inject","logInjects","process","env","NODE_ENV","jsonElList","document","getElementsByClassName","length","componentPromises","Array","from","forEach","el","interactive","lazy","wrapper","ASuspense","suspense","ComponentPromise","React","default","LoadingComponent","containerEl","nextElementSibling","aInject","console","info","props","JSON","parse","innerHTML","vdom","hydrate","render","IntersectionObserver","obs","isIntersecting","unobserve","observe","defaultContainer","children","container","warn","isNode","Container","Component","Fragment","type","class","dangerouslySetInnerHTML","__html","stringify","defaultSerializer","value","defaultDeserializer","valueRef","hydratedContext","context","ref","serialize","deserialize","elClass","useContext","subs","update","newValue","this","sub","Context","setValue","useState","useEffect","Provider"],"mappings":"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"}