@elurjs/kit 2.4.4 → 2.4.6

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.
@@ -14,7 +14,7 @@ function o() {
14
14
  return Array.from(document.querySelectorAll("[data-elur-island]")).map((e) => {
15
15
  let t = {
16
16
  el: e,
17
- name: e.dataset.elurJsIsland ?? "",
17
+ name: e.dataset.elurIsland ?? "",
18
18
  directive: e.dataset.directive ?? "load",
19
19
  props: null
20
20
  };
@@ -123,4 +123,4 @@ function d(e) {
123
123
  //#endregion
124
124
  export { d as n, r, u as t };
125
125
 
126
- //# sourceMappingURL=hydrate-CgZGrTxF.js.map
126
+ //# sourceMappingURL=hydrate-CJbUWdXu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate-CJbUWdXu.js","names":[],"sources":["../../src/island/hydrate.ts"],"sourcesContent":["import type { ElurTemplate } from \"@elurjs/core\";\nimport { hydrate as hydrateTemplate } from \"@elurjs/core/hydrate\";\nimport type { IslandDirective } from \"./island.js\";\n\n// --- Client-side island hydration ---\n\n// Keep track of every active island dispose so we can clean them up before a\n// client-side navigation swaps the whole #app content.\nconst _islandDisposes = new Set<() => void>();\nconst _islandSchedules = new Set<() => void>();\n\n// Finds [data-elur-island] markers in the current document and mounts the\n// corresponding interactive components over them. This runs in the browser.\n\nexport type IslandComponent<TProps = unknown> = (props: TProps) => ElurTemplate | null | false | undefined;\n\n// Re-exported from island.ts so the client entry and the server helper share a\n// single source of truth for the directive union (now includes \"only\").\nexport type { IslandDirective } from \"./island.js\";\n\n/** Lazy island loader in a discriminated form (no probe required to detect). */\nexport interface IslandLoader<TProps = unknown> {\n load: () => Promise<IslandComponent<TProps>>;\n}\n\n/**\n * Island registry entry. Two unambiguous shapes:\n * - `IslandComponent` (eager component function).\n * - `IslandLoader` `{ load }` (lazy, code-split loader).\n *\n * Legacy async loader functions are also accepted for backwards compatibility\n * and detected *without invoking them* (via the `AsyncFunction` tag), so no\n * side effects or duplicate signal creation happen during detection.\n */\nexport type IslandRegistryEntry<TProps = unknown> =\n | IslandComponent<TProps>\n | IslandLoader<TProps>\n | (() => Promise<IslandComponent<TProps>>);\n\nexport type IslandRegistry = Record<string, IslandRegistryEntry<any>>;\n\n/**\n * Wraps a lazy island loader in the discriminated `{ load }` form.\n */\nexport function lazyIsland<TProps = unknown>(\n loader: () => Promise<IslandComponent<TProps>>,\n): IslandLoader<TProps> {\n return { load: loader };\n}\n\nfunction isIslandLoader(value: unknown): value is IslandLoader {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { load?: unknown }).load === \"function\"\n );\n}\n\nfunction isAsyncFunction(value: unknown): boolean {\n if (typeof value !== \"function\") return false;\n const ctor = (value as { constructor?: { name?: string } }).constructor;\n return ctor?.name === \"AsyncFunction\" || (value as { [Symbol.toStringTag]?: string })[Symbol.toStringTag] === \"AsyncFunction\";\n}\n\ninterface IslandMarker {\n el: HTMLElement;\n name: string;\n directive: IslandDirective;\n props: unknown;\n propsError?: unknown;\n}\n\nfunction collectMarkers(): IslandMarker[] {\n const elements = Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-elur-island]\"),\n );\n return elements.map((el) => {\n const marker: IslandMarker = {\n el,\n name: el.dataset.elurIsland ?? \"\",\n directive: (el.dataset.directive as IslandDirective) ?? \"load\",\n props: null,\n };\n if (el.dataset.props) {\n try {\n marker.props = JSON.parse(el.dataset.props);\n } catch (error) {\n marker.propsError = error;\n }\n }\n return marker;\n });\n}\n\nasync function hydrate(marker: IslandMarker, registry: IslandRegistry): Promise<void> {\n try {\n if (marker.propsError) {\n reportIslandError(marker, marker.propsError);\n return;\n }\n\n const entry = registry[marker.name];\n if (!entry) {\n console.warn(`[elur-kit] No island registered for \"${marker.name}\"`);\n return;\n }\n\n // Resolve the component without probing: a `{ load }` loader or an async\n // function is lazy (awaited for the module/component); anything else is an\n // eager component called directly with the island props. Detection never\n // invokes the component with undefined props, so no side effects or\n // duplicate signal creation occur during resolution. Eager components\n // hydrate synchronously; lazy loaders hydrate once the module resolves.\n let Component: IslandComponent | undefined;\n if (isIslandLoader(entry)) {\n const mod = (await (entry as IslandLoader).load()) as IslandComponent | { default?: unknown };\n Component = typeof mod === \"function\" ? (mod as IslandComponent) : (mod as { default?: unknown }).default as IslandComponent | undefined;\n } else if (typeof entry === \"function\") {\n if (isAsyncFunction(entry)) {\n const mod = (await (entry as () => Promise<unknown>)()) as IslandComponent | { default?: unknown };\n Component = typeof mod === \"function\" ? (mod as IslandComponent) : (mod as { default?: unknown }).default as IslandComponent | undefined;\n } else {\n Component = entry as IslandComponent;\n }\n }\n\n if (typeof Component !== \"function\") {\n console.warn(`[elur-kit] Island \"${marker.name}\" did not resolve to a component function`);\n return;\n }\n\n const template = Component(marker.props);\n if (template === null || template === false || template === undefined) return;\n const prevDispose = (marker.el as any).__elur_js_island_dispose;\n if (typeof prevDispose === \"function\") prevDispose();\n\n // Islands with directive \"only\" or options.ssr:false have no SSR-rendered\n // DOM inside the marker — only fallback HTML or nothing. hydrateTemplate\n // assumes the SSR DOM is already present and walks it for hydration markers\n // (<!--elur-N-->, data-elur-e-*). When there's nothing to walk, it silently\n // does nothing (no contexts to match → empty loop → no mount). So we detect\n // the absence of hydration markers and do a fresh _render mount instead.\n const hasSSRMarkers = marker.el.innerHTML.includes(\"<!--elur-\");\n const handle = hasSSRMarkers\n ? hydrateTemplate(template, marker.el, { mismatch: \"warn-remount\" })\n : freshMount(template, marker.el);\n\n const wrappedDispose = () => {\n handle.unmount();\n _islandDisposes.delete(wrappedDispose);\n delete (marker.el as any).__elur_js_island_dispose;\n };\n (marker.el as any).__elur_js_island_dispose = wrappedDispose;\n _islandDisposes.add(wrappedDispose);\n } catch (error) {\n reportIslandError(marker, error);\n }\n}\n\nfunction reportIslandError(marker: IslandMarker, error: unknown): void {\n console.error(`[elur-kit] Failed to hydrate island \"${marker.name}\":`, error);\n const EventConstructor = marker.el.ownerDocument.defaultView?.CustomEvent;\n if (EventConstructor) {\n marker.el.dispatchEvent(new EventConstructor(\"elur:island-error\", {\n bubbles: true,\n detail: { name: marker.name, error },\n }));\n }\n}\n\n/**\n * Mounts a template fresh into a container (no hydration).\n * Used for islands with no SSR DOM (directive \"only\" or ssr:false) where\n * hydrateTemplate can't work — there's nothing to hydrate against.\n */\nfunction freshMount(template: ElurTemplate, container: Element): { unmount: () => void } {\n container.replaceChildren();\n const dispose = template._render(container, null);\n return { unmount: dispose };\n}\n\n/**\n * Hydrates all islands on the page using the provided registry.\n *\n * @param registry Map from island name to component factory.\n */\n/**\n * Dispose all currently hydrated islands. Called by the client router before\n * swapping the page body to prevent leaked effects and stale DOM writes.\n */\nexport function cleanupHydratedIslands(): void {\n for (const cancel of _islandSchedules) cancel();\n _islandSchedules.clear();\n for (const dispose of _islandDisposes) dispose();\n _islandDisposes.clear();\n}\n\nexport function hydrateIslands(registry: IslandRegistry): void {\n if (typeof window === \"undefined\") return;\n\n const markers = collectMarkers();\n\n for (const marker of markers) {\n if (marker.directive === \"load\" || marker.directive === \"only\") {\n // \"only\" is client-only (no SSR) but hydrates immediately on the\n // client, just like \"load\" — the difference is purely server-side.\n void hydrate(marker, registry);\n continue;\n }\n\n if (marker.directive === \"idle\") {\n let cancel = () => { };\n if (\"requestIdleCallback\" in window) {\n const id = window.requestIdleCallback(() => {\n _islandSchedules.delete(cancel);\n void hydrate(marker, registry);\n });\n cancel = () => window.cancelIdleCallback(id);\n } else {\n const id = globalThis.setTimeout(() => {\n _islandSchedules.delete(cancel);\n void hydrate(marker, registry);\n }, 0);\n cancel = () => globalThis.clearTimeout(id);\n }\n _islandSchedules.add(cancel);\n continue;\n }\n\n if (marker.directive === \"visible\") {\n if (\"IntersectionObserver\" in window) {\n let cancel = () => { };\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n _islandSchedules.delete(cancel);\n observer.disconnect();\n void hydrate(marker, registry);\n }\n }\n },\n { rootMargin: \"0px\", threshold: 0 },\n );\n cancel = () => observer.disconnect();\n _islandSchedules.add(cancel);\n observer.observe(marker.el);\n } else {\n void hydrate(marker, registry);\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ let e=require("@elurjs/core/hydrate");var t=new Set,n=new Set;function r(e){return{load:e}}function i(e){return typeof e==`object`&&!!e&&typeof e.load==`function`}function a(e){return typeof e==`function`?e.constructor?.name===`AsyncFunction`||e[Symbol.toStringTag]===`AsyncFunction`:!1}function o(){return Array.from(document.querySelectorAll(`[data-elur-island]`)).map(e=>{let t={el:e,name:e.dataset.elurIsland??``,directive:e.dataset.directive??`load`,props:null};if(e.dataset.props)try{t.props=JSON.parse(e.dataset.props)}catch(e){t.propsError=e}return t})}async function s(n,r){try{if(n.propsError){c(n,n.propsError);return}let o=r[n.name];if(!o){console.warn(`[elur-kit] No island registered for "${n.name}"`);return}let s;if(i(o)){let e=await o.load();s=typeof e==`function`?e:e.default}else if(typeof o==`function`){if(a(o)){let e=await o();s=typeof e==`function`?e:e.default}else s=o}if(typeof s!=`function`){console.warn(`[elur-kit] Island "${n.name}" did not resolve to a component function`);return}let u=s(n.props);if(u===null||u===!1||u===void 0)return;let d=n.el.__elur_js_island_dispose;typeof d==`function`&&d();let f=n.el.innerHTML.includes(`<!--elur-`)?(0,e.hydrate)(u,n.el,{mismatch:`warn-remount`}):l(u,n.el),p=()=>{f.unmount(),t.delete(p),delete n.el.__elur_js_island_dispose};n.el.__elur_js_island_dispose=p,t.add(p)}catch(e){c(n,e)}}function c(e,t){console.error(`[elur-kit] Failed to hydrate island "${e.name}":`,t);let n=e.el.ownerDocument.defaultView?.CustomEvent;n&&e.el.dispatchEvent(new n(`elur:island-error`,{bubbles:!0,detail:{name:e.name,error:t}}))}function l(e,t){return t.replaceChildren(),{unmount:e._render(t,null)}}function u(){for(let e of n)e();n.clear();for(let e of t)e();t.clear()}function d(e){if(typeof window>`u`)return;let t=o();for(let r of t){if(r.directive===`load`||r.directive===`only`){s(r,e);continue}if(r.directive===`idle`){let t=()=>{};if(`requestIdleCallback`in window){let i=window.requestIdleCallback(()=>{n.delete(t),s(r,e)});t=()=>window.cancelIdleCallback(i)}else{let i=globalThis.setTimeout(()=>{n.delete(t),s(r,e)},0);t=()=>globalThis.clearTimeout(i)}n.add(t);continue}if(r.directive===`visible`){if(`IntersectionObserver`in window){let t=()=>{},i=new IntersectionObserver(a=>{for(let o of a)o.isIntersecting&&(n.delete(t),i.disconnect(),s(r,e))},{rootMargin:`0px`,threshold:0});t=()=>i.disconnect(),n.add(t),i.observe(r.el)}else s(r,e)}}}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
2
+ //# sourceMappingURL=hydrate-D6MR24mz.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate-D6MR24mz.cjs","names":[],"sources":["../../src/island/hydrate.ts"],"sourcesContent":["import type { ElurTemplate } from \"@elurjs/core\";\nimport { hydrate as hydrateTemplate } from \"@elurjs/core/hydrate\";\nimport type { IslandDirective } from \"./island.js\";\n\n// --- Client-side island hydration ---\n\n// Keep track of every active island dispose so we can clean them up before a\n// client-side navigation swaps the whole #app content.\nconst _islandDisposes = new Set<() => void>();\nconst _islandSchedules = new Set<() => void>();\n\n// Finds [data-elur-island] markers in the current document and mounts the\n// corresponding interactive components over them. This runs in the browser.\n\nexport type IslandComponent<TProps = unknown> = (props: TProps) => ElurTemplate | null | false | undefined;\n\n// Re-exported from island.ts so the client entry and the server helper share a\n// single source of truth for the directive union (now includes \"only\").\nexport type { IslandDirective } from \"./island.js\";\n\n/** Lazy island loader in a discriminated form (no probe required to detect). */\nexport interface IslandLoader<TProps = unknown> {\n load: () => Promise<IslandComponent<TProps>>;\n}\n\n/**\n * Island registry entry. Two unambiguous shapes:\n * - `IslandComponent` (eager component function).\n * - `IslandLoader` `{ load }` (lazy, code-split loader).\n *\n * Legacy async loader functions are also accepted for backwards compatibility\n * and detected *without invoking them* (via the `AsyncFunction` tag), so no\n * side effects or duplicate signal creation happen during detection.\n */\nexport type IslandRegistryEntry<TProps = unknown> =\n | IslandComponent<TProps>\n | IslandLoader<TProps>\n | (() => Promise<IslandComponent<TProps>>);\n\nexport type IslandRegistry = Record<string, IslandRegistryEntry<any>>;\n\n/**\n * Wraps a lazy island loader in the discriminated `{ load }` form.\n */\nexport function lazyIsland<TProps = unknown>(\n loader: () => Promise<IslandComponent<TProps>>,\n): IslandLoader<TProps> {\n return { load: loader };\n}\n\nfunction isIslandLoader(value: unknown): value is IslandLoader {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { load?: unknown }).load === \"function\"\n );\n}\n\nfunction isAsyncFunction(value: unknown): boolean {\n if (typeof value !== \"function\") return false;\n const ctor = (value as { constructor?: { name?: string } }).constructor;\n return ctor?.name === \"AsyncFunction\" || (value as { [Symbol.toStringTag]?: string })[Symbol.toStringTag] === \"AsyncFunction\";\n}\n\ninterface IslandMarker {\n el: HTMLElement;\n name: string;\n directive: IslandDirective;\n props: unknown;\n propsError?: unknown;\n}\n\nfunction collectMarkers(): IslandMarker[] {\n const elements = Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-elur-island]\"),\n );\n return elements.map((el) => {\n const marker: IslandMarker = {\n el,\n name: el.dataset.elurIsland ?? \"\",\n directive: (el.dataset.directive as IslandDirective) ?? \"load\",\n props: null,\n };\n if (el.dataset.props) {\n try {\n marker.props = JSON.parse(el.dataset.props);\n } catch (error) {\n marker.propsError = error;\n }\n }\n return marker;\n });\n}\n\nasync function hydrate(marker: IslandMarker, registry: IslandRegistry): Promise<void> {\n try {\n if (marker.propsError) {\n reportIslandError(marker, marker.propsError);\n return;\n }\n\n const entry = registry[marker.name];\n if (!entry) {\n console.warn(`[elur-kit] No island registered for \"${marker.name}\"`);\n return;\n }\n\n // Resolve the component without probing: a `{ load }` loader or an async\n // function is lazy (awaited for the module/component); anything else is an\n // eager component called directly with the island props. Detection never\n // invokes the component with undefined props, so no side effects or\n // duplicate signal creation occur during resolution. Eager components\n // hydrate synchronously; lazy loaders hydrate once the module resolves.\n let Component: IslandComponent | undefined;\n if (isIslandLoader(entry)) {\n const mod = (await (entry as IslandLoader).load()) as IslandComponent | { default?: unknown };\n Component = typeof mod === \"function\" ? (mod as IslandComponent) : (mod as { default?: unknown }).default as IslandComponent | undefined;\n } else if (typeof entry === \"function\") {\n if (isAsyncFunction(entry)) {\n const mod = (await (entry as () => Promise<unknown>)()) as IslandComponent | { default?: unknown };\n Component = typeof mod === \"function\" ? (mod as IslandComponent) : (mod as { default?: unknown }).default as IslandComponent | undefined;\n } else {\n Component = entry as IslandComponent;\n }\n }\n\n if (typeof Component !== \"function\") {\n console.warn(`[elur-kit] Island \"${marker.name}\" did not resolve to a component function`);\n return;\n }\n\n const template = Component(marker.props);\n if (template === null || template === false || template === undefined) return;\n const prevDispose = (marker.el as any).__elur_js_island_dispose;\n if (typeof prevDispose === \"function\") prevDispose();\n\n // Islands with directive \"only\" or options.ssr:false have no SSR-rendered\n // DOM inside the marker — only fallback HTML or nothing. hydrateTemplate\n // assumes the SSR DOM is already present and walks it for hydration markers\n // (<!--elur-N-->, data-elur-e-*). When there's nothing to walk, it silently\n // does nothing (no contexts to match → empty loop → no mount). So we detect\n // the absence of hydration markers and do a fresh _render mount instead.\n const hasSSRMarkers = marker.el.innerHTML.includes(\"<!--elur-\");\n const handle = hasSSRMarkers\n ? hydrateTemplate(template, marker.el, { mismatch: \"warn-remount\" })\n : freshMount(template, marker.el);\n\n const wrappedDispose = () => {\n handle.unmount();\n _islandDisposes.delete(wrappedDispose);\n delete (marker.el as any).__elur_js_island_dispose;\n };\n (marker.el as any).__elur_js_island_dispose = wrappedDispose;\n _islandDisposes.add(wrappedDispose);\n } catch (error) {\n reportIslandError(marker, error);\n }\n}\n\nfunction reportIslandError(marker: IslandMarker, error: unknown): void {\n console.error(`[elur-kit] Failed to hydrate island \"${marker.name}\":`, error);\n const EventConstructor = marker.el.ownerDocument.defaultView?.CustomEvent;\n if (EventConstructor) {\n marker.el.dispatchEvent(new EventConstructor(\"elur:island-error\", {\n bubbles: true,\n detail: { name: marker.name, error },\n }));\n }\n}\n\n/**\n * Mounts a template fresh into a container (no hydration).\n * Used for islands with no SSR DOM (directive \"only\" or ssr:false) where\n * hydrateTemplate can't work — there's nothing to hydrate against.\n */\nfunction freshMount(template: ElurTemplate, container: Element): { unmount: () => void } {\n container.replaceChildren();\n const dispose = template._render(container, null);\n return { unmount: dispose };\n}\n\n/**\n * Hydrates all islands on the page using the provided registry.\n *\n * @param registry Map from island name to component factory.\n */\n/**\n * Dispose all currently hydrated islands. Called by the client router before\n * swapping the page body to prevent leaked effects and stale DOM writes.\n */\nexport function cleanupHydratedIslands(): void {\n for (const cancel of _islandSchedules) cancel();\n _islandSchedules.clear();\n for (const dispose of _islandDisposes) dispose();\n _islandDisposes.clear();\n}\n\nexport function hydrateIslands(registry: IslandRegistry): void {\n if (typeof window === \"undefined\") return;\n\n const markers = collectMarkers();\n\n for (const marker of markers) {\n if (marker.directive === \"load\" || marker.directive === \"only\") {\n // \"only\" is client-only (no SSR) but hydrates immediately on the\n // client, just like \"load\" — the difference is purely server-side.\n void hydrate(marker, registry);\n continue;\n }\n\n if (marker.directive === \"idle\") {\n let cancel = () => { };\n if (\"requestIdleCallback\" in window) {\n const id = window.requestIdleCallback(() => {\n _islandSchedules.delete(cancel);\n void hydrate(marker, registry);\n });\n cancel = () => window.cancelIdleCallback(id);\n } else {\n const id = globalThis.setTimeout(() => {\n _islandSchedules.delete(cancel);\n void hydrate(marker, registry);\n }, 0);\n cancel = () => globalThis.clearTimeout(id);\n }\n _islandSchedules.add(cancel);\n continue;\n }\n\n if (marker.directive === \"visible\") {\n if (\"IntersectionObserver\" in window) {\n let cancel = () => { };\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n _islandSchedules.delete(cancel);\n observer.disconnect();\n void hydrate(marker, registry);\n }\n }\n },\n { rootMargin: \"0px\", threshold: 0 },\n );\n cancel = () => observer.disconnect();\n _islandSchedules.add(cancel);\n observer.observe(marker.el);\n } else {\n void hydrate(marker, registry);\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./errors-0X7pCFNU.cjs"),t=require("./node-http-DhxguYyz.cjs"),n=require("./route-scanner-JY6YrNH5.cjs"),r=require("./scan-CY2O9ty6.cjs"),i=require("./interpolation-plugin-CMPCDlVJ.cjs"),a=require("./scan-DXzYtmRQ.cjs"),o=require("./image/service.cjs"),s=require("./image/registry.cjs"),c=require("./image/index.cjs"),l=require("./integrations-DDqfWjvH.cjs"),u=require("./hydrate-8a3TbQbs.cjs"),d=require("./stream-DmZjYqHm.cjs"),f=require("./runtime-CrH5X-Es.cjs"),p=require("./action-DZHihU3Z.cjs"),m=require("./adapters/vercel.cjs"),h=require("./adapters/netlify.cjs"),g=require("./adapters/bun.cjs"),_=require("./adapters/node.cjs"),v=require("./router/client.cjs"),y=require("./config/index.cjs"),b=require("./manifest/index.cjs");let x=require("node:fs/promises"),S=require("node:path"),C=require("node:fs"),w=require("node:crypto"),ee=require("@elurjs/core"),te=require("node:http"),T=require("vite"),E=require("node:async_hooks");function D(e,t){if("/"===t)return(0,S.join)(e,"index.html");let r=t.slice(1).split("/");return(0,S.join)(e,...r,"index.html")}function O(e){return e.includes(":")}function k(e,t){return e.replace(/:([a-zA-Z0-9_]+)(\*)?/g,(r,i,a)=>{let n=t[i];if(null==n)throw Error(`Missing value for dynamic segment "${i}" in path "${e}"`);return a&&Array.isArray(n)?n.join("/"):String(n)})}async function A(e){if(e.publicDir)try{(await(0,x.stat)(e.publicDir)).isDirectory()&&(await(0,x.mkdir)(e.outDir,{recursive:!0}),await(0,x.cp)(e.publicDir,e.outDir,{recursive:!0,force:!0}))}catch(e){if("ENOENT"!==e.code)throw e}let c=await n.t(e.appDir),u=await a.n(e.appDir),p=a.t(u),d={pages:0,skipped:[],files:[],islands:[],imagesProcessed:0,outDir:e.outDir};e.islandsDir&&(d.islands=await r.t(e.islandsDir)),e.generatedEntry&&(d.generatedEntry=await i.c({islands:d.islands,outFile:e.generatedEntry,hydrateImport:e.hydrateImport,routerImport:e.routerImport}));for(let t of c.pages){if(!O(t.path)){let r=await j(e,t,p);d.pages++,d.files.push(r);continue}let r=await M(e,t,p);0===r.length?d.skipped.push(t.path):(d.pages+=r.length,d.files.push(...r))}let f={lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1};if(c.error404){let r=await t.c({routes:c,status:404,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"404.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}if(c.error500){let r=await t.c({routes:c,status:500,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"500.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}let m=s.consumeImageRegistry(),h=null;if(m.length>0&&e.publicDir){let r=(0,S.join)(e.outDir,".elur","image-manifest.json"),i=await o.processImageBatch(m,{publicDir:e.publicDir,outDir:e.outDir,formats:e.imageFormats,manifestPath:r});if(d.imagesProcessed=i.count,i.optimized&&i.count>0){h=i.manifest,s.setImageManifest(h),d.pages=0,d.files=[];for(let t of c.pages){if(!O(t.path)){let r=await j(e,t,p);d.pages++,d.files.push(r);continue}let r=await M(e,t,p);0===r.length?d.skipped.push(t.path):(d.pages+=r.length,d.files.push(...r))}if(c.error404){let r=await t.c({routes:c,status:404,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"404.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}if(c.error500){let r=await t.c({routes:c,status:500,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"500.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}}}return s.setImageManifest(null),e.integrations&&e.integrations.length>0&&await l.t(e.integrations,"build",[d,{root:e.root??e.outDir,command:"build"}]),d}async function j(e,t,r){return N(e,t,{},r)}async function M(e,t,r){let{generateStaticParams:i}=await(import(t.pagePath));if(!i)return[];let a=await i();if(!Array.isArray(a)||0===a.length)return[];let n=[];for(let i of a)n.push(await N(e,t,i,r));return n}async function N(e,r,i,a){let{html:n}=await t.l({route:r,params:i,searchParams:new URLSearchParams,config:{lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1},actions:a}),o=O(r.path)?k(r.path,i):r.path,s=D(e.outDir,o);return await(0,x.mkdir)((0,S.dirname)(s),{recursive:!0}),await(0,x.writeFile)(s,n,"utf8"),s}function ne(e,t,r,i="load",a){let n="only"!==i&&(a?.ssr??!0),o=a?.fallback,s=t=>`<div data-elur-island="${L(e)}" data-directive="${i}" data-props='${R(r)}'>${t}</div>`;return{__isElurTemplate:!0,[ee.ELUR_RENDER_PROTOCOL]:{async renderServer(i){let a="";if(n)try{let e=t(r);a=null!==e&&!1!==e&&void 0!==e?await i.render(e,{markers:!0}):await F(o,i)}catch(t){throw P(e,t)}else a=await F(o,i);return s(a)}},_render(e,i){let a=document.createElement("div"),l="";if(n){let e=t(r);if(null!==e&&!1!==e&&void 0!==e){let t=e._render(a,null);l=a.innerHTML,t()}else l=I(o,a)}else l=I(o,a);let c=document.createElement("template");c.innerHTML=s(l);let u=c.content,p=u.firstChild;return e.insertBefore(u,i),()=>{p?.parentNode&&p.parentNode.removeChild(p)}}}}function P(e,t){let r=t instanceof Error?t:Error(String(t)),i=t instanceof Error?t.message:String(t);return Error(`[elur-kit] Island "${e}" threw during SSR: ${i}\n If the component accesses browser-only globals (document, window, etc.),\n use directive: "only" or options: { ssr: false } to skip server rendering.\n For environment reads (matchMedia, localStorage, navigator) you may guard\n the access with isSSR() from "@elurjs/kit".`,{cause:r})}async function F(e,t){return null==e||""===e?"":"string"==typeof e?e:t.render(e,{markers:!1})}function I(e,t){if(null==e||""===e)return"";if("string"==typeof e)return e;let r=e._render(t,null),i=t.innerHTML;return r(),i}function L(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function R(e){return JSON.stringify(e??null).replace(/</g,"\\u003c").replace(/'/g,"\\u0027")}async function z(r){let o=await n.t(r.appDir),s=await a.n(r.appDir),l=a.t(s),c=r.root?await i.i(r.root):null,u=async(e,t)=>{let r=G(t,o),i=r?s[r]:Object.values(s).find(t=>t[e])??void 0,a=i?i[e]:void 0;if(!a)return;let n=(await(import(a)))[e];return"function"==typeof n?n:void 0},p=(0,te.createServer)(async(a,n)=>{let s,p=a.url??"/";if(p.includes("?")&&(p=p.split("?")[0]),"/__elur-js/actions"===p&&"POST"===a.method){try{let e=await U(a),i=t.t(a,e),o=await t.n(i,u,r.actionSecurity);n.writeHead(o.status,Object.fromEntries(o.headers.entries())),n.end(await o.text())}catch(t){console.error("[action] error handling",t),n.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),n.end(e.l(t).message)}return}if("/__elur-js/render"===p){let e=new URL(a.url??"/","http://localhost"),i=e.searchParams.get("page")??"/",s=e.searchParams.get("search")??"",c=(a.headers.accept??"").includes("application/json");try{let e,u,p,m,h=t.t(a),g=await K(r,i,o),w=`/__elur-js/render${i}?${s}`;if(r.cacheDir&&"number"==typeof g&&V(h)){let t=await f.g(r.cacheDir,w);if(t)e=q(t.html),u=J(t.html);else{let t=await d.n({routes:o,pathname:i,searchParams:new URLSearchParams(s),config:{lang:r.lang??"es",clientEntry:r.clientEntry},actions:l,request:h});e=t.body,u=t.title,p=t.clearActionErrorCookie,m=t.head,await f._(r.cacheDir,w,t.fullHtml??"",g)}}else{let t=await d.n({routes:o,pathname:i,searchParams:new URLSearchParams(s),config:{lang:r.lang??"es",clientEntry:r.clientEntry},actions:l,request:h});e=t.body,u=t.title,p=t.clearActionErrorCookie,m=t.head}if(c){let t={"Content-Type":"application/json; charset=utf-8"},r=p;r&&(t["X-Elur-Action-Clear-Cookie"]=r),n.writeHead(200,t),n.end(JSON.stringify({title:u,body:e,head:m,clearActionErrorCookie:r}))}else{let t={"Content-Type":"text/html; charset=utf-8"};p&&(t["Set-Cookie"]=p),n.writeHead(200,t),n.end(e)}}catch(e){if(e instanceof d.t)return console.log(`[ssr] render endpoint: no route for ${i}`),n.writeHead(404,{"Content-Type":"text/plain"}),void n.end("Not Found");console.error("[ssr] streaming render error",e),n.writeHead(500,{"Content-Type":"text/plain"}),n.end("Internal Server Error")}return}if(c&&i.a(p,c.config)){let e=await i.o(c,t.t(a));if("response"===e.kind)return n.writeHead(e.response.status,Object.fromEntries(e.response.headers.entries())),void n.end(Buffer.from(await e.response.arrayBuffer()));s=e.headers}let m=t.a(p,o.api);if(m){try{let e=(await(import(m.route.routePath)))[a.method??"GET"];if("function"!=typeof e)return n.writeHead(405,{"Content-Type":"text/plain"}),void n.end(`Method not allowed: ${a.method}`);let r=a.method&&"GET"!==a.method&&"HEAD"!==a.method?await U(a):void 0,i=t.t(a,r);H(i.headers,s);let o=await e(i,{params:m.params});n.writeHead(o.status,Object.fromEntries(o.headers.entries())),n.end(Buffer.from(await o.arrayBuffer()))}catch(t){console.error("[api] error handling",p,t),n.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),n.end(e.l(t).message)}return}if(r.publicDir)try{if(await B(n,r.publicDir,p))return}catch(e){console.error("[static] error serving",p,e)}let h=t.o(p,o.pages),g={lang:r.lang??"es",clientEntry:r.clientEntry};if(h)try{let e=t.t(a);H(e.headers,s);let i,o,c=(h.route.dataPath?(await(import(h.route.dataPath))).revalidate:void 0)??r.defaultRevalidate;if(!1!==r.streaming&&h.route.loadingPath)i=await d.r({route:h.route,params:h.params,searchParams:new URLSearchParams(a.url?.split("?")[1]??""),config:g,actions:l,request:e});else if(r.cacheDir&&"number"==typeof c&&V(e)){let n=new URL(e.url).pathname+new URL(e.url).search,s=await f.g(r.cacheDir,n);if(s)i=s.html;else{let s=await t.l({route:h.route,params:h.params,searchParams:new URLSearchParams(a.url?.split("?")[1]??""),config:g,actions:l,request:e});i=s.html,o=s.clearActionErrorCookie,await f._(r.cacheDir,n,i,c)}}else{let r=await t.l({route:h.route,params:h.params,searchParams:new URLSearchParams(a.url?.split("?")[1]??""),config:g,actions:l,request:e});i=r.html,o=r.clearActionErrorCookie}let u={"Content-Type":"text/html; charset=utf-8"};return o&&(u["Set-Cookie"]=o),n.writeHead(200,u),void n.end(i)}catch(a){console.error("[ssr] error rendering",p,a);let r=await t.c({routes:o,status:500,error:a,config:g,actions:l});return void(r?(n.writeHead(r.status,{"Content-Type":"text/html; charset=utf-8"}),n.end(r.html)):(n.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),n.end(e.l(a).message)))}let w=await t.c({routes:o,status:404,config:g,actions:l});if(w)return n.writeHead(w.status,{"Content-Type":"text/html; charset=utf-8"}),void n.end(w.html);n.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"}),n.end(`Not found: ${a.url}`)});return{server:p,listen:()=>new Promise(e=>{p.listen(r.port??3e3,r.host??"127.0.0.1",()=>{console.log(`\n → SSR server http://${r.host??"127.0.0.1"}:${r.port??3e3}`),e()})}),close:()=>new Promise((e,t)=>{p.close(r=>r?t(r):e())})}}async function B(e,t,r){let i=await f.m(t,r);if(!i)return!1;let a=W(i),n=await(0,x.readFile)(i);return a.includes("text/html")&&(n=n.toString("utf8").replace('<meta name="elur:render-endpoint" content="off" />','<meta name="elur:render-endpoint" content="on" />')),e.writeHead(200,{"Content-Type":a,"Content-Length":Buffer.byteLength(n)}),e.end(n),!0}function V(e){return!e.headers.has("cookie")&&!e.headers.has("authorization")}function H(e,t){if(t)for(let[r,i]of Object.entries(t))e.set(r,i)}function U(e){return new Promise((t,r)=>{let i="";e.setEncoding("utf8"),e.on("data",e=>{i+=e}),e.on("end",()=>t(i)),e.on("error",r)})}function W(e){switch((0,S.extname)(e)){case".html":return"text/html; charset=utf-8";case".js":case".mjs":return"application/javascript; charset=utf-8";case".css":return"text/css; charset=utf-8";case".json":return"application/json; charset=utf-8";case".svg":return"image/svg+xml";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".avif":return"image/avif";case".ico":return"image/x-icon";case".woff":return"font/woff";case".woff2":return"font/woff2";case".wasm":return"application/wasm";default:return"application/octet-stream"}}function G(e,r){if(!e)return;if(r.pages.some(t=>t.path===e))return e;let i=t.o(e,r.pages);return i?i.route.path:e}async function K(e,r,i){let a=t.o(r,i.pages);if(a)return(a.route.dataPath?(await(import(a.route.dataPath))).revalidate:void 0)??e.defaultRevalidate}function q(e){let t=e.match(/<div id="app">([\s\S]*)<\/div>\s*(<script|$)/);return t?t[1].trim():e}function J(e){let t=e.match(/<title>([^<]*)<\/title>/);return t?t[1]:""}var Y;async function X(){if(null===Y)return null;if(Y)return Y();try{let e=(await(import("sharp"))).default;return"function"==typeof e?(Y=async()=>e,e):(Y=null,null)}catch{return Y=null,null}}async function re(e,t){let r=await X();if(!r)return console.warn("[elur-kit] Image optimization requires `sharp`. Install it with:\n npm install sharp\n # or\n bun add sharp\nSkipping image processing — using original files."),[];let{publicDir:i,outDir:a,formats:n=["webp","avif"],quality:o=80}=t,s=[],l=!1;for(let{src:t,widths:c,formats:u}of e){let p=(0,S.join)(i,t.replace(/^\//,""));try{await(0,x.stat)(p)}catch{l||=(console.warn(`[elur-kit] Image not found: ${p}. Skipping.`),!0);continue}let d=await(0,x.readFile)(p),f=(0,w.createHash)("md5").update(d).digest("hex").slice(0,8),m=(0,S.extname)(t),h=(0,S.basename)(t,m),g=(0,S.dirname)(t),y=[],v=u.length>0?u:n;for(let t of c)for(let i of v){let n=`${h}-${t}w-${f}.${i}`,s=(0,S.join)(g,n),l=(0,S.join)(a,s.replace(/^\//,""));try{await(0,x.mkdir)((0,S.dirname)(l),{recursive:!0}),await r(d).resize({width:t,withoutEnlargement:!0}).toFormat(i,{quality:o}).toFile(l),y.push({path:s,width:t,format:i})}catch(e){console.warn(`[elur-kit] Failed to generate ${n}:`,e)}}y.length>0&&s.push({src:t,variants:y})}return s}async function ie(){return null!==await X()}var ae=new E.AsyncLocalStorage;function oe(e){let t=`elur-stream-${(0,w.randomUUID)().slice(0,8)}`,r=ae.getStore();return r&&r.boundaries.set(t,{promise:e.promise,children:e.children}),{__isElurTemplate:!0,mount(r){let i="string"==typeof r?document.querySelector(r):r;if(!i)throw Error("[elur-kit] streamBoundary(): container not found");let a=e.fallback.mount(i);return e.promise.then(t=>{let r=e.children(t);i.innerHTML="";let n=r.mount(i);a.__elurChildHandle=n}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),{unmount(){let e=a.__elurChildHandle;e?.unmount&&e.unmount(),a.unmount()}}},_render(r,i){let a=e.fallback._render(r,i);return e.promise.then(e=>{}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),a}}}async function se(e){let t=e.logPrefix??"[client]";console.log(`${t} Building hydration bundle...`);let r=await ce(e.userConfigPath,e.root),a=i.r(e.interpolation??"auto")?i.n({appDir:e.appDir,islandsDir:e.islandsDir}):[],n={...r,root:e.root,base:e.base??r.base??"/",build:{...r.build??{},outDir:e.outDir,emptyOutDir:!0},plugins:[...r.plugins??[],a],configFile:!1},o=await(0,T.build)(n),s=(Array.isArray(o)?o:[o]).reduce((e,t)=>e+("output"in t?t.output?.length??0:0),0);return console.log(`${t} ✓ ${s} asset(s) emitted → ${(0,S.relative)(e.root,e.outDir)}`),{outDir:e.outDir,outputCount:s}}async function ce(e,t){let r=await(import(e)),i=r.default??r,a="function"==typeof i?await i({command:"build",mode:"production"}):i;return(a&&"function"==typeof a.then?await a:a)??{}}async function Z(e){let t=(0,S.resolve)(e.outDir),r=(0,S.resolve)(e.tempDir??(0,S.join)((0,S.dirname)(t),`.${le(t)}.tmp-${process.pid}`));return await(0,x.rm)(r,{recursive:!0,force:!0}),await(0,x.mkdir)(r,{recursive:!0}),{tempDir:r,commit:async()=>{let i=e.keepExisting&&(0,C.existsSync)(t)?`${t}.bak-${process.pid}`:void 0;i&&(await(0,x.rm)(i,{recursive:!0,force:!0}),await Q(t,i));try{await Q(r,t)}catch(e){if(!$(e))throw i&&await Q(i,t),e;await(0,x.cp)(r,t,{recursive:!0,force:!0}),await(0,x.rm)(r,{recursive:!0,force:!0})}i&&await(0,x.rm)(i,{recursive:!0,force:!0})},rollback:async()=>{await(0,x.rm)(r,{recursive:!0,force:!0})}}}function le(e){let t=e.split(/[\\/]+/).filter(Boolean);return t[t.length-1]??"output"}async function Q(e,t){await(0,x.rm)(t,{recursive:!0,force:!0});try{await(0,x.rename)(e,t)}catch(r){if(!$(r))throw r;await(0,x.cp)(e,t,{recursive:!0,force:!0}),await(0,x.rm)(e,{recursive:!0,force:!0})}}function $(e){return"EXDEV"===e?.code}async function ue(e){try{if(await(0,x.access)(e.publicDir),!(await(0,x.stat)(e.publicDir)).isDirectory())return 0}catch{return 0}return await(0,x.mkdir)(e.outDir,{recursive:!0}),await(0,x.cp)(e.publicDir,e.outDir,{recursive:!0,force:!0}),de(e.outDir)}async function de(e){let{readdir:t}=await(import("node:fs/promises")),r=0;return await async function e(i){let a=await t(i,{withFileTypes:!0});for(let t of a){let a=(0,S.join)(i,t.name);t.isDirectory()?await e(a):r++}}(e),r}exports.ACTION_ERROR_COOKIE=t.d,exports.ActionFailure=e.t,exports.RedirectResponse=e.n,exports.RequestContext=f.a,exports.assertClientImportAllowed=b.assertClientImportAllowed,exports.beginAtomicStage=Z,exports.build=A,exports.buildClientBundle=se,exports.buildEntrySource=i.s,exports.buildHeadTags=t.g,exports.buildPictureMarkup=o.buildPictureMarkup,exports.buildSrcset=o.buildSrcset,exports.bunAdapter=g.bunAdapter,exports.callAction=p.t,exports.clearActionErrorCookieHeader=t.f,exports.clearCache=f.h,exports.collectShellExtras=t.s,exports.consumeImageRegistry=s.consumeImageRegistry,exports.copyPublicAssets=ue,exports.createAppManifest=b.createAppManifest,exports.createSsrServer=z,exports.createWebHandler=f.t,exports.decodeActionErrorCookie=t.p,exports.defineAction=p.r,exports.defineConfig=y.defineConfig,exports.documentShell=t._,exports.encodeActionErrorCookie=t.m,exports.fail=e.i,exports.generateClientEntry=i.c,exports.getCachedHtml=f.g,exports.getManifestEntry=o.getManifestEntry,exports.guessContentType=f.o,exports.handleActionRequest=t.n,exports.htmlResponse=f.s,exports.hydrateIslands=u.n,exports.image=c.image,exports.incomingMessageToRequest=t.t,exports.isSSR=t.y,exports.isSharpAvailable=ie,exports.island=ne,exports.jsonResponse=f.c,exports.loadElurConfig=y.loadElurConfig,exports.loadMiddleware=i.i,exports.matchApiRoute=t.a,exports.matchRoute=t.o,exports.matchesMiddleware=i.a,exports.methodNotAllowed=f.l,exports.netlifyAdapter=h.netlifyAdapter,exports.nodeAdapter=_.nodeAdapter,exports.notFound=f.u,exports.originForbidden=t.r,exports.processImageBatch=o.processImageBatch,exports.processImages=re,exports.readManifest=o.readManifest,exports.redirect=e.c,exports.renderErrorPage=t.c,exports.renderPage=t.l,exports.renderPageBody=d.n,exports.renderStreamingPage=d.r,exports.renderToString=t.v,exports.resolveStaticFile=f.m,exports.runIntegrationHook=l.t,exports.runMiddleware=i.o,exports.scanActions=a.n,exports.scanIslands=r.t,exports.scanRoutes=n.t,exports.serveStaticFile=f.d,exports.serverError=f.f,exports.setActionErrorCookieHeader=t.h,exports.setCachedHtml=f._,exports.setImageManifest=s.setImageManifest,exports.startClientRouter=v.startClientRouter,exports.streamBoundary=oe,exports.textResponse=f.p,exports.validateManifestRoutes=b.validateManifestRoutes,exports.validateManifestUrls=o.validateManifestUrls,exports.vercelAdapter=m.vercelAdapter,exports.verifyOrigin=t.i,exports.writeAppManifest=b.writeAppManifest,exports.writeManifest=o.writeManifest,exports.writeRouteTypes=b.writeRouteTypes;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./errors-0X7pCFNU.cjs"),t=require("./node-http-DhxguYyz.cjs"),n=require("./route-scanner-JY6YrNH5.cjs"),r=require("./scan-CY2O9ty6.cjs"),i=require("./interpolation-plugin-CMPCDlVJ.cjs"),a=require("./scan-DXzYtmRQ.cjs"),o=require("./image/service.cjs"),s=require("./image/registry.cjs"),c=require("./image/index.cjs"),l=require("./integrations-DDqfWjvH.cjs"),u=require("./hydrate-D6MR24mz.cjs"),d=require("./stream-DmZjYqHm.cjs"),f=require("./runtime-CrH5X-Es.cjs"),p=require("./action-DZHihU3Z.cjs"),m=require("./adapters/vercel.cjs"),h=require("./adapters/netlify.cjs"),g=require("./adapters/bun.cjs"),_=require("./adapters/node.cjs"),v=require("./router/client.cjs"),y=require("./config/index.cjs"),b=require("./manifest/index.cjs");let x=require("node:fs/promises"),S=require("node:path"),C=require("node:fs"),w=require("node:crypto"),ee=require("@elurjs/core"),te=require("node:http"),T=require("vite"),E=require("node:async_hooks");function D(e,t){if("/"===t)return(0,S.join)(e,"index.html");let r=t.slice(1).split("/");return(0,S.join)(e,...r,"index.html")}function O(e){return e.includes(":")}function k(e,t){return e.replace(/:([a-zA-Z0-9_]+)(\*)?/g,(r,i,a)=>{let n=t[i];if(null==n)throw Error(`Missing value for dynamic segment "${i}" in path "${e}"`);return a&&Array.isArray(n)?n.join("/"):String(n)})}async function A(e){if(e.publicDir)try{(await(0,x.stat)(e.publicDir)).isDirectory()&&(await(0,x.mkdir)(e.outDir,{recursive:!0}),await(0,x.cp)(e.publicDir,e.outDir,{recursive:!0,force:!0}))}catch(e){if("ENOENT"!==e.code)throw e}let c=await n.t(e.appDir),u=await a.n(e.appDir),p=a.t(u),d={pages:0,skipped:[],files:[],islands:[],imagesProcessed:0,outDir:e.outDir};e.islandsDir&&(d.islands=await r.t(e.islandsDir)),e.generatedEntry&&(d.generatedEntry=await i.c({islands:d.islands,outFile:e.generatedEntry,hydrateImport:e.hydrateImport,routerImport:e.routerImport}));for(let t of c.pages){if(!O(t.path)){let r=await j(e,t,p);d.pages++,d.files.push(r);continue}let r=await M(e,t,p);0===r.length?d.skipped.push(t.path):(d.pages+=r.length,d.files.push(...r))}let f={lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1};if(c.error404){let r=await t.c({routes:c,status:404,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"404.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}if(c.error500){let r=await t.c({routes:c,status:500,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"500.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}let m=s.consumeImageRegistry(),h=null;if(m.length>0&&e.publicDir){let r=(0,S.join)(e.outDir,".elur","image-manifest.json"),i=await o.processImageBatch(m,{publicDir:e.publicDir,outDir:e.outDir,formats:e.imageFormats,manifestPath:r});if(d.imagesProcessed=i.count,i.optimized&&i.count>0){h=i.manifest,s.setImageManifest(h),d.pages=0,d.files=[];for(let t of c.pages){if(!O(t.path)){let r=await j(e,t,p);d.pages++,d.files.push(r);continue}let r=await M(e,t,p);0===r.length?d.skipped.push(t.path):(d.pages+=r.length,d.files.push(...r))}if(c.error404){let r=await t.c({routes:c,status:404,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"404.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}if(c.error500){let r=await t.c({routes:c,status:500,config:f,actions:p});if(r){let t=(0,S.join)(e.outDir,"500.html");await(0,x.mkdir)((0,S.dirname)(t),{recursive:!0}),await(0,x.writeFile)(t,r.html,"utf8"),d.files.push(t)}}}}return s.setImageManifest(null),e.integrations&&e.integrations.length>0&&await l.t(e.integrations,"build",[d,{root:e.root??e.outDir,command:"build"}]),d}async function j(e,t,r){return N(e,t,{},r)}async function M(e,t,r){let{generateStaticParams:i}=await(import(t.pagePath));if(!i)return[];let a=await i();if(!Array.isArray(a)||0===a.length)return[];let n=[];for(let i of a)n.push(await N(e,t,i,r));return n}async function N(e,r,i,a){let{html:n}=await t.l({route:r,params:i,searchParams:new URLSearchParams,config:{lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1},actions:a}),o=O(r.path)?k(r.path,i):r.path,s=D(e.outDir,o);return await(0,x.mkdir)((0,S.dirname)(s),{recursive:!0}),await(0,x.writeFile)(s,n,"utf8"),s}function ne(e,t,r,i="load",a){let n="only"!==i&&(a?.ssr??!0),o=a?.fallback,s=t=>`<div data-elur-island="${L(e)}" data-directive="${i}" data-props='${R(r)}'>${t}</div>`;return{__isElurTemplate:!0,[ee.ELUR_RENDER_PROTOCOL]:{async renderServer(i){let a="";if(n)try{let e=t(r);a=null!==e&&!1!==e&&void 0!==e?await i.render(e,{markers:!0}):await F(o,i)}catch(t){throw P(e,t)}else a=await F(o,i);return s(a)}},_render(e,i){let a=document.createElement("div"),l="";if(n){let e=t(r);if(null!==e&&!1!==e&&void 0!==e){let t=e._render(a,null);l=a.innerHTML,t()}else l=I(o,a)}else l=I(o,a);let c=document.createElement("template");c.innerHTML=s(l);let u=c.content,p=u.firstChild;return e.insertBefore(u,i),()=>{p?.parentNode&&p.parentNode.removeChild(p)}}}}function P(e,t){let r=t instanceof Error?t:Error(String(t)),i=t instanceof Error?t.message:String(t);return Error(`[elur-kit] Island "${e}" threw during SSR: ${i}\n If the component accesses browser-only globals (document, window, etc.),\n use directive: "only" or options: { ssr: false } to skip server rendering.\n For environment reads (matchMedia, localStorage, navigator) you may guard\n the access with isSSR() from "@elurjs/kit".`,{cause:r})}async function F(e,t){return null==e||""===e?"":"string"==typeof e?e:t.render(e,{markers:!1})}function I(e,t){if(null==e||""===e)return"";if("string"==typeof e)return e;let r=e._render(t,null),i=t.innerHTML;return r(),i}function L(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function R(e){return JSON.stringify(e??null).replace(/</g,"\\u003c").replace(/'/g,"\\u0027")}async function z(r){let o=await n.t(r.appDir),s=await a.n(r.appDir),l=a.t(s),c=r.root?await i.i(r.root):null,u=async(e,t)=>{let r=G(t,o),i=r?s[r]:Object.values(s).find(t=>t[e])??void 0,a=i?i[e]:void 0;if(!a)return;let n=(await(import(a)))[e];return"function"==typeof n?n:void 0},p=(0,te.createServer)(async(a,n)=>{let s,p=a.url??"/";if(p.includes("?")&&(p=p.split("?")[0]),"/__elur-js/actions"===p&&"POST"===a.method){try{let e=await U(a),i=t.t(a,e),o=await t.n(i,u,r.actionSecurity);n.writeHead(o.status,Object.fromEntries(o.headers.entries())),n.end(await o.text())}catch(t){console.error("[action] error handling",t),n.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),n.end(e.l(t).message)}return}if("/__elur-js/render"===p){let e=new URL(a.url??"/","http://localhost"),i=e.searchParams.get("page")??"/",s=e.searchParams.get("search")??"",c=(a.headers.accept??"").includes("application/json");try{let e,u,p,m,h=t.t(a),g=await K(r,i,o),w=`/__elur-js/render${i}?${s}`;if(r.cacheDir&&"number"==typeof g&&V(h)){let t=await f.g(r.cacheDir,w);if(t)e=q(t.html),u=J(t.html);else{let t=await d.n({routes:o,pathname:i,searchParams:new URLSearchParams(s),config:{lang:r.lang??"es",clientEntry:r.clientEntry},actions:l,request:h});e=t.body,u=t.title,p=t.clearActionErrorCookie,m=t.head,await f._(r.cacheDir,w,t.fullHtml??"",g)}}else{let t=await d.n({routes:o,pathname:i,searchParams:new URLSearchParams(s),config:{lang:r.lang??"es",clientEntry:r.clientEntry},actions:l,request:h});e=t.body,u=t.title,p=t.clearActionErrorCookie,m=t.head}if(c){let t={"Content-Type":"application/json; charset=utf-8"},r=p;r&&(t["X-Elur-Action-Clear-Cookie"]=r),n.writeHead(200,t),n.end(JSON.stringify({title:u,body:e,head:m,clearActionErrorCookie:r}))}else{let t={"Content-Type":"text/html; charset=utf-8"};p&&(t["Set-Cookie"]=p),n.writeHead(200,t),n.end(e)}}catch(e){if(e instanceof d.t)return console.log(`[ssr] render endpoint: no route for ${i}`),n.writeHead(404,{"Content-Type":"text/plain"}),void n.end("Not Found");console.error("[ssr] streaming render error",e),n.writeHead(500,{"Content-Type":"text/plain"}),n.end("Internal Server Error")}return}if(c&&i.a(p,c.config)){let e=await i.o(c,t.t(a));if("response"===e.kind)return n.writeHead(e.response.status,Object.fromEntries(e.response.headers.entries())),void n.end(Buffer.from(await e.response.arrayBuffer()));s=e.headers}let m=t.a(p,o.api);if(m){try{let e=(await(import(m.route.routePath)))[a.method??"GET"];if("function"!=typeof e)return n.writeHead(405,{"Content-Type":"text/plain"}),void n.end(`Method not allowed: ${a.method}`);let r=a.method&&"GET"!==a.method&&"HEAD"!==a.method?await U(a):void 0,i=t.t(a,r);H(i.headers,s);let o=await e(i,{params:m.params});n.writeHead(o.status,Object.fromEntries(o.headers.entries())),n.end(Buffer.from(await o.arrayBuffer()))}catch(t){console.error("[api] error handling",p,t),n.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),n.end(e.l(t).message)}return}if(r.publicDir)try{if(await B(n,r.publicDir,p))return}catch(e){console.error("[static] error serving",p,e)}let h=t.o(p,o.pages),g={lang:r.lang??"es",clientEntry:r.clientEntry};if(h)try{let e=t.t(a);H(e.headers,s);let i,o,c=(h.route.dataPath?(await(import(h.route.dataPath))).revalidate:void 0)??r.defaultRevalidate;if(!1!==r.streaming&&h.route.loadingPath)i=await d.r({route:h.route,params:h.params,searchParams:new URLSearchParams(a.url?.split("?")[1]??""),config:g,actions:l,request:e});else if(r.cacheDir&&"number"==typeof c&&V(e)){let n=new URL(e.url).pathname+new URL(e.url).search,s=await f.g(r.cacheDir,n);if(s)i=s.html;else{let s=await t.l({route:h.route,params:h.params,searchParams:new URLSearchParams(a.url?.split("?")[1]??""),config:g,actions:l,request:e});i=s.html,o=s.clearActionErrorCookie,await f._(r.cacheDir,n,i,c)}}else{let r=await t.l({route:h.route,params:h.params,searchParams:new URLSearchParams(a.url?.split("?")[1]??""),config:g,actions:l,request:e});i=r.html,o=r.clearActionErrorCookie}let u={"Content-Type":"text/html; charset=utf-8"};return o&&(u["Set-Cookie"]=o),n.writeHead(200,u),void n.end(i)}catch(a){console.error("[ssr] error rendering",p,a);let r=await t.c({routes:o,status:500,error:a,config:g,actions:l});return void(r?(n.writeHead(r.status,{"Content-Type":"text/html; charset=utf-8"}),n.end(r.html)):(n.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),n.end(e.l(a).message)))}let w=await t.c({routes:o,status:404,config:g,actions:l});if(w)return n.writeHead(w.status,{"Content-Type":"text/html; charset=utf-8"}),void n.end(w.html);n.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"}),n.end(`Not found: ${a.url}`)});return{server:p,listen:()=>new Promise(e=>{p.listen(r.port??3e3,r.host??"127.0.0.1",()=>{console.log(`\n → SSR server http://${r.host??"127.0.0.1"}:${r.port??3e3}`),e()})}),close:()=>new Promise((e,t)=>{p.close(r=>r?t(r):e())})}}async function B(e,t,r){let i=await f.m(t,r);if(!i)return!1;let a=W(i),n=await(0,x.readFile)(i);return a.includes("text/html")&&(n=n.toString("utf8").replace('<meta name="elur:render-endpoint" content="off" />','<meta name="elur:render-endpoint" content="on" />')),e.writeHead(200,{"Content-Type":a,"Content-Length":Buffer.byteLength(n)}),e.end(n),!0}function V(e){return!e.headers.has("cookie")&&!e.headers.has("authorization")}function H(e,t){if(t)for(let[r,i]of Object.entries(t))e.set(r,i)}function U(e){return new Promise((t,r)=>{let i="";e.setEncoding("utf8"),e.on("data",e=>{i+=e}),e.on("end",()=>t(i)),e.on("error",r)})}function W(e){switch((0,S.extname)(e)){case".html":return"text/html; charset=utf-8";case".js":case".mjs":return"application/javascript; charset=utf-8";case".css":return"text/css; charset=utf-8";case".json":return"application/json; charset=utf-8";case".svg":return"image/svg+xml";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".avif":return"image/avif";case".ico":return"image/x-icon";case".woff":return"font/woff";case".woff2":return"font/woff2";case".wasm":return"application/wasm";default:return"application/octet-stream"}}function G(e,r){if(!e)return;if(r.pages.some(t=>t.path===e))return e;let i=t.o(e,r.pages);return i?i.route.path:e}async function K(e,r,i){let a=t.o(r,i.pages);if(a)return(a.route.dataPath?(await(import(a.route.dataPath))).revalidate:void 0)??e.defaultRevalidate}function q(e){let t=e.match(/<div id="app">([\s\S]*)<\/div>\s*(<script|$)/);return t?t[1].trim():e}function J(e){let t=e.match(/<title>([^<]*)<\/title>/);return t?t[1]:""}var Y;async function X(){if(null===Y)return null;if(Y)return Y();try{let e=(await(import(`sharp`))).default;return"function"==typeof e?(Y=async()=>e,e):(Y=null,null)}catch{return Y=null,null}}async function re(e,t){let r=await X();if(!r)return console.warn("[elur-kit] Image optimization requires `sharp`. Install it with:\n npm install sharp\n # or\n bun add sharp\nSkipping image processing — using original files."),[];let{publicDir:i,outDir:a,formats:n=["webp","avif"],quality:o=80}=t,s=[],l=!1;for(let{src:t,widths:c,formats:u}of e){let p=(0,S.join)(i,t.replace(/^\//,""));try{await(0,x.stat)(p)}catch{l||=(console.warn(`[elur-kit] Image not found: ${p}. Skipping.`),!0);continue}let d=await(0,x.readFile)(p),f=(0,w.createHash)("md5").update(d).digest("hex").slice(0,8),m=(0,S.extname)(t),h=(0,S.basename)(t,m),g=(0,S.dirname)(t),y=[],v=u.length>0?u:n;for(let t of c)for(let i of v){let n=`${h}-${t}w-${f}.${i}`,s=(0,S.join)(g,n),l=(0,S.join)(a,s.replace(/^\//,""));try{await(0,x.mkdir)((0,S.dirname)(l),{recursive:!0}),await r(d).resize({width:t,withoutEnlargement:!0}).toFormat(i,{quality:o}).toFile(l),y.push({path:s,width:t,format:i})}catch(e){console.warn(`[elur-kit] Failed to generate ${n}:`,e)}}y.length>0&&s.push({src:t,variants:y})}return s}async function ie(){return null!==await X()}var ae=new E.AsyncLocalStorage;function oe(e){let t=`elur-stream-${(0,w.randomUUID)().slice(0,8)}`,r=ae.getStore();return r&&r.boundaries.set(t,{promise:e.promise,children:e.children}),{__isElurTemplate:!0,mount(r){let i="string"==typeof r?document.querySelector(r):r;if(!i)throw Error("[elur-kit] streamBoundary(): container not found");let a=e.fallback.mount(i);return e.promise.then(t=>{let r=e.children(t);i.innerHTML="";let n=r.mount(i);a.__elurChildHandle=n}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),{unmount(){let e=a.__elurChildHandle;e?.unmount&&e.unmount(),a.unmount()}}},_render(r,i){let a=e.fallback._render(r,i);return e.promise.then(e=>{}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),a}}}async function se(e){let t=e.logPrefix??"[client]";console.log(`${t} Building hydration bundle...`);let r=await ce(e.userConfigPath,e.root),a=i.r(e.interpolation??"auto")?i.n({appDir:e.appDir,islandsDir:e.islandsDir}):[],n={...r,root:e.root,base:e.base??r.base??"/",build:{...r.build??{},outDir:e.outDir,emptyOutDir:!0},plugins:[...r.plugins??[],a],configFile:!1},o=await(0,T.build)(n),s=(Array.isArray(o)?o:[o]).reduce((e,t)=>e+("output"in t?t.output?.length??0:0),0);return console.log(`${t} ✓ ${s} asset(s) emitted → ${(0,S.relative)(e.root,e.outDir)}`),{outDir:e.outDir,outputCount:s}}async function ce(e,t){let r=await(import(e)),i=r.default??r,a="function"==typeof i?await i({command:"build",mode:"production"}):i;return(a&&"function"==typeof a.then?await a:a)??{}}async function Z(e){let t=(0,S.resolve)(e.outDir),r=(0,S.resolve)(e.tempDir??(0,S.join)((0,S.dirname)(t),`.${le(t)}.tmp-${process.pid}`));return await(0,x.rm)(r,{recursive:!0,force:!0}),await(0,x.mkdir)(r,{recursive:!0}),{tempDir:r,commit:async()=>{let i=e.keepExisting&&(0,C.existsSync)(t)?`${t}.bak-${process.pid}`:void 0;i&&(await(0,x.rm)(i,{recursive:!0,force:!0}),await Q(t,i));try{await Q(r,t)}catch(e){if(!$(e))throw i&&await Q(i,t),e;await(0,x.cp)(r,t,{recursive:!0,force:!0}),await(0,x.rm)(r,{recursive:!0,force:!0})}i&&await(0,x.rm)(i,{recursive:!0,force:!0})},rollback:async()=>{await(0,x.rm)(r,{recursive:!0,force:!0})}}}function le(e){let t=e.split(/[\\/]+/).filter(Boolean);return t[t.length-1]??"output"}async function Q(e,t){await(0,x.rm)(t,{recursive:!0,force:!0});try{await(0,x.rename)(e,t)}catch(r){if(!$(r))throw r;await(0,x.cp)(e,t,{recursive:!0,force:!0}),await(0,x.rm)(e,{recursive:!0,force:!0})}}function $(e){return"EXDEV"===e?.code}async function ue(e){try{if(await(0,x.access)(e.publicDir),!(await(0,x.stat)(e.publicDir)).isDirectory())return 0}catch{return 0}return await(0,x.mkdir)(e.outDir,{recursive:!0}),await(0,x.cp)(e.publicDir,e.outDir,{recursive:!0,force:!0}),de(e.outDir)}async function de(e){let{readdir:t}=await(import(`node:fs/promises`)),r=0;return await async function e(i){let a=await t(i,{withFileTypes:!0});for(let t of a){let a=(0,S.join)(i,t.name);t.isDirectory()?await e(a):r++}}(e),r}exports.ACTION_ERROR_COOKIE=t.d,exports.ActionFailure=e.t,exports.RedirectResponse=e.n,exports.RequestContext=f.a,exports.assertClientImportAllowed=b.assertClientImportAllowed,exports.beginAtomicStage=Z,exports.build=A,exports.buildClientBundle=se,exports.buildEntrySource=i.s,exports.buildHeadTags=t.g,exports.buildPictureMarkup=o.buildPictureMarkup,exports.buildSrcset=o.buildSrcset,exports.bunAdapter=g.bunAdapter,exports.callAction=p.t,exports.clearActionErrorCookieHeader=t.f,exports.clearCache=f.h,exports.collectShellExtras=t.s,exports.consumeImageRegistry=s.consumeImageRegistry,exports.copyPublicAssets=ue,exports.createAppManifest=b.createAppManifest,exports.createSsrServer=z,exports.createWebHandler=f.t,exports.decodeActionErrorCookie=t.p,exports.defineAction=p.r,exports.defineConfig=y.defineConfig,exports.documentShell=t._,exports.encodeActionErrorCookie=t.m,exports.fail=e.i,exports.generateClientEntry=i.c,exports.getCachedHtml=f.g,exports.getManifestEntry=o.getManifestEntry,exports.guessContentType=f.o,exports.handleActionRequest=t.n,exports.htmlResponse=f.s,exports.hydrateIslands=u.n,exports.image=c.image,exports.incomingMessageToRequest=t.t,exports.isSSR=t.y,exports.isSharpAvailable=ie,exports.island=ne,exports.jsonResponse=f.c,exports.loadElurConfig=y.loadElurConfig,exports.loadMiddleware=i.i,exports.matchApiRoute=t.a,exports.matchRoute=t.o,exports.matchesMiddleware=i.a,exports.methodNotAllowed=f.l,exports.netlifyAdapter=h.netlifyAdapter,exports.nodeAdapter=_.nodeAdapter,exports.notFound=f.u,exports.originForbidden=t.r,exports.processImageBatch=o.processImageBatch,exports.processImages=re,exports.readManifest=o.readManifest,exports.redirect=e.c,exports.renderErrorPage=t.c,exports.renderPage=t.l,exports.renderPageBody=d.n,exports.renderStreamingPage=d.r,exports.renderToString=t.v,exports.resolveStaticFile=f.m,exports.runIntegrationHook=l.t,exports.runMiddleware=i.o,exports.scanActions=a.n,exports.scanIslands=r.t,exports.scanRoutes=n.t,exports.serveStaticFile=f.d,exports.serverError=f.f,exports.setActionErrorCookieHeader=t.h,exports.setCachedHtml=f._,exports.setImageManifest=s.setImageManifest,exports.startClientRouter=v.startClientRouter,exports.streamBoundary=oe,exports.textResponse=f.p,exports.validateManifestRoutes=b.validateManifestRoutes,exports.validateManifestUrls=o.validateManifestUrls,exports.vercelAdapter=m.vercelAdapter,exports.verifyOrigin=t.i,exports.writeAppManifest=b.writeAppManifest,exports.writeManifest=o.writeManifest,exports.writeRouteTypes=b.writeRouteTypes;
package/dist/lib/index.js CHANGED
@@ -1 +1 @@
1
- import{c as e,i as t,l as n,n as r,t as i}from"./errors-ePYxDlhU.js";import{_ as a,a as o,c as s,d as c,f as l,g as u,h as d,i as f,l as p,m,n as h,o as g,p as _,r as v,s as ee,t as y,v as te,y as ne}from"./node-http-DRAUhO0c.js";import{t as b}from"./route-scanner-XcLId7lK.js";import{t as re}from"./scan-Dn93ycXG.js";import{a as x,c as S,i as C,n as ie,o as ae,r as oe,s as se}from"./interpolation-plugin-Bt-KRKVY.js";import{n as w,t as T}from"./scan-CjMUgnsd.js";import{buildPictureMarkup as ce,buildSrcset as le,getManifestEntry as ue,processImageBatch as E,readManifest as de,validateManifestUrls as fe,writeManifest as pe}from"./image/service.js";import{consumeImageRegistry as D,setImageManifest as O}from"./image/registry.js";import{image as me}from"./image/index.js";import{t as k}from"./integrations-7dpN1RYB.js";import{n as he}from"./hydrate-CgZGrTxF.js";import{n as A,r as j,t as ge}from"./stream-CpOG052V.js";import{_ as M,a as _e,c as ve,d as ye,f as be,g as N,h as xe,l as Se,m as Ce,o as we,p as Te,s as Ee,t as De,u as Oe}from"./runtime-Ds2-wH6P.js";import{r as ke,t as Ae}from"./action-BB6N5yD-.js";import{vercelAdapter as je}from"./adapters/vercel.js";import{netlifyAdapter as Me}from"./adapters/netlify.js";import{bunAdapter as Ne}from"./adapters/bun.js";import{nodeAdapter as Pe}from"./adapters/node.js";import{startClientRouter as Fe}from"./router/client.js";import{defineConfig as Ie,loadElurConfig as Le}from"./config/index.js";import{assertClientImportAllowed as Re,createAppManifest as ze,validateManifestRoutes as Be,writeAppManifest as Ve,writeRouteTypes as He}from"./manifest/index.js";import{access as Ue,cp as P,mkdir as F,readFile as I,rename as We,rm as L,stat as R,writeFile as z}from"node:fs/promises";import{basename as Ge,dirname as B,extname as V,join as H,relative as Ke,resolve as U}from"node:path";import{existsSync as qe}from"node:fs";import{createHash as Je,randomUUID as Ye}from"node:crypto";import{ELUR_RENDER_PROTOCOL as Xe}from"@elurjs/core";import{createServer as Ze}from"node:http";import{build as Qe}from"vite";import{AsyncLocalStorage as $e}from"node:async_hooks";function et(e,t){if("/"===t)return H(e,"index.html");let r=t.slice(1).split("/");return H(e,...r,"index.html")}function W(e){return e.includes(":")}function tt(e,t){return e.replace(/:([a-zA-Z0-9_]+)(\*)?/g,(r,a,i)=>{let s=t[a];if(null==s)throw Error(`Missing value for dynamic segment "${a}" in path "${e}"`);return i&&Array.isArray(s)?s.join("/"):String(s)})}async function nt(e){if(e.publicDir)try{(await R(e.publicDir)).isDirectory()&&(await F(e.outDir,{recursive:!0}),await P(e.publicDir,e.outDir,{recursive:!0,force:!0}))}catch(e){if("ENOENT"!==e.code)throw e}let t=await b(e.appDir),r=await w(e.appDir),a=T(r),i={pages:0,skipped:[],files:[],islands:[],imagesProcessed:0,outDir:e.outDir};e.islandsDir&&(i.islands=await re(e.islandsDir)),e.generatedEntry&&(i.generatedEntry=await S({islands:i.islands,outFile:e.generatedEntry,hydrateImport:e.hydrateImport,routerImport:e.routerImport}));for(let r of t.pages){if(!W(r.path)){let t=await G(e,r,a);i.pages++,i.files.push(t);continue}let t=await K(e,r,a);0===t.length?i.skipped.push(r.path):(i.pages+=t.length,i.files.push(...t))}let n={lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1};if(t.error404){let r=await s({routes:t,status:404,config:n,actions:a});if(r){let t=H(e.outDir,"404.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}if(t.error500){let r=await s({routes:t,status:500,config:n,actions:a});if(r){let t=H(e.outDir,"500.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}let o=D(),l=null;if(o.length>0&&e.publicDir){let r=H(e.outDir,".elur","image-manifest.json"),c=await E(o,{publicDir:e.publicDir,outDir:e.outDir,formats:e.imageFormats,manifestPath:r});if(i.imagesProcessed=c.count,c.optimized&&c.count>0){l=c.manifest,O(l),i.pages=0,i.files=[];for(let r of t.pages){if(!W(r.path)){let t=await G(e,r,a);i.pages++,i.files.push(t);continue}let t=await K(e,r,a);0===t.length?i.skipped.push(r.path):(i.pages+=t.length,i.files.push(...t))}if(t.error404){let r=await s({routes:t,status:404,config:n,actions:a});if(r){let t=H(e.outDir,"404.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}if(t.error500){let r=await s({routes:t,status:500,config:n,actions:a});if(r){let t=H(e.outDir,"500.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}}}return O(null),e.integrations&&e.integrations.length>0&&await k(e.integrations,"build",[i,{root:e.root??e.outDir,command:"build"}]),i}async function G(e,t,r){return q(e,t,{},r)}async function K(e,t,r){let{generateStaticParams:a}=await(import(t.pagePath));if(!a)return[];let i=await a();if(!Array.isArray(i)||0===i.length)return[];let s=[];for(let a of i)s.push(await q(e,t,a,r));return s}async function q(e,t,r,a){let{html:i}=await p({route:t,params:r,searchParams:new URLSearchParams,config:{lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1},actions:a}),s=W(t.path)?tt(t.path,r):t.path,n=et(e.outDir,s);return await F(B(n),{recursive:!0}),await z(n,i,"utf8"),n}function rt(e,t,r,a="load",i){let s="only"!==a&&(i?.ssr??!0),n=i?.fallback,o=t=>`<div data-elur-island="${at(e)}" data-directive="${a}" data-props='${ot(r)}'>${t}</div>`;return{__isElurTemplate:!0,[Xe]:{async renderServer(a){let i="";if(s)try{let e=t(r);i=null!==e&&!1!==e&&void 0!==e?await a.render(e,{markers:!0}):await J(n,a)}catch(t){throw it(e,t)}else i=await J(n,a);return o(i)}},_render(e,a){let i=document.createElement("div"),l="";if(s){let e=t(r);if(null!==e&&!1!==e&&void 0!==e){let t=e._render(i,null);l=i.innerHTML,t()}else l=Y(n,i)}else l=Y(n,i);let c=document.createElement("template");c.innerHTML=o(l);let u=c.content,d=u.firstChild;return e.insertBefore(u,a),()=>{d?.parentNode&&d.parentNode.removeChild(d)}}}}function it(e,t){let r=t instanceof Error?t:Error(String(t)),a=t instanceof Error?t.message:String(t);return Error(`[elur-kit] Island "${e}" threw during SSR: ${a}\n If the component accesses browser-only globals (document, window, etc.),\n use directive: "only" or options: { ssr: false } to skip server rendering.\n For environment reads (matchMedia, localStorage, navigator) you may guard\n the access with isSSR() from "@elurjs/kit".`,{cause:r})}async function J(e,t){return null==e||""===e?"":"string"==typeof e?e:t.render(e,{markers:!1})}function Y(e,t){if(null==e||""===e)return"";if("string"==typeof e)return e;let r=e._render(t,null),a=t.innerHTML;return r(),a}function at(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function ot(e){return JSON.stringify(e??null).replace(/</g,"\\u003c").replace(/'/g,"\\u0027")}async function st(e){let t=await b(e.appDir),r=await w(e.appDir),a=T(r),i=e.root?await C(e.root):null,l=async(e,a)=>{let i=dt(a,t),s=i?r[i]:Object.values(r).find(t=>t[e])??void 0,n=s?s[e]:void 0;if(!n)return;let o=(await(import(n)))[e];return"function"==typeof o?o:void 0},c=Ze(async(r,c)=>{let u,d=r.url??"/";if(d.includes("?")&&(d=d.split("?")[0]),"/__elur-js/actions"===d&&"POST"===r.method){try{let t=await lt(r),a=y(r,t),i=await h(a,l,e.actionSecurity);c.writeHead(i.status,Object.fromEntries(i.headers.entries())),c.end(await i.text())}catch(e){console.error("[action] error handling",e),c.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),c.end(n(e).message)}return}if("/__elur-js/render"===d){let i=new URL(r.url??"/","http://localhost"),s=i.searchParams.get("page")??"/",n=i.searchParams.get("search")??"",o=(r.headers.accept??"").includes("application/json");try{let i,l,u,d,p=y(r),f=await ft(e,s,t),m=`/__elur-js/render${s}?${n}`;if(e.cacheDir&&"number"==typeof f&&X(p)){let r=await N(e.cacheDir,m);if(r)i=pt(r.html),l=mt(r.html);else{let r=await A({routes:t,pathname:s,searchParams:new URLSearchParams(n),config:{lang:e.lang??"es",clientEntry:e.clientEntry},actions:a,request:p});i=r.body,l=r.title,u=r.clearActionErrorCookie,d=r.head,await M(e.cacheDir,m,r.fullHtml??"",f)}}else{let r=await A({routes:t,pathname:s,searchParams:new URLSearchParams(n),config:{lang:e.lang??"es",clientEntry:e.clientEntry},actions:a,request:p});i=r.body,l=r.title,u=r.clearActionErrorCookie,d=r.head}if(o){let e={"Content-Type":"application/json; charset=utf-8"},t=u;t&&(e["X-Elur-Action-Clear-Cookie"]=t),c.writeHead(200,e),c.end(JSON.stringify({title:l,body:i,head:d,clearActionErrorCookie:t}))}else{let e={"Content-Type":"text/html; charset=utf-8"};u&&(e["Set-Cookie"]=u),c.writeHead(200,e),c.end(i)}}catch(e){if(e instanceof ge)return console.log(`[ssr] render endpoint: no route for ${s}`),c.writeHead(404,{"Content-Type":"text/plain"}),void c.end("Not Found");console.error("[ssr] streaming render error",e),c.writeHead(500,{"Content-Type":"text/plain"}),c.end("Internal Server Error")}return}if(i&&x(d,i.config)){let e=await ae(i,y(r));if("response"===e.kind)return c.writeHead(e.response.status,Object.fromEntries(e.response.headers.entries())),void c.end(Buffer.from(await e.response.arrayBuffer()));u=e.headers}let f=o(d,t.api);if(f){try{let e=(await(import(f.route.routePath)))[r.method??"GET"];if("function"!=typeof e)return c.writeHead(405,{"Content-Type":"text/plain"}),void c.end(`Method not allowed: ${r.method}`);let t=r.method&&"GET"!==r.method&&"HEAD"!==r.method?await lt(r):void 0,a=y(r,t);Z(a.headers,u);let i=await e(a,{params:f.params});c.writeHead(i.status,Object.fromEntries(i.headers.entries())),c.end(Buffer.from(await i.arrayBuffer()))}catch(e){console.error("[api] error handling",d,e),c.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),c.end(n(e).message)}return}if(e.publicDir)try{if(await ct(c,e.publicDir,d))return}catch(e){console.error("[static] error serving",d,e)}let m=g(d,t.pages),w={lang:e.lang??"es",clientEntry:e.clientEntry};if(m)try{let t=y(r);Z(t.headers,u);let i,s,n=(m.route.dataPath?(await(import(m.route.dataPath))).revalidate:void 0)??e.defaultRevalidate;if(!1!==e.streaming&&m.route.loadingPath)i=await j({route:m.route,params:m.params,searchParams:new URLSearchParams(r.url?.split("?")[1]??""),config:w,actions:a,request:t});else if(e.cacheDir&&"number"==typeof n&&X(t)){let o=new URL(t.url).pathname+new URL(t.url).search,l=await N(e.cacheDir,o);if(l)i=l.html;else{let l=await p({route:m.route,params:m.params,searchParams:new URLSearchParams(r.url?.split("?")[1]??""),config:w,actions:a,request:t});i=l.html,s=l.clearActionErrorCookie,await M(e.cacheDir,o,i,n)}}else{let e=await p({route:m.route,params:m.params,searchParams:new URLSearchParams(r.url?.split("?")[1]??""),config:w,actions:a,request:t});i=e.html,s=e.clearActionErrorCookie}let o={"Content-Type":"text/html; charset=utf-8"};return s&&(o["Set-Cookie"]=s),c.writeHead(200,o),void c.end(i)}catch(e){console.error("[ssr] error rendering",d,e);let r=await s({routes:t,status:500,error:e,config:w,actions:a});return void(r?(c.writeHead(r.status,{"Content-Type":"text/html; charset=utf-8"}),c.end(r.html)):(c.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),c.end(n(e).message)))}let v=await s({routes:t,status:404,config:w,actions:a});if(v)return c.writeHead(v.status,{"Content-Type":"text/html; charset=utf-8"}),void c.end(v.html);c.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"}),c.end(`Not found: ${r.url}`)});return{server:c,listen:()=>new Promise(t=>{c.listen(e.port??3e3,e.host??"127.0.0.1",()=>{console.log(`\n → SSR server http://${e.host??"127.0.0.1"}:${e.port??3e3}`),t()})}),close:()=>new Promise((e,t)=>{c.close(r=>r?t(r):e())})}}async function ct(e,t,r){let a=await Ce(t,r);if(!a)return!1;let i=ut(a),s=await I(a);return i.includes("text/html")&&(s=s.toString("utf8").replace('<meta name="elur:render-endpoint" content="off" />','<meta name="elur:render-endpoint" content="on" />')),e.writeHead(200,{"Content-Type":i,"Content-Length":Buffer.byteLength(s)}),e.end(s),!0}function X(e){return!e.headers.has("cookie")&&!e.headers.has("authorization")}function Z(e,t){if(t)for(let[r,a]of Object.entries(t))e.set(r,a)}function lt(e){return new Promise((t,r)=>{let a="";e.setEncoding("utf8"),e.on("data",e=>{a+=e}),e.on("end",()=>t(a)),e.on("error",r)})}function ut(e){switch(V(e)){case".html":return"text/html; charset=utf-8";case".js":case".mjs":return"application/javascript; charset=utf-8";case".css":return"text/css; charset=utf-8";case".json":return"application/json; charset=utf-8";case".svg":return"image/svg+xml";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".avif":return"image/avif";case".ico":return"image/x-icon";case".woff":return"font/woff";case".woff2":return"font/woff2";case".wasm":return"application/wasm";default:return"application/octet-stream"}}function dt(e,t){if(!e)return;if(t.pages.some(t=>t.path===e))return e;let r=g(e,t.pages);return r?r.route.path:e}async function ft(e,t,r){let a=g(t,r.pages);if(a)return(a.route.dataPath?(await(import(a.route.dataPath))).revalidate:void 0)??e.defaultRevalidate}function pt(e){let t=e.match(/<div id="app">([\s\S]*)<\/div>\s*(<script|$)/);return t?t[1].trim():e}function mt(e){let t=e.match(/<title>([^<]*)<\/title>/);return t?t[1]:""}var Q;async function ht(){if(null===Q)return null;if(Q)return Q();try{let e=(await(import("sharp"))).default;return"function"==typeof e?(Q=async()=>e,e):(Q=null,null)}catch{return Q=null,null}}async function gt(e,t){let r=await ht();if(!r)return console.warn("[elur-kit] Image optimization requires `sharp`. Install it with:\n npm install sharp\n # or\n bun add sharp\nSkipping image processing — using original files."),[];let{publicDir:a,outDir:i,formats:s=["webp","avif"],quality:n=80}=t,o=[],l=!1;for(let{src:t,widths:c,formats:u}of e){let d=H(a,t.replace(/^\//,""));try{await R(d)}catch{l||=(console.warn(`[elur-kit] Image not found: ${d}. Skipping.`),!0);continue}let p=await I(d),f=Je("md5").update(p).digest("hex").slice(0,8),m=V(t),h=Ge(t,m),g=B(t),w=[],y=u.length>0?u:s;for(let t of c)for(let a of y){let s=`${h}-${t}w-${f}.${a}`,o=H(g,s),l=H(i,o.replace(/^\//,""));try{await F(B(l),{recursive:!0}),await r(p).resize({width:t,withoutEnlargement:!0}).toFormat(a,{quality:n}).toFile(l),w.push({path:o,width:t,format:a})}catch(e){console.warn(`[elur-kit] Failed to generate ${s}:`,e)}}w.length>0&&o.push({src:t,variants:w})}return o}async function _t(){return null!==await ht()}var vt=new $e;function yt(e){let t=`elur-stream-${Ye().slice(0,8)}`,r=vt.getStore();return r&&r.boundaries.set(t,{promise:e.promise,children:e.children}),{__isElurTemplate:!0,mount(r){let a="string"==typeof r?document.querySelector(r):r;if(!a)throw Error("[elur-kit] streamBoundary(): container not found");let i=e.fallback.mount(a);return e.promise.then(t=>{let r=e.children(t);a.innerHTML="";let s=r.mount(a);i.__elurChildHandle=s}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),{unmount(){let e=i.__elurChildHandle;e?.unmount&&e.unmount(),i.unmount()}}},_render(r,a){let i=e.fallback._render(r,a);return e.promise.then(e=>{}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),i}}}async function bt(e){let t=e.logPrefix??"[client]";console.log(`${t} Building hydration bundle...`);let r=await xt(e.userConfigPath,e.root),a=oe(e.interpolation??"auto")?ie({appDir:e.appDir,islandsDir:e.islandsDir}):[],i={...r,root:e.root,base:e.base??r.base??"/",build:{...r.build??{},outDir:e.outDir,emptyOutDir:!0},plugins:[...r.plugins??[],a],configFile:!1},s=await Qe(i),n=(Array.isArray(s)?s:[s]).reduce((e,t)=>e+("output"in t?t.output?.length??0:0),0);return console.log(`${t} ✓ ${n} asset(s) emitted → ${Ke(e.root,e.outDir)}`),{outDir:e.outDir,outputCount:n}}async function xt(e,t){let r=await(import(e)),a=r.default??r,i="function"==typeof a?await a({command:"build",mode:"production"}):a;return(i&&"function"==typeof i.then?await i:i)??{}}async function St(e){let t=U(e.outDir),r=U(e.tempDir??H(B(t),`.${Ct(t)}.tmp-${process.pid}`));return await L(r,{recursive:!0,force:!0}),await F(r,{recursive:!0}),{tempDir:r,commit:async()=>{let a=e.keepExisting&&qe(t)?`${t}.bak-${process.pid}`:void 0;a&&(await L(a,{recursive:!0,force:!0}),await $(t,a));try{await $(r,t)}catch(e){if(!wt(e))throw a&&await $(a,t),e;await P(r,t,{recursive:!0,force:!0}),await L(r,{recursive:!0,force:!0})}a&&await L(a,{recursive:!0,force:!0})},rollback:async()=>{await L(r,{recursive:!0,force:!0})}}}function Ct(e){let t=e.split(/[\\/]+/).filter(Boolean);return t[t.length-1]??"output"}async function $(e,t){await L(t,{recursive:!0,force:!0});try{await We(e,t)}catch(r){if(!wt(r))throw r;await P(e,t,{recursive:!0,force:!0}),await L(e,{recursive:!0,force:!0})}}function wt(e){return"EXDEV"===e?.code}async function Tt(e){try{if(await Ue(e.publicDir),!(await R(e.publicDir)).isDirectory())return 0}catch{return 0}return await F(e.outDir,{recursive:!0}),await P(e.publicDir,e.outDir,{recursive:!0,force:!0}),Et(e.outDir)}async function Et(e){let{readdir:t}=await(import("node:fs/promises")),r=0;return await async function e(a){let i=await t(a,{withFileTypes:!0});for(let t of i){let i=H(a,t.name);t.isDirectory()?await e(i):r++}}(e),r}export{c as ACTION_ERROR_COOKIE,i as ActionFailure,r as RedirectResponse,_e as RequestContext,Re as assertClientImportAllowed,St as beginAtomicStage,nt as build,bt as buildClientBundle,se as buildEntrySource,u as buildHeadTags,ce as buildPictureMarkup,le as buildSrcset,Ne as bunAdapter,Ae as callAction,l as clearActionErrorCookieHeader,xe as clearCache,ee as collectShellExtras,D as consumeImageRegistry,Tt as copyPublicAssets,ze as createAppManifest,st as createSsrServer,De as createWebHandler,_ as decodeActionErrorCookie,ke as defineAction,Ie as defineConfig,a as documentShell,m as encodeActionErrorCookie,t as fail,S as generateClientEntry,N as getCachedHtml,ue as getManifestEntry,we as guessContentType,h as handleActionRequest,Ee as htmlResponse,he as hydrateIslands,me as image,y as incomingMessageToRequest,ne as isSSR,_t as isSharpAvailable,rt as island,ve as jsonResponse,Le as loadElurConfig,C as loadMiddleware,o as matchApiRoute,g as matchRoute,x as matchesMiddleware,Se as methodNotAllowed,Me as netlifyAdapter,Pe as nodeAdapter,Oe as notFound,v as originForbidden,E as processImageBatch,gt as processImages,de as readManifest,e as redirect,s as renderErrorPage,p as renderPage,A as renderPageBody,j as renderStreamingPage,te as renderToString,Ce as resolveStaticFile,k as runIntegrationHook,ae as runMiddleware,w as scanActions,re as scanIslands,b as scanRoutes,ye as serveStaticFile,be as serverError,d as setActionErrorCookieHeader,M as setCachedHtml,O as setImageManifest,Fe as startClientRouter,yt as streamBoundary,Te as textResponse,Be as validateManifestRoutes,fe as validateManifestUrls,je as vercelAdapter,f as verifyOrigin,Ve as writeAppManifest,pe as writeManifest,He as writeRouteTypes};
1
+ import{c as e,i as t,l as n,n as r,t as i}from"./errors-ePYxDlhU.js";import{_ as a,a as o,c as s,d as c,f as l,g as u,h as d,i as f,l as p,m,n as h,o as g,p as _,r as v,s as ee,t as y,v as te,y as ne}from"./node-http-DRAUhO0c.js";import{t as b}from"./route-scanner-XcLId7lK.js";import{t as re}from"./scan-Dn93ycXG.js";import{a as x,c as S,i as C,n as ie,o as ae,r as oe,s as se}from"./interpolation-plugin-Bt-KRKVY.js";import{n as w,t as T}from"./scan-CjMUgnsd.js";import{buildPictureMarkup as ce,buildSrcset as le,getManifestEntry as ue,processImageBatch as E,readManifest as de,validateManifestUrls as fe,writeManifest as pe}from"./image/service.js";import{consumeImageRegistry as D,setImageManifest as O}from"./image/registry.js";import{image as me}from"./image/index.js";import{t as k}from"./integrations-7dpN1RYB.js";import{n as he}from"./hydrate-CJbUWdXu.js";import{n as A,r as j,t as ge}from"./stream-CpOG052V.js";import{_ as M,a as _e,c as ve,d as ye,f as be,g as N,h as xe,l as Se,m as Ce,o as we,p as Te,s as Ee,t as De,u as Oe}from"./runtime-Ds2-wH6P.js";import{r as ke,t as Ae}from"./action-BB6N5yD-.js";import{vercelAdapter as je}from"./adapters/vercel.js";import{netlifyAdapter as Me}from"./adapters/netlify.js";import{bunAdapter as Ne}from"./adapters/bun.js";import{nodeAdapter as Pe}from"./adapters/node.js";import{startClientRouter as Fe}from"./router/client.js";import{defineConfig as Ie,loadElurConfig as Le}from"./config/index.js";import{assertClientImportAllowed as Re,createAppManifest as ze,validateManifestRoutes as Be,writeAppManifest as Ve,writeRouteTypes as He}from"./manifest/index.js";import{access as Ue,cp as P,mkdir as F,readFile as I,rename as We,rm as L,stat as R,writeFile as z}from"node:fs/promises";import{basename as Ge,dirname as B,extname as V,join as H,relative as Ke,resolve as U}from"node:path";import{existsSync as qe}from"node:fs";import{createHash as Je,randomUUID as Ye}from"node:crypto";import{ELUR_RENDER_PROTOCOL as Xe}from"@elurjs/core";import{createServer as Ze}from"node:http";import{build as Qe}from"vite";import{AsyncLocalStorage as $e}from"node:async_hooks";function et(e,t){if("/"===t)return H(e,"index.html");let r=t.slice(1).split("/");return H(e,...r,"index.html")}function W(e){return e.includes(":")}function tt(e,t){return e.replace(/:([a-zA-Z0-9_]+)(\*)?/g,(r,a,i)=>{let s=t[a];if(null==s)throw Error(`Missing value for dynamic segment "${a}" in path "${e}"`);return i&&Array.isArray(s)?s.join("/"):String(s)})}async function nt(e){if(e.publicDir)try{(await R(e.publicDir)).isDirectory()&&(await F(e.outDir,{recursive:!0}),await P(e.publicDir,e.outDir,{recursive:!0,force:!0}))}catch(e){if("ENOENT"!==e.code)throw e}let t=await b(e.appDir),r=await w(e.appDir),a=T(r),i={pages:0,skipped:[],files:[],islands:[],imagesProcessed:0,outDir:e.outDir};e.islandsDir&&(i.islands=await re(e.islandsDir)),e.generatedEntry&&(i.generatedEntry=await S({islands:i.islands,outFile:e.generatedEntry,hydrateImport:e.hydrateImport,routerImport:e.routerImport}));for(let r of t.pages){if(!W(r.path)){let t=await G(e,r,a);i.pages++,i.files.push(t);continue}let t=await K(e,r,a);0===t.length?i.skipped.push(r.path):(i.pages+=t.length,i.files.push(...t))}let n={lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1};if(t.error404){let r=await s({routes:t,status:404,config:n,actions:a});if(r){let t=H(e.outDir,"404.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}if(t.error500){let r=await s({routes:t,status:500,config:n,actions:a});if(r){let t=H(e.outDir,"500.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}let o=D(),l=null;if(o.length>0&&e.publicDir){let r=H(e.outDir,".elur","image-manifest.json"),c=await E(o,{publicDir:e.publicDir,outDir:e.outDir,formats:e.imageFormats,manifestPath:r});if(i.imagesProcessed=c.count,c.optimized&&c.count>0){l=c.manifest,O(l),i.pages=0,i.files=[];for(let r of t.pages){if(!W(r.path)){let t=await G(e,r,a);i.pages++,i.files.push(t);continue}let t=await K(e,r,a);0===t.length?i.skipped.push(r.path):(i.pages+=t.length,i.files.push(...t))}if(t.error404){let r=await s({routes:t,status:404,config:n,actions:a});if(r){let t=H(e.outDir,"404.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}if(t.error500){let r=await s({routes:t,status:500,config:n,actions:a});if(r){let t=H(e.outDir,"500.html");await F(B(t),{recursive:!0}),await z(t,r.html,"utf8"),i.files.push(t)}}}}return O(null),e.integrations&&e.integrations.length>0&&await k(e.integrations,"build",[i,{root:e.root??e.outDir,command:"build"}]),i}async function G(e,t,r){return q(e,t,{},r)}async function K(e,t,r){let{generateStaticParams:a}=await(import(t.pagePath));if(!a)return[];let i=await a();if(!Array.isArray(i)||0===i.length)return[];let s=[];for(let a of i)s.push(await q(e,t,a,r));return s}async function q(e,t,r,a){let{html:i}=await p({route:t,params:r,searchParams:new URLSearchParams,config:{lang:e.lang,clientEntry:e.clientEntry,renderEndpoint:!1},actions:a}),s=W(t.path)?tt(t.path,r):t.path,n=et(e.outDir,s);return await F(B(n),{recursive:!0}),await z(n,i,"utf8"),n}function rt(e,t,r,a="load",i){let s="only"!==a&&(i?.ssr??!0),n=i?.fallback,o=t=>`<div data-elur-island="${at(e)}" data-directive="${a}" data-props='${ot(r)}'>${t}</div>`;return{__isElurTemplate:!0,[Xe]:{async renderServer(a){let i="";if(s)try{let e=t(r);i=null!==e&&!1!==e&&void 0!==e?await a.render(e,{markers:!0}):await J(n,a)}catch(t){throw it(e,t)}else i=await J(n,a);return o(i)}},_render(e,a){let i=document.createElement("div"),l="";if(s){let e=t(r);if(null!==e&&!1!==e&&void 0!==e){let t=e._render(i,null);l=i.innerHTML,t()}else l=Y(n,i)}else l=Y(n,i);let c=document.createElement("template");c.innerHTML=o(l);let u=c.content,d=u.firstChild;return e.insertBefore(u,a),()=>{d?.parentNode&&d.parentNode.removeChild(d)}}}}function it(e,t){let r=t instanceof Error?t:Error(String(t)),a=t instanceof Error?t.message:String(t);return Error(`[elur-kit] Island "${e}" threw during SSR: ${a}\n If the component accesses browser-only globals (document, window, etc.),\n use directive: "only" or options: { ssr: false } to skip server rendering.\n For environment reads (matchMedia, localStorage, navigator) you may guard\n the access with isSSR() from "@elurjs/kit".`,{cause:r})}async function J(e,t){return null==e||""===e?"":"string"==typeof e?e:t.render(e,{markers:!1})}function Y(e,t){if(null==e||""===e)return"";if("string"==typeof e)return e;let r=e._render(t,null),a=t.innerHTML;return r(),a}function at(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function ot(e){return JSON.stringify(e??null).replace(/</g,"\\u003c").replace(/'/g,"\\u0027")}async function st(e){let t=await b(e.appDir),r=await w(e.appDir),a=T(r),i=e.root?await C(e.root):null,l=async(e,a)=>{let i=dt(a,t),s=i?r[i]:Object.values(r).find(t=>t[e])??void 0,n=s?s[e]:void 0;if(!n)return;let o=(await(import(n)))[e];return"function"==typeof o?o:void 0},c=Ze(async(r,c)=>{let u,d=r.url??"/";if(d.includes("?")&&(d=d.split("?")[0]),"/__elur-js/actions"===d&&"POST"===r.method){try{let t=await lt(r),a=y(r,t),i=await h(a,l,e.actionSecurity);c.writeHead(i.status,Object.fromEntries(i.headers.entries())),c.end(await i.text())}catch(e){console.error("[action] error handling",e),c.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),c.end(n(e).message)}return}if("/__elur-js/render"===d){let i=new URL(r.url??"/","http://localhost"),s=i.searchParams.get("page")??"/",n=i.searchParams.get("search")??"",o=(r.headers.accept??"").includes("application/json");try{let i,l,u,d,p=y(r),f=await ft(e,s,t),m=`/__elur-js/render${s}?${n}`;if(e.cacheDir&&"number"==typeof f&&X(p)){let r=await N(e.cacheDir,m);if(r)i=pt(r.html),l=mt(r.html);else{let r=await A({routes:t,pathname:s,searchParams:new URLSearchParams(n),config:{lang:e.lang??"es",clientEntry:e.clientEntry},actions:a,request:p});i=r.body,l=r.title,u=r.clearActionErrorCookie,d=r.head,await M(e.cacheDir,m,r.fullHtml??"",f)}}else{let r=await A({routes:t,pathname:s,searchParams:new URLSearchParams(n),config:{lang:e.lang??"es",clientEntry:e.clientEntry},actions:a,request:p});i=r.body,l=r.title,u=r.clearActionErrorCookie,d=r.head}if(o){let e={"Content-Type":"application/json; charset=utf-8"},t=u;t&&(e["X-Elur-Action-Clear-Cookie"]=t),c.writeHead(200,e),c.end(JSON.stringify({title:l,body:i,head:d,clearActionErrorCookie:t}))}else{let e={"Content-Type":"text/html; charset=utf-8"};u&&(e["Set-Cookie"]=u),c.writeHead(200,e),c.end(i)}}catch(e){if(e instanceof ge)return console.log(`[ssr] render endpoint: no route for ${s}`),c.writeHead(404,{"Content-Type":"text/plain"}),void c.end("Not Found");console.error("[ssr] streaming render error",e),c.writeHead(500,{"Content-Type":"text/plain"}),c.end("Internal Server Error")}return}if(i&&x(d,i.config)){let e=await ae(i,y(r));if("response"===e.kind)return c.writeHead(e.response.status,Object.fromEntries(e.response.headers.entries())),void c.end(Buffer.from(await e.response.arrayBuffer()));u=e.headers}let f=o(d,t.api);if(f){try{let e=(await(import(f.route.routePath)))[r.method??"GET"];if("function"!=typeof e)return c.writeHead(405,{"Content-Type":"text/plain"}),void c.end(`Method not allowed: ${r.method}`);let t=r.method&&"GET"!==r.method&&"HEAD"!==r.method?await lt(r):void 0,a=y(r,t);Z(a.headers,u);let i=await e(a,{params:f.params});c.writeHead(i.status,Object.fromEntries(i.headers.entries())),c.end(Buffer.from(await i.arrayBuffer()))}catch(e){console.error("[api] error handling",d,e),c.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),c.end(n(e).message)}return}if(e.publicDir)try{if(await ct(c,e.publicDir,d))return}catch(e){console.error("[static] error serving",d,e)}let m=g(d,t.pages),w={lang:e.lang??"es",clientEntry:e.clientEntry};if(m)try{let t=y(r);Z(t.headers,u);let i,s,n=(m.route.dataPath?(await(import(m.route.dataPath))).revalidate:void 0)??e.defaultRevalidate;if(!1!==e.streaming&&m.route.loadingPath)i=await j({route:m.route,params:m.params,searchParams:new URLSearchParams(r.url?.split("?")[1]??""),config:w,actions:a,request:t});else if(e.cacheDir&&"number"==typeof n&&X(t)){let o=new URL(t.url).pathname+new URL(t.url).search,l=await N(e.cacheDir,o);if(l)i=l.html;else{let l=await p({route:m.route,params:m.params,searchParams:new URLSearchParams(r.url?.split("?")[1]??""),config:w,actions:a,request:t});i=l.html,s=l.clearActionErrorCookie,await M(e.cacheDir,o,i,n)}}else{let e=await p({route:m.route,params:m.params,searchParams:new URLSearchParams(r.url?.split("?")[1]??""),config:w,actions:a,request:t});i=e.html,s=e.clearActionErrorCookie}let o={"Content-Type":"text/html; charset=utf-8"};return s&&(o["Set-Cookie"]=s),c.writeHead(200,o),void c.end(i)}catch(e){console.error("[ssr] error rendering",d,e);let r=await s({routes:t,status:500,error:e,config:w,actions:a});return void(r?(c.writeHead(r.status,{"Content-Type":"text/html; charset=utf-8"}),c.end(r.html)):(c.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),c.end(n(e).message)))}let v=await s({routes:t,status:404,config:w,actions:a});if(v)return c.writeHead(v.status,{"Content-Type":"text/html; charset=utf-8"}),void c.end(v.html);c.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"}),c.end(`Not found: ${r.url}`)});return{server:c,listen:()=>new Promise(t=>{c.listen(e.port??3e3,e.host??"127.0.0.1",()=>{console.log(`\n → SSR server http://${e.host??"127.0.0.1"}:${e.port??3e3}`),t()})}),close:()=>new Promise((e,t)=>{c.close(r=>r?t(r):e())})}}async function ct(e,t,r){let a=await Ce(t,r);if(!a)return!1;let i=ut(a),s=await I(a);return i.includes("text/html")&&(s=s.toString("utf8").replace('<meta name="elur:render-endpoint" content="off" />','<meta name="elur:render-endpoint" content="on" />')),e.writeHead(200,{"Content-Type":i,"Content-Length":Buffer.byteLength(s)}),e.end(s),!0}function X(e){return!e.headers.has("cookie")&&!e.headers.has("authorization")}function Z(e,t){if(t)for(let[r,a]of Object.entries(t))e.set(r,a)}function lt(e){return new Promise((t,r)=>{let a="";e.setEncoding("utf8"),e.on("data",e=>{a+=e}),e.on("end",()=>t(a)),e.on("error",r)})}function ut(e){switch(V(e)){case".html":return"text/html; charset=utf-8";case".js":case".mjs":return"application/javascript; charset=utf-8";case".css":return"text/css; charset=utf-8";case".json":return"application/json; charset=utf-8";case".svg":return"image/svg+xml";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".avif":return"image/avif";case".ico":return"image/x-icon";case".woff":return"font/woff";case".woff2":return"font/woff2";case".wasm":return"application/wasm";default:return"application/octet-stream"}}function dt(e,t){if(!e)return;if(t.pages.some(t=>t.path===e))return e;let r=g(e,t.pages);return r?r.route.path:e}async function ft(e,t,r){let a=g(t,r.pages);if(a)return(a.route.dataPath?(await(import(a.route.dataPath))).revalidate:void 0)??e.defaultRevalidate}function pt(e){let t=e.match(/<div id="app">([\s\S]*)<\/div>\s*(<script|$)/);return t?t[1].trim():e}function mt(e){let t=e.match(/<title>([^<]*)<\/title>/);return t?t[1]:""}var Q;async function ht(){if(null===Q)return null;if(Q)return Q();try{let e=(await(import("sharp"))).default;return"function"==typeof e?(Q=async()=>e,e):(Q=null,null)}catch{return Q=null,null}}async function gt(e,t){let r=await ht();if(!r)return console.warn("[elur-kit] Image optimization requires `sharp`. Install it with:\n npm install sharp\n # or\n bun add sharp\nSkipping image processing — using original files."),[];let{publicDir:a,outDir:i,formats:s=["webp","avif"],quality:n=80}=t,o=[],l=!1;for(let{src:t,widths:c,formats:u}of e){let d=H(a,t.replace(/^\//,""));try{await R(d)}catch{l||=(console.warn(`[elur-kit] Image not found: ${d}. Skipping.`),!0);continue}let p=await I(d),f=Je("md5").update(p).digest("hex").slice(0,8),m=V(t),h=Ge(t,m),g=B(t),w=[],y=u.length>0?u:s;for(let t of c)for(let a of y){let s=`${h}-${t}w-${f}.${a}`,o=H(g,s),l=H(i,o.replace(/^\//,""));try{await F(B(l),{recursive:!0}),await r(p).resize({width:t,withoutEnlargement:!0}).toFormat(a,{quality:n}).toFile(l),w.push({path:o,width:t,format:a})}catch(e){console.warn(`[elur-kit] Failed to generate ${s}:`,e)}}w.length>0&&o.push({src:t,variants:w})}return o}async function _t(){return null!==await ht()}var vt=new $e;function yt(e){let t=`elur-stream-${Ye().slice(0,8)}`,r=vt.getStore();return r&&r.boundaries.set(t,{promise:e.promise,children:e.children}),{__isElurTemplate:!0,mount(r){let a="string"==typeof r?document.querySelector(r):r;if(!a)throw Error("[elur-kit] streamBoundary(): container not found");let i=e.fallback.mount(a);return e.promise.then(t=>{let r=e.children(t);a.innerHTML="";let s=r.mount(a);i.__elurChildHandle=s}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),{unmount(){let e=i.__elurChildHandle;e?.unmount&&e.unmount(),i.unmount()}}},_render(r,a){let i=e.fallback._render(r,a);return e.promise.then(e=>{}).catch(e=>{console.error(`[elur-kit] streamBoundary ${t} failed:`,e)}),i}}}async function bt(e){let t=e.logPrefix??"[client]";console.log(`${t} Building hydration bundle...`);let r=await xt(e.userConfigPath,e.root),a=oe(e.interpolation??"auto")?ie({appDir:e.appDir,islandsDir:e.islandsDir}):[],i={...r,root:e.root,base:e.base??r.base??"/",build:{...r.build??{},outDir:e.outDir,emptyOutDir:!0},plugins:[...r.plugins??[],a],configFile:!1},s=await Qe(i),n=(Array.isArray(s)?s:[s]).reduce((e,t)=>e+("output"in t?t.output?.length??0:0),0);return console.log(`${t} ✓ ${n} asset(s) emitted → ${Ke(e.root,e.outDir)}`),{outDir:e.outDir,outputCount:n}}async function xt(e,t){let r=await(import(e)),a=r.default??r,i="function"==typeof a?await a({command:"build",mode:"production"}):a;return(i&&"function"==typeof i.then?await i:i)??{}}async function St(e){let t=U(e.outDir),r=U(e.tempDir??H(B(t),`.${Ct(t)}.tmp-${process.pid}`));return await L(r,{recursive:!0,force:!0}),await F(r,{recursive:!0}),{tempDir:r,commit:async()=>{let a=e.keepExisting&&qe(t)?`${t}.bak-${process.pid}`:void 0;a&&(await L(a,{recursive:!0,force:!0}),await $(t,a));try{await $(r,t)}catch(e){if(!wt(e))throw a&&await $(a,t),e;await P(r,t,{recursive:!0,force:!0}),await L(r,{recursive:!0,force:!0})}a&&await L(a,{recursive:!0,force:!0})},rollback:async()=>{await L(r,{recursive:!0,force:!0})}}}function Ct(e){let t=e.split(/[\\/]+/).filter(Boolean);return t[t.length-1]??"output"}async function $(e,t){await L(t,{recursive:!0,force:!0});try{await We(e,t)}catch(r){if(!wt(r))throw r;await P(e,t,{recursive:!0,force:!0}),await L(e,{recursive:!0,force:!0})}}function wt(e){return"EXDEV"===e?.code}async function Tt(e){try{if(await Ue(e.publicDir),!(await R(e.publicDir)).isDirectory())return 0}catch{return 0}return await F(e.outDir,{recursive:!0}),await P(e.publicDir,e.outDir,{recursive:!0,force:!0}),Et(e.outDir)}async function Et(e){let{readdir:t}=await(import("node:fs/promises")),r=0;return await async function e(a){let i=await t(a,{withFileTypes:!0});for(let t of i){let i=H(a,t.name);t.isDirectory()?await e(i):r++}}(e),r}export{c as ACTION_ERROR_COOKIE,i as ActionFailure,r as RedirectResponse,_e as RequestContext,Re as assertClientImportAllowed,St as beginAtomicStage,nt as build,bt as buildClientBundle,se as buildEntrySource,u as buildHeadTags,ce as buildPictureMarkup,le as buildSrcset,Ne as bunAdapter,Ae as callAction,l as clearActionErrorCookieHeader,xe as clearCache,ee as collectShellExtras,D as consumeImageRegistry,Tt as copyPublicAssets,ze as createAppManifest,st as createSsrServer,De as createWebHandler,_ as decodeActionErrorCookie,ke as defineAction,Ie as defineConfig,a as documentShell,m as encodeActionErrorCookie,t as fail,S as generateClientEntry,N as getCachedHtml,ue as getManifestEntry,we as guessContentType,h as handleActionRequest,Ee as htmlResponse,he as hydrateIslands,me as image,y as incomingMessageToRequest,ne as isSSR,_t as isSharpAvailable,rt as island,ve as jsonResponse,Le as loadElurConfig,C as loadMiddleware,o as matchApiRoute,g as matchRoute,x as matchesMiddleware,Se as methodNotAllowed,Me as netlifyAdapter,Pe as nodeAdapter,Oe as notFound,v as originForbidden,E as processImageBatch,gt as processImages,de as readManifest,e as redirect,s as renderErrorPage,p as renderPage,A as renderPageBody,j as renderStreamingPage,te as renderToString,Ce as resolveStaticFile,k as runIntegrationHook,ae as runMiddleware,w as scanActions,re as scanIslands,b as scanRoutes,ye as serveStaticFile,be as serverError,d as setActionErrorCookieHeader,M as setCachedHtml,O as setImageManifest,Fe as startClientRouter,yt as streamBoundary,Te as textResponse,Be as validateManifestRoutes,fe as validateManifestUrls,je as vercelAdapter,f as verifyOrigin,Ve as writeAppManifest,pe as writeManifest,He as writeRouteTypes};
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../hydrate-8a3TbQbs.cjs");exports.cleanupHydratedIslands=e.t,exports.hydrateIslands=e.n,exports.lazyIsland=e.r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../hydrate-D6MR24mz.cjs");exports.cleanupHydratedIslands=e.t,exports.hydrateIslands=e.n,exports.lazyIsland=e.r;
@@ -1 +1 @@
1
- import{n as e,r as t,t as n}from"../hydrate-CgZGrTxF.js";export{n as cleanupHydratedIslands,e as hydrateIslands,t as lazyIsland};
1
+ import{n as e,r as t,t as n}from"../hydrate-CJbUWdXu.js";export{n as cleanupHydratedIslands,e as hydrateIslands,t as lazyIsland};