{"version":3,"file":"createEntry.cjs","names":["Fragment","WaitFor","UpdateEntry"],"sources":["../../src/createEntry/createEntry.tsx"],"sourcesContent":["import { cloneElement, Fragment, isValidElement } from 'react';\nimport { createRoot, hydrateRoot, type Root } from 'react-dom/client';\nimport { createEntry as _createEntry } from '@pastweb/tools/createEntry';\nimport { UpdateEntry } from './UpdateEntry';\nimport { WaitFor } from './WaitFor';\nimport type { ReactEntry, ReactEntryOptions } from './types';\n\nfunction getRenderComponent(entry: ReactEntry) {\n  const {\n    Providers = Fragment,\n    initData,\n    waitFor = [],\n    fallback = Fragment,\n  } = entry.options;\n  const { EntryComponent } = entry;\n\n  return () => (\n    <WaitFor wait={waitFor} fallback={fallback}>\n      <Providers>\n        <UpdateEntry on={entry.on} {...initData}>\n          {isValidElement(EntryComponent) ? (\n            cloneElement(EntryComponent, initData)\n          ) : (\n            <EntryComponent />\n          )}\n        </UpdateEntry>\n      </Providers>\n    </WaitFor>\n  );\n}\n\n/**\n * Creates a React entry object with methods for mounting and unmounting React components.\n *\n * @param options - Configuration options for the React entry.\n * @param options.Providers - Optional provider components to wrap the entry component.\n * @param options.initData - Initial data to be passed as props to the entry component.\n * @param options.waitFor - Optional array of promises to wait for before rendering the entry component.\n * @param options.fallback - Optional fallback component to be rendered while waiting.\n *\n * @returns A `ReactEntry` object with methods for mounting and unmounting the React component.\n * - `mount`: A method to render the entry component. Can optionally hydrate if `hydrate` is true.\n * - `unmount`: A method to unmount the entry component from the DOM.\n *\n * @example\n * // Example usage:\n * const entry = createEntry({\n *   EntryComponent: MyComponent,\n *   Providers: MyProviders,\n *   initData: { someProp: 'value' },\n *   waitFor: [fetchData()],\n *   fallback: <LoadingSpinner />,\n * });\n *\n * entry.mount({ hydrate: false });\n * // Later in the lifecycle\n * entry.unmount();\n */\nexport function createEntry(options: ReactEntryOptions = {}): ReactEntry {\n  const entry = _createEntry(options) as ReactEntry;\n  let _root: Root | null;\n\n  entry.mount = ({ hydrate = false } = {}): void => {\n    const RenderComponent = getRenderComponent(entry);\n\n    if (hydrate) {\n      _root = hydrateRoot(\n        entry.entryElement as HTMLElement,\n        <RenderComponent />\n      );\n    } else {\n      _root = createRoot(entry.entryElement as HTMLElement);\n      _root.render(<RenderComponent />);\n    }\n  };\n\n  entry.unmount = (): void => {\n    (_root as Root).unmount();\n  };\n\n  return entry as ReactEntry;\n}\n"],"mappings":";;;;;;;;;AAOA,SAAS,mBAAmB,OAAmB;CAC7C,MAAM,EACJ,YAAYA,MAAAA,UACZ,UACA,UAAU,CAAC,GACX,WAAWA,MAAAA,aACT,MAAM;CACV,MAAM,EAAE,mBAAmB;CAE3B,aACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,SAAD;EAAS,MAAM;EAAmB;YAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,aAAD;GAAa,IAAI,MAAM;GAAI,GAAI;uCACb,cAAc,KAAA,GAAA,MAAA,aAAA,CACf,gBAAgB,QAAQ,IAErC,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,CAAiB,CAAA;EAER,CAAA,EACJ,CAAA;CACJ,CAAA;AAEb;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,YAAY,UAA6B,CAAC,GAAe;CACvE,MAAM,SAAA,GAAA,2BAAA,YAAA,CAAqB,OAAO;CAClC,IAAI;CAEJ,MAAM,SAAS,EAAE,UAAU,UAAU,CAAC,MAAY;EAChD,MAAM,kBAAkB,mBAAmB,KAAK;EAEhD,IAAI,SACF,SAAA,GAAA,iBAAA,YAAA,CACE,MAAM,cACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD,CAAkB,CAAA,CACpB;OACK;GACL,SAAA,GAAA,iBAAA,WAAA,CAAmB,MAAM,YAA2B;GACpD,MAAM,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD,CAAkB,CAAA,CAAC;EAClC;CACF;CAEA,MAAM,gBAAsB;EAC1B,MAAgB,QAAQ;CAC1B;CAEA,OAAO;AACT"}