rari 0.14.7 → 0.14.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/vite.mjs CHANGED
@@ -1,11 +1,6 @@
1
- import{RariRequest as e}from"./proxy/RariRequest.mjs";import{RariResponse as t}from"./proxy/RariResponse.mjs";import{_ as n,c as r,d as i,f as a,g as o,h as s,i as c,m as l,p as u,u as d}from"./runtime-client-DHeO6y_7.mjs";import{i as f,n as p,o as m,r as h,t as g}from"./constants-De7aSsCq.mjs";import{_,a as v,b as y,c as b,i as ee,m as te,o as ne,r as re,s as ie,t as x,x as ae,y as oe}from"./regex-constants-DQ2vkSU5.mjs";import{t as se}from"./timer-utils-Duul5JHq.mjs";import{t as ce}from"./alias-resolver-BintHkb_.mjs";import{Buffer as le}from"node:buffer";import{spawn as ue}from"node:child_process";import S,{promises as C}from"node:fs";import w from"node:path";import T from"node:process";import{fileURLToPath as E,pathToFileURL as D}from"node:url";import de from"node:crypto";import O from"node:fs/promises";import{build as k}from"rolldown";function fe(e={}){let{root:t=T.cwd(),srcDir:n=`src`,proxyFileName:r=`proxy`,extensions:i=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mts`,`.mjs`],verbose:a=!1}=e,o=null,s=e=>{a&&console.warn(`[rari] Proxy: ${e}`)};async function c(){for(let e of i){let n=`${r}${e}`,i=w.join(t,n);try{return await C.access(i),s(`Found proxy file: ${n}`),{filePath:i,exists:!0,relativePath:n}}catch{}}let e=w.join(t,n);try{await C.access(e);for(let t of i){let i=`${r}${t}`,a=w.join(e,i);try{return await C.access(a),s(`Found proxy file: ${w.join(n,i)}`),{filePath:a,exists:!0,relativePath:w.join(n,i)}}catch{}}}catch{}return null}return{name:`rari:proxy`,async buildStart(){o=await c(),s(o?`Proxy enabled: ${o.relativePath}`:`No proxy file found`)},configureServer(e){o&&(e.watcher.add(o.filePath),e.watcher.on(`change`,t=>{t===o?.filePath&&(s(`Proxy file changed, reloading...`),e.ws.send({type:`custom`,event:`rari:proxy-reload`}))}))},async handleHotUpdate({file:e,server:t}){if(o&&e===o.filePath)return s(`Hot reloading proxy...`),t.ws.send({type:`custom`,event:`rari:proxy-reload`,data:{file:o.relativePath}}),[]}}}const A={PAGE:`page`,LAYOUT:`layout`,LOADING:`loading`,ERROR:`error`,NOT_FOUND:`not-found`,TEMPLATE:`template`,DEFAULT:`default`,ROUTE:`route`,OG_IMAGE:`opengraph-image`,TWITTER_IMAGE:`twitter-image`,ICON:`icon`,APPLE_ICON:`apple-icon`},j={DYNAMIC:/^\[([^\]]+)\]$/,CATCH_ALL:/^\[\.\.\.([^\]]+)\]$/,OPTIONAL_CATCH_ALL:/^\[\[\.\.\.([^\]]+)\]\]$/},pe=[{pattern:j.OPTIONAL_CATCH_ALL,type:`optional-catch-all`,format:e=>`[[...${e}]]`},{pattern:j.CATCH_ALL,type:`catch-all`,format:e=>`[...${e}]`},{pattern:j.DYNAMIC,type:`dynamic`,format:e=>`[${e}]`}],me=/^\([^/]+\)$/;function M(e){return me.test(e)}function he(e){return e?e.replace(x,`/`).split(`/`).filter(Boolean).some(M):!1}function ge(e){for(let t of pe){let n=e.match(t.pattern);if(n)return{type:t.type,param:n[1],format:t.format}}}function _e(e){let t=ge(e);return t?t.format(t.param):e}function ve(e){let t=ge(e);return t?{type:t.type,value:e,param:t.param}:{type:`static`,value:e}}const ye=/export\s+const\s+size\s*=\s*\{\s*width\s*:\s*(\d+)\s*,\s*height\s*:\s*(\d+)\s*[,}]/,be=/export\s+const\s+contentType\s*=\s*['"]([^'"]+)['"]/,xe=[`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`];var Se=class{appDir;extensions;verbose;constructor(e){this.appDir=w.resolve(e.appDir),this.extensions=e.extensions||[`.tsx`,`.jsx`,`.ts`,`.js`],this.verbose=e.verbose||!1}async generateManifest(){this.verbose&&console.warn(`[rari] Router: Scanning app directory: ${this.appDir}`);let e=[],t=[],n=[],r=[],i=[],a=[],o=[];await this.scanDirectory(``,e,t,n,r,i,a,o);for(let a of[t,n,r,i,o])this.finalizeGroupEntries(e,a);return this.assertNoDuplicateRoutes(e),this.assertNoDuplicateRoutes(a),this.verbose&&(console.warn(`[rari] Router: Found ${e.length} routes`),console.warn(`[rari] Router: Found ${t.length} layouts`),console.warn(`[rari] Router: Found ${n.length} loading components`),console.warn(`[rari] Router: Found ${r.length} error boundaries`),console.warn(`[rari] Router: Found ${a.length} API routes`),console.warn(`[rari] Router: Found ${o.length} OG images`)),{routes:this.sortRoutes(e),layouts:this.sortLayouts(t),loading:n,errors:r,notFound:i,apiRoutes:this.sortApiRoutes(a),ogImages:o,generated:new Date().toISOString()}}finalizeGroupEntries(e,t){for(let n=t.length-1;n>=0;n--){let r=t[n],i=w.dirname(r.filePath).replace(x,`/`);if(!he(i))continue;let a=e.filter(e=>{let t=w.dirname(e.filePath).replace(x,`/`);return t===i||t.startsWith(`${i}/`)}).map(e=>e.path);if(a.length===0){t.splice(n,1);continue}let o=Array.from(new Set(a)).sort();r.path=o[0],o.length>1&&(r.additionalPaths=o.slice(1))}}assertNoDuplicateRoutes(e){let t=new Map;for(let n of e){let e=t.get(n.path);if(e)throw Error(`[rari] Route conflict: path '${n.path}' is defined by both '${e}' and '${n.filePath}'.`);t.set(n.path,n.filePath)}}async scanDirectory(e,t,n,r,i,a,o,s){let c=w.join(this.appDir,e),l;try{l=await C.readdir(c)}catch{return}let u=[],d=[];for(let e of l){let t=w.join(c,e),n=await C.stat(t);n.isDirectory()?this.shouldScanDirectory(e)&&d.push(e):n.isFile()&&u.push(e)}await this.processSpecialFiles(e,u,t,n,r,i,a,o,s);for(let c of d){let l=e?w.join(e,c):c;await this.scanDirectory(l,t,n,r,i,a,o,s)}}async processSpecialFiles(e,t,n,r,i,a,o,s,c){let l=this.pathToRoute(e),u=this.findFile(t,A.PAGE);if(u){let t=this.parseRouteSegments(e),r=this.extractParams(t);n.push({path:l,filePath:w.join(e,u).replace(x,`/`),segments:t,params:r,isDynamic:r.length>0})}let d=this.findFile(t,A.LAYOUT);if(d){let t=this.getParentPath(e);r.push({path:l,filePath:w.join(e,d).replace(x,`/`),parentPath:t?this.pathToRoute(t):void 0})}let f=this.findFile(t,A.LOADING);if(f){let t=this.generateComponentId(l,`loading`);i.push({path:l,filePath:w.join(e,f).replace(x,`/`),componentId:t})}let p=this.findFile(t,A.ERROR);p&&a.push({path:l,filePath:w.join(e,p).replace(x,`/`)});let m=this.findFile(t,A.NOT_FOUND);m&&o.push({path:l,filePath:w.join(e,m).replace(x,`/`)});let h=this.findFile(t,A.OG_IMAGE);if(h){let t=w.join(e,h).replace(x,`/`),n=w.join(this.appDir,t),r,i,a;try{let e=await C.readFile(n,`utf-8`),t=e.match(ye);t&&(r=Number.parseInt(t[1],10),i=Number.parseInt(t[2],10));let o=e.match(be);o&&(a=o[1])}catch{}c.push({path:l,filePath:t,width:r,height:i,contentType:a})}let g=this.findFile(t,A.ROUTE);if(g){let t=await this.processApiRouteFile(e,g);s.push(t)}}findFile(e,t){for(let n of this.extensions){let r=`${t}${n}`;if(e.includes(r))return r}}pathToRoute(e){return e?`/${e.replace(x,`/`).split(`/`).filter(Boolean).filter(e=>!M(e)).map(_e).join(`/`)}`:`/`}parseRouteSegments(e){return e?e.split(_).filter(Boolean).filter(e=>!M(e)).map(ve):[]}extractParams(e){return e.filter(e=>e.param!==void 0).map(e=>e.param)}getParentPath(e){if(!e)return null;let t=e.split(_).filter(Boolean);return t.length===0?null:t.slice(0,-1).join(`/`)}generateComponentId(e,t){return`${t}:${e}`}shouldScanDirectory(e){return![`node_modules`,`.git`,`dist`,`build`,`__tests__`,`test`,`tests`,`coverage`].includes(e)&&!e.startsWith(`_`)&&!e.startsWith(`.`)}sortRoutes(e){return e.sort((e,t)=>{let n=e=>{if(!e.isDynamic)return 0;let t=e.segments.some(e=>e.type===`catch-all`);return e.segments.some(e=>e.type===`optional-catch-all`)?3:t?2:1},r=n(e),i=n(t);if(r!==i)return r-i;let a=e.path.split(`/`).length,o=t.path.split(`/`).length;return a===o?e.path.localeCompare(t.path):o-a})}sortApiRoutes(e){return e.sort((e,t)=>{if(!e.isDynamic&&t.isDynamic)return-1;if(e.isDynamic&&!t.isDynamic)return 1;let n=e.path.split(`/`).length,r=t.path.split(`/`).length;return n===r?e.path.localeCompare(t.path):n-r})}sortLayouts(e){return e.sort((e,t)=>e.path===`/`&&t.path!==`/`?-1:t.path===`/`&&e.path!==`/`?1:e.path.split(`/`).length-t.path.split(`/`).length)}async detectHttpMethods(e){let t=w.join(this.appDir,e),n=await C.readFile(t,`utf-8`),r=[];for(let e of xe){let t=RegExp(`export\\s+(?:async\\s+)?function\\s+${e}\\s*\\(`),i=RegExp(`export\\s+(?:async\\s+)?(?:const|let|var)\\s+${e}\\s*=`);(t.test(n)||i.test(n))&&r.push(e)}return r}async processApiRouteFile(e,t){let n=w.join(e,t).replace(x,`/`),r=this.pathToRoute(e),i=this.parseRouteSegments(e),a=this.extractParams(i),o=await this.detectHttpMethods(n);return{path:r,filePath:n,segments:i,params:a,isDynamic:a.length>0,methods:o}}};async function Ce(e,t={}){return new Se({appDir:e,...t}).generateManifest()}const we=/export\s+const\s+metadata\s*(?::\s*\w+\s*)?=\s*(\{[\s\S]*?\n\})/,Te=/title\s*:\s*['"]([^'"]+)['"]/,Ee=/description\s*:\s*['"]([^'"]+)['"]/,De=/keywords\s*:\s*\[([\s\S]*?)\]/,Oe={appDir:`src/app`,extensions:[`.tsx`,`.jsx`,`.ts`,`.js`],outDir:`dist`};function N(e){switch(w.basename(e).replace(y,``)){case`page`:return`page`;case`layout`:return`layout`;case`loading`:return`loading`;case`error`:return`error`;case`not-found`:return`not-found`;case`route`:return`route`;default:return null}}function ke(e,t){let n=w.relative(t,w.dirname(e));return!n||n===`.`?`/`:`/${n.replace(x,`/`).split(`/`).filter(Boolean).join(`/`)}`}function Ae(e,t,n){if(t===`page`)return[e];let r=n.filter(t=>t===e||t.startsWith(`${e}/`));return r.length>0?r:[e]}function je(e){try{let t=e.match(we);if(!t)return null;let n=t[1],r={},i=n.match(Te);i&&(r.title=i[1]);let a=n.match(Ee);a&&(r.description=a[1]);let o=n.match(De);o&&(r.keywords=o[1].split(`,`).map(e=>e.trim().replace(oe,``)).filter(Boolean));for(let e of[`author`,`viewport`,`themeColor`,`robots`,`openGraph`,`twitter`]){let t=RegExp(`${e}\\s*:\\s*['"]([^'"]+)['"]`,`m`),i=n.match(t);i&&(r[e]=i[1])}return Object.keys(r).length>0?r:null}catch(e){return console.error(`[rari] Router: Failed to extract metadata:`,e),null}}function Me(e){let t=[];for(let n of[`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`]){let r=RegExp(`export\\s+(?:async\\s+)?function\\s+${n}\\s*\\(`),i=RegExp(`export\\s+(?:async\\s+)?(?:const|let|var)\\s+${n}\\s*=`);(r.test(e)||i.test(e))&&t.push(n)}return t}async function Ne(e){try{let t=await fetch(`http://localhost:3000/_rari/hmr`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`invalidate-api-route`,filePath:e})});if(!t.ok){console.error(`[rari] Router: Failed to invalidate API route cache: ${t.statusText}`);return}let n=await t.json();n.success||console.error(`[rari] HMR: Failed to invalidate API route cache: ${n.error||`Unknown error`}`)}catch(e){console.error(`[rari] Router: Failed to notify API route invalidation:`,e)}}function Pe(e={}){let t={...Oe,...e},n=null,r=new Map,i=null,a=new Set,o=e=>[...e].toSorted().join(`|`),s=async e=>{let n=new Set,r=async e=>{try{let i=await C.readdir(e,{withFileTypes:!0});for(let a of i){let i=w.join(e,a.name);a.isDirectory()?await r(i):a.isFile()&&t.extensions.some(e=>a.name.endsWith(e))&&N(i)&&n.add(i)}}catch{}};return await r(e),n},c=async(e,r=!1)=>{let c=w.resolve(e,t.appDir);try{await C.access(c)}catch{return null}try{let l=await s(c),u=o(l);if(!r&&i===u&&n)return n;let d=await Ce(c,{extensions:t.extensions}),f=JSON.stringify(d,null,2),p=w.resolve(e,t.outDir);await C.mkdir(p,{recursive:!0});let m=w.join(p,`server`);return await C.mkdir(m,{recursive:!0}),await C.writeFile(w.join(m,`routes.json`),f,`utf-8`),i=u,a.clear(),l.forEach(e=>a.add(e)),f}catch(e){return console.error(`[rari] Router: Failed to generate app routes:`,e),null}},l=e=>{let n=w.resolve(e.config.root,t.appDir);e.watcher.on(`all`,async(r,i)=>{if(i.startsWith(n)&&t.extensions.some(e=>i.endsWith(e)))try{let n=N(i)!==null,o=r===`add`||r===`unlink`,s=n&&!a.has(i);(o||s)&&(await c(e.config.root,!0),i.includes(t.appDir)&&e.ws.send({type:`full-reload`,path:`*`}))}catch(e){console.error(`[rari] Router: Failed to regenerate app routes:`,e)}})},u;return{name:`rari-router`,configResolved(e){u=e.root;let t=e.logger.warn;e.logger.warn=(e,n)=>{typeof e==`string`&&e.includes(`runtime-client`)&&e.includes(`The above dynamic import cannot be analyzed`)||t(e,n)}},async writeBundle(){n=await c(u||T.cwd(),!0)},configureServer(e){l(e)},async handleHotUpdate(e){let{file:i,server:o}=e,s=w.resolve(o.config.root,t.appDir);if(i.startsWith(s)&&t.extensions.some(e=>i.endsWith(e))){let e=N(i);if(e){let t=r.get(i);t&&clearTimeout(t);let l=setTimeout(async()=>{r.delete(i);let t=!a.has(i),l=n;n=await c(o.config.root,t);let u=l!==n,d=ke(i,s),f=[d];if(n)try{f=JSON.parse(n).routes.map(e=>e.path)}catch(e){console.error(`[rari] Router: Failed to parse manifest for affected routes:`,e)}let p=Ae(d,e,f),m,h=!1,g;if(e===`page`||e===`layout`)try{let e=je(await C.readFile(i,`utf-8`));e&&(m=e,h=!0)}catch(e){console.error(`[rari] Router: Failed to extract metadata:`,e)}if(e===`route`)try{g=Me(await C.readFile(i,`utf-8`)),await Ne(w.relative(s,i))}catch(e){console.error(`[rari] Router: Failed to detect HTTP methods:`,e)}let _={fileType:e,filePath:w.relative(o.config.root,i),routePath:d,affectedRoutes:p,manifestUpdated:u,timestamp:Date.now(),metadata:m,metadataChanged:h,methods:g};o.ws.send({type:`custom`,event:`rari:app-router-updated`,data:_})},200);return r.set(i,l),[]}return n=await c(o.config.root),[]}},async closeBundle(){for(let e of r.values())clearTimeout(e);r.clear();let e=u||T.cwd(),n=w.resolve(e,t.outDir,`server`),i=w.join(n,`routes.json`);try{let e=await C.readFile(i,`utf-8`),t=JSON.parse(e),r=!1;for(let e of t.routes){if(!e.isDynamic)continue;let t=e.componentId;if(!t)continue;let i=t.startsWith(`app/`)?t.slice(4):t,a=w.resolve(n,`app`,`${i}.js`);try{let t=await import(a);if(typeof t.generateStaticParams==`function`){let n=await t.generateStaticParams();Array.isArray(n)&&n.length>0&&(e.staticParams=n,r=!0)}}catch{}}r&&await C.writeFile(i,JSON.stringify(t,null,2),`utf-8`)}catch{}}}}const Fe=/\\/g,Ie=/[^\w/-]/g,Le=/^src\//,Re=/\.(tsx?|jsx?)$/,ze=/^\.\.(?:[/\\]|$)/;function Be(e,t=8){return de.createHash(`sha256`).update(e).digest(`hex`).slice(0,t)}function Ve(e,t=T.cwd()){let n=w.isAbsolute(e)?e:w.resolve(t,e),r=w.relative(t,n);return(ze.test(r)||w.isAbsolute(r)?e:r).replace(Fe,`/`)}function He(e){return e.replace(Re,``).replace(Ie,`_`).replace(Le,``)}function P(e,t=T.cwd()){let n=Ve(e,t);return`${He(n)}_${Be(n)}`}const Ue=new Set([`return`,`throw`,`case`,`typeof`,`instanceof`,`new`,`delete`,`void`,`in`,`of`]);function F(e){return e===` `||e===` `||e===`\r`||e===`
2
- `||e===`\u2028`||e===`\u2029`||e===``}function I(e){return e===`\r`||e===`
3
- `||e===`\u2028`||e===`\u2029`}function We(e,t,n){for(;t<n&&F(e[t]);)t++;return t}function L(e,t,n){for(;t<n;){let r=We(e,t,n);if(r!==t){t=r;continue}if(e[t]===`/`&&e[t+1]===`/`){t=R(e,t,n);continue}if(e[t]===`/`&&e[t+1]===`*`){t=z(e,t,n);continue}break}return t}function R(e,t,n){for(;t<n&&!I(e[t]);)t++;return t}function z(e,t,n){for(t+=2;t<n-1&&(e[t]!==`*`||e[t+1]!==`/`);)t++;return t+2}function B(e,t,n,r){for(t++;t<n;){if(e[t]===`\\`){t+=2;continue}if(e[t]===r)return t+1;t++}return t}function Ge(e,t,n){t++;let r=e[t]===`/`;for(r&&t++;t<n&&(U(e[t])||e[t]===`.`||e[t]===`-`);)t++;let i=+!r;for(;t<n&&i>0;){let a=e[t]===`'`||e[t]===`"`||e[t]==="`"?e[t]:null;if(a){t=B(e,t,n,a);continue}if(e[t]===`{`){t++;let r=1;for(;t<n&&r>0;){let i=e[t]===`'`||e[t]===`"`||e[t]==="`"?e[t]:null;if(i){t=B(e,t,n,i);continue}e[t]===`{`&&r++,e[t]===`}`&&r--,t++}continue}if(e[t]===`/`&&e[t+1]===`>`){i--,t+=2;continue}if(e[t]===`>`){t++,r&&i--;continue}if(e[t]===`<`){let r=e[t+1];if(r===`/`||r===`.`||r===`>`||qe(r)){for(r===`/`?(i--,t++):r!==`!`&&i++,t++;t<n&&(U(e[t])||e[t]===`.`||e[t]===`-`);)t++;continue}t++;continue}t++}return t}function Ke(e,t){let n=0,r=e.length;for(;n<r;){if(F(e[n])){n++;continue}if(e[n]===`/`&&e[n+1]===`/`){n=R(e,n,r);continue}if(e[n]===`/`&&e[n+1]===`*`){n=z(e,n,r);continue}let i=e[n]===`'`||e[n]===`"`?e[n]:null;if(i){let a=n+1,o=B(e,n,r,i);if(o>a){let i=e.slice(a,o-1),s=o;for(;s<r;){if(F(e[s])&&!I(e[s])){s++;continue}if(I(e[s])||e[s]===`;`){if(i===t)return!0;n=s+1;break}if(e[s]===`/`&&e[s+1]===`/`){s=R(e,s,r);continue}if(e[s]===`/`&&e[s+1]===`*`){s=z(e,s,r);continue}return!1}if(s>=r)return i===t;if(s<r&&(I(e[s])||e[s]===`;`))continue;return!1}}return!1}return!1}function V(e){return Ke(e,`use server`)}function H(e){return Ke(e,`use client`)}function U(e){return!!e&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`_`||e===`$`)}function qe(e){return!!e&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`_`||e===`$`)}function Je(e){return!e||e===`(`||e===`[`||e===`{`||e===`,`||e===`;`||e===`=`||e===`:`||e===`?`||e===`!`||e===`+`||e===`-`||e===`*`||e===`%`||e===`&`||e===`|`||e===`^`||e===`~`||e===`<`||e===`>`}function Ye(e,t){let n=t-1;for(;n>=0;){if(F(e[n])){n--;continue}if(n>=1&&e[n]===`/`&&e[n-1]===`*`){for(n-=2;n>=1;){if(e[n]===`*`&&e[n-1]===`/`){n-=2;break}n--}if(n<0)return;continue}if(n>=1&&e[n]===`/`&&e[n-1]===`/`){n-=2;continue}let t=n;for(;t>=0&&e[t]!==`
4
- `&&e[t]!==`\r`;)t--;let r=t+1;for(;r<n&&(e[r]===` `||e[r]===` `);)r++;if(r<n&&e[r]===`/`&&e[r+1]===`/`){n=r-1;continue}break}if(n<0||!U(e[n]))return;let r=n;for(;n>=0&&U(e[n]);)n--;return e.slice(n+1,r+1)}function Xe(e,t){if(Je(Qe(e,t)))return!0;let n=Ye(e,t);return n?Ue.has(n):!1}function Ze(e,t,n){t++;let r=!1;for(;t<n;){if(e[t]===`\\`){t+=2;continue}if(r){e[t]===`]`&&(r=!1),t++;continue}if(e[t]===`[`){r=!0,t++;continue}if(e[t]===`/`){for(t++;t<n&&U(e[t]);)t++;return t}if(I(e[t]))return t;t++}return t}function Qe(e,t){let n=t-1;for(;n>=0;){if(F(e[n])){n--;continue}if(n>=1&&e[n]===`/`&&e[n-1]===`*`){for(n-=2;n>=1;){if(e[n]===`*`&&e[n-1]===`/`){n-=2;break}n--}if(n<0)return;continue}if(n>=1&&e[n]===`/`&&e[n-1]===`/`){n-=2;continue}let t=n;for(;t>=0&&e[t]!==`
5
- `&&e[t]!==`\r`;)t--;let r=t+1;for(;r<n&&(e[r]===` `||e[r]===` `);)r++;if(r<n&&e[r]===`/`&&e[r+1]===`/`){n=r-1;continue}return e[n]}}function W(e){let t=0,n=e.length;for(;t<n;){if(F(e[t])){t++;continue}if(e[t]===`/`&&e[t+1]===`/`){t=R(e,t,n);continue}if(e[t]===`/`&&e[t+1]===`*`){t=z(e,t,n);continue}let r=e[t]===`'`||e[t]===`"`||e[t]==="`"?e[t]:null;if(r){t=B(e,t,n,r);continue}if(e[t]===`/`&&e[t+1]!==`/`&&e[t+1]!==`*`&&Xe(e,t)){t=Ze(e,t,n);continue}if(e[t]===`<`){let r=e[t+1];if(r===`/`||r===`.`||r===`>`||qe(r)){t=Ge(e,t,n);continue}t++;continue}if(e.slice(t,t+6)===`export`){let r=t+6;if(r<n&&(F(e[r])||e[r]===`{`||e[r]===`/`&&(e[r+1]===`/`||e[r+1]===`*`))){let t=L(e,r,n);if(e.slice(t,t+7)==="default"){let r=t+7;if(r>=n||!U(e[r]))return!0}if(e[t]===`{`){let r=t+1;for(;r<n&&(r=L(e,r,n),e[r]!==`}`);){let t=r;for(;r<n&&U(e[r]);)r++;let i=e.slice(t,r);if(!i)break;r=L(e,r,n);let a=!1;if(e.slice(r,r+2)===`as`){a=!0;let t=r+2;if(t<n&&!U(e[t])){r=L(e,t,n);let i=r;for(;r<n&&U(e[r]);)r++;if(e.slice(i,r)==="default")return!0}}if(!a&&i==="default")return!0;if(e[r]===`,`){r++;continue}if(e[r]===`}`)break;r++}}}}t++}return!1}function $e(e,t){let n=null;for(let r of t)if(e.endsWith(r)&&(n??=S.existsSync(e),n))return e;for(let n of t){let t=`${e}${n}`;if(S.existsSync(t))return t}return null}function et(e,t){if(S.existsSync(e)){if(!S.statSync(e).isDirectory())return null;for(let n of t){let t=w.join(e,`index${n}`);if(S.existsSync(t))return t}}return null}var tt=class{errorCount=0;maxErrors;resetTimeout;resetTimer=null;lastError=null;constructor(e={}){this.maxErrors=e.maxErrors??5,this.resetTimeout=e.resetTimeout??3e4}recordError(e){this.errorCount++,this.lastError=e,this.resetTimer=se(this.resetTimer),this.resetTimer=setTimeout(()=>{this.reset()},this.resetTimeout),this.errorCount>=this.maxErrors&&this.handleMaxErrorsReached()}reset(){this.errorCount=0,this.lastError=null,this.resetTimer=se(this.resetTimer)}getErrorCount(){return this.errorCount}getLastError(){return this.lastError}hasReachedMaxErrors(){return this.errorCount>=this.maxErrors}handleMaxErrorsReached(){console.error(`[rari] HMR: Maximum error count (${this.maxErrors}) reached. Consider restarting the dev server if issues persist.`)}dispose(){this.reset()}};const nt=/^(["'])use client\1\s*(?:;\s*)?(?:\/\/.*)?$/;var rt=class{serverComponentBuilder;rustServerUrl;pendingUpdates=new Map;pendingFiles=new Set;batchTimer=null;DEBOUNCE_DELAY=200;errorHandler;logBatch=[];logBatchTimer=null;LOG_BATCH_DELAY=500;constructor(e,t=3e3){this.serverComponentBuilder=e,this.rustServerUrl=`http://localhost:${t}`,this.errorHandler=new tt({maxErrors:5,resetTimeout:3e4})}getErrorCount(){return this.errorHandler.getErrorCount()}async handleClientComponentUpdate(e,t){let n=w.relative(T.cwd(),e);try{let r=t.moduleGraph.getModuleById(e);r?(t.moduleGraph.invalidateModule(r),this.errorHandler.reset()):this.queueLog(`warning`,`Client component module not found in graph: ${n}`)}catch(e){let t=e instanceof Error?e.message:String(e);this.queueLog(`error`,`Failed to update client component: ${n} - ${t}`),this.errorHandler.recordError(e instanceof Error?e:Error(t))}}async handleServerComponentUpdate(e,t){this.pendingFiles.add(e);let n=this.pendingUpdates.get(e);n&&(clearTimeout(n),this.pendingUpdates.delete(e)),this.batchTimer&&clearTimeout(this.batchTimer),this.batchTimer=setTimeout(async()=>{let e=[...this.pendingFiles];if(this.pendingFiles.clear(),this.batchTimer=null,e.length===0)return;let n=this.collectDependentPageComponents(e);for(let e of n)this.serverComponentBuilder.invalidateBuildCacheFor(e);let r=[...e,...n],i=await Promise.allSettled(r.map(async e=>{let t=w.relative(T.cwd(),e);try{let n=await this.serverComponentBuilder.rebuildComponent(e);if(!n.success)throw Error(n.error||`Build failed`);return await this.notifyRustServer(n.componentId,n.bundlePath),{success:!0,componentId:n.componentId,filePath:e,relativePath:t}}catch(n){return{success:!1,filePath:e,relativePath:t,error:n instanceof Error?n:Error(String(n))}}})),a=[],o=[];if(i.forEach(e=>{e.status===`fulfilled`&&e.value.success?a.push(e.value):e.status===`fulfilled`&&!e.value.success?o.push(e.value):e.status===`rejected`&&o.push({filePath:``,relativePath:`unknown`,error:Error(String(e.reason))})}),a.length>0){let e=Date.now();a.forEach(({componentId:n})=>{t.hot.send(`rari:server-component-updated`,{id:n,t:e})}),this.errorHandler.reset(),t.ws.send({type:`custom`,event:`rari:hmr-error-cleared`,data:{t:e}})}if(o.length>0){let e=Date.now();o.forEach(({relativePath:n,error:r})=>{let i=r.message,a=(r.stack||``).substring(0,500);this.queueLog(`error`,`Failed to rebuild: ${n} - ${i}`),this.errorHandler.recordError(r),t.ws.send({type:`custom`,event:`rari:hmr-error`,data:{msg:i,stack:a,file:n,t:e,count:this.errorHandler.getErrorCount(),max:5}})}),this.errorHandler.hasReachedMaxErrors()&&this.queueLog(`error`,`Maximum error count reached (${this.errorHandler.getErrorCount()}). Consider restarting the dev server if issues persist.`)}},this.DEBOUNCE_DELAY)}async notifyRustServer(e,t){try{let n=await fetch(`${this.rustServerUrl}/_rari/hmr`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`reload-component`,component_id:e,bundle_path:t})});await d(n);let r=await n.text(),i;try{i=JSON.parse(r)}catch(e){throw Error(`Failed to parse server response (status ${n.status}): ${e instanceof Error?e.message:String(e)}. Response body: ${r.substring(0,200)}${r.length>200?`...`:``}`)}if(!i||typeof i!=`object`)throw Error(`Invalid server response (status ${n.status}): expected object, got ${typeof i}. Response body: ${r.substring(0,200)}${r.length>200?`...`:``}`);let a=i;if(!a.success)throw Error(a.message||a.error||`Component reload failed`)}catch(e){throw console.error(`[rari] HMR: Failed to notify Rust server:`,e),e}}collectDependentPageComponents(e){let t=this.serverComponentBuilder.getImportGraph(),n=new Set,r=new Set,i=a=>{if(r.has(a))return;r.add(a);let o=t.get(a);if(o)for(let t of o)(t.includes(`/app/`)||t.includes(`\\app\\`))&&!e.includes(t)&&n.add(t),i(t)};for(let t of e)i(t);return[...n]}detectComponentType(e){try{let t=S.readFileSync(e,`utf-8`).split(`
6
- `),n=!1;function r(e){return nt.test(e.trim())}function i(e){let t=e;for(;t.includes(`/*`)&&t.includes(`*/`);){let e=t.indexOf(`/*`),n=t.indexOf(`*/`,e);if(n===-1)break;t=t.substring(0,e)+t.substring(n+2)}if(t.includes(`/*`)){let e=t.indexOf(`/*`);t=t.substring(0,e)}return t}for(let e of t){let t=e.trim();if(n){if(t.includes(`*/`)){n=!1;let e=t.substring(t.indexOf(`*/`)+2).trim();if(!e||e.startsWith(`//`))continue;let a=i(e).trim();if(!a||a.startsWith(`//`))continue;if(r(a))return`client`;break}continue}if(!(!t||t.startsWith(`//`))){if(t.includes(`/*`))if(t.includes(`*/`)){let e=i(t).trim();if(!e||e.startsWith(`//`))continue;if(r(e))return`client`;break}else{let e=t.substring(0,t.indexOf(`/*`)).trim();if(e){if(r(e))return`client`;break}n=!0;continue}if(r(t))return`client`;break}}return`server`}catch{return`unknown`}}queueLog(e,t){this.logBatch.push({type:e,message:t,timestamp:Date.now()}),this.logBatchTimer&&clearTimeout(this.logBatchTimer),this.logBatchTimer=setTimeout(()=>{this.flushLogs()},this.LOG_BATCH_DELAY)}flushLogs(){if(this.logBatch.length===0)return;let e=this.logBatch.reduce((e,t)=>(e[t.type]||(e[t.type]=[]),e[t.type].push(t),e),{});for(let[t,n]of Object.entries(e))if(n.length===1){let e=n[0];this.outputLog(t,e.message)}else{let e=n.map(e=>e.message).join(`
7
- • `);this.outputLog(t,`${n.length} updates:\n • ${e}`)}this.logBatch=[],this.logBatchTimer=null}outputLog(e,t){let n=`[rari] HMR:`;switch(e){case`success`:console.warn(`\x1B[32m${n}\x1B[0m ${t}`);break;case`warning`:console.warn(`\x1B[33m${n}\x1B[0m ${t}`);break;case`error`:console.error(`\x1B[31m${n}\x1B[0m ${t}`);break;default:console.warn(`${n} ${t}`);break}}dispose(){this.logBatchTimer&&(clearTimeout(this.logBatchTimer),this.flushLogs()),this.batchTimer&&=(clearTimeout(this.batchTimer),null);for(let e of this.pendingUpdates.values())clearTimeout(e);this.pendingUpdates.clear(),this.pendingFiles.clear(),this.errorHandler.dispose()}};const it=/import\s+(\w+)\s+from\s+['"]rari\/image['"]/g,at=/import\s+\{[^}]*\b(?:Image\s+as\s+(\w+)|Image)\b[^}]*\}\s+from\s+['"]rari\/image['"]/g,ot=/src:\s*["']([^"']+)["']/,st=/[.*+?^${}()|[\]\\]/g,ct=/^[A-Z_$][\w$]*$/i,lt=/width:\s*(\d+)/,ut=/quality:\s*(\d+)/,dt=/preload:\s*(true|!0)/,ft=/preload:\s*(false|!1)/,pt=/src=\{?["']([^"']+)["']\}?|src=\{([^}]+)\}/,mt=/width=\{?(\d+)\}?/,ht=/quality=\{?(\d+)\}?/,gt=/preload(?:=\{?true\}?)?/,_t=/preload=\{?false\}?/;async function vt(e,t){try{await kt(await O.readFile(e,`utf8`),e,t)}catch(t){t.code!==`ENOENT`&&console.warn(`[rari] Image scanner: Failed to process ${e}:`,t)}}const yt=new class{permits;queue=[];constructor(e){this.permits=e}async acquire(){if(this.permits>0){this.permits--;return}return new Promise(e=>{this.queue.push(e)})}release(){this.permits++;let e=this.queue.shift();e&&(this.permits--,e())}async run(e){await this.acquire();try{return await e()}finally{this.release()}}}(50);async function G(e,t){try{await O.access(e)}catch{return}let n=await O.readdir(e,{withFileTypes:!0}),r=[];for(let i of n){let n=w.join(e,i.name);if(i.isDirectory()){if(i.name===`node_modules`||i.name===`dist`)continue;r.push(G(n,t))}else i.isFile()&&y.test(i.name)&&r.push(yt.run(()=>vt(n,t)))}await Promise.all(r)}async function bt(e,t=[]){let n=new Map;try{await O.access(e),await G(e,n)}catch(t){throw t.code===`ENOENT`?Error(`Required source directory does not exist: ${e}`):t}for(let e of t)try{await O.access(e),await G(e,n)}catch(t){t.code!==`ENOENT`&&console.warn(`[rari] Image scanner: Failed to scan directory ${e}:`,t)}return{images:[...n.values()]}}function xt(e){return e.endsWith(`.tsx`)?`tsx`:e.endsWith(`.jsx`)?`jsx`:e.endsWith(`.ts`)?`ts`:`js`}async function St(e,t,n){let r=`\0virtual:${t}`,i=await k({input:r,external:[`rari/image`],platform:`browser`,write:!1,output:{format:`esm`},moduleTypes:{[`.${n}`]:n},transform:{jsx:`react`},plugins:[{name:`virtual-module`,resolveId(e){return e===r?e:null},load(t){return t===r?{code:e,moduleType:n}:null}}]});if(!i.output||i.output.length===0)throw Error(`Transform produced no output`);return i.output[0].code}function K(e){let t=new Set;for(let n of e.matchAll(it))t.add(n[1]);for(let n of e.matchAll(at))n[1]?t.add(n[1]):t.add(`Image`);return t}function Ct(e){return K(e)}function wt(e){let t=e.match(ot);if(!t)return null;let n=t[1];if(!n.startsWith(`/`)&&!n.startsWith(`http`))return null;let r=e.match(lt),i=r?Number.parseInt(r[1],10):void 0,a=e.match(ut),o=a?Number.parseInt(a[1],10):void 0,s=e.match(dt),c=e.match(ft);return{src:n,width:i,quality:o,preload:!!s&&!c}}function Tt(e,t){let n=`${e.src}:${e.width??`auto`}:${e.quality??75}`;(!t.has(n)||e.preload)&&t.set(n,e)}function Et(e,t){let n=0,r=!1,i=``,a=!1,o=0;for(let s=t;s<e.length;s++){let c=e[s];if(a){a=!1;continue}if(c===`\\`){a=!0;continue}if(!r&&(c===`"`||c===`'`||c==="`")){r=!0,i=c,c==="`"&&(o=1);continue}if(r&&c===i){i==="`"?(o--,o===0&&(r=!1,i=``)):(r=!1,i=``);continue}if(r&&i==="`"&&c===`$`&&s+1<e.length&&e[s+1]===`{`){n++,s++;continue}if(r&&i==="`"&&n>0&&c==="`"){o++;continue}if(r&&i==="`"&&c===`}`&&n>0){n--;continue}if(!r){if(c===`{`)n++;else if(c===`}`&&(n--,n===0))return e.substring(t+1,s)}}return null}function Dt(e,t,n){for(let r of t){if(!ct.test(r)){console.warn(`[rari] Image scanner: Skipping unsafe identifier: ${r}`);continue}let t=r.replace(st,`\\$&`),i=RegExp(`React\\.createElement\\(\\s*${t}\\s*,\\s*\\{`,`g`);for(let t of e.matchAll(i)){let r=Et(e,t.index+t[0].length-1);if(r){let e=wt(r);e&&Tt(e,n)}}}}function Ot(e){return K(e)}async function kt(e,t,n){let r=Ot(e);if(r.size!==0)try{let r=await St(e,t,xt(t)),i=Ct(r);if(i.size===0)return;Dt(r,i,n)}catch{At(e,r,n)}}function At(e,t,n){for(let r of t){if(!ct.test(r)){console.warn(`[rari] Image scanner: Skipping unsafe alias: ${r}`);continue}let t=r.replace(st,`\\$&`),i=RegExp(`<${t}\\s([^/>]+)\\/>`,`g`),a=RegExp(`<${t}\\s([^>]+)>`,`g`);for(let t of e.matchAll(i))jt(t[1],n);for(let t of e.matchAll(a))jt(t[1],n)}}function jt(e,t){let n=e.match(pt);if(!n)return;let r=n[1]||n[2];if(!r||r.includes(`{`)||!r.startsWith(`/`)&&!r.startsWith(`http`))return;let i=e.match(mt),a=i?Number.parseInt(i[1],10):void 0,o=e.match(ht),s=o?Number.parseInt(o[1],10):void 0,c=gt.test(e)&&!_t.test(e),l=`${r}:${a??`auto`}:${s??75}`;(!t.has(l)||c)&&t.set(l,{src:r,width:a,quality:s,preload:c})}const Mt=/import\s*\(\s*["']([^"']+)["']\s*\)|import\s+["']([^"']+)["']/g,q=/from\s+['"]([^'"]+)['"]|import\s*\(\s*['"]([^'"]+)['"]\s*\)|import\s+['"]([^'"]+)['"]/g,Nt=/import(?:\s+(?:\w+|\{[^}]*\}|\*\s+as\s+\w+)(?:\s*,\s*(?:\w+|\{[^}]*\}|\*\s+as\s+\w+))*\s+from\s+)?['"]([^'"]+)['"]/g,Pt=/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g,Ft=/import\s+(?:(\w+)|\{([^}]+)\})\s+from\s+['"]([^'"]+)['"];?\s*$/gm,It=/^proxy\.(?:tsx?|jsx?|mts|mjs)$/,Lt=/\\/g,Rt=/\/components\/(\w+)(?:\.tsx?|\.jsx?)?$/,zt=/[/\\]components[/\\](\w+)(?:\.tsx?|\.jsx?)?$/,Bt=/^(?:robots|sitemap)\.(?:tsx?|jsx?)$/,Vt=/^node:/,J=/\\/g,Ht=`[hash]_[local]`,Ut=w.dirname(E(import.meta.url)),Wt=w.dirname(Ut);function Gt(e){return e.startsWith(Wt)}var Y=class{serverComponents=new Map;serverActions=new Map;options;projectRoot;buildCache=new Map;htmlOnlyImports=new Set;fileImporters=new Map;getComponentCount(){return this.serverComponents.size+this.serverActions.size}getImportGraph(){let e=new Map;for(let[t,n]of this.fileImporters)e.set(t,new Set(n));return e}getHtmlOnlyImports(){return new Set(this.htmlOnlyImports)}hashString(e,t=8){return Be(e,t)}async writeComponentCssAsset(e,t){if(t.length===0)return[];let n=w.join(this.options.outDir,`assets`,`server`);await S.promises.mkdir(n,{recursive:!0});let r=`${t.join(`
8
- `)}\n`,i=`${this.hashString(e+r,12)}.css`,a=w.join(n,i);return await S.promises.writeFile(a,r,`utf-8`),[`/assets/server/${i}`]}getComponentIdFromRouteManifestPath(e){return this.getComponentId(w.join(this.projectRoot,`src`,`app`,e))}getLegacyComponentReferenceId(e){return this.getReadableComponentId(this.getProjectRelativePath(e))}async writeRouteCssEntries(e){let t=w.join(this.options.outDir,this.options.rscDir,`routes.json`);if(!S.existsSync(t))return;let n=await S.promises.readFile(t,`utf-8`),r=JSON.parse(n),i=t=>{if(t)for(let n of t){if(!n.filePath)continue;let t=this.getComponentIdFromRouteManifestPath(n.filePath);n.componentId=t;let r=e.components[t]?.css??[];r.length?n.css=r:delete n.css}};if(i(r.routes),i(r.layouts),i(r.loading),i(r.errors),i(r.notFound),r.apiRoutes)for(let e of r.apiRoutes)e.filePath&&(e.componentId=this.getComponentIdFromRouteManifestPath(e.filePath));await S.promises.writeFile(t,JSON.stringify(r,null,2),`utf-8`)}constructor(e,t={}){this.projectRoot=e;let n=t.rscDir||`server`;this.options={outDir:t.outDir||w.join(e,`dist`),rscDir:n,manifestPath:t.manifestPath||w.join(n,`manifest.json`),serverConfigPath:t.serverConfigPath||w.join(n,`config.json`),minify:t.minify??T.env.NODE_ENV===`production`,alias:t.alias||{},define:t.define,csp:t.csp,cacheControl:t.cacheControl},this.parseHtmlImports()}parseHtmlImports(){let e=w.join(this.projectRoot,`index.html`);if(S.existsSync(e))try{let t=S.readFileSync(e,`utf-8`);for(let e of t.matchAll(Mt)){let t=e[1]||e[2];if(t.startsWith(`/src/`)){let e=w.join(this.projectRoot,t.slice(1));this.htmlOnlyImports.add(e)}}}catch(e){console.warn(`[server-build] Error parsing index.html:`,e)}}isHtmlOnlyImport(e){return this.htmlOnlyImports.has(e)}isServerComponent(e,t){if(e.includes(`node_modules`)||this.isHtmlOnlyImport(e))return!1;try{let n=t??(S.existsSync(e)?S.readFileSync(e,`utf-8`):null);return n===null?!1:!H(n)&&!V(n)}catch{return!1}}isClientComponent(e,t){try{let n=t??(S.existsSync(e)?S.readFileSync(e,`utf-8`):null);return n===null?!1:H(n)}catch{return!1}}buildImportGraph(e){this.fileImporters.clear();let t=e=>{if(!S.existsSync(e))return;let n=S.readdirSync(e,{withFileTypes:!0});for(let r of n){let n=w.join(e,r.name);if(r.isDirectory()){if(r.name===`node_modules`)continue;t(n)}else if(r.isFile()&&y.test(r.name))try{let e=S.readFileSync(n,`utf-8`),t;for(q.lastIndex=0,t=q.exec(e);t!==null;){let r=t[1]||t[2]||t[3],i=null;if(r.startsWith(`./`)||r.startsWith(`../`)){let e=w.dirname(n);i=w.resolve(e,r)}else if(r.startsWith(`@/`)){let e=r.slice(2);i=w.join(this.projectRoot,`src`,e)}if(i){let e=[``,`.ts`,`.tsx`,`.js`,`.jsx`],t=null;for(let n of e){let e=i+n;if(S.existsSync(e)&&S.statSync(e).isFile()){t=e;break}}t&&(this.fileImporters.has(t)||this.fileImporters.set(t,new Set),this.fileImporters.get(t).add(n))}t=q.exec(e)}}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error building import graph:`,n,e)}}};t(e)}isOnlyImportedByClientComponents(e){let t=this.fileImporters.get(e);if(!t||t.size===0)return!1;for(let e of t)if(!this.isClientComponent(e)&&!this.isOnlyImportedByClientComponents(e))return!1;return!0}addServerComponent(e,t){let n=t??S.readFileSync(e,`utf-8`);if(this.isServerAction(n)){let t=this.extractDependencies(n),r=this.hasNodeImports(n);this.serverActions.set(e,{filePath:e,originalCode:n,dependencies:t,hasNodeImports:r});return}if(!this.isServerComponent(e,n))return;let r=this.extractDependencies(n),i=this.hasNodeImports(n);this.serverComponents.set(e,{filePath:e,originalCode:n,dependencies:r,hasNodeImports:i})}isServerAction(e){return V(e)}extractDependencies(e){let t=[],n;for(Nt.lastIndex=0;n=Nt.exec(e),n!==null;){let e=n[1];!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`node:`)&&!this.isNodeBuiltin(e)&&t.push(e)}return[...new Set(t)]}isNodeBuiltin(e){return[`fs`,`path`,`os`,`crypto`,`util`,`stream`,`events`,`process`,`buffer`,`url`,`querystring`,`zlib`,`http`,`https`,`net`,`tls`,`child_process`,`cluster`,`worker_threads`].includes(e)}hasNodeImports(e){return e.includes(`from 'node:`)||e.includes(`from "node:`)||e.includes(`from 'fs'`)||e.includes(`from "fs"`)||e.includes(`from 'path'`)||e.includes(`from "path"`)||e.includes(`from 'os'`)||e.includes(`from "os"`)||e.includes(`from 'crypto'`)||e.includes(`from "crypto"`)||e.includes(`from 'util'`)||e.includes(`from "util"`)||e.includes(`from 'stream'`)||e.includes(`from "stream"`)||e.includes(`from 'events'`)||e.includes(`from "events"`)}async getTransformedComponentsForDevelopment(){let e=[];for(let[t]of this.serverComponents){let n=w.relative(this.projectRoot,t),r=this.getComponentId(n),i=await this.buildComponentCodeOnly(t);e.push({id:r,code:i})}for(let[t]of this.serverActions){let n=w.relative(this.projectRoot,t),r=this.getComponentId(n),i=await this.buildComponentCodeOnly(t);e.push({id:r,code:i})}return e}transformComponentImportsToGlobal(e){let t=[];for(let n of e.matchAll(Pt)){let[e,r,i]=n;if(!i.startsWith(`.`)&&!i.startsWith(`@`)&&!i.startsWith(`~`)&&!i.startsWith(`#`))continue;let a=null;if(i.startsWith(`.`)){if(i.includes(`/components/`)){let n=i.match(Rt);if(n){let i=n[1],a=[w.resolve(this.projectRoot,`src`,`components`,`${i}.tsx`),w.resolve(this.projectRoot,`src`,`components`,`${i}.ts`),w.resolve(this.projectRoot,`src`,`components`,`${i}.jsx`),w.resolve(this.projectRoot,`src`,`components`,`${i}.js`)],o=!1;for(let e of a)if(S.existsSync(e)&&this.isClientComponent(e)){o=!0;break}if(!o)continue;let s=`// Component reference: ${i}
1
+ import{RariRequest as e}from"./proxy/RariRequest.mjs";import{RariResponse as t}from"./proxy/RariResponse.mjs";import{a as n,i as r,n as i,o as a,r as o,s,t as c}from"./props-extractor-C8FRV5vW.mjs";import{i as l,n as u,o as d,r as f,t as p}from"./constants-De7aSsCq.mjs";import{_ as m,a as h,b as g,c as _,i as v,m as y,o as ee,r as b,s as te,t as x,x as ne,y as S}from"./regex-constants-DQ2vkSU5.mjs";import{t as C}from"./timer-utils-Duul5JHq.mjs";import{t as re}from"./alias-resolver-BintHkb_.mjs";import{Buffer as ie}from"node:buffer";import{spawn as ae}from"node:child_process";import w,{promises as T}from"node:fs";import E from"node:path";import D from"node:process";import{fileURLToPath as O,pathToFileURL as k}from"node:url";import oe from"node:crypto";import A from"node:fs/promises";import{build as j}from"rolldown";function se(e={}){let{root:t=D.cwd(),srcDir:n=`src`,proxyFileName:r=`proxy`,extensions:i=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mts`,`.mjs`],verbose:a=!1}=e,o=null,s=e=>{a&&console.warn(`[rari] Proxy: ${e}`)};async function c(){for(let e of i){let n=`${r}${e}`,i=E.join(t,n);try{return await T.access(i),s(`Found proxy file: ${n}`),{filePath:i,exists:!0,relativePath:n}}catch{}}let e=E.join(t,n);try{await T.access(e);for(let t of i){let i=`${r}${t}`,a=E.join(e,i);try{return await T.access(a),s(`Found proxy file: ${E.join(n,i)}`),{filePath:a,exists:!0,relativePath:E.join(n,i)}}catch{}}}catch{}return null}return{name:`rari:proxy`,async buildStart(){o=await c(),s(o?`Proxy enabled: ${o.relativePath}`:`No proxy file found`)},configureServer(e){o&&(e.watcher.add(o.filePath),e.watcher.on(`change`,t=>{t===o?.filePath&&(s(`Proxy file changed, reloading...`),e.ws.send({type:`custom`,event:`rari:proxy-reload`}))}))},async handleHotUpdate({file:e,server:t}){if(o&&e===o.filePath)return s(`Hot reloading proxy...`),t.ws.send({type:`custom`,event:`rari:proxy-reload`,data:{file:o.relativePath}}),[]}}}const M={PAGE:`page`,LAYOUT:`layout`,LOADING:`loading`,ERROR:`error`,NOT_FOUND:`not-found`,TEMPLATE:`template`,DEFAULT:`default`,ROUTE:`route`,OG_IMAGE:`opengraph-image`,TWITTER_IMAGE:`twitter-image`,ICON:`icon`,APPLE_ICON:`apple-icon`},N={DYNAMIC:/^\[([^\]]+)\]$/,CATCH_ALL:/^\[\.\.\.([^\]]+)\]$/,OPTIONAL_CATCH_ALL:/^\[\[\.\.\.([^\]]+)\]\]$/},ce=[{pattern:N.OPTIONAL_CATCH_ALL,type:`optional-catch-all`,format:e=>`[[...${e}]]`},{pattern:N.CATCH_ALL,type:`catch-all`,format:e=>`[...${e}]`},{pattern:N.DYNAMIC,type:`dynamic`,format:e=>`[${e}]`}],le=/^\([^/]+\)$/;function P(e){return le.test(e)}function ue(e){return e?e.replace(x,`/`).split(`/`).filter(Boolean).some(P):!1}function de(e){for(let t of ce){let n=e.match(t.pattern);if(n)return{type:t.type,param:n[1],format:t.format}}}function fe(e){let t=de(e);return t?t.format(t.param):e}function pe(e){let t=de(e);return t?{type:t.type,value:e,param:t.param}:{type:`static`,value:e}}const me=/export\s+const\s+size\s*=\s*\{\s*width\s*:\s*(\d+)\s*,\s*height\s*:\s*(\d+)\s*[,}]/,he=/export\s+const\s+contentType\s*=\s*['"]([^'"]+)['"]/,ge=[`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`];var _e=class{appDir;extensions;verbose;constructor(e){this.appDir=E.resolve(e.appDir),this.extensions=e.extensions||[`.tsx`,`.jsx`,`.ts`,`.js`],this.verbose=e.verbose||!1}async generateManifest(){this.verbose&&console.warn(`[rari] Router: Scanning app directory: ${this.appDir}`);let e=[],t=[],n=[],r=[],i=[],a=[],o=[],s=[];await this.scanDirectory(``,e,t,n,r,i,a,o,s);for(let o of[t,n,r,i,a,s])this.finalizeGroupEntries(e,o);return this.assertNoDuplicateRoutes(e),this.assertNoDuplicateRoutes(o),this.verbose&&(console.warn(`[rari] Router: Found ${e.length} routes`),console.warn(`[rari] Router: Found ${t.length} layouts`),console.warn(`[rari] Router: Found ${n.length} loading components`),console.warn(`[rari] Router: Found ${r.length} error boundaries`),console.warn(`[rari] Router: Found ${a.length} templates`),console.warn(`[rari] Router: Found ${o.length} API routes`),console.warn(`[rari] Router: Found ${s.length} OG images`)),{routes:this.sortRoutes(e),layouts:this.sortLayouts(t),loading:n,errors:r,notFound:i,templates:this.sortTemplates(a),apiRoutes:this.sortApiRoutes(o),ogImages:s,generated:new Date().toISOString()}}finalizeGroupEntries(e,t){for(let n=t.length-1;n>=0;n--){let r=t[n],i=E.dirname(r.filePath).replace(x,`/`);if(!ue(i))continue;let a=e.filter(e=>{let t=E.dirname(e.filePath).replace(x,`/`);return t===i||t.startsWith(`${i}/`)}).map(e=>e.path);if(a.length===0){t.splice(n,1);continue}let o=Array.from(new Set(a)).sort();r.path=o[0],o.length>1&&(r.additionalPaths=o.slice(1))}}assertNoDuplicateRoutes(e){let t=new Map;for(let n of e){let e=t.get(n.path);if(e)throw Error(`[rari] Route conflict: path '${n.path}' is defined by both '${e}' and '${n.filePath}'.`);t.set(n.path,n.filePath)}}async scanDirectory(e,t,n,r,i,a,o,s,c){let l=E.join(this.appDir,e),u;try{u=await T.readdir(l)}catch{return}let d=[],f=[];for(let e of u){let t=E.join(l,e),n=await T.stat(t);n.isDirectory()?this.shouldScanDirectory(e)&&f.push(e):n.isFile()&&d.push(e)}await this.processSpecialFiles(e,d,t,n,r,i,a,o,s,c);for(let l of f){let u=e?E.join(e,l):l;await this.scanDirectory(u,t,n,r,i,a,o,s,c)}}async processSpecialFiles(e,t,n,r,i,a,o,s,c,l){let u=this.pathToRoute(e),d=this.findFile(t,M.PAGE);if(d){let t=this.parseRouteSegments(e),r=this.extractParams(t);n.push({path:u,filePath:E.join(e,d).replace(x,`/`),segments:t,params:r,isDynamic:r.length>0})}let f=this.findFile(t,M.LAYOUT);if(f){let t=this.getParentPath(e);r.push({path:u,filePath:E.join(e,f).replace(x,`/`),parentPath:t===null?void 0:this.pathToRoute(t)})}let p=this.findFile(t,M.LOADING);if(p){let t=this.generateComponentId(u,`loading`);i.push({path:u,filePath:E.join(e,p).replace(x,`/`),componentId:t})}let m=this.findFile(t,M.ERROR);m&&a.push({path:u,filePath:E.join(e,m).replace(x,`/`)});let h=this.findFile(t,M.NOT_FOUND);h&&o.push({path:u,filePath:E.join(e,h).replace(x,`/`)});let g=this.findFile(t,M.TEMPLATE);if(g){let t=this.getParentPath(e);s.push({path:u,filePath:E.join(e,g).replace(x,`/`),parentPath:t===null?void 0:this.pathToRoute(t)})}let _=this.findFile(t,M.OG_IMAGE);if(_){let t=E.join(e,_).replace(x,`/`),n=E.join(this.appDir,t),r,i,a;try{let e=await T.readFile(n,`utf-8`),t=e.match(me);t&&(r=Number.parseInt(t[1],10),i=Number.parseInt(t[2],10));let o=e.match(he);o&&(a=o[1])}catch{}l.push({path:u,filePath:t,width:r,height:i,contentType:a})}let v=this.findFile(t,M.ROUTE);if(v){let t=await this.processApiRouteFile(e,v);c.push(t)}}findFile(e,t){for(let n of this.extensions){let r=`${t}${n}`;if(e.includes(r))return r}}pathToRoute(e){return e?`/${e.replace(x,`/`).split(`/`).filter(Boolean).filter(e=>!P(e)).map(fe).join(`/`)}`:`/`}parseRouteSegments(e){return e?e.split(m).filter(Boolean).filter(e=>!P(e)).map(pe):[]}extractParams(e){return e.filter(e=>e.param!==void 0).map(e=>e.param)}getParentPath(e){if(!e)return null;let t=e.split(m).filter(Boolean);return t.length===0?null:t.slice(0,-1).join(`/`)}generateComponentId(e,t){return`${t}:${e}`}shouldScanDirectory(e){return![`node_modules`,`.git`,`dist`,`build`,`__tests__`,`test`,`tests`,`coverage`].includes(e)&&!e.startsWith(`_`)&&!e.startsWith(`.`)}sortRoutes(e){return e.sort((e,t)=>{let n=e=>{if(!e.isDynamic)return 0;let t=e.segments.some(e=>e.type===`catch-all`);return e.segments.some(e=>e.type===`optional-catch-all`)?3:t?2:1},r=n(e),i=n(t);if(r!==i)return r-i;let a=e.path.split(`/`).length,o=t.path.split(`/`).length;return a===o?e.path.localeCompare(t.path):o-a})}sortApiRoutes(e){return e.sort((e,t)=>{if(!e.isDynamic&&t.isDynamic)return-1;if(e.isDynamic&&!t.isDynamic)return 1;let n=e.path.split(`/`).length,r=t.path.split(`/`).length;return n===r?e.path.localeCompare(t.path):n-r})}sortLayouts(e){return e.sort((e,t)=>e.path===`/`&&t.path!==`/`?-1:t.path===`/`&&e.path!==`/`?1:e.path.split(`/`).length-t.path.split(`/`).length)}sortTemplates(e){return e.sort((e,t)=>e.path===`/`&&t.path!==`/`?-1:t.path===`/`&&e.path!==`/`?1:e.path.split(`/`).length-t.path.split(`/`).length)}async detectHttpMethods(e){let t=E.join(this.appDir,e),n=await T.readFile(t,`utf-8`),r=[];for(let e of ge){let t=RegExp(`export\\s+(?:async\\s+)?function\\s+${e}\\s*\\(`),i=RegExp(`export\\s+(?:async\\s+)?(?:const|let|var)\\s+${e}\\s*=`);(t.test(n)||i.test(n))&&r.push(e)}return r}async processApiRouteFile(e,t){let n=E.join(e,t).replace(x,`/`),r=this.pathToRoute(e),i=this.parseRouteSegments(e),a=this.extractParams(i),o=await this.detectHttpMethods(n);return{path:r,filePath:n,segments:i,params:a,isDynamic:a.length>0,methods:o}}};async function ve(e,t={}){return new _e({appDir:e,...t}).generateManifest()}const ye=/export\s+const\s+metadata\s*(?::\s*\w+\s*)?=\s*(\{[\s\S]*?\n\})/,be=/title\s*:\s*['"]([^'"]+)['"]/,xe=/description\s*:\s*['"]([^'"]+)['"]/,Se=/keywords\s*:\s*\[([\s\S]*?)\]/,Ce={appDir:`src/app`,extensions:[`.tsx`,`.jsx`,`.ts`,`.js`],outDir:`dist`};function F(e){switch(E.basename(e).replace(g,``)){case`page`:return`page`;case`layout`:return`layout`;case`template`:return`template`;case`loading`:return`loading`;case`error`:return`error`;case`not-found`:return`not-found`;case`route`:return`route`;default:return null}}function we(e){return/^\([^/]+\)$/.test(e)}function Te(e){if(!e||e===`/`)return`/`;let t=e.replace(x,`/`).split(`/`).filter(e=>!!e&&!we(e));return t.length>0?`/${t.join(`/`)}`:`/`}function Ee(e,t){let n=E.relative(t,E.dirname(e));return!n||n===`.`?`/`:Te(`/${n.replace(x,`/`).split(`/`).filter(Boolean).join(`/`)}`)}function De(e,t,n){if(t===`page`)return[e];let r=`${e}${e===`/`?``:`/`}`,i=n.filter(t=>t===e||t.startsWith(r));return i.length>0?i:[e]}function Oe(e){try{let t=e.match(ye);if(!t)return null;let n=t[1],r={},i=n.match(be);i&&(r.title=i[1]);let a=n.match(xe);a&&(r.description=a[1]);let o=n.match(Se);o&&(r.keywords=o[1].split(`,`).map(e=>e.trim().replace(S,``)).filter(Boolean));for(let e of[`author`,`viewport`,`themeColor`,`robots`,`openGraph`,`twitter`]){let t=RegExp(`${e}\\s*:\\s*['"]([^'"]+)['"]`,`m`),i=n.match(t);i&&(r[e]=i[1])}return Object.keys(r).length>0?r:null}catch(e){return console.error(`[rari] Router: Failed to extract metadata:`,e),null}}function ke(e){let t=[];for(let n of[`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`]){let r=RegExp(`export\\s+(?:async\\s+)?function\\s+${n}\\s*\\(`),i=RegExp(`export\\s+(?:async\\s+)?(?:const|let|var)\\s+${n}\\s*=`);(r.test(e)||i.test(e))&&t.push(n)}return t}async function Ae(e){try{let t=await fetch(`http://localhost:3000/_rari/hmr`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`invalidate-api-route`,filePath:e})});if(!t.ok){console.error(`[rari] Router: Failed to invalidate API route cache: ${t.statusText}`);return}let n=await t.json();n.success||console.error(`[rari] HMR: Failed to invalidate API route cache: ${n.error||`Unknown error`}`)}catch(e){console.error(`[rari] Router: Failed to notify API route invalidation:`,e)}}function je(e={}){let t={...Ce,...e},n=null,r=new Map,i=null,a=new Set,o=e=>[...e].toSorted().join(`|`),s=async e=>{let n=new Set,r=async e=>{try{let i=await T.readdir(e,{withFileTypes:!0});for(let a of i){let i=E.join(e,a.name);a.isDirectory()?await r(i):a.isFile()&&t.extensions.some(e=>a.name.endsWith(e))&&F(i)&&n.add(i)}}catch{}};return await r(e),n},c=async(e,r=!1)=>{let c=E.resolve(e,t.appDir);try{await T.access(c)}catch{return null}try{let l=await s(c),u=o(l);if(!r&&i===u&&n)return n;let d=await ve(c,{extensions:t.extensions}),f=JSON.stringify(d,null,2),p=E.resolve(e,t.outDir);await T.mkdir(p,{recursive:!0});let m=E.join(p,`server`);return await T.mkdir(m,{recursive:!0}),await T.writeFile(E.join(m,`routes.json`),f,`utf-8`),i=u,a.clear(),l.forEach(e=>a.add(e)),f}catch(e){return console.error(`[rari] Router: Failed to generate app routes:`,e),null}},l=e=>{let n=E.resolve(e.config.root,t.appDir);e.watcher.on(`all`,async(r,i)=>{if(i.startsWith(n)&&t.extensions.some(e=>i.endsWith(e)))try{let n=F(i)!==null,o=r===`add`||r===`unlink`,s=n&&!a.has(i);(o||s)&&(await c(e.config.root,!0),i.includes(t.appDir)&&e.ws.send({type:`full-reload`,path:`*`}))}catch(e){console.error(`[rari] Router: Failed to regenerate app routes:`,e)}})},u;return{name:`rari-router`,configResolved(e){u=e.root;let t=e.logger.warn;e.logger.warn=(e,n)=>{typeof e==`string`&&e.includes(`The above dynamic import cannot be analyzed`)&&e.includes(`packages/rari/dist/`)||t(e,n)}},async writeBundle(){n=await c(u||D.cwd(),!0)},configureServer(e){l(e)},async handleHotUpdate(e){let{file:i,server:o}=e,s=E.resolve(o.config.root,t.appDir);if(i.startsWith(s)&&t.extensions.some(e=>i.endsWith(e))){let e=F(i);if(e){let t=r.get(i);t&&clearTimeout(t);let l=setTimeout(async()=>{r.delete(i);let t=!a.has(i),l=n;n=await c(o.config.root,t);let u=l!==n,d=Ee(i,s),f=[d];if(n)try{f=JSON.parse(n).routes.map(e=>e.path)}catch(e){console.error(`[rari] Router: Failed to parse manifest for affected routes:`,e)}let p=De(d,e,f),m,h=!1,g;if(e===`page`||e===`layout`)try{let e=Oe(await T.readFile(i,`utf-8`));e&&(m=e,h=!0)}catch(e){console.error(`[rari] Router: Failed to extract metadata:`,e)}if(e===`route`)try{g=ke(await T.readFile(i,`utf-8`)),await Ae(E.relative(s,i))}catch(e){console.error(`[rari] Router: Failed to detect HTTP methods:`,e)}let _={fileType:e,filePath:E.relative(o.config.root,i),routePath:d,affectedRoutes:p,manifestUpdated:u,timestamp:Date.now(),metadata:m,metadataChanged:h,methods:g};o.ws.send({type:`custom`,event:`rari:app-router-updated`,data:_})},200);return r.set(i,l),[]}return n=await c(o.config.root),[]}},async closeBundle(){for(let e of r.values())clearTimeout(e);r.clear();let e=u||D.cwd(),n=E.resolve(e,t.outDir,`server`),i=E.join(n,`routes.json`);try{let e=await T.readFile(i,`utf-8`),t=JSON.parse(e),r=!1;for(let e of t.routes){if(!e.isDynamic)continue;let t=e.componentId;if(!t)continue;let i=t.startsWith(`app/`)?t.slice(4):t,a=E.resolve(n,`app`,`${i}.js`);try{let t=await import(a);if(typeof t.generateStaticParams==`function`){let n=await t.generateStaticParams();Array.isArray(n)&&n.length>0&&(e.staticParams=n,r=!0)}}catch{}}r&&await T.writeFile(i,JSON.stringify(t,null,2),`utf-8`)}catch{}}}}const Me=/\\/g,Ne=/[^\w/-]/g,Pe=/^src\//,Fe=/\.(tsx?|jsx?)$/,Ie=/^\.\.(?:[/\\]|$)/;function Le(e,t=8){return oe.createHash(`sha256`).update(e).digest(`hex`).slice(0,t)}function Re(e,t=D.cwd()){let n=E.isAbsolute(e)?e:E.resolve(t,e),r=E.relative(t,n);return(Ie.test(r)||E.isAbsolute(r)?e:r).replace(Me,`/`)}function ze(e){return e.replace(Fe,``).replace(Ne,`_`).replace(Pe,``)}function I(e,t=D.cwd()){let n=Re(e,t);return`${ze(n)}_${Le(n)}`}const Be=new Set([`return`,`throw`,`case`,`typeof`,`instanceof`,`new`,`delete`,`void`,`in`,`of`]),Ve=8232,He=8233;function L(e){return e===32||e===9||e===13||e===10||e===Ve||e===He||e===65279}function R(e){return e===13||e===10||e===Ve||e===He}function z(e){return e>=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57||e===95||e===36}function Ue(e){return e>=97&&e<=122||e>=65&&e<=90||e===95||e===36}function We(e,t,n){for(;t<n&&L(e.charCodeAt(t));)t++;return t}function B(e,t,n){for(;t<n;){let r=We(e,t,n);if(r!==t){t=r;continue}let i=e.charCodeAt(t);if(i===47&&e.charCodeAt(t+1)===47){t=V(e,t,n);continue}if(i===47&&e.charCodeAt(t+1)===42){t=H(e,t,n);continue}break}return t}function V(e,t,n){for(;t<n&&!R(e.charCodeAt(t));)t++;return t}function H(e,t,n){for(t+=2;t<n-1&&(e.charCodeAt(t)!==42||e.charCodeAt(t+1)!==47);)t++;return t+2}function U(e,t,n,r){for(t++;t<n;){let n=e.charCodeAt(t);if(n===92){t+=2;continue}if(n===r)return t+1;t++}return t}function Ge(e,t,n){t++;let r=e.charCodeAt(t)===47;for(r&&t++;t<n;){let n=e.charCodeAt(t);if(z(n)||n===46||n===45)t++;else break}let i=+!r;for(;t<n&&i>0;){let a=e.charCodeAt(t);if(a===39||a===34||a===96){t=U(e,t,n,a);continue}if(a===123){t++;let r=1;for(;t<n&&r>0;){let i=e.charCodeAt(t);if(i===39||i===34||i===96){t=U(e,t,n,i);continue}i===123&&r++,i===125&&r--,t++}continue}if(a===47&&e.charCodeAt(t+1)===62){i--,t+=2;continue}if(a===62){t++,r&&i--;continue}if(a===60){let r=e.charCodeAt(t+1);if(r===47||r===46||r===62||Ue(r)){for(r===47?(i--,t++):r!==33&&i++,t++;t<n;){let n=e.charCodeAt(t);if(z(n)||n===46||n===45)t++;else break}continue}t++;continue}t++}return t}function W(e,t,n){for(let r=0;r<n.length;r++)if(e.charCodeAt(t+r)!==n.charCodeAt(r))return!1;return!0}function G(e){let t={hasUseClient:!1,hasUseServer:!1},n=0,r=e.length;for(;n<r;){let i=e.charCodeAt(n);if(L(i)){n++;continue}if(i===47&&e.charCodeAt(n+1)===47){n=V(e,n,r);continue}if(i===47&&e.charCodeAt(n+1)===42){n=H(e,n,r);continue}if(i!==39&&i!==34)return t;let a=n+1,o=U(e,n,r,i);if(o<=a)return t;let s=o-1-a,c=o;for(;c<r;){let i=e.charCodeAt(c);if(L(i)&&!R(i)){c++;continue}if(R(i)||i===59){s===10&&W(e,a,`use client`)?t.hasUseClient=!0:s===10&&W(e,a,`use server`)&&(t.hasUseServer=!0),n=c+1;break}if(i===47&&e.charCodeAt(c+1)===47){c=V(e,c,r);continue}if(i===47&&e.charCodeAt(c+1)===42){c=H(e,c,r);continue}return t}if(c>=r)return s===10&&W(e,a,`use client`)?t.hasUseClient=!0:s===10&&W(e,a,`use server`)&&(t.hasUseServer=!0),t}return t}function K(e){let t=0,n=e.length;for(;t<n;){let r=e.charCodeAt(t);if(L(r)){t++;continue}if(r===47&&e.charCodeAt(t+1)===47){t=V(e,t,n);continue}if(r===47&&e.charCodeAt(t+1)===42){t=H(e,t,n);continue}if(r!==39&&r!==34)return!1;let i=t+1,a=U(e,t,n,r);if(a<=i||a-1-i!=10||!W(e,i,`use server`))return!1;let o=a;for(;o<n;){let t=e.charCodeAt(o);if(L(t)&&!R(t)){o++;continue}if(R(t)||t===59)return!0;if(t===47&&e.charCodeAt(o+1)===47){o=V(e,o,n);continue}if(t===47&&e.charCodeAt(o+1)===42){o=H(e,o,n);continue}return!1}return!0}return!1}function q(e){let t=0,n=e.length;for(;t<n;){let r=e.charCodeAt(t);if(L(r)){t++;continue}if(r===47&&e.charCodeAt(t+1)===47){t=V(e,t,n);continue}if(r===47&&e.charCodeAt(t+1)===42){t=H(e,t,n);continue}if(r!==39&&r!==34)return!1;let i=t+1,a=U(e,t,n,r);if(a<=i||a-1-i!=10||!W(e,i,`use client`))return!1;let o=a;for(;o<n;){let t=e.charCodeAt(o);if(L(t)&&!R(t)){o++;continue}if(R(t)||t===59)return!0;if(t===47&&e.charCodeAt(o+1)===47){o=V(e,o,n);continue}if(t===47&&e.charCodeAt(o+1)===42){o=H(e,o,n);continue}return!1}return!0}return!1}function Ke(e){return e===40||e===91||e===123||e===44||e===59||e===61||e===58||e===63||e===33||e===43||e===45||e===42||e===37||e===38||e===124||e===94||e===126||e===60||e===62}function qe(e,t){let n=t-1;for(;n>=0;){let t=e.charCodeAt(n);if(L(t)){n--;continue}if(n>=1&&t===47&&e.charCodeAt(n-1)===42){for(n-=2;n>=1;){if(e.charCodeAt(n)===42&&e.charCodeAt(n-1)===47){n-=2;break}n--}if(n<0)return;continue}if(n>=1&&t===47&&e.charCodeAt(n-1)===47){n-=2;continue}let r=n;for(;r>=0&&e.charCodeAt(r)!==10&&e.charCodeAt(r)!==13;)r--;let i=r+1;for(;i<n&&(e.charCodeAt(i)===32||e.charCodeAt(i)===9);)i++;if(i<n&&e.charCodeAt(i)===47&&e.charCodeAt(i+1)===47){n=i-1;continue}break}if(n<0||!z(e.charCodeAt(n)))return;let r=n;for(;n>=0&&z(e.charCodeAt(n));)n--;return e.slice(n+1,r+1)}function Je(e,t){let n=t-1;for(;n>=0;){let t=e.charCodeAt(n);if(L(t)){n--;continue}if(n>=1&&t===47&&e.charCodeAt(n-1)===42){for(n-=2;n>=1;){if(e.charCodeAt(n)===42&&e.charCodeAt(n-1)===47){n-=2;break}n--}if(n<0)return-1;continue}if(n>=1&&t===47&&e.charCodeAt(n-1)===47){n-=2;continue}let r=n;for(;r>=0&&e.charCodeAt(r)!==10&&e.charCodeAt(r)!==13;)r--;let i=r+1;for(;i<n&&(e.charCodeAt(i)===32||e.charCodeAt(i)===9);)i++;if(i<n&&e.charCodeAt(i)===47&&e.charCodeAt(i+1)===47){n=i-1;continue}return t}return-1}function Ye(e,t){let n=Je(e,t);if(n===-1||Ke(n))return!0;let r=qe(e,t);return r?Be.has(r):!1}function Xe(e,t,n){t++;let r=!1;for(;t<n;){let i=e.charCodeAt(t);if(i===92){t+=2;continue}if(r){i===93&&(r=!1),t++;continue}if(i===91){r=!0,t++;continue}if(i===47){for(t++;t<n&&z(e.charCodeAt(t));)t++;return t}if(R(i))return t;t++}return t}function Ze(e,t){return e.charCodeAt(t)===101&&e.charCodeAt(t+1)===120&&e.charCodeAt(t+2)===112&&e.charCodeAt(t+3)===111&&e.charCodeAt(t+4)===114&&e.charCodeAt(t+5)===116}function J(e,t){return e.charCodeAt(t)===100&&e.charCodeAt(t+1)===101&&e.charCodeAt(t+2)===102&&e.charCodeAt(t+3)===97&&e.charCodeAt(t+4)===117&&e.charCodeAt(t+5)===108&&e.charCodeAt(t+6)===116}function Y(e){let t=0,n=e.length;for(;t<n;){let r=e.charCodeAt(t);if(L(r)){t++;continue}if(r===47&&e.charCodeAt(t+1)===47){t=V(e,t,n);continue}if(r===47&&e.charCodeAt(t+1)===42){t=H(e,t,n);continue}if(r===39||r===34||r===96){t=U(e,t,n,r);continue}if(r===47&&e.charCodeAt(t+1)!==47&&e.charCodeAt(t+1)!==42&&Ye(e,t)){t=Xe(e,t,n);continue}if(r===60){let r=e.charCodeAt(t+1);if(r===47||r===46||r===62||Ue(r)){t=Ge(e,t,n);continue}t++;continue}if(Ze(e,t)){let r=t+6;if(r<n){let t=e.charCodeAt(r);if(L(t)||t===123||t===47&&(e.charCodeAt(r+1)===47||e.charCodeAt(r+1)===42)){let t=B(e,r,n);if(J(e,t)){let r=t+7;if(r>=n||!z(e.charCodeAt(r)))return!0}if(e.charCodeAt(t)===123){let r=t+1;for(;r<n&&(r=B(e,r,n),e.charCodeAt(r)!==125);){let t=r;for(;r<n&&z(e.charCodeAt(r));)r++;let i=r-t;if(i===0)break;r=B(e,r,n);let a=!1;if(e.charCodeAt(r)===97&&e.charCodeAt(r+1)===115){a=!0;let t=r+2;if(t<n&&!z(e.charCodeAt(t))){r=B(e,t,n);let i=r;for(;r<n&&z(e.charCodeAt(r));)r++;if(r-i===7&&J(e,i))return!0}}if(!a&&i===7&&J(e,t))return!0;if(e.charCodeAt(r)===44){r++;continue}if(e.charCodeAt(r)===125)break;r++}}}}}t++}return!1}function Qe(e,t){let n=null;for(let r of t)if(e.endsWith(r)&&(n??=w.existsSync(e),n))return e;for(let n of t){let t=`${e}${n}`;if(w.existsSync(t))return t}return null}function $e(e,t){if(w.existsSync(e)){if(!w.statSync(e).isDirectory())return null;for(let n of t){let t=E.join(e,`index${n}`);if(w.existsSync(t))return t}}return null}async function X(e){if(!e.ok){let t;try{t=await e.text()}catch{t=`<unable to read response body>`}let n=t.length>200?`${t.slice(0,200)}...`:t,r=Error(`HTTP ${e.status}: ${e.statusText}`);throw r.status=e.status,r.statusText=e.statusText,r.bodyPreview=n,r}}var et=class{errorCount=0;maxErrors;resetTimeout;resetTimer=null;lastError=null;constructor(e={}){this.maxErrors=e.maxErrors??5,this.resetTimeout=e.resetTimeout??3e4}recordError(e){this.errorCount++,this.lastError=e,this.resetTimer=C(this.resetTimer),this.resetTimer=setTimeout(()=>{this.reset()},this.resetTimeout),this.errorCount>=this.maxErrors&&this.handleMaxErrorsReached()}reset(){this.errorCount=0,this.lastError=null,this.resetTimer=C(this.resetTimer)}getErrorCount(){return this.errorCount}getLastError(){return this.lastError}hasReachedMaxErrors(){return this.errorCount>=this.maxErrors}handleMaxErrorsReached(){console.error(`[rari] HMR: Maximum error count (${this.maxErrors}) reached. Consider restarting the dev server if issues persist.`)}dispose(){this.reset()}},tt=class{serverComponentBuilder;rustServerUrl;pendingUpdates=new Map;pendingFiles=new Set;batchTimer=null;DEBOUNCE_DELAY=200;errorHandler;logBatch=[];logBatchTimer=null;LOG_BATCH_DELAY=500;constructor(e,t=3e3){this.serverComponentBuilder=e,this.rustServerUrl=`http://localhost:${t}`,this.errorHandler=new et({maxErrors:5,resetTimeout:3e4})}getErrorCount(){return this.errorHandler.getErrorCount()}async handleClientComponentUpdate(e,t){let n=E.relative(D.cwd(),e);try{let r=t.moduleGraph.getModuleById(e);r?(t.moduleGraph.invalidateModule(r),this.errorHandler.reset()):this.queueLog(`warning`,`Client component module not found in graph: ${n}`)}catch(e){let t=e instanceof Error?e.message:String(e);this.queueLog(`error`,`Failed to update client component: ${n} - ${t}`),this.errorHandler.recordError(e instanceof Error?e:Error(t))}}async handleServerComponentUpdate(e,t){this.pendingFiles.add(e);let n=this.pendingUpdates.get(e);n&&(clearTimeout(n),this.pendingUpdates.delete(e)),this.batchTimer&&clearTimeout(this.batchTimer),this.batchTimer=setTimeout(async()=>{let e=[...this.pendingFiles];if(this.pendingFiles.clear(),this.batchTimer=null,e.length===0)return;let n=this.collectDependentPageComponents(e);for(let e of n)this.serverComponentBuilder.invalidateBuildCacheFor(e);let r=[...e,...n],i=await Promise.allSettled(r.map(async e=>{let t=E.relative(D.cwd(),e);try{let n=await this.serverComponentBuilder.rebuildComponent(e);if(!n.success)throw Error(n.error||`Build failed`);return await this.notifyRustServer(n.componentId,n.bundlePath),{success:!0,componentId:n.componentId,filePath:e,relativePath:t}}catch(n){return{success:!1,filePath:e,relativePath:t,error:n instanceof Error?n:Error(String(n))}}})),a=[],o=[];if(i.forEach(e=>{e.status===`fulfilled`&&e.value.success?a.push(e.value):e.status===`fulfilled`&&!e.value.success?o.push(e.value):e.status===`rejected`&&o.push({filePath:``,relativePath:`unknown`,error:Error(String(e.reason))})}),a.length>0){let e=Date.now();a.forEach(({componentId:n})=>{t.hot.send(`rari:server-component-updated`,{id:n,t:e})}),this.errorHandler.reset(),t.ws.send({type:`custom`,event:`rari:hmr-error-cleared`,data:{t:e}})}if(o.length>0){let e=Date.now();o.forEach(({relativePath:n,error:r})=>{let i=r.message,a=(r.stack||``).substring(0,500);this.queueLog(`error`,`Failed to rebuild: ${n} - ${i}`),this.errorHandler.recordError(r),t.ws.send({type:`custom`,event:`rari:hmr-error`,data:{msg:i,stack:a,file:n,t:e,count:this.errorHandler.getErrorCount(),max:5}})}),this.errorHandler.hasReachedMaxErrors()&&this.queueLog(`error`,`Maximum error count reached (${this.errorHandler.getErrorCount()}). Consider restarting the dev server if issues persist.`)}},this.DEBOUNCE_DELAY)}async notifyRustServer(e,t){try{let n=await fetch(`${this.rustServerUrl}/_rari/hmr`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`reload-component`,component_id:e,bundle_path:t})});await X(n);let r=await n.text(),i;try{i=JSON.parse(r)}catch(e){throw Error(`Failed to parse server response (status ${n.status}): ${e instanceof Error?e.message:String(e)}. Response body: ${r.substring(0,200)}${r.length>200?`...`:``}`)}if(!i||typeof i!=`object`)throw Error(`Invalid server response (status ${n.status}): expected object, got ${typeof i}. Response body: ${r.substring(0,200)}${r.length>200?`...`:``}`);let a=i;if(!a.success)throw Error(a.message||a.error||`Component reload failed`)}catch(e){throw console.error(`[rari] HMR: Failed to notify Rust server:`,e),e}}collectDependentPageComponents(e){let t=this.serverComponentBuilder.getImportGraph(),n=new Set,r=new Set,i=a=>{if(r.has(a))return;r.add(a);let o=t.get(a);if(o)for(let t of o)(t.includes(`/app/`)||t.includes(`\\app\\`))&&!e.includes(t)&&n.add(t),i(t)};for(let t of e)i(t);return[...n]}detectComponentType(e){try{return q(w.readFileSync(e,`utf-8`))?`client`:`server`}catch{return`unknown`}}queueLog(e,t){this.logBatch.push({type:e,message:t,timestamp:Date.now()}),this.logBatchTimer&&clearTimeout(this.logBatchTimer),this.logBatchTimer=setTimeout(()=>{this.flushLogs()},this.LOG_BATCH_DELAY)}flushLogs(){if(this.logBatch.length===0)return;let e=this.logBatch.reduce((e,t)=>(e[t.type]||(e[t.type]=[]),e[t.type].push(t),e),{});for(let[t,n]of Object.entries(e))if(n.length===1){let e=n[0];this.outputLog(t,e.message)}else{let e=n.map(e=>e.message).join(`
2
+ • `);this.outputLog(t,`${n.length} updates:\n • ${e}`)}this.logBatch=[],this.logBatchTimer=null}outputLog(e,t){let n=`[rari] HMR:`;switch(e){case`success`:console.warn(`\x1B[32m${n}\x1B[0m ${t}`);break;case`warning`:console.warn(`\x1B[33m${n}\x1B[0m ${t}`);break;case`error`:console.error(`\x1B[31m${n}\x1B[0m ${t}`);break;default:console.warn(`${n} ${t}`);break}}dispose(){this.logBatchTimer&&(clearTimeout(this.logBatchTimer),this.flushLogs()),this.batchTimer&&=(clearTimeout(this.batchTimer),null);for(let e of this.pendingUpdates.values())clearTimeout(e);this.pendingUpdates.clear(),this.pendingFiles.clear(),this.errorHandler.dispose()}};const nt=/import\s+(\w+)\s+from\s+['"]rari\/image['"]/g,rt=/import\s+\{[^}]*\b(?:Image\s+as\s+(\w+)|Image)\b[^}]*\}\s+from\s+['"]rari\/image['"]/g,it=/src:\s*["']([^"']+)["']/,at=/[.*+?^${}()|[\]\\]/g,ot=/^[A-Z_$][\w$]*$/i,st=/width:\s*(\d+)/,ct=/quality:\s*(\d+)/,lt=/preload:\s*(true|!0)/,ut=/preload:\s*(false|!1)/,dt=/src=\{?["']([^"']+)["']\}?|src=\{([^}]+)\}/,ft=/width=\{?(\d+)\}?/,pt=/quality=\{?(\d+)\}?/,mt=/preload(?:=\{?true\}?)?/,ht=/preload=\{?false\}?/;async function gt(e,t){try{await Ot(await A.readFile(e,`utf8`),e,t)}catch(t){t.code!==`ENOENT`&&console.warn(`[rari] Image scanner: Failed to process ${e}:`,t)}}const _t=new class{permits;queue=[];constructor(e){this.permits=e}async acquire(){if(this.permits>0){this.permits--;return}return new Promise(e=>{this.queue.push(e)})}release(){this.permits++;let e=this.queue.shift();e&&(this.permits--,e())}async run(e){await this.acquire();try{return await e()}finally{this.release()}}}(50);async function Z(e,t){try{await A.access(e)}catch{return}let n=await A.readdir(e,{withFileTypes:!0}),r=[];for(let i of n){let n=E.join(e,i.name);if(i.isDirectory()){if(i.name===`node_modules`||i.name===`dist`)continue;r.push(Z(n,t))}else i.isFile()&&g.test(i.name)&&r.push(_t.run(()=>gt(n,t)))}await Promise.all(r)}async function vt(e,t=[]){let n=new Map;try{await A.access(e),await Z(e,n)}catch(t){throw t.code===`ENOENT`?Error(`Required source directory does not exist: ${e}`):t}for(let e of t)try{await A.access(e),await Z(e,n)}catch(t){t.code!==`ENOENT`&&console.warn(`[rari] Image scanner: Failed to scan directory ${e}:`,t)}return{images:[...n.values()]}}function yt(e){return e.endsWith(`.tsx`)?`tsx`:e.endsWith(`.jsx`)?`jsx`:e.endsWith(`.ts`)?`ts`:`js`}async function bt(e,t,n){let r=`\0virtual:${t}`,i=await j({input:r,external:[`rari/image`],platform:`browser`,write:!1,output:{format:`esm`},moduleTypes:{[`.${n}`]:n},transform:{jsx:`react`},plugins:[{name:`virtual-module`,resolveId(e){return e===r?e:null},load(t){return t===r?{code:e,moduleType:n}:null}}]});if(!i.output||i.output.length===0)throw Error(`Transform produced no output`);return i.output[0].code}function xt(e){let t=new Set;for(let n of e.matchAll(nt))t.add(n[1]);for(let n of e.matchAll(rt))n[1]?t.add(n[1]):t.add(`Image`);return t}function St(e){return xt(e)}function Ct(e){let t=e.match(it);if(!t)return null;let n=t[1];if(!n.startsWith(`/`)&&!n.startsWith(`http`))return null;let r=e.match(st),i=r?Number.parseInt(r[1],10):void 0,a=e.match(ct),o=a?Number.parseInt(a[1],10):void 0,s=e.match(lt),c=e.match(ut);return{src:n,width:i,quality:o,preload:!!s&&!c}}function wt(e,t){let n=`${e.src}:${e.width??`auto`}:${e.quality??75}`;(!t.has(n)||e.preload)&&t.set(n,e)}function Tt(e,t){let n=0,r=!1,i=``,a=!1,o=0;for(let s=t;s<e.length;s++){let c=e[s];if(a){a=!1;continue}if(c===`\\`){a=!0;continue}if(!r&&(c===`"`||c===`'`||c==="`")){r=!0,i=c,c==="`"&&(o=1);continue}if(r&&c===i){i==="`"?(o--,o===0&&(r=!1,i=``)):(r=!1,i=``);continue}if(r&&i==="`"&&c===`$`&&s+1<e.length&&e[s+1]===`{`){n++,s++;continue}if(r&&i==="`"&&n>0&&c==="`"){o++;continue}if(r&&i==="`"&&c===`}`&&n>0){n--;continue}if(!r){if(c===`{`)n++;else if(c===`}`&&(n--,n===0))return e.substring(t+1,s)}}return null}function Et(e,t,n){for(let r of t){if(!ot.test(r)){console.warn(`[rari] Image scanner: Skipping unsafe identifier: ${r}`);continue}let t=r.replace(at,`\\$&`),i=RegExp(`React\\.createElement\\(\\s*${t}\\s*,\\s*\\{`,`g`);for(let t of e.matchAll(i)){let r=Tt(e,t.index+t[0].length-1);if(r){let e=Ct(r);e&&wt(e,n)}}}}function Dt(e){return xt(e)}async function Ot(e,t,n){let r=Dt(e);if(r.size!==0)try{let r=await bt(e,t,yt(t)),i=St(r);if(i.size===0)return;Et(r,i,n)}catch{kt(e,r,n)}}function kt(e,t,n){for(let r of t){if(!ot.test(r)){console.warn(`[rari] Image scanner: Skipping unsafe alias: ${r}`);continue}let t=r.replace(at,`\\$&`),i=RegExp(`<${t}\\s([^/>]+)\\/>`,`g`),a=RegExp(`<${t}\\s([^>]+)>`,`g`);for(let t of e.matchAll(i))At(t[1],n);for(let t of e.matchAll(a))At(t[1],n)}}function At(e,t){let n=e.match(dt);if(!n)return;let r=n[1]||n[2];if(!r||r.includes(`{`)||!r.startsWith(`/`)&&!r.startsWith(`http`))return;let i=e.match(ft),a=i?Number.parseInt(i[1],10):void 0,o=e.match(pt),s=o?Number.parseInt(o[1],10):void 0,c=mt.test(e)&&!ht.test(e),l=`${r}:${a??`auto`}:${s??75}`;(!t.has(l)||c)&&t.set(l,{src:r,width:a,quality:s,preload:c})}const jt=/import\s*\(\s*["']([^"']+)["']\s*\)|import\s+["']([^"']+)["']/g,Q=/from\s+['"]([^'"]+)['"]|import\s*\(\s*['"]([^'"]+)['"]\s*\)|import\s+['"]([^'"]+)['"]/g,Mt=/import(?:\s+(?:\w+|\{[^}]*\}|\*\s+as\s+\w+)(?:\s*,\s*(?:\w+|\{[^}]*\}|\*\s+as\s+\w+))*\s+from\s+)?['"]([^'"]+)['"]/g,Nt=/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g,Pt=/import\s+(?:(\w+)|\{([^}]+)\})\s+from\s+['"]([^'"]+)['"];?\s*$/gm,Ft=/^proxy\.(?:tsx?|jsx?|mts|mjs)$/,It=/\/components\/(\w+)(?:\.tsx?|\.jsx?)?$/,Lt=/[/\\]components[/\\](\w+)(?:\.tsx?|\.jsx?)?$/,Rt=/^(?:robots|sitemap)\.(?:tsx?|jsx?)$/,zt=/^node:/,Bt=new Set([`fs`,`path`,`os`,`crypto`,`util`,`stream`,`events`,`process`,`buffer`,`url`,`querystring`,`zlib`,`http`,`https`,`net`,`tls`,`child_process`,`cluster`,`worker_threads`]),Vt=`[hash]_[local]`,Ht=E.dirname(O(import.meta.url)),Ut=E.dirname(Ht);function Wt(e){return e.startsWith(Ut)}var $=class{serverComponents=new Map;serverActions=new Map;options;projectRoot;buildCache=new Map;htmlOnlyImports=new Set;fileImporters=new Map;getComponentCount(){return this.serverComponents.size+this.serverActions.size}getImportGraph(){let e=new Map;for(let[t,n]of this.fileImporters)e.set(t,new Set(n));return e}getHtmlOnlyImports(){return new Set(this.htmlOnlyImports)}hashString(e,t=8){return Le(e,t)}async writeComponentCssAsset(e,t){if(t.length===0)return[];let n=E.join(this.options.outDir,`assets`,`server`);await w.promises.mkdir(n,{recursive:!0});let r=`${t.join(`
3
+ `)}\n`,i=`${this.hashString(e+r,12)}.css`,a=E.join(n,i);return await w.promises.writeFile(a,r,`utf-8`),[`/assets/server/${i}`]}getComponentIdFromRouteManifestPath(e){return this.getComponentId(E.join(this.projectRoot,`src`,`app`,e))}getLegacyComponentReferenceId(e){return this.getReadableComponentId(this.getProjectRelativePath(e))}async writeRouteCssEntries(e){let t=E.join(this.options.outDir,this.options.rscDir,`routes.json`);if(!w.existsSync(t))return;let n=await w.promises.readFile(t,`utf-8`),r=JSON.parse(n),i=t=>{if(t)for(let n of t){if(!n.filePath)continue;let t=this.getComponentIdFromRouteManifestPath(n.filePath);n.componentId=t;let r=e.components[t]?.css??[];r.length?n.css=r:delete n.css}};if(i(r.routes),i(r.layouts),i(r.loading),i(r.errors),i(r.notFound),r.apiRoutes)for(let e of r.apiRoutes)e.filePath&&(e.componentId=this.getComponentIdFromRouteManifestPath(e.filePath));await w.promises.writeFile(t,JSON.stringify(r,null,2),`utf-8`)}constructor(e,t={}){this.projectRoot=e;let n=t.rscDir||`server`;this.options={outDir:t.outDir||E.join(e,`dist`),rscDir:n,manifestPath:t.manifestPath||E.join(n,`manifest.json`),serverConfigPath:t.serverConfigPath||E.join(n,`config.json`),minify:t.minify??D.env.NODE_ENV===`production`,alias:t.alias||{},define:t.define,csp:t.csp,cacheControl:t.cacheControl},this.parseHtmlImports()}parseHtmlImports(){let e=E.join(this.projectRoot,`index.html`);if(w.existsSync(e))try{let t=w.readFileSync(e,`utf-8`);for(let e of t.matchAll(jt)){let t=e[1]||e[2];if(t.startsWith(`/src/`)){let e=E.join(this.projectRoot,t.slice(1));this.htmlOnlyImports.add(e)}}}catch(e){console.warn(`[server-build] Error parsing index.html:`,e)}}isHtmlOnlyImport(e){return this.htmlOnlyImports.has(e)}isServerComponent(e,t){if(e.includes(`node_modules`)||this.isHtmlOnlyImport(e))return!1;try{let n=G(t??w.readFileSync(e,`utf-8`));return!n.hasUseClient&&!n.hasUseServer}catch{return!1}}isClientComponent(e,t){try{return G(t??w.readFileSync(e,`utf-8`)).hasUseClient}catch{return!1}}buildImportGraph(e){this.fileImporters.clear();let t=e=>{if(!w.existsSync(e))return;let n=w.readdirSync(e,{withFileTypes:!0});for(let r of n){let n=E.join(e,r.name);if(r.isDirectory()){if(r.name===`node_modules`)continue;t(n)}else if(r.isFile()&&g.test(r.name))try{let e=w.readFileSync(n,`utf-8`),t;for(Q.lastIndex=0,t=Q.exec(e);t!==null;){let r=t[1]||t[2]||t[3],i=null;if(r.startsWith(`./`)||r.startsWith(`../`)){let e=E.dirname(n);i=E.resolve(e,r)}else if(r.startsWith(`@/`)){let e=r.slice(2);i=E.join(this.projectRoot,`src`,e)}if(i){let e=[``,`.ts`,`.tsx`,`.js`,`.jsx`],t=null;for(let n of e){let e=i+n;try{if(w.statSync(e).isFile()){t=e;break}}catch{}}t&&(this.fileImporters.has(t)||this.fileImporters.set(t,new Set),this.fileImporters.get(t).add(n))}t=Q.exec(e)}}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error building import graph:`,n,e)}}};t(e)}isOnlyImportedByClientComponents(e){let t=this.fileImporters.get(e);if(!t||t.size===0)return!1;for(let e of t)if(!this.isClientComponent(e)&&!this.isOnlyImportedByClientComponents(e))return!1;return!0}addServerComponent(e,t){let n=t??w.readFileSync(e,`utf-8`);if(this.isServerAction(n)){let t=this.extractDependencies(n),r=this.hasNodeImports(n);this.serverActions.set(e,{filePath:e,originalCode:n,dependencies:t,hasNodeImports:r});return}if(!this.isServerComponent(e,n))return;let r=this.extractDependencies(n),i=this.hasNodeImports(n);this.serverComponents.set(e,{filePath:e,originalCode:n,dependencies:r,hasNodeImports:i})}isServerAction(e){return G(e).hasUseServer}extractDependencies(e){let t=[],n;for(Mt.lastIndex=0;n=Mt.exec(e),n!==null;){let e=n[1];!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`node:`)&&!this.isNodeBuiltin(e)&&t.push(e)}return[...new Set(t)]}isNodeBuiltin(e){return Bt.has(e)}hasNodeImports(e){return e.includes(`from 'node:`)||e.includes(`from "node:`)||e.includes(`from 'fs'`)||e.includes(`from "fs"`)||e.includes(`from 'path'`)||e.includes(`from "path"`)||e.includes(`from 'os'`)||e.includes(`from "os"`)||e.includes(`from 'crypto'`)||e.includes(`from "crypto"`)||e.includes(`from 'util'`)||e.includes(`from "util"`)||e.includes(`from 'stream'`)||e.includes(`from "stream"`)||e.includes(`from 'events'`)||e.includes(`from "events"`)}async getTransformedComponentsForDevelopment(){let e=[];for(let[t]of this.serverComponents){let n=E.relative(this.projectRoot,t),r=this.getComponentId(n),i=await this.buildComponentCodeOnly(t);e.push({id:r,code:i})}for(let[t]of this.serverActions){let n=E.relative(this.projectRoot,t),r=this.getComponentId(n),i=await this.buildComponentCodeOnly(t);e.push({id:r,code:i})}return e}transformComponentImportsToGlobal(e){let t=[];for(let n of e.matchAll(Nt)){let[e,r,i]=n;if(!i.startsWith(`.`)&&!i.startsWith(`@`)&&!i.startsWith(`~`)&&!i.startsWith(`#`))continue;let a=null;if(i.startsWith(`.`)){if(i.includes(`/components/`)){let n=i.match(It);if(n){let i=n[1],a=[E.resolve(this.projectRoot,`src`,`components`,`${i}.tsx`),E.resolve(this.projectRoot,`src`,`components`,`${i}.ts`),E.resolve(this.projectRoot,`src`,`components`,`${i}.jsx`),E.resolve(this.projectRoot,`src`,`components`,`${i}.js`)],o=!1;for(let e of a)if(w.existsSync(e)&&this.isClientComponent(e)){o=!0;break}if(!o)continue;let s=`// Component reference: ${i}
9
4
  const ${r} = (props) => {
10
5
  let Component = globalThis['~clientComponents']?.['components/${i}']?.component
11
6
  || globalThis['components/${i}'];
@@ -23,7 +18,7 @@ const ${r} = (props) => {
23
18
  }
24
19
 
25
20
  return Component(props);
26
- }`;t.push({original:e,replacement:s})}}continue}let o=this.options.alias||{};for(let[e,t]of Object.entries(o))if(i.startsWith(`${e}/`)||i===e){let n=i.slice(e.length);a=w.join(t,n);break}if(a){let n=a.match(zt);if(n){let i=n[1],o=w.isAbsolute(a)?a:w.resolve(this.projectRoot,a),s=[o,`${o}.tsx`,`${o}.ts`,`${o}.jsx`,`${o}.js`],c=!1,l=o;for(let e of s)if(S.existsSync(e)){l=e,this.isClientComponent(e)&&(c=!0);break}if(!c)continue;let u=this.getLegacyComponentReferenceId(l),d=`// Component reference: ${i}
21
+ }`;t.push({original:e,replacement:s})}}continue}let o=this.options.alias||{};for(let[e,t]of Object.entries(o))if(i.startsWith(`${e}/`)||i===e){let n=i.slice(e.length);a=E.join(t,n);break}if(a){let n=a.match(Lt);if(n){let i=n[1],o=E.isAbsolute(a)?a:E.resolve(this.projectRoot,a),s=[o,`${o}.tsx`,`${o}.ts`,`${o}.jsx`,`${o}.js`],c=!1,l=o;for(let e of s)if(w.existsSync(e)){l=e,this.isClientComponent(e)&&(c=!0);break}if(!c)continue;let u=this.getLegacyComponentReferenceId(l),d=`// Component reference: ${i}
27
22
  const ${r} = (props) => {
28
23
  let Component = globalThis['~clientComponents']?.['${u}']?.component
29
24
  || globalThis['${u}'];
@@ -41,7 +36,7 @@ const ${r} = (props) => {
41
36
  }
42
37
 
43
38
  return Component(props);
44
- }`;t.push({original:e,replacement:d})}}}let n=e;for(let{original:e,replacement:r}of t)n=n.replace(e,r);return n}isPageComponent(e){return e.includes(`/app/`)||e.includes(`\\app\\`)}createBuildPlugins(e,t,n,r,i=!1,a){let o=w.dirname(r),s=It.test(w.basename(r)),c=this,l=new Map,u=new Map;return[{name:`virtual-module`,resolveId(t,n){if(t===e)return t;if(n===e&&(t.startsWith(`./`)||t.startsWith(`../`))){if(t.endsWith(`.module.css`))return null;let e=w.resolve(o,t);for(let t of[`.ts`,`.tsx`,`.js`,`.jsx`,``]){let n=e+t;if(S.existsSync(n)&&S.statSync(n).isFile())return n}for(let t of[`.ts`,`.tsx`,`.js`,`.jsx`]){let n=w.join(e,`index${t}`);if(S.existsSync(n))return n}return e}return null},load(r){return r===e?{code:t,moduleType:n}:null}},{name:`resolve-client-server-boundaries`,resolveId:(t,n)=>{if(!n||n.includes(`node_modules`)||Gt(n)||t.startsWith(`node:`)||c.isNodeBuiltin(t)||t===`react`||t===`react-dom`||t===`react/jsx-runtime`||t===`react/jsx-dev-runtime`)return null;let r=null;if(r=ce(t,c.options.alias||{},c.projectRoot),!r&&(t.startsWith(`./`)||t.startsWith(`../`))){let i=n===e?o:w.dirname(n);r=w.resolve(i,t)}if(r)for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=r+e;if(S.existsSync(t)&&S.statSync(t).isFile()){if(c.isClientComponent(t)){let e=w.relative(c.projectRoot,t),n=(e.startsWith(`..`)?t:e).replace(J,`/`);return l.set(t,n),{id:`\0client-ref:${t}`}}try{let e=S.readFileSync(t,`utf-8`);if(V(e)){let n=c.getComponentId(t),r=W(e);return u.set(t,{actionId:n,hasDefaultExport:r}),{id:`\0server-action:${t}`}}}catch(e){console.error(`[rari] Failed to read file for server action detection: ${t}`,e)}break}}return null},load(e){if(e.startsWith(`\0client-ref:`)){let t=e.slice(12),n=w.relative(c.projectRoot,t),r=(l.get(t)||(n.startsWith(`..`)?t:n)).replace(J,`/`);return{code:`
39
+ }`;t.push({original:e,replacement:d})}}}let n=e;for(let{original:e,replacement:r}of t)n=n.replace(e,r);return n}isPageComponent(e){return e.includes(`/app/`)||e.includes(`\\app\\`)}createBuildPlugins(e,t,n,r,i=!1,a){let o=E.dirname(r),s=Ft.test(E.basename(r)),c=this,l=new Map,u=new Map;return[{name:`virtual-module`,resolveId(t,n){if(t===e)return t;if(n===e&&(t.startsWith(`./`)||t.startsWith(`../`))){if(t.endsWith(`.module.css`))return null;let e=E.resolve(o,t);for(let t of[`.ts`,`.tsx`,`.js`,`.jsx`,``]){let n=e+t;if(w.existsSync(n)&&w.statSync(n).isFile())return n}for(let t of[`.ts`,`.tsx`,`.js`,`.jsx`]){let n=E.join(e,`index${t}`);if(w.existsSync(n))return n}return e}return null},load(r){return r===e?{code:t,moduleType:n}:null}},{name:`resolve-client-server-boundaries`,resolveId:(t,n)=>{if(!n||n.includes(`node_modules`)||Wt(n)||t.startsWith(`node:`)||c.isNodeBuiltin(t)||t===`react`||t===`react-dom`||t===`react/jsx-runtime`||t===`react/jsx-dev-runtime`)return null;let r=null;if(r=re(t,c.options.alias||{},c.projectRoot),!r&&(t.startsWith(`./`)||t.startsWith(`../`))){let i=n===e?o:E.dirname(n);r=E.resolve(i,t)}if(r)for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=r+e;if(w.existsSync(t)&&w.statSync(t).isFile()){if(c.isClientComponent(t)){let e=E.relative(c.projectRoot,t),n=(e.startsWith(`..`)?t:e).replace(x,`/`);return l.set(t,n),{id:`\0client-ref:${t}`}}try{let e=w.readFileSync(t,`utf-8`);if(K(e)){let n=c.getComponentId(t),r=Y(e);return u.set(t,{actionId:n,hasDefaultExport:r}),{id:`\0server-action:${t}`}}}catch(e){console.error(`[rari] Failed to read file for server action detection: ${t}`,e)}break}}return null},load(e){if(e.startsWith(`\0client-ref:`)){let t=e.slice(12),n=E.relative(c.projectRoot,t),r=(l.get(t)||(n.startsWith(`..`)?t:n)).replace(x,`/`);return{code:`
45
40
  function registerClientReference(clientReference, id, exportName) {
46
41
  const key = id + '#' + exportName;
47
42
  const clientProxy = {};
@@ -61,7 +56,7 @@ function registerClientReference(clientReference, id, exportName) {
61
56
  }
62
57
 
63
58
  export default registerClientReference(null, ${JSON.stringify(r)}, "default");
64
- `,moduleType:`js`}}if(e.startsWith(`\0server-action:`)){let t=e.slice(15),n=u.get(t)?.actionId??c.getComponentId(t),r=w.join(c.options.outDir,c.options.rscDir,`${n}.js`),i=D(w.resolve(c.projectRoot,r)).href;return{code:u.get(t)?.hasDefaultExport??!1?`export * from ${JSON.stringify(i)};\nexport { default } from ${JSON.stringify(i)};`:`export * from ${JSON.stringify(i)};`,moduleType:`js`}}return null}},{name:`use-transformed-server-components`,resolveId:(e,t)=>{if(!i)return null;if(e.startsWith(`file://`)){let t=e.replace(b,``);return S.existsSync(t)?{id:`\0transformed:${t}`}:null}let n=null;n=ce(e,c.options.alias||{},c.projectRoot);let r=t?.startsWith(`\0`)?o:t?w.dirname(t):o;if(!n&&(e.startsWith(`./`)||e.startsWith(`../`))&&(n=w.resolve(r,e)),!n||r.includes(`node_modules`))return null;for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=n+e;if(S.existsSync(t)&&S.statSync(t).isFile()){if(c.isClientComponent(t))return null;let e=w.join(c.projectRoot,`src`);if(!t.startsWith(e))return null;let n=c.getComponentId(t),r=w.join(c.options.outDir,c.options.rscDir,`${n}.js`);if(S.existsSync(r))return{id:`\0transformed:${r}`};break}}return null},load(e){if(e.startsWith(`\0transformed:`)){let t=e.slice(13);return{code:S.readFileSync(t,`utf-8`),moduleType:`js`}}return null}},{name:`resolve-aliases`,resolveId:e=>{if(e.startsWith(`\0`))return null;let t=c.options.alias||{};for(let[n,r]of Object.entries(t))if(e.startsWith(`${n}/`)||e===n){let t=e.slice(n.length),i=w.join(r,t),a=w.isAbsolute(i)?i:w.resolve(c.projectRoot,i);for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=a+e;if(S.existsSync(t)&&S.statSync(t).isFile())return t}for(let e of[`.ts`,`.tsx`,`.js`,`.jsx`]){let t=w.join(a,`index${e}`);if(S.existsSync(t))return t}return a}return null}},{name:`resolve-rari-proxy`,resolveId:e=>{if(s&&e===`rari`){let e=w.join(Ut,`proxy/RariResponse.mjs`);if(S.existsSync(e))return e;let t=w.join(Wt,`src/proxy/RariResponse.ts`);if(S.existsSync(t))return t}return null}},{name:`css-modules`,resolveId:(e,t)=>{if(e.endsWith(`.module.css`)){let n=!t?.startsWith(`\0`)&&t?w.dirname(t):o,r=w.resolve(n,e);if(S.existsSync(r))return{id:`\0css-module:${r}`}}return null},load:async e=>{if(!e.startsWith(`\0css-module:`))return null;let t=e.slice(12);try{let{transform:e}=await import(`lightningcss`),n=S.readFileSync(t),r=e({filename:w.relative(this.projectRoot,t),code:n,cssModules:{pattern:Ht}});a&&a.push(new TextDecoder().decode(r.code));let i={};if(r.exports)for(let[e,t]of Object.entries(r.exports))i[e]=t.name;return{code:`export default ${JSON.stringify(i)}`,moduleType:`js`}}catch(t){throw Error(`[rari] Failed to process CSS module ${e}: ${t instanceof Error?t.message:String(t)}`)}}},{name:`externalize-deps`,resolveId:e=>e.startsWith(`\0`)?null:e.startsWith(`node:`)||c.isNodeBuiltin(e)||[`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`rari/image`].includes(e)?{id:e,external:!0}:e===`rari`||e===`rari/client`?null:!e.startsWith(`.`)&&!e.startsWith(`/`)?{id:e,external:!0}:null}]}async buildComponentCodeOnly(e){let t=await S.promises.readFile(e,`utf-8`),n=this.transformClientImports(t,e),r=this.isPageComponent(e),i=r?this.transformComponentImportsToGlobal(n):n,a=w.extname(e),o;o=a===`.tsx`?`tsx`:a===`.ts`?`ts`:a===`.jsx`?`jsx`:`js`;let s=`\0virtual:${e}`,c=await k({input:s,platform:`node`,write:!1,external:[Vt,`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`],output:{format:`esm`,minify:this.options.minify},moduleTypes:{[`.${o}`]:o},resolve:{mainFields:[`module`,`main`],conditionNames:[`import`,`module`,`default`],extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]},transform:{jsx:`react`,define:{global:`globalThis`,"process.env.NODE_ENV":JSON.stringify(T.env.NODE_ENV||`production`),...this.options.define}},plugins:this.createBuildPlugins(s,i,o,e,r,[])});if(!c.output||c.output.length===0)throw Error(`No output generated from Rolldown`);let l=c.output.find(e=>e.type===`chunk`&&e.isEntry);if(!l||l.type!==`chunk`)throw Error(`No entry chunk found in Rolldown output`);let u=l.code;return u=`// Built: ${new Date().toISOString()}\n${u}`,u}async buildServerComponents(){let e=w.join(this.options.outDir,this.options.rscDir);await S.promises.mkdir(e,{recursive:!0});let t={components:{},buildTime:new Date().toISOString()};for(let[e,n]of this.serverComponents){if(this.isPageComponent(e))continue;let r=w.relative(this.projectRoot,e),i=this.getComponentId(e),a=w.join(this.options.rscDir,`${i}.js`),o=w.join(this.options.outDir,a),s=w.dirname(o);await S.promises.mkdir(s,{recursive:!0});let c=await this.buildSingleComponent(e,o),l=await this.writeComponentCssAsset(i,c.css),u=D(w.resolve(this.projectRoot,o)).href;t.components[i]={id:i,filePath:e,relativePath:r,bundlePath:a,moduleSpecifier:u,dependencies:n.dependencies,hasNodeImports:n.hasNodeImports,css:l}}for(let[e,n]of this.serverComponents){if(!this.isPageComponent(e))continue;let r=w.relative(this.projectRoot,e),i=this.getComponentId(e),a=w.join(this.options.rscDir,`${i}.js`),o=w.join(this.options.outDir,a),s=w.dirname(o);await S.promises.mkdir(s,{recursive:!0});let c=await this.buildSingleComponent(e,o),l=await this.writeComponentCssAsset(i,c.css),u=D(w.resolve(this.projectRoot,o)).href;t.components[i]={id:i,filePath:e,relativePath:r,bundlePath:a,moduleSpecifier:u,dependencies:n.dependencies,hasNodeImports:n.hasNodeImports,css:l}}for(let[e,n]of this.serverActions){let r=w.relative(this.projectRoot,e),i=this.getComponentId(e),a=w.join(this.options.rscDir,`${i}.js`),o=w.join(this.options.outDir,a),s=w.dirname(o);await S.promises.mkdir(s,{recursive:!0});let c=await this.buildSingleComponent(e,o),l=await this.writeComponentCssAsset(i,c.css),u=D(w.resolve(this.projectRoot,o)).href;t.components[i]={id:i,filePath:e,relativePath:r,bundlePath:a,moduleSpecifier:u,dependencies:n.dependencies,hasNodeImports:n.hasNodeImports,css:l}}let n=w.join(this.options.outDir,this.options.manifestPath);await S.promises.writeFile(n,JSON.stringify(t,null,2),`utf-8`),await this.writeRouteCssEntries(t);let r={};this.options.csp&&(r.csp=this.options.csp),this.options.cacheControl&&(r.cacheControl=this.options.cacheControl);let i=w.join(this.options.outDir,this.options.serverConfigPath);if(Object.keys(r).length===0)try{await S.promises.unlink(i)}catch(e){e.code!==`ENOENT`&&console.warn(`Failed to remove server config file:`,e)}else await S.promises.writeFile(i,JSON.stringify(r,null,2),`utf-8`);return t}async buildSingleComponent(e,t){let n=await S.promises.readFile(e,`utf-8`),r=this.transformClientImports(n,e),i=this.isPageComponent(e),a=i?this.transformComponentImportsToGlobal(r):r,o=w.extname(e),s;s=o===`.tsx`?`tsx`:o===`.ts`?`ts`:o===`.jsx`?`jsx`:`js`;let c=`\0virtual:${e}`,l=[],u=await k({input:c,platform:`node`,write:!1,external:[Vt,`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`],output:{format:`esm`,minify:this.options.minify},moduleTypes:{[`.${s}`]:s},resolve:{mainFields:[`module`,`main`],conditionNames:[`import`,`module`,`default`],extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]},transform:{jsx:`react`,define:{global:`globalThis`,"process.env.NODE_ENV":JSON.stringify(T.env.NODE_ENV||`production`),...this.options.define}},plugins:this.createBuildPlugins(c,a,s,e,i,l)});if(!u.output||u.output.length===0)throw Error(`No output generated from Rolldown`);let d=u.output.find(e=>e.type===`chunk`&&e.isEntry);if(!d||d.type!==`chunk`)throw Error(`No entry chunk found in Rolldown output`);let f=d.code;f=`// Built: ${new Date().toISOString()}\n${f}`,await S.promises.writeFile(t,f,`utf-8`);let p=await S.promises.open(t,`r+`);return await p.sync(),await p.close(),{code:f,css:l}}transformClientImports(e,t){let n=e,r,i=[],a=!1,o=[`rari/image`];for(Ft.lastIndex=0;r=Ft.exec(e),r!==null;){let[e,n,s,c]=r,l=!1,u=c;if(o.includes(c))l=!0;else{let e=this.resolveImportPath(c,t);this.isClientComponent(e)&&(l=!0,u=w.relative(this.projectRoot,e).replace(J,`/`))}if(l){a=!0;let t=``;n?t=`const ${n} = registerClientReference(
59
+ `,moduleType:`js`}}if(e.startsWith(`\0server-action:`)){let t=e.slice(15),n=u.get(t)?.actionId??c.getComponentId(t),r=E.join(c.options.outDir,c.options.rscDir,`${n}.js`),i=k(E.resolve(c.projectRoot,r)).href;return{code:u.get(t)?.hasDefaultExport??!1?`export * from ${JSON.stringify(i)};\nexport { default } from ${JSON.stringify(i)};`:`export * from ${JSON.stringify(i)};`,moduleType:`js`}}return null}},{name:`use-transformed-server-components`,resolveId:(e,t)=>{if(!i)return null;if(e.startsWith(`file://`)){let t=e.replace(_,``);return w.existsSync(t)?{id:`\0transformed:${t}`}:null}let n=null;n=re(e,c.options.alias||{},c.projectRoot);let r=t?.startsWith(`\0`)?o:t?E.dirname(t):o;if(!n&&(e.startsWith(`./`)||e.startsWith(`../`))&&(n=E.resolve(r,e)),!n||r.includes(`node_modules`))return null;for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=n+e;if(w.existsSync(t)&&w.statSync(t).isFile()){if(c.isClientComponent(t))return null;let e=E.join(c.projectRoot,`src`);if(!t.startsWith(e))return null;let n=c.getComponentId(t),r=E.join(c.options.outDir,c.options.rscDir,`${n}.js`);if(w.existsSync(r))return{id:`\0transformed:${r}`};break}}return null},load(e){if(e.startsWith(`\0transformed:`)){let t=e.slice(13);return{code:w.readFileSync(t,`utf-8`),moduleType:`js`}}return null}},{name:`resolve-aliases`,resolveId:e=>{if(e.startsWith(`\0`))return null;let t=c.options.alias||{};for(let[n,r]of Object.entries(t))if(e.startsWith(`${n}/`)||e===n){let t=e.slice(n.length),i=E.join(r,t),a=E.isAbsolute(i)?i:E.resolve(c.projectRoot,i);for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=a+e;if(w.existsSync(t)&&w.statSync(t).isFile())return t}for(let e of[`.ts`,`.tsx`,`.js`,`.jsx`]){let t=E.join(a,`index${e}`);if(w.existsSync(t))return t}return a}return null}},{name:`resolve-rari-proxy`,resolveId:e=>{if(s&&e===`rari`){let e=E.join(Ht,`proxy/RariResponse.mjs`);if(w.existsSync(e))return e;let t=E.join(Ut,`src/proxy/RariResponse.ts`);if(w.existsSync(t))return t}return null}},{name:`css-modules`,resolveId:(e,t)=>{if(e.endsWith(`.module.css`)){let n=!t?.startsWith(`\0`)&&t?E.dirname(t):o,r=E.resolve(n,e);if(w.existsSync(r))return{id:`\0css-module:${r}`}}return null},load:async e=>{if(!e.startsWith(`\0css-module:`))return null;let t=e.slice(12);try{let{transform:e}=await import(`lightningcss`),n=w.readFileSync(t),r=e({filename:E.relative(this.projectRoot,t),code:n,cssModules:{pattern:Vt}});a&&a.push(new TextDecoder().decode(r.code));let i={};if(r.exports)for(let[e,t]of Object.entries(r.exports))i[e]=t.name;return{code:`export default ${JSON.stringify(i)}`,moduleType:`js`}}catch(t){throw Error(`[rari] Failed to process CSS module ${e}: ${t instanceof Error?t.message:String(t)}`)}}},{name:`externalize-deps`,resolveId:e=>e.startsWith(`\0`)?null:e.startsWith(`node:`)||c.isNodeBuiltin(e)||[`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`rari/image`].includes(e)?{id:e,external:!0}:e===`rari`||e===`rari/client`?null:!e.startsWith(`.`)&&!e.startsWith(`/`)?{id:e,external:!0}:null}]}async buildComponentCodeOnly(e){let t=await w.promises.readFile(e,`utf-8`),n=this.transformClientImports(t,e),r=this.isPageComponent(e),i=r?this.transformComponentImportsToGlobal(n):n,a=E.extname(e),o;o=a===`.tsx`?`tsx`:a===`.ts`?`ts`:a===`.jsx`?`jsx`:`js`;let s=`\0virtual:${e}`,c=await j({input:s,platform:`node`,write:!1,external:[zt,`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`],output:{format:`esm`,minify:this.options.minify},moduleTypes:{[`.${o}`]:o},resolve:{mainFields:[`module`,`main`],conditionNames:[`import`,`module`,`default`],extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]},transform:{jsx:`react`,define:{global:`globalThis`,"process.env.NODE_ENV":JSON.stringify(D.env.NODE_ENV||`production`),...this.options.define}},plugins:this.createBuildPlugins(s,i,o,e,r,[])});if(!c.output||c.output.length===0)throw Error(`No output generated from Rolldown`);let l=c.output.find(e=>e.type===`chunk`&&e.isEntry);if(!l||l.type!==`chunk`)throw Error(`No entry chunk found in Rolldown output`);let u=l.code;return u=`// Built: ${new Date().toISOString()}\n${u}`,u}async buildServerComponents(){let e=E.join(this.options.outDir,this.options.rscDir);await w.promises.mkdir(e,{recursive:!0});let t={components:{},buildTime:new Date().toISOString()};for(let[e,n]of this.serverComponents){if(this.isPageComponent(e))continue;let r=E.relative(this.projectRoot,e),i=this.getComponentId(e),a=E.join(this.options.rscDir,`${i}.js`),o=E.join(this.options.outDir,a),s=E.dirname(o);await w.promises.mkdir(s,{recursive:!0});let c=await this.buildSingleComponent(e,o),l=await this.writeComponentCssAsset(i,c.css),u=k(E.resolve(this.projectRoot,o)).href;t.components[i]={id:i,filePath:e,relativePath:r,bundlePath:a,moduleSpecifier:u,dependencies:n.dependencies,hasNodeImports:n.hasNodeImports,css:l}}for(let[e,n]of this.serverComponents){if(!this.isPageComponent(e))continue;let r=E.relative(this.projectRoot,e),i=this.getComponentId(e),a=E.join(this.options.rscDir,`${i}.js`),o=E.join(this.options.outDir,a),s=E.dirname(o);await w.promises.mkdir(s,{recursive:!0});let c=await this.buildSingleComponent(e,o),l=await this.writeComponentCssAsset(i,c.css),u=k(E.resolve(this.projectRoot,o)).href;t.components[i]={id:i,filePath:e,relativePath:r,bundlePath:a,moduleSpecifier:u,dependencies:n.dependencies,hasNodeImports:n.hasNodeImports,css:l}}for(let[e,n]of this.serverActions){let r=E.relative(this.projectRoot,e),i=this.getComponentId(e),a=E.join(this.options.rscDir,`${i}.js`),o=E.join(this.options.outDir,a),s=E.dirname(o);await w.promises.mkdir(s,{recursive:!0});let c=await this.buildSingleComponent(e,o),l=await this.writeComponentCssAsset(i,c.css),u=k(E.resolve(this.projectRoot,o)).href;t.components[i]={id:i,filePath:e,relativePath:r,bundlePath:a,moduleSpecifier:u,dependencies:n.dependencies,hasNodeImports:n.hasNodeImports,css:l}}let n=E.join(this.options.outDir,this.options.manifestPath);await w.promises.writeFile(n,JSON.stringify(t,null,2),`utf-8`),await this.writeRouteCssEntries(t);let r={};this.options.csp&&(r.csp=this.options.csp),this.options.cacheControl&&(r.cacheControl=this.options.cacheControl);let i=E.join(this.options.outDir,this.options.serverConfigPath);if(Object.keys(r).length===0)try{await w.promises.unlink(i)}catch(e){e.code!==`ENOENT`&&console.warn(`Failed to remove server config file:`,e)}else await w.promises.writeFile(i,JSON.stringify(r,null,2),`utf-8`);return t}async buildSingleComponent(e,t){let n=await w.promises.readFile(e,`utf-8`),r=this.transformClientImports(n,e),i=this.isPageComponent(e),a=i?this.transformComponentImportsToGlobal(r):r,o=E.extname(e),s;s=o===`.tsx`?`tsx`:o===`.ts`?`ts`:o===`.jsx`?`jsx`:`js`;let c=`\0virtual:${e}`,l=[],u=await j({input:c,platform:`node`,write:!1,external:[zt,`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`],output:{format:`esm`,minify:this.options.minify},moduleTypes:{[`.${s}`]:s},resolve:{mainFields:[`module`,`main`],conditionNames:[`import`,`module`,`default`],extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]},transform:{jsx:`react`,define:{global:`globalThis`,"process.env.NODE_ENV":JSON.stringify(D.env.NODE_ENV||`production`),...this.options.define}},plugins:this.createBuildPlugins(c,a,s,e,i,l)});if(!u.output||u.output.length===0)throw Error(`No output generated from Rolldown`);let d=u.output.find(e=>e.type===`chunk`&&e.isEntry);if(!d||d.type!==`chunk`)throw Error(`No entry chunk found in Rolldown output`);let f=d.code;f=`// Built: ${new Date().toISOString()}\n${f}`,await w.promises.writeFile(t,f,`utf-8`);let p=await w.promises.open(t,`r+`);return await p.sync(),await p.close(),{code:f,css:l}}transformClientImports(e,t){let n=e,r,i=[],a=!1,o=[`rari/image`];for(Pt.lastIndex=0;r=Pt.exec(e),r!==null;){let[e,n,s,c]=r,l=!1,u=c;if(o.includes(c))l=!0;else{let e=this.resolveImportPath(c,t);this.isClientComponent(e)&&(l=!0,u=E.relative(this.projectRoot,e).replace(x,`/`))}if(l){a=!0;let t=``;n?t=`const ${n} = registerClientReference(
65
60
  null,
66
61
  ${JSON.stringify(u)},
67
62
  "default"
@@ -102,25 +97,25 @@ function registerClientReference(clientReference, id, exportName) {
102
97
  return clientProxy;
103
98
  }
104
99
 
105
- `+n);for(let{original:e,replacement:t}of i)n=n.replace(e,t);return n}resolveImportPath(e,t){let n=e,r=this.options.alias||{};for(let[t,i]of Object.entries(r))if(e.startsWith(`${t}/`)||e===t){let r=e.slice(t.length);n=w.join(i,r);break}w.isAbsolute(n)||(n=w.resolve(w.dirname(t),n));let i=[`.tsx`,`.jsx`,`.ts`,`.js`];return $e(n,i)||et(n,i)||`${n}.tsx`}getProjectRelativePath(e){return Ve(e,this.projectRoot)}getReadableComponentId(e){return He(e)}getComponentId(e){return P(e,this.projectRoot)}async rebuildComponent(e){let t=this.getComponentId(e),n=await S.promises.readFile(e,`utf-8`),r=this.extractDependencies(n),i={filePath:e,originalCode:n,dependencies:r,hasNodeImports:this.hasNodeImports(n)};this.isServerAction(n)?this.serverActions.set(e,i):this.serverComponents.set(e,i);let a=w.join(this.options.rscDir,`${t}.js`),o=w.join(this.options.outDir,a),s=this.buildCache.get(e),c=(await S.promises.stat(e)).mtimeMs;if(s&&s.timestamp>=c&&JSON.stringify(s.dependencies)===JSON.stringify(r))return await S.promises.writeFile(o,s.code,`utf-8`),await this.updateManifestForComponent(t,e,a,s.css),{componentId:t,bundlePath:w.join(this.options.outDir,a),success:!0};let l=w.dirname(o);await S.promises.mkdir(l,{recursive:!0});let u=await this.buildSingleComponent(e,o),d=await this.writeComponentCssAsset(t,u.css);return this.buildCache.set(e,{code:u.code,css:d,timestamp:Date.now(),dependencies:r}),await this.updateManifestForComponent(t,e,a,d),{componentId:t,bundlePath:w.join(this.options.outDir,a),success:!0}}manifestCache=null;async updateManifestForComponent(e,t,n,r=[]){let i=w.join(this.options.outDir,this.options.manifestPath),a;if(this.manifestCache)a=this.manifestCache;else if(S.existsSync(i)){let e=await S.promises.readFile(i,`utf-8`);a=JSON.parse(e),this.manifestCache=a}else a={components:{},buildTime:new Date().toISOString()},this.manifestCache=a;let o=this.serverComponents.get(t)||this.serverActions.get(t),s=w.join(this.options.outDir,n),c=D(w.resolve(this.projectRoot,s)).href;if(o)a.components[e]={id:e,filePath:t,relativePath:w.relative(this.projectRoot,t),bundlePath:n,moduleSpecifier:c,dependencies:o.dependencies,hasNodeImports:o.hasNodeImports,css:r};else{let i=await S.promises.readFile(t,`utf-8`);a.components[e]={id:e,filePath:t,relativePath:w.relative(this.projectRoot,t),bundlePath:n,moduleSpecifier:c,dependencies:this.extractDependencies(i),hasNodeImports:this.hasNodeImports(i),css:r}}a.buildTime=new Date().toISOString(),await S.promises.writeFile(i,JSON.stringify(a,null,2),`utf-8`),await this.writeRouteCssEntries(a),this.manifestCache=a}clearCache(){this.buildCache.clear(),this.manifestCache=null}invalidateBuildCacheFor(e){this.buildCache.delete(e)}async getTransformedComponentCode(e){return await this.buildComponentCodeOnly(e)}};function Kt(e){return W(e)||v.test(e)||ee.test(e)||re.test(e)}function X(e,t,n=!0){n&&t.buildImportGraph(e);let r=S.readdirSync(e,{withFileTypes:!0});for(let n of r){let r=w.join(e,n.name);if(n.isDirectory())X(r,t,!1);else if(n.isFile()&&y.test(n.name)){if(Bt.test(n.name)||n.name.endsWith(`.d.ts`))continue;try{let e=S.readFileSync(r,`utf-8`);if(V(e)){t.addServerComponent(r,e);continue}if(t.isOnlyImportedByClientComponents(r))continue;if(t.isServerComponent(r,e)){if(!Kt(e))continue;t.addServerComponent(r,e)}}catch(e){console.warn(`[server-build] Error checking ${r}:`,e instanceof Error?e.message:e)}}}}function qt(e={}){let t=null,n,r=!1,i={};return{name:`rari-server-build`,configResolved(a){n=a.root,r=a.command===`serve`;let o={};if(a.resolve?.alias){let e=a.resolve.alias;Array.isArray(e)?e.forEach(e=>{typeof e.find==`string`&&typeof e.replacement==`string`&&(o[e.find]=e.replacement)}):typeof e==`object`&&Object.entries(e).forEach(([e,t])=>{typeof t==`string`&&(o[e]=t)})}i=o,t=new Y(n,{...e,alias:o})},buildStart(){if(!t)return;let e=T.env.NODE_ENV===`production`,r=[w.join(n,`dist`,`cache`,`og`),w.join(n,`dist`,`cache`,`images`)];e&&r.push(`/tmp/rari-og-cache`,`/tmp/rari-image-cache`);for(let e of r)try{S.existsSync(e)&&S.rmSync(e,{recursive:!0,force:!0})}catch(t){console.warn(`[rari] Failed to clear cache ${e}:`,t)}let i=w.join(n,`src`);S.existsSync(i)&&X(i,t)},async closeBundle(){if(t){await t.buildServerComponents();try{let{generateRobotsFile:e}=await import(`./robots-generator-l2O5neuR.mjs`);await e({appDir:w.join(n,`src`,`app`),outDir:w.join(n,`dist`),extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]})}catch(e){console.warn(`[rari] Failed to generate robots.txt:`,e)}try{let{generateSitemapFiles:e}=await import(`./sitemap-generator-BGu4N9qc.mjs`);await e({appDir:w.join(n,`src`,`app`),outDir:w.join(n,`dist`),extensions:[`.ts`,`.tsx`,`.js`,`.jsx`],aliases:i})}catch(e){console.warn(`[rari] Failed to generate sitemap:`,e)}}},async handleHotUpdate({file:e}){if(!t||!r)return;let i=w.relative(n,e).replace(Lt,`/`);if(!(!i.startsWith(`src/`)||!y.test(i)))try{if(H(await S.promises.readFile(e,`utf-8`)))return;await t.buildServerComponents()}catch(e){console.error(`[rari] Build: Error rebuilding ${i}:`,e)}}}}const Jt=/import\s+type\s+(\{[^}]+\})\s+from\s+["']\.\.?\/([^"']+)["'];?/g,Yt=/import\s+type\s+(\*\s+as\s+\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,Xt=/import\s+type\s+(\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,Zt=/import\s+(\{[^}]+\})\s+from\s+["']\.\.?\/([^"']+)["'];?/g,Qt=/import\s+(\*\s+as\s+\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,$t=/import\s+(\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,en=/import\s+["']\.\.?\/([^"']+)["'];?/g,tn=/import\s*(?:\(\s*)?["']([^"']+)["']\)?/g,nn=/export\s*\{([^}]+)\}/g,rn=/\s+as\s+/,an=/export\s+default\s+(?:function|class)\s+\w+/,on=/export\s+default\s+(?:async\s+)?function\s+(\w+)/,sn=/export\s+default\s+([^;]+)/,cn=/export\s+(?:async\s+)?(?:const|let|var|function|class)\s+(\w+)/g,ln=/^['"]use client['"];?\s*$/gm,un=/import\s+["']([^"']+)["']/g,dn=/^\s*import\s+(?:(\w+)(?:\s*,\s*\{\s*(?:(\w+(?:\s*,\s*\w+)*)\s*)?\})?|\{\s*(\w+(?:\s*,\s*\w+)*)\s*\})\s+from\s+['"]([./@][^'"]+)['"].*$/,fn=/import\s+\{[^}]*\}\s+from\s+['"]react['"]/,pn=/import\s+[^,\s]+\s*,\s*\{[^}]*\}\s+from\s+['"]react['"]/,mn=/import React(,\s*\{([^}]*)\})?\s+from\s+['"]react['"];?/,hn=/import\s+["']([^"']+)["']/g,gn=/from(\s*)(['"])(?:\.\/vendor\/react-flight-client\/index|rari\/runtime\/vendor\/react-flight-client\/index)\.mjs\2/g,_n=/\bJSX\b/,vn=/\{([^}]*)\}/,yn=/^['"]use client['"];?\s*\n/,bn={remotePatterns:[],localPatterns:[],deviceSizes:g,imageSizes:h,formats:p,qualityAllowlist:m,minimumCacheTTL:60,maxCacheSize:f};async function Z(e){let t=import.meta.url,n=E(t),r=w.dirname(n),i=[w.join(r,`runtime`,e),w.join(r,`../runtime`,e)];for(let e of i)try{let t=await S.promises.readFile(e,`utf-8`);return e.endsWith(`.ts`)&&(t=t.replace(Jt,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(Yt,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(Xt,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(Zt,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace(Qt,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace($t,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace(en,(e,t)=>`import "rari/${t}";`)),t}catch(t){t.code!==`ENOENT`&&t.code!==`EISDIR`&&console.warn(`[rari] Unexpected error reading ${e}:`,t)}throw Error(`Could not find ${e}. Tried: ${i.join(`, `)}`)}const Q=w.dirname(E(import.meta.url)),xn=w.dirname(Q);function $(e){let t=[w.join(Q,`runtime`,e),w.join(Q,`../runtime`,e)];for(let e of t)if(S.existsSync(e))return e;return null}function Sn(e){return e.startsWith(xn)}async function Cn(){return Z(`rsc-client-runtime.mjs`)}async function wn(e,t){return(await Z(`entry-client.mjs`)).replace(`/*! @preserve CLIENT_COMPONENT_IMPORTS_PLACEHOLDER */`,e).replace(`/*! @preserve CLIENT_COMPONENT_REGISTRATIONS_PLACEHOLDER */`,t)}async function Tn(){return Z(`react-server-dom-shim.mjs`)}async function En(e,t){let n=await bt(w.join(e,`src`)),r={...bn,...t.images,preoptimizeManifest:n.images},i=w.join(e,`dist`),a=w.join(i,`server`);S.existsSync(a)||S.mkdirSync(a,{recursive:!0});let o=w.join(a,`image.json`);S.writeFileSync(o,JSON.stringify(r,null,2))}function Dn(e,t=[]){let n=new Set;function r(e){if(!S.existsSync(e))return;let t=S.readdirSync(e,{withFileTypes:!0});for(let i of t){let t=w.join(e,i.name);if(i.isDirectory()){if(i.name===`node_modules`)continue;r(t)}else if(i.isFile()&&y.test(i.name))try{H(S.readFileSync(t,`utf8`))&&n.add(t)}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error during file scan:`,t,e)}}}r(e);for(let e of t)S.existsSync(e)&&r(e);return n}function On(e){return e}function kn(e={}){let t=new Map,n=new Set,r=new Map,i=null,a=null,o={};function s(e){if(r.has(e))return r.get(e);let t={hasUseServer:!1,hasUseClient:!1},n=e.replace(x,`/`);if(!y.test(n)||!n.includes(`/src/`))return r.set(e,t),t;try{let n=S.readFileSync(e,`utf-8`);t.hasUseServer=V(n),t.hasUseClient=H(n),r.set(e,t)}catch{r.set(e,t)}return t}function c(t){if(t.includes(`node_modules`)||Sn(t))return!1;let n=e.projectRoot||T.cwd(),r=w.join(n,`index.html`);if(S.existsSync(r))try{let e=S.readFileSync(r,`utf-8`);for(let r of e.matchAll(tn)){let e=r[1];if(e.startsWith(`/src/`)&&w.join(n,e.slice(1))===t)return!1}}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error reading index.html:`,e)}let i;try{i=S.realpathSync(t)}catch{return!1}try{if(!S.existsSync(i))return!1;let e=S.readFileSync(i,`utf-8`),t=H(e);return V(e)?!1:!t}catch{return!1}}function l(e){try{let t=[],n=e.matchAll(nn);for(let e of n){let n=e[1].split(`,`);for(let e of n){let n=e.trim().split(rn).at(-1)?.trim();n&&t.push(n)}}(an.test(e)||W(e))&&t.push(`default`);let r=e.matchAll(cn);for(let e of r)e[1]&&t.push(e[1]);return[...new Set(t)]}catch{return[]}}function u(e,t){if(!V(e))return e;let n=l(e);if(n.length===0)return e;let r=e;r+=`
100
+ `+n);for(let{original:e,replacement:t}of i)n=n.replace(e,t);return n}resolveImportPath(e,t){let n=e,r=this.options.alias||{};for(let[t,i]of Object.entries(r))if(e.startsWith(`${t}/`)||e===t){let r=e.slice(t.length);n=E.join(i,r);break}E.isAbsolute(n)||(n=E.resolve(E.dirname(t),n));let i=[`.tsx`,`.jsx`,`.ts`,`.js`];return Qe(n,i)||$e(n,i)||`${n}.tsx`}getProjectRelativePath(e){return Re(e,this.projectRoot)}getReadableComponentId(e){return ze(e)}getComponentId(e){return I(e,this.projectRoot)}async rebuildComponent(e){let t=this.getComponentId(e),n=await w.promises.readFile(e,`utf-8`),r=this.extractDependencies(n),i={filePath:e,originalCode:n,dependencies:r,hasNodeImports:this.hasNodeImports(n)};this.isServerAction(n)?this.serverActions.set(e,i):this.serverComponents.set(e,i);let a=E.join(this.options.rscDir,`${t}.js`),o=E.join(this.options.outDir,a),s=this.buildCache.get(e),c=(await w.promises.stat(e)).mtimeMs;if(s&&s.timestamp>=c&&JSON.stringify(s.dependencies)===JSON.stringify(r))return await w.promises.writeFile(o,s.code,`utf-8`),await this.updateManifestForComponent(t,e,a,s.css),{componentId:t,bundlePath:E.join(this.options.outDir,a),success:!0};let l=E.dirname(o);await w.promises.mkdir(l,{recursive:!0});let u=await this.buildSingleComponent(e,o),d=await this.writeComponentCssAsset(t,u.css);return this.buildCache.set(e,{code:u.code,css:d,timestamp:Date.now(),dependencies:r}),await this.updateManifestForComponent(t,e,a,d),{componentId:t,bundlePath:E.join(this.options.outDir,a),success:!0}}manifestCache=null;async updateManifestForComponent(e,t,n,r=[]){let i=E.join(this.options.outDir,this.options.manifestPath),a;if(this.manifestCache)a=this.manifestCache;else if(w.existsSync(i)){let e=await w.promises.readFile(i,`utf-8`);a=JSON.parse(e),this.manifestCache=a}else a={components:{},buildTime:new Date().toISOString()},this.manifestCache=a;let o=this.serverComponents.get(t)||this.serverActions.get(t),s=E.join(this.options.outDir,n),c=k(E.resolve(this.projectRoot,s)).href;if(o)a.components[e]={id:e,filePath:t,relativePath:E.relative(this.projectRoot,t),bundlePath:n,moduleSpecifier:c,dependencies:o.dependencies,hasNodeImports:o.hasNodeImports,css:r};else{let i=await w.promises.readFile(t,`utf-8`);a.components[e]={id:e,filePath:t,relativePath:E.relative(this.projectRoot,t),bundlePath:n,moduleSpecifier:c,dependencies:this.extractDependencies(i),hasNodeImports:this.hasNodeImports(i),css:r}}a.buildTime=new Date().toISOString(),await w.promises.writeFile(i,JSON.stringify(a,null,2),`utf-8`),await this.writeRouteCssEntries(a),this.manifestCache=a}clearCache(){this.buildCache.clear(),this.manifestCache=null}invalidateBuildCacheFor(e){this.buildCache.delete(e)}async getTransformedComponentCode(e){return await this.buildComponentCodeOnly(e)}};function Gt(e){return Y(e)||h.test(e)||v.test(e)||b.test(e)}function Kt(e,t,n=!0){n&&t.buildImportGraph(e);let r=w.readdirSync(e,{withFileTypes:!0});for(let n of r){let r=E.join(e,n.name);if(n.isDirectory())Kt(r,t,!1);else if(n.isFile()&&g.test(n.name)){if(Rt.test(n.name)||n.name.endsWith(`.d.ts`))continue;try{let e=w.readFileSync(r,`utf-8`);if(K(e)){t.addServerComponent(r,e);continue}if(t.isOnlyImportedByClientComponents(r))continue;if(t.isServerComponent(r,e)){if(!Gt(e))continue;t.addServerComponent(r,e)}}catch(e){console.warn(`[server-build] Error checking ${r}:`,e instanceof Error?e.message:e)}}}}function qt(e={}){let t=null,n,r=!1,i={};return{name:`rari-server-build`,configResolved(a){n=a.root,r=a.command===`serve`;let o={};if(a.resolve?.alias){let e=a.resolve.alias;Array.isArray(e)?e.forEach(e=>{typeof e.find==`string`&&typeof e.replacement==`string`&&(o[e.find]=e.replacement)}):typeof e==`object`&&Object.entries(e).forEach(([e,t])=>{typeof t==`string`&&(o[e]=t)})}i=o,t=new $(n,{...e,alias:o})},buildStart(){if(!t)return;let e=D.env.NODE_ENV===`production`,r=[E.join(n,`dist`,`cache`,`og`),E.join(n,`dist`,`cache`,`images`)];e&&r.push(`/tmp/rari-og-cache`,`/tmp/rari-image-cache`);for(let e of r)try{w.existsSync(e)&&w.rmSync(e,{recursive:!0,force:!0})}catch(t){console.warn(`[rari] Failed to clear cache ${e}:`,t)}let i=E.join(n,`src`);w.existsSync(i)&&Kt(i,t)},async closeBundle(){if(t){await t.buildServerComponents();try{let{generateRobotsFile:e}=await import(`./robots-generator-l2O5neuR.mjs`);await e({appDir:E.join(n,`src`,`app`),outDir:E.join(n,`dist`),extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]})}catch(e){console.warn(`[rari] Failed to generate robots.txt:`,e)}try{let{generateSitemapFiles:e}=await import(`./sitemap-generator-BGu4N9qc.mjs`);await e({appDir:E.join(n,`src`,`app`),outDir:E.join(n,`dist`),extensions:[`.ts`,`.tsx`,`.js`,`.jsx`],aliases:i})}catch(e){console.warn(`[rari] Failed to generate sitemap:`,e)}}},async handleHotUpdate({file:e}){if(!t||!r)return;let i=E.relative(n,e).replace(x,`/`);if(!(!i.startsWith(`src/`)||!g.test(i)))try{if(q(await w.promises.readFile(e,`utf-8`)))return;await t.buildServerComponents()}catch(e){console.error(`[rari] Build: Error rebuilding ${i}:`,e)}}}}const Jt="[rari] Runtime dist not built. Run `pnpm build` in the rari package first.",Yt=/import\s+type\s+(\{[^}]+\})\s+from\s+["']\.\.?\/([^"']+)["'];?/g,Xt=/import\s+type\s+(\*\s+as\s+\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,Zt=/import\s+type\s+(\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,Qt=/import\s+(\{[^}]+\})\s+from\s+["']\.\.?\/([^"']+)["'];?/g,$t=/import\s+(\*\s+as\s+\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,en=/import\s+(\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,tn=/import\s+["']\.\.?\/([^"']+)["'];?/g,nn=/import\s*(?:\(\s*)?["']([^"']+)["']\)?/g,rn=/export\s*\{([^}]+)\}/g,an=/\s+as\s+/,on=/export\s+default\s+(?:function|class)\s+\w+/,sn=/export\s+default\s+(?:async\s+)?function\s+(\w+)/,cn=/export\s+default\s+([^;]+)/,ln=/export\s+(?:async\s+)?(?:const|let|var|function|class)\s+(\w+)/g,un=/^['"]use client['"];?\s*$/gm,dn=/import\s+["']([^"']+)["']/g,fn=/^\s*import\s+(?:(\w+)(?:\s*,\s*\{\s*(?:(\w+(?:\s*,\s*\w+)*)\s*)?\})?|\{\s*(\w+(?:\s*,\s*\w+)*)\s*\})\s+from\s+['"]([./@][^'"]+)['"].*$/,pn=/import\s+\{[^}]*\}\s+from\s+['"]react['"]/,mn=/import\s+[^,\s]+\s*,\s*\{[^}]*\}\s+from\s+['"]react['"]/,hn=/import React(,\s*\{([^}]*)\})?\s+from\s+['"]react['"];?/,gn=/import\s+["']([^"']+)["']/g,_n=/from(\s*)(['"])(?:\.\/vendor\/react-flight-client\/index|rari\/runtime\/vendor\/react-flight-client\/index)\.mjs\2/g,vn=/\bJSX\b/,yn=/\{([^}]*)\}/,bn=/^['"]use client['"];?\s*\n/,xn={remotePatterns:[],localPatterns:[],deviceSizes:p,imageSizes:f,formats:u,qualityAllowlist:d,minimumCacheTTL:60,maxCacheSize:l};async function Sn(e){let t=import.meta.url,n=O(t),r=E.dirname(n),i=[E.join(r,`runtime`,e),E.join(r,`../runtime`,e)];for(let e of i)try{let t=await w.promises.readFile(e,`utf-8`);return e.endsWith(`.ts`)&&(t=t.replace(Yt,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(Xt,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(Zt,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(Qt,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace($t,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace(en,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace(tn,(e,t)=>`import "rari/${t}";`)),t}catch(t){t.code!==`ENOENT`&&t.code!==`EISDIR`&&console.warn(`[rari] Unexpected error reading ${e}:`,t)}throw Error(`Could not find ${e}. Tried: ${i.join(`, `)}`)}const Cn=E.dirname(O(import.meta.url)),wn=E.dirname(Cn);function Tn(e){let t=[E.join(Cn,`runtime`,e),E.join(Cn,`../runtime`,e)];for(let e of t)if(w.existsSync(e))return e;return null}function En(e){return e.startsWith(wn)}async function Dn(){return Sn(`rsc-client-runtime.mjs`)}async function On(e,t){return(await Sn(`entry-client.mjs`)).replace(`/*! @preserve CLIENT_COMPONENT_IMPORTS_PLACEHOLDER */`,e).replace(`/*! @preserve CLIENT_COMPONENT_REGISTRATIONS_PLACEHOLDER */`,t)}async function kn(){return Sn(`react-server-dom-shim.mjs`)}async function An(e,t){let n=await vt(E.join(e,`src`)),r={...xn,...t.images,preoptimizeManifest:n.images},i=E.join(e,`dist`),a=E.join(i,`server`);w.existsSync(a)||w.mkdirSync(a,{recursive:!0});let o=E.join(a,`image.json`);w.writeFileSync(o,JSON.stringify(r,null,2))}function jn(e,t=[]){let n=new Set;function r(e){if(!w.existsSync(e))return;let t=w.readdirSync(e,{withFileTypes:!0});for(let i of t){let t=E.join(e,i.name);if(i.isDirectory()){if(i.name===`node_modules`)continue;r(t)}else if(i.isFile()&&g.test(i.name))try{q(w.readFileSync(t,`utf8`))&&n.add(t)}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error during file scan:`,t,e)}}}r(e);for(let e of t)w.existsSync(e)&&r(e);return n}function Mn(e){return e}function Nn(e={}){let t=new Map,n=new Set,r=new Map,i=null,a=null,o={};function s(e){if(r.has(e))return r.get(e);let t={hasUseServer:!1,hasUseClient:!1},n=e.replace(x,`/`);if(!g.test(n)||!n.includes(`/src/`))return r.set(e,t),t;try{let n=G(w.readFileSync(e,`utf-8`));t.hasUseServer=n.hasUseServer,t.hasUseClient=n.hasUseClient,r.set(e,t)}catch{r.set(e,t)}return t}let c=null,l=null;function u(){let t=e.projectRoot||D.cwd(),n=E.join(t,`index.html`);try{let e=w.statSync(n).mtimeMs;if(c!==null&&e===l)return c;l=e}catch{return c===null&&(c=new Set),c}c=new Set;try{let e=w.readFileSync(n,`utf-8`);for(let n of e.matchAll(nn)){let e=n[1];e.startsWith(`/src/`)&&c.add(E.join(t,e.slice(1)))}}catch{}return c}function d(e){if(e.includes(`node_modules`)||En(e)||u().has(e))return!1;let t;try{t=w.realpathSync(e)}catch{return!1}try{let e=G(w.readFileSync(t,`utf-8`));return e.hasUseServer?!1:!e.hasUseClient}catch{return!1}}function f(e){try{let t=[],n=e.matchAll(rn);for(let e of n){let n=e[1].split(`,`);for(let e of n){let n=e.trim().split(an).at(-1)?.trim();n&&t.push(n)}}(on.test(e)||Y(e))&&t.push(`default`);let r=e.matchAll(ln);for(let e of r)e[1]&&t.push(e[1]);return[...new Set(t)]}catch{return[]}}function p(e,t){if(!K(e))return e;let n=f(e);if(n.length===0)return e;let r=JSON.stringify(t),i=e;i+=`
106
101
 
107
102
  import {registerServerReference} from "react-server-dom-rari/server";
108
- `;for(let i of n)if(i==="default"){let n=e.match(on);if(n){let e=n[1];r+=`
103
+ `;for(let t of n)if(t==="default"){let n=e.match(sn);if(n){let e=n[1];i+=`
109
104
  // Register server reference for default export
110
- `,r+=`registerServerReference(${e}, ${JSON.stringify(t)}, ${JSON.stringify(i)});\n`}else{let n=e.match(sn);if(n){let e=n[1].trim(),a=`__default_export__`;r=r.replace(sn,`const ${a} = ${e};\nexport default ${a}`),r+=`
105
+ `,i+=`registerServerReference(${e}, ${r}, ${JSON.stringify(t)});\n`}else{let n=e.match(cn);if(n){let e=n[1].trim(),a=`__default_export__`;i=i.replace(cn,`const ${a} = ${e};\nexport default ${a}`),i+=`
111
106
  // Register server reference for default export
112
- `,r+=`if (typeof ${a} === "function") {\n`,r+=` registerServerReference(${a}, ${JSON.stringify(t)}, ${JSON.stringify(i)});\n`,r+=`}
113
- `}}}else r+=`\n// Register server reference for ${i}\n`,r+=`if (typeof ${i} === "function") {\n`,r+=` registerServerReference(${i}, ${JSON.stringify(t)}, ${JSON.stringify(i)});\n`,r+=`}
114
- `;return r+=`
107
+ `,i+=`if (typeof ${a} === "function") {\n`,i+=` registerServerReference(${a}, ${r}, ${JSON.stringify(t)});\n`,i+=`}
108
+ `}}}else i+=`\n// Register server reference for ${t}\n`,i+=`if (typeof ${t} === "function") {\n`,i+=` registerServerReference(${t}, ${r}, ${JSON.stringify(t)});\n`,i+=`}
109
+ `;return i+=`
115
110
 
116
111
  if (import.meta.hot) {
117
112
  import.meta.hot.accept(() => {
118
113
  });
119
- }`,r}function d(t,n){let r=e.projectRoot||T.cwd(),i=V(t),a=c(n);if(i){let e=l(t);if(e.length===0)return``;let i=P(n,r),a=`import { createServerReference } from "rari/runtime/actions";
120
- `;for(let t of e)t==="default"?a+=`export default createServerReference("default", ${JSON.stringify(i)}, "default");\n`:a+=`export const ${t} = createServerReference("${t}", ${JSON.stringify(i)}, "${t}");\n`;return a}if(a){let e=l(t);if(e.length===0)return``;let i=P(n,r),a=`import { createServerComponentWrapper } from "virtual:rsc-integration.ts";
121
- `;for(let t of e)t==="default"?a+=`export default createServerComponentWrapper("${i}", ${JSON.stringify(n)});\n`:a+=`export const ${t} = createServerComponentWrapper("${i}_${t}", ${JSON.stringify(n)});\n`;return a}if(!H(t))return t;let o=l(t);if(o.length===0)return``;let s=`import {registerClientReference} from "react-server-dom-rari/server";
122
- `;for(let e of o){if(e==="default"){let e=`Attempted to call the default export of ${n} from the server but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;s+=`export default `,s+=`registerClientReference(function() {`,s+=`throw new Error(${JSON.stringify(e)});`}else{let t=`Attempted to call ${e}() from the server but ${e} is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;s+=`export const ${e} = `,s+=`registerClientReference(function() {`,s+=`throw new Error(${JSON.stringify(t)});`}s+=`},`,s+=`${JSON.stringify(n)},`,s+=`${JSON.stringify(e)});\n`}return s}function f(e,t){return!H(e)||l(e).length===0?e:e.replace(ln,``)}function p(e,t){let n=e;for(let[t,r]of Object.entries(o))if(e.startsWith(`${t}/`)){n=e.replace(t,r);break}else if(e===t){n=r;break}let r=w.resolve(w.dirname(t),n),i=[`.tsx`,`.jsx`,`.ts`,`.js`];return $e(r,i)||et(r,i)||`${r}.tsx`}function m(e){return(e.split(`/`).pop()||e).replace(ie,``)}let h=!1;async function g(){let e=`http://localhost:${T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3)}`;try{let t=(await fetch(`${e}/_rari/health`,{signal:AbortSignal.timeout(1e3)})).ok;return h=t,t}catch{return h=!1,!1}}let _=[{name:`rari`,config(t,{command:n}){if(t.define=t.define||{},n===`serve`||T.env.RARI_SERVER_URL||T.env.RARI_HOST){let e=T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3),n;if(T.env.RARI_SERVER_URL)n=T.env.RARI_SERVER_URL;else if(T.env.RARI_HOST){let t=T.env.RARI_HOST.startsWith(`http`)?T.env.RARI_HOST:`http://${T.env.RARI_HOST}`;n=t.replace(te,``).includes(`:`)?t:`${t}:${e}`}else n=`http://localhost:${e}`;t.define[`import.meta.env.RARI_SERVER_URL`]=JSON.stringify(n)}let r=typeof t.css?.modules==`object`?t.css.modules:{};if(t.css={...t.css,transformer:t.css?.transformer??`lightningcss`,modules:{...r,pattern:Ht}},n===`build`){let n=e.projectRoot||T.cwd(),r=w.join(n,`index.html`);if(S.existsSync(r))try{let e=S.readFileSync(r,`utf-8`),n=[];for(let t of e.matchAll(un)){let e=t[1];if(e.startsWith(`/src/`)&&y.test(e)){let t=e.slice(1),r=w.basename(t,w.extname(t));n.push({path:t,name:r})}}if(n.length>0){t.build=t.build||{},t.build.rolldownOptions=t.build.rolldownOptions||{};let e=t.build.rolldownOptions.input||{main:`./index.html`},r;r=typeof e==`string`?{main:e}:Array.isArray(e)?{main:e[0]||`./index.html`}:{...e},n.forEach(({path:e,name:t})=>{r[t]=`./${e}`}),t.build.rolldownOptions.input=r}}catch(e){console.warn(`[rari] Error parsing index.html for build inputs:`,e)}}t.resolve=t.resolve||{};let i=Array.isArray(t.resolve.dedupe)?t.resolve.dedupe:[],a=[`react`,`react-dom`];t.resolve.dedupe=[...new Set([...i||[],...a])];let o=[];Array.isArray(t.resolve.alias)?o=t.resolve.alias:t.resolve.alias&&typeof t.resolve.alias==`object`&&(o=Object.entries(t.resolve.alias).map(([e,t])=>({find:e,replacement:t})));let c=new Set(o.map(e=>String(e.find)));try{let e=E(import.meta.resolve(`react`)),n=E(import.meta.resolve(`react-dom/client`)),r=E(import.meta.resolve(`react/jsx-runtime`)),i=[];c.has(`react/jsx-runtime`)||i.push({find:`react/jsx-runtime`,replacement:r});try{let e=E(import.meta.resolve(`react/jsx-dev-runtime`));c.has(`react/jsx-dev-runtime`)||i.push({find:`react/jsx-dev-runtime`,replacement:e})}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error resolving react/jsx-dev-runtime:`,e)}c.has(`react`)||i.push({find:`react`,replacement:e}),c.has(`react-dom/client`)||i.push({find:`react-dom/client`,replacement:n}),i.length>0&&(t.resolve.alias=[...o,...i])}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error configuring React aliases:`,e)}t.environments=t.environments||{},t.environments.rsc={resolve:{conditions:[`react-server`,`node`,`import`]},...t.environments.rsc},t.environments.ssr={resolve:{conditions:[`node`,`import`]},...t.environments.ssr},t.environments.client={resolve:{conditions:[`browser`,`import`]},...t.environments.client},t.optimizeDeps=t.optimizeDeps||{},t.optimizeDeps.include=t.optimizeDeps.include||[];for(let e of[`react`,`react-dom`,`react-dom/client`,`react-dom/server`,`react/jsx-runtime`,`react/jsx-dev-runtime`])t.optimizeDeps.include.includes(e)||t.optimizeDeps.include.push(e);if(t.optimizeDeps.exclude=t.optimizeDeps.exclude||[],t.optimizeDeps.exclude.includes(`rari`)||t.optimizeDeps.exclude.push(`rari`),n===`build`)for(let e of[`rsc`,`ssr`,`client`]){let n=t.environments[e];n&&n.build&&(n.build.rolldownOptions=n.build.rolldownOptions||{})}t.server=t.server||{},t.server.proxy=t.server.proxy||{};let l=T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3);if(t.server.proxy[`/api`]={target:`http://localhost:${l}`,changeOrigin:!0,secure:!1,ws:!0},t.server.proxy[`/_rari`]={target:`http://localhost:${l}`,changeOrigin:!0,secure:!1,ws:!0},n===`build`){t.build=t.build||{},t.build.rolldownOptions=t.build.rolldownOptions||{},t.build.rolldownOptions.input||(t.build.rolldownOptions.input={main:`./index.html`}),t.build.rolldownOptions.output=t.build.rolldownOptions.output||{};let e=Array.isArray(t.build.rolldownOptions.output)?t.build.rolldownOptions.output:[t.build.rolldownOptions.output];for(let t of e){if(t.codeSplitting!==!1&&typeof t.codeSplitting!=`object`&&(t.codeSplitting={}),typeof t.codeSplitting==`object`){t.codeSplitting.groups=t.codeSplitting.groups||[];let e=t.codeSplitting.groups;t.codeSplitting.groups.push({name(t){if(t.includes(`node_modules`)){for(let n of e)if(n.test){let e=!1;if(typeof n.test==`function`?e=!!n.test(t):n.test instanceof RegExp?e=n.test.test(t):typeof n.test==`string`&&(e=t.includes(n.test)),e)return null}return t.includes(`node_modules/react-dom`)?`react-dom`:t.includes(`node_modules/react`)?`react`:`vendor`}return null}})}t.chunkFileNames||=e=>e.moduleIds?.some(e=>s(e).hasUseServer)?`client/actions/[name]-[hash].js`:e.moduleIds?.some(e=>s(e).hasUseClient)?`client/components/[name]-[hash].js`:`assets/[name]-[hash].js`}}return t.environments&&t.environments.client&&(t.environments.client.build||(t.environments.client.build={}),t.environments.client.build.rolldownOptions||(t.environments.client.build.rolldownOptions={}),t.environments.client.build.rolldownOptions.input||(t.environments.client.build.rolldownOptions.input={})),t},configResolved(e){let t=new Set([`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`react-dom/client`]);if(e.resolve?.alias){let n=e.resolve.alias;Array.isArray(n)?n.forEach(e=>{typeof e.find==`string`&&typeof e.replacement==`string`&&!t.has(e.find)&&(o[e.find]=e.replacement)}):typeof n==`object`&&Object.entries(n).forEach(([e,n])=>{typeof n==`string`&&!t.has(e)&&(o[e]=n)})}},transform(e,r){if(!y.test(r))return null;let i=this.environment;if(H(e)){t.set(r,`client`),n.add(r);let i=e.split(`
123
- `);for(let e of i){let i=e.match(dn);if(!i)continue;let a=i[4];if(!a)continue;let o=p(a,r);S.existsSync(o)&&(t.set(o,`client`),n.add(o))}return f(e,r)}if(t.get(r)===`client`||n.has(r))return f(e,r);if(c(r)){if(t.set(r,`server`),i&&(i.name===`rsc`||i.name===`ssr`))return u(e,r);{let t=d(e,r);return t=`// HMR acceptance for server component
114
+ }`,i}function m(t,n){let r=e.projectRoot||D.cwd(),i=K(t),a=d(n);if(i){let e=f(t);if(e.length===0)return``;let i=I(n,r),a=JSON.stringify(i),o=`import { createServerReference } from "rari/runtime/actions";
115
+ `;for(let t of e)t==="default"?o+=`export default createServerReference("default", ${a}, "default");\n`:o+=`export const ${t} = createServerReference("${t}", ${a}, "${t}");\n`;return o}if(a){let e=f(t);if(e.length===0)return``;let i=I(n,r),a=JSON.stringify(n),o=`import { createServerComponentWrapper } from "virtual:rsc-integration.ts";
116
+ `;for(let t of e)t==="default"?o+=`export default createServerComponentWrapper("${i}", ${a});\n`:o+=`export const ${t} = createServerComponentWrapper("${i}_${t}", ${a});\n`;return o}if(!q(t))return t;let o=f(t);if(o.length===0)return``;let s=JSON.stringify(n),c=`import {registerClientReference} from "react-server-dom-rari/server";
117
+ `;for(let e of o){if(e==="default"){let e=`Attempted to call the default export of ${n} from the server but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;c+=`export default `,c+=`registerClientReference(function() {`,c+=`throw new Error(${JSON.stringify(e)});`}else{let t=`Attempted to call ${e}() from the server but ${e} is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;c+=`export const ${e} = `,c+=`registerClientReference(function() {`,c+=`throw new Error(${JSON.stringify(t)});`}c+=`},`,c+=`${s},`,c+=`${JSON.stringify(e)});\n`}return c}function h(e,t){return!q(e)||f(e).length===0?e:e.replace(un,``)}function _(e,t){let n=e;for(let[t,r]of Object.entries(o))if(e.startsWith(`${t}/`)){n=e.replace(t,r);break}else if(e===t){n=r;break}let r=E.resolve(E.dirname(t),n),i=[`.tsx`,`.jsx`,`.ts`,`.js`];return Qe(r,i)||$e(r,i)||`${r}.tsx`}function v(e){return(e.split(`/`).pop()||e).replace(te,``)}let b=!1;async function S(){let e=`http://localhost:${D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3)}`;try{let t=(await fetch(`${e}/_rari/health`,{signal:AbortSignal.timeout(1e3)})).ok;return b=t,t}catch{return b=!1,!1}}let C=[{name:`rari`,config(t,{command:n}){if(t.define=t.define||{},n===`serve`||D.env.RARI_SERVER_URL||D.env.RARI_HOST){let e=D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3),n;if(D.env.RARI_SERVER_URL)n=D.env.RARI_SERVER_URL;else if(D.env.RARI_HOST){let t=D.env.RARI_HOST.startsWith(`http`)?D.env.RARI_HOST:`http://${D.env.RARI_HOST}`;n=t.replace(y,``).includes(`:`)?t:`${t}:${e}`}else n=`http://localhost:${e}`;t.define[`import.meta.env.RARI_SERVER_URL`]=JSON.stringify(n)}let r=typeof t.css?.modules==`object`?t.css.modules:{};if(t.css={...t.css,transformer:t.css?.transformer??`lightningcss`,modules:{...r,pattern:Vt}},n===`build`){let n=e.projectRoot||D.cwd(),r=E.join(n,`index.html`);if(w.existsSync(r))try{let e=w.readFileSync(r,`utf-8`),n=[];for(let t of e.matchAll(dn)){let e=t[1];if(e.startsWith(`/src/`)&&g.test(e)){let t=e.slice(1),r=E.basename(t,E.extname(t));n.push({path:t,name:r})}}if(n.length>0){t.build=t.build||{},t.build.rolldownOptions=t.build.rolldownOptions||{};let e=t.build.rolldownOptions.input||{main:`./index.html`},r;r=typeof e==`string`?{main:e}:Array.isArray(e)?{main:e[0]||`./index.html`}:{...e},n.forEach(({path:e,name:t})=>{r[t]=`./${e}`}),t.build.rolldownOptions.input=r}}catch(e){console.warn(`[rari] Error parsing index.html for build inputs:`,e)}}t.resolve=t.resolve||{};let i=Array.isArray(t.resolve.dedupe)?t.resolve.dedupe:[],a=[`react`,`react-dom`];t.resolve.dedupe=[...new Set([...i||[],...a])];let o=[];Array.isArray(t.resolve.alias)?o=t.resolve.alias:t.resolve.alias&&typeof t.resolve.alias==`object`&&(o=Object.entries(t.resolve.alias).map(([e,t])=>({find:e,replacement:t})));let c=new Set(o.map(e=>String(e.find)));try{let e=O(import.meta.resolve(`react`)),n=O(import.meta.resolve(`react-dom/client`)),r=O(import.meta.resolve(`react/jsx-runtime`)),i=[];c.has(`react/jsx-runtime`)||i.push({find:`react/jsx-runtime`,replacement:r});try{let e=O(import.meta.resolve(`react/jsx-dev-runtime`));c.has(`react/jsx-dev-runtime`)||i.push({find:`react/jsx-dev-runtime`,replacement:e})}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error resolving react/jsx-dev-runtime:`,e)}c.has(`react`)||i.push({find:`react`,replacement:e}),c.has(`react-dom/client`)||i.push({find:`react-dom/client`,replacement:n}),i.length>0&&(t.resolve.alias=[...o,...i])}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error configuring React aliases:`,e)}t.environments=t.environments||{},t.environments.rsc={resolve:{conditions:[`react-server`,`node`,`import`]},...t.environments.rsc},t.environments.ssr={resolve:{conditions:[`node`,`import`]},...t.environments.ssr},t.environments.client={resolve:{conditions:[`browser`,`import`]},...t.environments.client},t.optimizeDeps=t.optimizeDeps||{},t.optimizeDeps.include=t.optimizeDeps.include||[];for(let e of[`react`,`react-dom`,`react-dom/client`,`react-dom/server`,`react/jsx-runtime`,`react/jsx-dev-runtime`])t.optimizeDeps.include.includes(e)||t.optimizeDeps.include.push(e);if(t.optimizeDeps.exclude=t.optimizeDeps.exclude||[],t.optimizeDeps.exclude.includes(`rari`)||t.optimizeDeps.exclude.push(`rari`),n===`build`)for(let e of[`rsc`,`ssr`,`client`]){let n=t.environments[e];n&&n.build&&(n.build.rolldownOptions=n.build.rolldownOptions||{})}t.server=t.server||{},t.server.proxy=t.server.proxy||{};let l=D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3);if(t.server.proxy[`/api`]={target:`http://localhost:${l}`,changeOrigin:!0,secure:!1,ws:!0},t.server.proxy[`/_rari`]={target:`http://localhost:${l}`,changeOrigin:!0,secure:!1,ws:!0},n===`build`){t.build=t.build||{},t.build.rolldownOptions=t.build.rolldownOptions||{},t.build.rolldownOptions.input||(t.build.rolldownOptions.input={main:`./index.html`}),t.build.rolldownOptions.output=t.build.rolldownOptions.output||{};let e=Array.isArray(t.build.rolldownOptions.output)?t.build.rolldownOptions.output:[t.build.rolldownOptions.output];for(let t of e){if(t.codeSplitting!==!1&&typeof t.codeSplitting!=`object`&&(t.codeSplitting={}),typeof t.codeSplitting==`object`){t.codeSplitting.groups=t.codeSplitting.groups||[];let e=t.codeSplitting.groups;t.codeSplitting.groups.push({name(t){if(t.includes(`node_modules`)){for(let n of e)if(n.test){let e=!1;if(typeof n.test==`function`?e=!!n.test(t):n.test instanceof RegExp?e=n.test.test(t):typeof n.test==`string`&&(e=t.includes(n.test)),e)return null}return t.includes(`node_modules/react-dom`)?`react-dom`:t.includes(`node_modules/react`)?`react`:`vendor`}return null}})}t.chunkFileNames||=e=>e.moduleIds?.some(e=>s(e).hasUseServer)?`client/actions/[name]-[hash].js`:e.moduleIds?.some(e=>s(e).hasUseClient)?`client/components/[name]-[hash].js`:`assets/[name]-[hash].js`}}return t.environments&&t.environments.client&&(t.environments.client.build||(t.environments.client.build={}),t.environments.client.build.rolldownOptions||(t.environments.client.build.rolldownOptions={}),t.environments.client.build.rolldownOptions.input||(t.environments.client.build.rolldownOptions.input={})),t},configResolved(e){let t=new Set([`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`react-dom/client`]);if(e.resolve?.alias){let n=e.resolve.alias;Array.isArray(n)?n.forEach(e=>{typeof e.find==`string`&&typeof e.replacement==`string`&&!t.has(e.find)&&(o[e.find]=e.replacement)}):typeof n==`object`&&Object.entries(n).forEach(([e,n])=>{typeof n==`string`&&!t.has(e)&&(o[e]=n)})}},transform(e,r){if(!g.test(r))return null;let i=this.environment;if(q(e)){t.set(r,`client`),n.add(r);let i=e.split(`
118
+ `);for(let e of i){let i=e.match(fn);if(!i)continue;let a=i[4];if(!a)continue;let o=_(a,r);w.existsSync(o)&&(t.set(o,`client`),n.add(o))}return h(e,r)}if(t.get(r)===`client`||n.has(r))return h(e,r);if(d(r)){if(t.set(r,`server`),i&&(i.name===`rsc`||i.name===`ssr`))return p(e,r);{let t=m(e,r);return t=`// HMR acceptance for server component
124
119
  if (import.meta.hot) {
125
120
  import.meta.hot.accept();
126
121
  }
@@ -131,19 +126,19 @@ if (typeof globalThis !== 'undefined') {
131
126
  globalThis['~rari'].serverComponents.add(${JSON.stringify(r)});
132
127
  }
133
128
 
134
- ${t}`,t}}if(V(e))return t.set(r,`server`),i&&(i.name===`rsc`||i.name===`ssr`)?u(e,r):d(e,r);let a=t.get(r);if(a===`server`)return i&&(i.name===`rsc`||i.name===`ssr`)?u(e,r):d(e,r);if(a===`client`)return f(e,r);t.set(r,`unknown`);let o=e.split(`
135
- `),s=e,l=!1,h=!1,g=!1,_=[];for(let a of o){let o=a.match(dn);if(!o)continue;let u=o[1],d=o[4],f=m(d),v=p(d,r),y=H(e)||t.get(r)===`client`||r.includes(`entry-client`),b=t.get(v)===`client`||S.existsSync(v)&&H(S.readFileSync(v,`utf-8`));if(b&&(t.set(v,`client`),n.add(v)),b&&i&&(i.name===`rsc`||i.name===`ssr`)){if(!y){let e=a,t=u||`default`,n=`
129
+ ${t}`,t}}if(K(e))return t.set(r,`server`),i&&(i.name===`rsc`||i.name===`ssr`)?p(e,r):m(e,r);let a=t.get(r);if(a===`server`)return i&&(i.name===`rsc`||i.name===`ssr`)?p(e,r):m(e,r);if(a===`client`)return h(e,r);t.set(r,`unknown`);let o=e.split(`
130
+ `),s=e,c=!1,l=!1,u=!1,f=[],y=q(e)||t.get(r)===`client`||r.includes(`entry-client`);for(let e of o){let a=e.match(fn);if(!a)continue;let o=a[1],p=a[4],m=v(p),h=_(p,r),g=t.get(h)===`client`||w.existsSync(h)&&q(w.readFileSync(h,`utf-8`));if(g&&(t.set(h,`client`),n.add(h)),g&&i&&(i.name===`rsc`||i.name===`ssr`)){if(!y){let t=e,n=o||`default`,r=`
136
131
  import { registerClientReference } from "react-server-dom-rari/server";
137
- const ${t} = registerClientReference(
132
+ const ${n} = registerClientReference(
138
133
  function() {
139
- throw new Error("Attempted to call ${t} from the server but it's on the client. It can only be rendered as a Component or passed to props of a Client Component.");
134
+ throw new Error("Attempted to call ${n} from the server but it's on the client. It can only be rendered as a Component or passed to props of a Client Component.");
140
135
  },
141
- ${JSON.stringify(v)},
142
- ${JSON.stringify(u||`default`)}
143
- );`;s=s.replace(e,n),l=!0,h=!0}}else if(!y&&c(v)){l=!0,h=!0,g=!0;let e=a;u&&u!==`_`&&_.push(`const ${u} = createServerComponentWrapper('${f}', '${d}');`),s=s.replace(e,``)}}if(l){let e=s.includes(`import React`)||s.match(fn)||s.match(pn),n=s.includes(`createServerComponentWrapper`),i=``;if(h&&!e&&(i+=`import React from 'react';
144
- `),g&&!n&&(i+=`import { createServerComponentWrapper } from 'virtual:rsc-integration.ts';
145
- `),_.length>0&&(i+=`${_.join(`
146
- `)}\n`),i&&(s=i+s),!s.includes(`Suspense`)){let e=s.match(mn);e&&(e[1]&&!e[2].includes(`Suspense`)?s=s.replace(e[0],e[0].replace(vn,`{ Suspense, $1 }`)):e[1]||(s=s.replace(e[0],`import React, { Suspense } from 'react';`)))}let a=T.env.NODE_ENV!==`production`,o=s.includes(`</`)||s.includes(`/>`)||_n.test(s);return!H(s)&&o&&a&&(s=`'use client';\n\n${s}`,t.set(r,`client`)),s}return null},async configureServer(n){let r=e.projectRoot||T.cwd(),s=w.join(r,`src`);await En(r,e);let l=null,u=async()=>{try{let t=new Y(r,{outDir:`dist`,rscDir:`server`,manifestPath:`server/manifest.json`,serverConfigPath:`server/config.json`,alias:o,csp:e.csp,cacheControl:e.cacheControl});if(l=t,!a&&l){let e=T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3);a=new rt(l,e)}let i=w.join(r,`src`),s=[];if(S.existsSync(i)){let e=t=>{let n=S.readdirSync(t,{withFileTypes:!0});for(let r of n){let n=w.join(t,r.name);if(r.isDirectory())e(n);else if(r.isFile()&&y.test(r.name))try{c(n)&&s.push(n)}catch(e){console.error(`[rari] Error checking ${n}:`,e)}}};e(i),X(i,t)}s.length>0&&n.ws.send({type:`custom`,event:`rari:server-components-registry`,data:{serverComponents:s}});let u=await t.getTransformedComponentsForDevelopment(),d=`http://localhost:${T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3)}`;for(let e of u)try{if(e.id.startsWith(`app/`)||V(e.code))continue;let t=await fetch(`${d}/_rari/register`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:e.id,component_code:e.code})});if(!t.ok){let e=await t.text();throw Error(`HTTP ${t.status}: ${e}`)}}catch(t){console.error(`[rari] Runtime: Failed to register component ${e.id}:`,t instanceof Error?t.message:String(t))}}catch(e){console.error(`[rari] Runtime: Component discovery failed:`,e instanceof Error?e.message:String(e))}},d=async()=>{try{let e=`http://localhost:${T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3)}`,t=Dn(s,Object.values(o));for(let n of t){let t=w.relative(T.cwd(),n),r=w.basename(n).replace(ie,``);try{await fetch(`${e}/_rari/register-client`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:r,file_path:t,export_name:`default`})})}catch(e){console.error(`[rari] Runtime: Failed to pre-register client component ${r}:`,e)}}}catch(e){console.error(`[rari] Runtime: Failed to pre-register client components:`,e)}},f=async()=>{if(i)return;let{getBinaryPath:e,getInstallationInstructions:t}=await import(`./platform.mjs`),r;try{r=e()}catch(e){console.error(`rari binary not found`),console.error(` ${e.message}`),console.error(t());return}let a=T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3),o=T.env.NODE_ENV===`production`?`production`:`development`,s=n.config.server.port||5173,c=[`--mode`,o,`--port`,a.toString(),`--host`,`127.0.0.1`];i=ue(r,c,{stdio:[`ignore`,`pipe`,`pipe`],cwd:T.cwd(),env:{...T.env,RUST_LOG:T.env.RUST_LOG||`error`,RARI_VITE_PORT:s.toString()}}),i.stdout?.on(`data`,e=>{let t=e.toString().trim();t&&console.error(`${t}`)}),i.stderr?.on(`data`,e=>{let t=e.toString().trim();t&&!t.includes(`warning`)&&console.error(`${t}`)}),i.on(`error`,e=>{h=!1,console.error(`Failed to start rari server:`,e.message),e.message.includes(`ENOENT`)&&console.error(` Binary not found. Please ensure rari is properly installed.`)}),i.on(`exit`,(e,t)=>{i=null,h=!1,t?console.error(`rari server stopped by signal ${t}`):e===0?console.error(`rari server stopped successfully`):e&&console.error(`rari server exited with code ${e}`)});let l=!1;for(let e=0;e<20&&(l=await g(),!l);e++)await new Promise(e=>setTimeout(e,500));l?(await d(),await u()):console.error(`Server failed to become ready for component registration`)},p=async t=>{try{if(!c(t))return;let n=new Y(r,{outDir:`dist`,rscDir:`server`,manifestPath:`server/manifest.json`,serverConfigPath:`server/config.json`,alias:o,csp:e.csp,cacheControl:e.cacheControl});n.addServerComponent(t);let i=await n.getTransformedComponentsForDevelopment();if(i.length===0)return;let a=`http://localhost:${T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3)}`;for(let e of i)try{let t=await fetch(`${a}/_rari/register`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:e.id,component_code:e.code})});if(!t.ok){let e=await t.text();throw Error(`HTTP ${t.status}: ${e}`)}}catch(t){console.error(`[rari] Failed to register component`,`${e.id}:`,t instanceof Error?t.message:String(t))}}catch(e){console.error(`[rari] Targeted HMR failed for`,`${t}:`,e instanceof Error?e.message:String(e)),setTimeout(u,1e3)}};f().catch(e=>{console.error(`[rari] Failed to start Rust server:`,e)}),n.middlewares.use(async(e,t,n)=>{let r=e.headers.accept;if(r&&r.includes(`text/x-component`)&&e.url&&!e.url.startsWith(`/api`)&&!e.url.startsWith(`/rsc`)&&!e.url.includes(`.`)){if(!h&&!await g()){let e=Date.now();for(;Date.now()-e<1e4&&!await g();)await new Promise(e=>setTimeout(e,100));if(!h){console.error(`[rari] Rust server not ready, cannot proxy RSC request`),t.headersSent||(t.statusCode=503,t.end(`Server not ready`));return}}let n=T.env.SERVER_PORT?Number(T.env.SERVER_PORT):Number(T.env.PORT||T.env.RSC_PORT||3e3),r=`http://localhost:${n}${e.url}`;try{let i={};for(let[t,n]of Object.entries(e.headers))typeof n==`string`?i[t]=n:Array.isArray(n)&&(i[t]=n.join(`,`));i.host=`localhost:${n}`,i[`accept-encoding`]=`identity`;let a=await fetch(r,{method:e.method,headers:i});if(t.statusCode=a.status,a.headers.forEach((e,n)=>{n.toLowerCase()!==`content-encoding`&&t.setHeader(n,e)}),a.body){let e=a.body.getReader();try{for(;;){let{done:n,value:r}=await e.read();if(n)break;t.write(le.from(r))}t.end()}catch(e){console.error(`[rari] Stream error:`,e),t.headersSent||(t.statusCode=500),t.end()}}else t.end();return}catch(e){console.error(`[rari] Failed to proxy RSC request:`,e),t.headersSent||(t.statusCode=500,t.end(`Internal Server Error`));return}}n()}),n.watcher.on(`change`,async e=>{y.test(e)&&t.delete(e),y.test(e)&&e.includes(s)&&(c(e)?(n.ws.send({type:`custom`,event:`rari:register-server-component`,data:{filePath:e}}),await p(e)):setTimeout(u,1e3))}),n.middlewares.use(`/api/vite/hmr-transform`,async(e,t)=>{if(e.method!==`POST`){t.statusCode=405,t.end(`Method Not Allowed`);return}let n=``;e.on(`data`,e=>{n+=e.toString()}),e.on(`end`,async()=>{try{let{filePath:e}=JSON.parse(n);if(!e){t.statusCode=400,t.end(JSON.stringify({error:`filePath is required`}));return}await p(e),t.statusCode=200,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({success:!0,filePath:e,message:`Component transformation completed`}))}catch(e){t.statusCode=500,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({success:!1,error:e instanceof Error?e.message:String(e)}))}})}),n.httpServer?.on(`close`,()=>{a&&=(a.dispose(),null),i&&=(i.kill(`SIGTERM`),null),h=!1})},resolveId(e,t){if(e===`virtual:rsc-integration`||e===`virtual:rsc-integration.ts`)return`virtual:rsc-integration.ts`;if(e===`virtual:rari-entry-client`||e===`virtual:rari-entry-client.ts`)return`virtual:rari-entry-client.ts`;if(e===`virtual:react-flight-client`||e===`virtual:react-flight-client.ts`)return`virtual:react-flight-client.ts`;if(e===`virtual:app-router-provider`||e===`virtual:app-router-provider.tsx`)return`virtual:app-router-provider.tsx`;if(e===`virtual:error-boundary-wrapper`||e===`virtual:error-boundary-wrapper.tsx`)return`virtual:error-boundary-wrapper.tsx`;if(e===`./DefaultLoadingIndicator`||e===`./DefaultLoadingIndicator.tsx`)return`virtual:default-loading-indicator.tsx`;if(e===`./LoadingErrorBoundary`||e===`./LoadingErrorBoundary.tsx`)return`virtual:loading-error-boundary.tsx`;if(e===`react-server-dom-rari/server`)return e;if(t&&t.startsWith(`virtual:`)&&e.startsWith(`../`)){let n=import.meta.url,r=E(n),i=w.dirname(r),a=null,o=[w.join(i,`runtime`),w.join(i,`../runtime`)];for(let e of o)if(S.existsSync(e)){a=e;break}if(a){let t=w.join(a,e);if(S.existsSync(t))return t;let n=w.join(a,`../dist`,w.basename(e));if(S.existsSync(n))return n}else console.warn(`[rari] Runtime directory not found, attempting fallback resolution for virtual import.\n Importer: ${t}\n ID: ${e}\n Current Dir: ${i}\n Hint: Runtime lookup failed, trying currentDir as fallback`);let s=w.join(i,e);if(S.existsSync(s))return s;let c=w.join(i,`../dist`,w.basename(e));if(S.existsSync(c))return c}if(T.env.NODE_ENV===`production`)try{let t=w.resolve(e);if(S.existsSync(t)&&c(t))return{id:e,external:!0}}catch(t){t?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error resolving server component:`,e,t)}return null},async load(t){if(y.test(t)){let e=this.environment;if(e&&e.name===`client`)try{let e=S.readFileSync(t,`utf-8`);if(V(e))return d(e,t)}catch{}}if(t===`virtual:rari-entry-client.ts`){let e=Dn(w.join(T.cwd(),`src`),Object.values(o)),t=new Set([...n,...e]),r=[{path:`rari/image`,exports:[`Image`]},{path:`virtual:error-boundary-wrapper.tsx`,exports:[`ErrorBoundaryWrapper`]}],i=[...t].filter(e=>{try{return H(S.readFileSync(e,`utf-8`))}catch{return!1}}).map(e=>{let t=w.relative(T.cwd(),e).replace(x,`/`),n=t.replace(y,``),r=t.startsWith(`..`)?e.replace(x,`/`):t,i=!1,a=``;try{let t=S.readFileSync(e,`utf-8`),n=W(t),r=t.match(ne);!n&&r&&(i=!0,a=r[1])}catch(t){t?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error reading component for export detection:`,e,t)}let o=i?a:w.basename(e,w.extname(e)),s=r.replace(x,`/`),c=s.startsWith(`/`)||ae.test(s)?s:`/${s}`;return` "${r}": {
136
+ ${JSON.stringify(h)},
137
+ ${JSON.stringify(o||`default`)}
138
+ );`;s=s.replace(t,r),c=!0,l=!0}}else if(!y&&d(h)){c=!0,l=!0,u=!0;let t=e;o&&o!==`_`&&f.push(`const ${o} = createServerComponentWrapper('${m}', '${p}');`),s=s.replace(t,``)}}if(c){let e=s.includes(`import React`)||s.match(pn)||s.match(mn),n=s.includes(`createServerComponentWrapper`),i=``;if(l&&!e&&(i+=`import React from 'react';
139
+ `),u&&!n&&(i+=`import { createServerComponentWrapper } from 'virtual:rsc-integration.ts';
140
+ `),f.length>0&&(i+=`${f.join(`
141
+ `)}\n`),i&&(s=i+s),!s.includes(`Suspense`)){let e=s.match(hn);e&&(e[1]&&!e[2].includes(`Suspense`)?s=s.replace(e[0],e[0].replace(yn,`{ Suspense, $1 }`)):e[1]||(s=s.replace(e[0],`import React, { Suspense } from 'react';`)))}let a=D.env.NODE_ENV!==`production`,o=s.includes(`</`)||s.includes(`/>`)||vn.test(s);return!q(s)&&o&&a&&(s=`'use client';\n\n${s}`,t.set(r,`client`)),s}return null},async configureServer(n){let r=e.projectRoot||D.cwd(),s=E.join(r,`src`);await An(r,e);let c=null,l=async()=>{try{let t=new $(r,{outDir:`dist`,rscDir:`server`,manifestPath:`server/manifest.json`,serverConfigPath:`server/config.json`,alias:o,csp:e.csp,cacheControl:e.cacheControl});if(c=t,!a&&c){let e=D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3);a=new tt(c,e)}let i=E.join(r,`src`),s=[];if(w.existsSync(i)){let e=t=>{let n=w.readdirSync(t,{withFileTypes:!0});for(let r of n){let n=E.join(t,r.name);if(r.isDirectory())e(n);else if(r.isFile()&&g.test(r.name))try{d(n)&&s.push(n)}catch(e){console.error(`[rari] Error checking ${n}:`,e)}}};e(i),Kt(i,t)}s.length>0&&n.ws.send({type:`custom`,event:`rari:server-components-registry`,data:{serverComponents:s}});let l=await t.getTransformedComponentsForDevelopment(),u=`http://localhost:${D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3)}`;for(let e of l)try{if(e.id.startsWith(`app/`)||K(e.code))continue;let t=await fetch(`${u}/_rari/register`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:e.id,component_code:e.code})});if(!t.ok){let e=await t.text();throw Error(`HTTP ${t.status}: ${e}`)}}catch(t){console.error(`[rari] Runtime: Failed to register component ${e.id}:`,t instanceof Error?t.message:String(t))}}catch(e){console.error(`[rari] Runtime: Component discovery failed:`,e instanceof Error?e.message:String(e))}},u=async()=>{try{let e=`http://localhost:${D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3)}`,t=jn(s,Object.values(o));for(let n of t){let t=E.relative(D.cwd(),n),r=E.basename(n).replace(te,``);try{await fetch(`${e}/_rari/register-client`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:r,file_path:t,export_name:`default`})})}catch(e){console.error(`[rari] Runtime: Failed to pre-register client component ${r}:`,e)}}}catch(e){console.error(`[rari] Runtime: Failed to pre-register client components:`,e)}},f=async()=>{if(i)return;let{getBinaryPath:e,getInstallationInstructions:t}=await import(`./platform.mjs`),r;try{r=e()}catch(e){console.error(`rari binary not found`),console.error(` ${e.message}`),console.error(t());return}let a=D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3),o=D.env.NODE_ENV===`production`?`production`:`development`,s=n.config.server.port||5173,c=[`--mode`,o,`--port`,a.toString(),`--host`,`127.0.0.1`];i=ae(r,c,{stdio:[`ignore`,`pipe`,`pipe`],cwd:D.cwd(),env:{...D.env,RUST_LOG:D.env.RUST_LOG||`error`,RARI_VITE_PORT:s.toString()}}),i.stdout?.on(`data`,e=>{let t=e.toString().trim();t&&console.error(`${t}`)}),i.stderr?.on(`data`,e=>{let t=e.toString().trim();t&&!t.includes(`warning`)&&console.error(`${t}`)}),i.on(`error`,e=>{b=!1,console.error(`Failed to start rari server:`,e.message),e.message.includes(`ENOENT`)&&console.error(` Binary not found. Please ensure rari is properly installed.`)}),i.on(`exit`,(e,t)=>{i=null,b=!1,t?console.error(`rari server stopped by signal ${t}`):e===0?console.error(`rari server stopped successfully`):e&&console.error(`rari server exited with code ${e}`)});let d=!1;for(let e=0;e<20&&(d=await S(),!d);e++)await new Promise(e=>setTimeout(e,500));d?(await u(),await l()):console.error(`Server failed to become ready for component registration`)},p=async t=>{try{if(!d(t))return;let n=new $(r,{outDir:`dist`,rscDir:`server`,manifestPath:`server/manifest.json`,serverConfigPath:`server/config.json`,alias:o,csp:e.csp,cacheControl:e.cacheControl});n.addServerComponent(t);let i=await n.getTransformedComponentsForDevelopment();if(i.length===0)return;let a=`http://localhost:${D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3)}`;for(let e of i)try{let t=await fetch(`${a}/_rari/register`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:e.id,component_code:e.code})});if(!t.ok){let e=await t.text();throw Error(`HTTP ${t.status}: ${e}`)}}catch(t){console.error(`[rari] Failed to register component`,`${e.id}:`,t instanceof Error?t.message:String(t))}}catch(e){console.error(`[rari] Targeted HMR failed for`,`${t}:`,e instanceof Error?e.message:String(e)),setTimeout(l,1e3)}};f().catch(e=>{console.error(`[rari] Failed to start Rust server:`,e)}),n.middlewares.use(async(e,t,n)=>{let r=e.headers.accept;if(r&&r.includes(`text/x-component`)&&e.url&&!e.url.startsWith(`/api`)&&!e.url.startsWith(`/rsc`)&&!e.url.includes(`.`)){if(!b&&!await S()){let e=Date.now();for(;Date.now()-e<1e4&&!await S();)await new Promise(e=>setTimeout(e,100));if(!b){console.error(`[rari] Rust server not ready, cannot proxy RSC request`),t.headersSent||(t.statusCode=503,t.end(`Server not ready`));return}}let n=D.env.SERVER_PORT?Number(D.env.SERVER_PORT):Number(D.env.PORT||D.env.RSC_PORT||3e3),r=`http://localhost:${n}${e.url}`;try{let i={};for(let[t,n]of Object.entries(e.headers))typeof n==`string`?i[t]=n:Array.isArray(n)&&(i[t]=n.join(`,`));i.host=`localhost:${n}`,i[`accept-encoding`]=`identity`;let a=await fetch(r,{method:e.method,headers:i});if(t.statusCode=a.status,a.headers.forEach((e,n)=>{n.toLowerCase()!==`content-encoding`&&t.setHeader(n,e)}),a.body){let e=a.body.getReader();try{for(;;){let{done:n,value:r}=await e.read();if(n)break;t.write(ie.from(r))}t.end()}catch(e){console.error(`[rari] Stream error:`,e),t.headersSent||(t.statusCode=500),t.end()}}else t.end();return}catch(e){console.error(`[rari] Failed to proxy RSC request:`,e),t.headersSent||(t.statusCode=500,t.end(`Internal Server Error`));return}}n()}),n.watcher.on(`change`,async e=>{g.test(e)&&t.delete(e),g.test(e)&&e.includes(s)&&(d(e)?(n.ws.send({type:`custom`,event:`rari:register-server-component`,data:{filePath:e}}),await p(e)):setTimeout(l,1e3))}),n.middlewares.use(`/api/vite/hmr-transform`,async(e,t)=>{if(e.method!==`POST`){t.statusCode=405,t.end(`Method Not Allowed`);return}let n=``;e.on(`data`,e=>{n+=e.toString()}),e.on(`end`,async()=>{try{let{filePath:e}=JSON.parse(n);if(!e){t.statusCode=400,t.end(JSON.stringify({error:`filePath is required`}));return}await p(e),t.statusCode=200,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({success:!0,filePath:e,message:`Component transformation completed`}))}catch(e){t.statusCode=500,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({success:!1,error:e instanceof Error?e.message:String(e)}))}})}),n.httpServer?.on(`close`,()=>{a&&=(a.dispose(),null),i&&=(i.kill(`SIGTERM`),null),b=!1})},resolveId(e,t){if(e===`virtual:rsc-integration`||e===`virtual:rsc-integration.ts`)return`virtual:rsc-integration.ts`;if(e===`virtual:rari-entry-client`||e===`virtual:rari-entry-client.ts`)return`virtual:rari-entry-client.ts`;if(e===`virtual:react-flight-client`||e===`virtual:react-flight-client.ts`)return`virtual:react-flight-client.ts`;if(e===`virtual:app-router-provider`||e===`virtual:app-router-provider.tsx`)return`virtual:app-router-provider.tsx`;if(e===`virtual:error-boundary-wrapper`||e===`virtual:error-boundary-wrapper.tsx`)return`virtual:error-boundary-wrapper.tsx`;if(e===`./LoadingErrorBoundary`||e===`./LoadingErrorBoundary.tsx`)return`virtual:loading-error-boundary.tsx`;if(e===`react-server-dom-rari/server`)return e;if(t&&t.startsWith(`virtual:`)&&e.startsWith(`../`)){let n=import.meta.url,r=O(n),i=E.dirname(r),a=null,o=[E.join(i,`runtime`),E.join(i,`../runtime`)];for(let e of o)if(w.existsSync(e)){a=e;break}if(a){let t=E.join(a,e);if(w.existsSync(t))return t;let n=E.join(a,`../dist`,E.basename(e));if(w.existsSync(n))return n}else console.warn(`[rari] Runtime directory not found, attempting fallback resolution for virtual import.\n Importer: ${t}\n ID: ${e}\n Current Dir: ${i}\n Hint: Runtime lookup failed, trying currentDir as fallback`);let s=E.join(i,e);if(w.existsSync(s))return s;let c=E.join(i,`../dist`,E.basename(e));if(w.existsSync(c))return c}if(D.env.NODE_ENV===`production`)try{let t=E.resolve(e);if(w.existsSync(t)&&d(t))return{id:e,external:!0}}catch(t){t?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error resolving server component:`,e,t)}return null},async load(t){if(g.test(t)){let e=this.environment;if(e&&e.name===`client`)try{let e=w.readFileSync(t,`utf-8`);if(K(e))return m(e,t)}catch{}}if(t===`virtual:rari-entry-client.ts`){let e=jn(E.join(D.cwd(),`src`),Object.values(o)),t=new Set([...n,...e]),r=[{path:`rari/image`,exports:[`Image`]},{path:`virtual:error-boundary-wrapper.tsx`,exports:[`ErrorBoundaryWrapper`]}],i=[...t].filter(e=>{try{return q(w.readFileSync(e,`utf-8`))}catch{return!1}}).map(e=>{let t=E.relative(D.cwd(),e).replace(x,`/`),n=t.replace(g,``),r=t.startsWith(`..`)?e.replace(x,`/`):t,i=!1,a=``;try{let t=w.readFileSync(e,`utf-8`),n=Y(t),r=t.match(ee);!n&&r&&(i=!0,a=r[1])}catch(t){t?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error reading component for export detection:`,e,t)}let o=i?a:E.basename(e,E.extname(e)),s=r.replace(x,`/`),c=s.startsWith(`/`)||ne.test(s)?s:`/${s}`;return` "${r}": {
147
142
  id: "${n}",
148
143
  path: "${r}",
149
144
  exportName: "${o}",
@@ -167,7 +162,7 @@ globalThis['~clientComponents']["${e.path}"] = globalThis['~clientComponents']["
167
162
  globalThis['~clientComponents']["${e.path}"].component = ExternalModule${t};
168
163
  globalThis['~clientComponentPaths'] = globalThis['~clientComponentPaths'] || {};
169
164
  globalThis['~clientComponentPaths']["${e.path}"] = "${n}";`)).join(`
170
- `);return await wn(a,[`
165
+ `);return await On(a,[`
171
166
  const lazyComponentRegistry = {
172
167
  ${i}
173
168
  };
@@ -180,79 +175,6 @@ for (const [path, config] of Object.entries(lazyComponentRegistry)) {
180
175
  globalThis['~clientComponentPaths'][path] = config.id;
181
176
  }
182
177
  `,s].filter(Boolean).join(`
183
- `))}if(t===`react-server-dom-rari/server`)return await Tn();if(t===`virtual:app-router-provider.tsx`){let e=$(`AppRouterProvider.mjs`);return e?S.readFileSync(e,`utf-8`):`export function AppRouterProvider({ children }) { return children; }`}if(t===`virtual:default-loading-indicator.tsx`){let e=$(`DefaultLoadingIndicator.mjs`);return e?S.readFileSync(e,`utf-8`):`export function DefaultLoadingIndicator() { return null; }`}if(t===`virtual:loading-error-boundary.tsx`){let e=$(`LoadingErrorBoundary.mjs`);return e?S.readFileSync(e,`utf-8`):`import * as React from 'react';
184
- export class LoadingErrorBoundary extends React.Component { render() { return this.props.children; } }`}if(t===`virtual:error-boundary-wrapper.tsx`){let e=$(`ErrorBoundaryWrapper.mjs`);if(e){let t=S.readFileSync(e,`utf-8`);if(!t.includes(`import React`)&&!t.includes(`from "react"`)&&!t.includes(`from 'react'`)){let e=t.match(yn);if(e){let n=e[0];return`
178
+ `))}if(t===`react-server-dom-rari/server`)return await kn();if(t===`virtual:app-router-provider.tsx`){let e=Tn(`AppRouterProvider.mjs`);if(e)return w.readFileSync(e,`utf-8`);throw Error(Jt)}if(t===`virtual:loading-error-boundary.tsx`){let e=Tn(`LoadingErrorBoundary.mjs`);if(e)return w.readFileSync(e,`utf-8`);throw Error(Jt)}if(t===`virtual:error-boundary-wrapper.tsx`){let e=Tn(`ErrorBoundaryWrapper.mjs`);if(e){let t=w.readFileSync(e,`utf-8`);if(!t.includes(`import React`)&&!t.includes(`from "react"`)&&!t.includes(`from 'react'`)){let e=t.match(bn);if(e){let n=e[0];return`
185
179
  ${n}import * as React from 'react';\n${t.slice(n.length)}`}return`
186
- import * as React from 'react';\n${t}`}return t}return`'use client';
187
- import * as React from 'react';
188
- export class ErrorBoundaryWrapper extends React.Component {
189
- constructor(props) {
190
- super(props);
191
- this.state = { hasError: false, error: null, ErrorComponent: null };
192
- this._isMounted = false;
193
- }
194
-
195
- componentDidMount() {
196
- this._isMounted = true;
197
- }
198
-
199
- componentWillUnmount() {
200
- this._isMounted = false;
201
- }
202
-
203
- static getDerivedStateFromError(error) {
204
- return { hasError: true, error };
205
- }
206
-
207
- componentDidCatch(error, errorInfo) {
208
- console.error('[rari] Error boundary caught error:', error, errorInfo);
209
-
210
- const errorComponentId = this.props.errorComponentId;
211
- if (errorComponentId && typeof window !== 'undefined') {
212
- const globalThis = window;
213
- const componentInfo = globalThis['~clientComponents']?.[errorComponentId];
214
-
215
- if (componentInfo) {
216
- if (componentInfo.component && typeof componentInfo.component === 'function') {
217
- if (this._isMounted) {
218
- this.setState({ ErrorComponent: componentInfo.component });
219
- }
220
- } else if (componentInfo.loader && !componentInfo.loading) {
221
- componentInfo.loading = true;
222
- componentInfo.loader()
223
- .then((module) => {
224
- const component = module.default || module;
225
- componentInfo.component = component;
226
- componentInfo.registered = true;
227
- componentInfo.loading = false;
228
- if (this._isMounted) {
229
- this.setState({ ErrorComponent: component });
230
- }
231
- })
232
- .catch((loadError) => {
233
- componentInfo.loading = false;
234
- console.error('[rari] Failed to load error component ' + errorComponentId + ':', loadError);
235
- });
236
- }
237
- }
238
- }
239
- }
240
-
241
- reset = () => {
242
- this.setState({ hasError: false, error: null, ErrorComponent: null });
243
- }
244
-
245
- render() {
246
- if (this.state.hasError && this.state.error) {
247
- const ErrorComponent = this.state.ErrorComponent;
248
- if (ErrorComponent) {
249
- return React.createElement(ErrorComponent, { error: this.state.error, reset: this.reset });
250
- }
251
- return React.createElement('div', { style: { padding: '20px', background: '#fee', border: '2px solid #f00' } },
252
- React.createElement('h2', null, 'Error'),
253
- React.createElement('p', null, 'Something went wrong.')
254
- );
255
- }
256
- return this.props.children;
257
- }
258
- }`}if(t===`virtual:rsc-integration.ts`)return(await Cn()).replace(gn,(e,t,n)=>`from${t}${n}virtual:react-flight-client.ts${n}`);if(t===`virtual:react-flight-client.ts`)return{code:`export * from 'rari/runtime/vendor/react-flight-client'`};if(t.endsWith(`.mjs`)&&S.existsSync(t))try{let n=e.projectRoot||T.cwd(),r=S.realpathSync(t),i=w.relative(n,r),a=!i.startsWith(`..`)&&!w.isAbsolute(i),o=r.includes(`${w.sep}node_modules${w.sep}`),s=r.includes(`${w.sep}packages${w.sep}rari${w.sep}`)||r.includes(`${w.sep}node_modules${w.sep}rari${w.sep}`);return a||o||s?S.readFileSync(t,`utf-8`):(console.warn(`[rari] Refusing to load .mjs file outside project root and node_modules: ${t}`),null)}catch(e){return console.warn(`[rari] Error validating .mjs file path: ${t}`,e),null}},async handleHotUpdate({file:e,server:t}){if(!y.test(e))return;if(e.includes(`/dist/`)||e.includes(`\\dist\\`))return[];let n=a?.detectComponentType(e)||`unknown`,r=e.includes(`/app/`)||e.includes(`\\app\\`),i=e.endsWith(`page.tsx`)||e.endsWith(`page.jsx`),o=e.endsWith(`layout.tsx`)||e.endsWith(`layout.jsx`),s=e.endsWith(`loading.tsx`)||e.endsWith(`loading.jsx`),c=e.endsWith(`error.tsx`)||e.endsWith(`error.jsx`),l=e.endsWith(`not-found.tsx`)||e.endsWith(`not-found.jsx`);if(!(r&&(i||o||s||c||l))&&n!==`client`&&n===`server`)return a&&await a.handleServerComponentUpdate(e,t),[]},transformIndexHtml:{order:`pre`,handler(e){let t=[];for(let n of e.matchAll(hn)){let e=n[1];e.startsWith(`/src/`)&&t.push(e)}let n=[];n.push({tag:`script`,attrs:{type:`module`},children:`import 'virtual:rari-entry-client';`,injectTo:`head-prepend`}),t.length>0&&n.push(...t.map(e=>({tag:`script`,attrs:{type:`module`,src:e},injectTo:`head-prepend`})));let r=e;r=r.replace(/^\s*import\s+["']\/src\/[^"']+["'];?\s*$/gm,``),r=r.replace(/^\s*import\s+["']virtual:rari-entry-client["'];?\s*$/gm,``);let i;do i=r,r=r.replace(/<script\s+type=["']module["'][^>]*>\s*<\/script>/gi,``);while(r!==i);return{html:r,tags:n}}},async writeBundle(){await En(e.projectRoot||T.cwd(),e)}},qt({...e.serverBuild,csp:e.csp,cacheControl:e.cacheControl})];return e.proxy!==!1&&_.push(fe(e.proxy||{})),e.router!==!1&&_.push(Pe(e.router||{})),_}function An(e){return{plugins:[kn(),...e.plugins||[]],...e}}var jn=class extends Response{static json(e,t){let n=new Headers(t?.headers);return n.has(`content-type`)||n.set(`content-type`,`application/json`),new Response(JSON.stringify(e),{...t,headers:n})}static redirect(e,t=307){return new Response(null,{status:t,headers:{location:e}})}static noContent(e){return new Response(null,{...e,status:204})}};function Mn(e){return kn(e)}export{jn as ApiResponse,c as HttpRuntimeClient,e as RariRequest,t as RariResponse,i as clearPropsCache,a as clearPropsCacheForComponent,r as createHttpRuntimeClient,An as defineRariConfig,On as defineRariOptions,u as extractMetadata,l as extractServerProps,s as extractServerPropsWithCache,o as extractStaticParams,Ce as generateAppRouteManifest,n as hasServerSideDataFetching,Mn as rari,fe as rariProxy,Pe as rariRouter};
180
+ import * as React from 'react';\n${t}`}return t}throw Error(Jt)}if(t===`virtual:rsc-integration.ts`)return(await Dn()).replace(_n,(e,t,n)=>`from${t}${n}virtual:react-flight-client.ts${n}`);if(t===`virtual:react-flight-client.ts`)return{code:`export * from 'rari/runtime/vendor/react-flight-client'`};if(t.endsWith(`.mjs`)&&w.existsSync(t))try{let n=e.projectRoot||D.cwd(),r=w.realpathSync(t),i=E.relative(n,r),a=!i.startsWith(`..`)&&!E.isAbsolute(i),o=r.includes(`${E.sep}node_modules${E.sep}`),s=r.includes(`${E.sep}packages${E.sep}rari${E.sep}`)||r.includes(`${E.sep}node_modules${E.sep}rari${E.sep}`);return a||o||s?w.readFileSync(t,`utf-8`):(console.warn(`[rari] Refusing to load .mjs file outside project root and node_modules: ${t}`),null)}catch(e){return console.warn(`[rari] Error validating .mjs file path: ${t}`,e),null}},async handleHotUpdate({file:e,server:t}){if(!g.test(e))return;if(e.includes(`/dist/`)||e.includes(`\\dist\\`))return[];let n=a?.detectComponentType(e)||`unknown`,r=e.includes(`/app/`)||e.includes(`\\app\\`),i=(e,t)=>e.endsWith(`${t}.tsx`)||e.endsWith(`${t}.jsx`)||e.endsWith(`${t}.ts`)||e.endsWith(`${t}.js`),o=[`page`,`layout`,`template`,`loading`,`error`,`not-found`].some(t=>i(e,t));if(!(r&&o)&&n!==`client`&&n===`server`)return a&&await a.handleServerComponentUpdate(e,t),[]},transformIndexHtml:{order:`pre`,handler(e){let t=[];for(let n of e.matchAll(gn)){let e=n[1];e.startsWith(`/src/`)&&t.push(e)}let n=[];n.push({tag:`script`,attrs:{type:`module`},children:`import 'virtual:rari-entry-client';`,injectTo:`head-prepend`}),t.length>0&&n.push(...t.map(e=>({tag:`script`,attrs:{type:`module`,src:e},injectTo:`head-prepend`})));let r=e;r=r.replace(/^\s*import\s+["']\/src\/[^"']+["'];?\s*$/gm,``),r=r.replace(/^\s*import\s+["']virtual:rari-entry-client["'];?\s*$/gm,``);let i;do i=r,r=r.replace(/<script\s+type=["']module["'][^>]*>\s*<\/script>/gi,``);while(r!==i);return{html:r,tags:n}}},async writeBundle(){await An(e.projectRoot||D.cwd(),e)}},qt({...e.serverBuild,csp:e.csp,cacheControl:e.cacheControl})];return e.proxy!==!1&&C.push(se(e.proxy||{})),e.router!==!1&&C.push(je(e.router||{})),C}function Pn(e){return{plugins:[Nn(),...e.plugins||[]],...e}}var Fn=class extends Response{static json(e,t){let n=new Headers(t?.headers);return n.has(`content-type`)||n.set(`content-type`,`application/json`),new Response(JSON.stringify(e),{...t,headers:n})}static redirect(e,t=307){return new Response(null,{status:t,headers:{location:e}})}static noContent(e){return new Response(null,{...e,status:204})}},In=class{baseUrl;timeout;components=[];initialized=!1;constructor(e={}){let{host:t=`127.0.0.1`,port:n=3e3,timeout:r=3e4,ssl:i=!1}=e,a=i?`https`:`http`;this.baseUrl=`${a}://${t}:${n}`,this.timeout=r}assertInitialized(){if(!this.initialized)throw Error(`Runtime client not initialized. Call initialize() first.`)}async request(e,t={}){let{method:n=`GET`,body:r,headers:i={}}=t,a=`${this.baseUrl}${e}`,o={method:n,headers:{"Content-Type":`application/json`,...i},signal:AbortSignal.timeout(this.timeout)};r&&(n===`POST`||n===`PUT`)&&(o.body=JSON.stringify(r));try{let e=await fetch(a,o);return await X(e),e.headers.get(`content-type`)?.includes(`application/json`)?await e.json():await e.text()}catch(e){if(e instanceof Error){if(e.name===`AbortError`)throw Error(`Request timeout after ${this.timeout}ms`);if(e.message.includes(`ECONNREFUSED`))throw Error(`Failed to connect to rari server at ${this.baseUrl}. Make sure the server is running.`)}throw e}}async initialize(){try{let e=await this.request(`/_rari/health`);if(e.status!==`healthy`)throw Error(`Server is not healthy: ${e.status}`);this.initialized=!0}catch(e){throw Error(`Failed to initialize runtime client: ${e}`)}}async registerComponent(e,t){this.assertInitialized();let n={component_id:e,component_code:t};try{let t=await this.request(`/_rari/register`,{method:`POST`,body:n});if(!t.success)throw Error(`Failed to register component: ${t.error||`Unknown error`}`);this.components.includes(e)||this.components.push(e)}catch(t){throw Error(`Failed to register component ${e}: ${t}`)}}async renderToStreamCallbacks(e,t){this.assertInitialized();let n={component_id:e,props:t?JSON.parse(t):void 0};try{let e=await fetch(`${this.baseUrl}/_rari/stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n),signal:AbortSignal.timeout(this.timeout)});return await X(e),e.body}catch(t){throw Error(`Failed to stream component ${e}: ${t}`)}}registerClientComponent(e,t,n){this.queueClientComponentRegistration(e,t,n)}async queueClientComponentRegistration(e,t,n){if(!this.initialized){console.error(`[rari] Runtime: Client not initialized. Registration for "${e}" dropped.`);return}let r={component_id:e,file_path:t,export_name:n};try{let e=await this.request(`/_rari/register-client`,{method:`POST`,body:r});if(!e.success)throw Error(`Failed to register client component: ${e.error||`Unknown error`}`)}catch(t){console.error(`[rari] Runtime: Failed to register client component ${e}:`,t)}}registerClientReference(e,t,n){this.queueClientComponentRegistration(e,t,n)}listComponents(){return[...this.components]}async shutdown(){this.initialized=!1,this.components=[]}async checkHealth(){return this.assertInitialized(),await this.request(`/_rari/health`)}isInitialized(){return this.initialized}getBaseUrl(){return this.baseUrl}};function Ln(e){return new In(e)}function Rn(e){return Nn(e)}export{Fn as ApiResponse,In as HttpRuntimeClient,e as RariRequest,t as RariResponse,c as clearPropsCache,i as clearPropsCacheForComponent,Ln as createHttpRuntimeClient,Pn as defineRariConfig,Mn as defineRariOptions,o as extractMetadata,r as extractServerProps,n as extractServerPropsWithCache,a as extractStaticParams,ve as generateAppRouteManifest,s as hasServerSideDataFetching,Rn as rari,se as rariProxy,je as rariRouter};