@devlusoft/devix 0.5.2 → 0.5.3
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/cli/dev-server.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/utils/banner.js +1 -1
- package/package.json +3 -3
package/dist/cli/dev-server.js
CHANGED
|
@@ -266,7 +266,7 @@ export type PageParams = NonNullable<Parameters<typeof loader>[0]>["params"]
|
|
|
266
266
|
`:`// auto-generado por devix - no editar
|
|
267
267
|
export type PageData = undefined
|
|
268
268
|
export type PageParams = Record<string, string>
|
|
269
|
-
`}function j(e,t){let r=w(t,e),n=re(r,"utf-8"),o=Be(n,r),s=[];o.exists&&!o.isAsync&&!o.isReExport&&s.push(`[devix] ${e}: 'loader' must be async. Use 'export async function loader' or 'export const loader = async (...) => ...'.`);let a=w(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),f=w(a,"$types.d.ts"),m=r.replace(/\.(tsx?|jsx?)$/,""),l=oe(a,m).replace(/\\/g,"/"),p=Ve(l,o.exists);return ne(f)&&re(f,"utf-8")===p?{warnings:s}:(je(a,{recursive:!0}),ke(f,p,"utf-8"),{warnings:s})}function ie(e,t){let r=w(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),n=w(r,"$types.d.ts");ne(n)&&Fe(n)}function U(e,t){let r=w(t,e,"pages"),n=[],o;try{o=se(r,t)}catch{return{warnings:n}}for(let s of o)try{let a=j(s,t);n.push(...a.warnings)}catch{}return{warnings:n}}var C=Ge(Je(import.meta.url)),F="virtual:devix/entry-client",N="virtual:devix/client-routes",$="virtual:devix/render",D="virtual:devix/api",k="virtual:devix/context",H="virtual:devix/server-entry",ae=new Set(["loader","guard","generateStaticParams","headers"]);function ce(e){let t=e.appDir??"app",r=`${t}/pages`,n=(e.css??[]).map(c=>c.startsWith("/")?c:`/${c.replace(/^\.\//,"")}`),o=g(C,"../server/render.js").replace(/\\/g,"/"),s=g(C,"../server/api.js").replace(/\\/g,"/"),a=g(C,"../runtime/client-router.js").replace(/\\/g,"/"),f=g(C,"../server/routes.js").replace(/\\/g,"/"),m=g(C,"../utils/env.js").replace(/\\/g,"/"),l=Ye(import.meta.url),p=l.resolve("@hono/node-server").replace(/\\/g,"/"),Ee=l.resolve("@hono/node-server/serve-static").replace(/\\/g,"/"),we=l.resolve("hono").replace(/\\/g,"/"),_e={name:"devix",enforce:"pre",resolveId(c){if(c===F)return`\0${F}`;if(c===N)return`\0${N}`;if(c===$)return`\0${$}`;if(c===D)return`\0${D}`;if(c===k)return`\0${k}`;if(c===H)return`\0${H}`},load(c){if(c===`\0${F}`)return q({cssUrls:n});if(c===`\0${N}`)return W({pagesDir:r,matcherPath:a});if(c===`\0${$}`)return J({pagesDir:r,renderPath:o});if(c===`\0${D}`)return G({apiPath:s,appDir:t});if(c===`\0${k}`)return X();if(c===`\0${H}`)return te({routesPath:f,envPath:m,honoServerPath:p,honoServerStaticPath:Ee,honoPath:we})},transform(c,u,T){if(T?.ssr)return;let E=g(process.cwd(),r);if(!u.startsWith(E))return;let S=ze(u,c,{sourceType:"module"}),R=[];for(let d of S.program.body){if(d.type!=="ExportNamedDeclaration"||!d.declaration)continue;let i=d.declaration;if(i.type==="FunctionDeclaration"&&i.id&&ae.has(i.id.name)&&R.push({start:d.start,end:d.end,name:i.id.name}),i.type==="VariableDeclaration"){let x=new Set;for(let b of i.declarations)b.id.type==="Identifier"&&ae.has(b.id.name)&&(x.has(d.start)||(x.add(d.start),R.push({start:d.start,end:d.end,name:b.id.name})))}}if(R.length===0)return;R.sort((d,i)=>i.start-d.start);let h=c;for(let{start:d,end:i,name:x}of R)h=h.slice(0,d)+`export const ${x} = undefined`+h.slice(i);return{code:h,map:null}},buildStart(){let c=process.cwd(),u=L(t,c);M(I(u,`${t}/api`),c);let{warnings:T}=U(t,c);for(let E of T)console.warn(E)},configureServer(c){let u=process.cwd(),T=U(t,u);for(let i of T.warnings)console.warn(i);let E=()=>{let i=L(t,u);M(I(i,`${t}/api`),u)},S=i=>i.startsWith(g(u,r))&&!i.endsWith("layout.tsx")&&!i.endsWith("error.tsx"),R=i=>Xe(u,i).replace(/\\/g,"/"),h=i=>{let x=c.moduleGraph.getModuleById(`\0${i}`);x&&c.moduleGraph.invalidateModule(x)};c.watcher.add(g(u,"devix.config.ts")),c.watcher.on("change",i=>{i===g(u,"devix.config.ts")&&(console.log("[devix] Config changed, restarting..."),process.exit(75))});let d=i=>{try{let{warnings:x}=j(R(i),u);for(let b of x)console.warn(b)}catch{}};c.watcher.on("add",i=>{i.startsWith(g(u,r))&&h($),S(i)&&d(i),i.includes(`${t}/api`)&&(h(D),E())}),c.watcher.on("unlink",i=>{i.startsWith(g(u,r))&&h($),S(i)&&ie(R(i),u),i.includes(`${t}/api`)&&(h(D),E())}),c.watcher.on("change",i=>{S(i)&&d(i),i.includes(`${t}/api`)&&!i.endsWith("middleware.ts")&&E()})}},Pe={plugins:[We(),_e],publicDir:g(process.cwd(),e.publicDir??"public"),ssr:{noExternal:["@devlusoft/devix"]},...e.envPrefix?{envPrefix:e.envPrefix}:{}};return qe(Pe,e.vite??{})}function A(e){let t={statusCode:e.statusCode,message:e.message};return e.code!==void 0&&(t.code=e.code),e.data!==void 0&&(t.data=e.data),t}function Ke(e,t){return Ze(t).test(e)}function B(e,t){if(!t||t.length===0)return!1;for(let r of t)if(Ke(e,r))return!0;return!1}function Ze(e){let t="",r=0;for(;r<e.length;){let n=e[r];if(n==="*"&&e[r+1]==="*")t+=".*",r+=2;else if(n==="*")t+="[^/]*",r+=1;else if(n===":"){for(r+=1;r<e.length&&/[a-zA-Z0-9_]/.test(e[r]);)r+=1;t+="[^/]+"}else".+?^$()|[]{}\\".includes(n)?(t+="\\"+n,r+=1):(t+=n,r+=1)}return new RegExp(`^${t}$`)}var le="/_devix/server";function P(e,t,r){let n=A({statusCode:e,message:t,code:r});return new Response(JSON.stringify(n),{status:e,headers:{"Content-Type":"application/json"}})}function Qe(e){if(!e.startsWith(le+"/"))return null;let t=e.slice(le.length+1),r=t.indexOf("/");return r===-1?{namespace:t,path:"/"}:{namespace:t.slice(0,r),path:t.slice(r)}}async function ue(e,t){let r=new URL(e.url),n=Qe(r.pathname);if(!n)return P(404,"Not found","PROXY_NOT_FOUND");let o=t?.[n.namespace];if(!o)return P(404,`Backend "${n.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!B(n.path,o.allowedPaths))return P(403,"Path not allowed","PATH_NOT_ALLOWED");if(B(n.path,o.deniedPaths))return P(403,"Path denied","PATH_DENIED");let s=new URL(n.path+r.search,o.url),a=new Headers;if(o.prepare){let l={request:e,headers:a,url:s};try{let p=await o.prepare(l);if(p instanceof Response)return p}catch(p){return console.error(`[devix] server.${n.namespace}.prepare error:`,p),P(500,"Proxy prepare failed","PREPARE_ERROR")}}if(!a.has("Accept")){let l=e.headers.get("Accept");l&&a.set("Accept",l)}let f=e.headers.get("Content-Type");f&&!a.has("Content-Type")&&a.set("Content-Type",f);let m=null;e.method!=="GET"&&e.method!=="HEAD"&&(m=await e.arrayBuffer(),m.byteLength===0&&(m=null));try{let l=await fetch(s,{method:e.method,headers:a,body:m,redirect:"manual"});return new Response(l.body,{status:l.status,statusText:l.statusText,headers:tt(l.headers)})}catch(l){return console.error(`[devix] server.${n.namespace} fetch error:`,l),P(502,"Bad Gateway","BACKEND_UNREACHABLE")}}var et=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailers","transfer-encoding","upgrade"]);function tt(e){let t=new Headers;return e.forEach((r,n)=>{et.has(n.toLowerCase())||t.set(n,r)}),t}function de(e,{apiModule:t,renderModule:r,loaderTimeout:n,server:o}){o&&e.all("/_devix/server/*",async s=>{try{return await ue(s.req.raw,o)}catch(a){return console.error("[devix] proxy fatal error:",a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.all("/api/*",async s=>{try{return await t.handleApiRequest(s.req.url,s.req.raw,o)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.get("/_data/*",async s=>{try{let{pathname:a,search:f}=new URL(s.req.url,"http://localhost"),m=a.replace(/^\/_data/,"")+f,l=await r.runLoader(m,s.req.raw,{loaderTimeout:n,server:o});if(l.error)return s.json({statusCode:500,message:"Internal Server Error"},500);if("loaderError"in l){let p=A(l.loaderError);return s.json(p,p.statusCode)}return s.json(l)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}})}import y from"picocolors";import{networkInterfaces as rt}from"node:os";function nt(e){let t=rt();for(let r of Object.values(t))for(let n of r??[])if(n.family==="IPv4"&&!n.internal)return`http://${n.address}:${e}/`;return null}function pe(e){let t="0.5.
|
|
269
|
+
`}function j(e,t){let r=w(t,e),n=re(r,"utf-8"),o=Be(n,r),s=[];o.exists&&!o.isAsync&&!o.isReExport&&s.push(`[devix] ${e}: 'loader' must be async. Use 'export async function loader' or 'export const loader = async (...) => ...'.`);let a=w(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),f=w(a,"$types.d.ts"),m=r.replace(/\.(tsx?|jsx?)$/,""),l=oe(a,m).replace(/\\/g,"/"),p=Ve(l,o.exists);return ne(f)&&re(f,"utf-8")===p?{warnings:s}:(je(a,{recursive:!0}),ke(f,p,"utf-8"),{warnings:s})}function ie(e,t){let r=w(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),n=w(r,"$types.d.ts");ne(n)&&Fe(n)}function U(e,t){let r=w(t,e,"pages"),n=[],o;try{o=se(r,t)}catch{return{warnings:n}}for(let s of o)try{let a=j(s,t);n.push(...a.warnings)}catch{}return{warnings:n}}var C=Ge(Je(import.meta.url)),F="virtual:devix/entry-client",N="virtual:devix/client-routes",$="virtual:devix/render",D="virtual:devix/api",k="virtual:devix/context",H="virtual:devix/server-entry",ae=new Set(["loader","guard","generateStaticParams","headers"]);function ce(e){let t=e.appDir??"app",r=`${t}/pages`,n=(e.css??[]).map(c=>c.startsWith("/")?c:`/${c.replace(/^\.\//,"")}`),o=g(C,"../server/render.js").replace(/\\/g,"/"),s=g(C,"../server/api.js").replace(/\\/g,"/"),a=g(C,"../runtime/client-router.js").replace(/\\/g,"/"),f=g(C,"../server/routes.js").replace(/\\/g,"/"),m=g(C,"../utils/env.js").replace(/\\/g,"/"),l=Ye(import.meta.url),p=l.resolve("@hono/node-server").replace(/\\/g,"/"),Ee=l.resolve("@hono/node-server/serve-static").replace(/\\/g,"/"),we=l.resolve("hono").replace(/\\/g,"/"),_e={name:"devix",enforce:"pre",resolveId(c){if(c===F)return`\0${F}`;if(c===N)return`\0${N}`;if(c===$)return`\0${$}`;if(c===D)return`\0${D}`;if(c===k)return`\0${k}`;if(c===H)return`\0${H}`},load(c){if(c===`\0${F}`)return q({cssUrls:n});if(c===`\0${N}`)return W({pagesDir:r,matcherPath:a});if(c===`\0${$}`)return J({pagesDir:r,renderPath:o});if(c===`\0${D}`)return G({apiPath:s,appDir:t});if(c===`\0${k}`)return X();if(c===`\0${H}`)return te({routesPath:f,envPath:m,honoServerPath:p,honoServerStaticPath:Ee,honoPath:we})},transform(c,u,T){if(T?.ssr)return;let E=g(process.cwd(),r);if(!u.startsWith(E))return;let S=ze(u,c,{sourceType:"module"}),R=[];for(let d of S.program.body){if(d.type!=="ExportNamedDeclaration"||!d.declaration)continue;let i=d.declaration;if(i.type==="FunctionDeclaration"&&i.id&&ae.has(i.id.name)&&R.push({start:d.start,end:d.end,name:i.id.name}),i.type==="VariableDeclaration"){let x=new Set;for(let b of i.declarations)b.id.type==="Identifier"&&ae.has(b.id.name)&&(x.has(d.start)||(x.add(d.start),R.push({start:d.start,end:d.end,name:b.id.name})))}}if(R.length===0)return;R.sort((d,i)=>i.start-d.start);let h=c;for(let{start:d,end:i,name:x}of R)h=h.slice(0,d)+`export const ${x} = undefined`+h.slice(i);return{code:h,map:null}},buildStart(){let c=process.cwd(),u=L(t,c);M(I(u,`${t}/api`),c);let{warnings:T}=U(t,c);for(let E of T)console.warn(E)},configureServer(c){let u=process.cwd(),T=U(t,u);for(let i of T.warnings)console.warn(i);let E=()=>{let i=L(t,u);M(I(i,`${t}/api`),u)},S=i=>i.startsWith(g(u,r))&&!i.endsWith("layout.tsx")&&!i.endsWith("error.tsx"),R=i=>Xe(u,i).replace(/\\/g,"/"),h=i=>{let x=c.moduleGraph.getModuleById(`\0${i}`);x&&c.moduleGraph.invalidateModule(x)};c.watcher.add(g(u,"devix.config.ts")),c.watcher.on("change",i=>{i===g(u,"devix.config.ts")&&(console.log("[devix] Config changed, restarting..."),process.exit(75))});let d=i=>{try{let{warnings:x}=j(R(i),u);for(let b of x)console.warn(b)}catch{}};c.watcher.on("add",i=>{i.startsWith(g(u,r))&&h($),S(i)&&d(i),i.includes(`${t}/api`)&&(h(D),E())}),c.watcher.on("unlink",i=>{i.startsWith(g(u,r))&&h($),S(i)&&ie(R(i),u),i.includes(`${t}/api`)&&(h(D),E())}),c.watcher.on("change",i=>{S(i)&&d(i),i.includes(`${t}/api`)&&!i.endsWith("middleware.ts")&&E()})}},Pe={plugins:[We(),_e],publicDir:g(process.cwd(),e.publicDir??"public"),ssr:{noExternal:["@devlusoft/devix"]},...e.envPrefix?{envPrefix:e.envPrefix}:{}};return qe(Pe,e.vite??{})}function A(e){let t={statusCode:e.statusCode,message:e.message};return e.code!==void 0&&(t.code=e.code),e.data!==void 0&&(t.data=e.data),t}function Ke(e,t){return Ze(t).test(e)}function B(e,t){if(!t||t.length===0)return!1;for(let r of t)if(Ke(e,r))return!0;return!1}function Ze(e){let t="",r=0;for(;r<e.length;){let n=e[r];if(n==="*"&&e[r+1]==="*")t+=".*",r+=2;else if(n==="*")t+="[^/]*",r+=1;else if(n===":"){for(r+=1;r<e.length&&/[a-zA-Z0-9_]/.test(e[r]);)r+=1;t+="[^/]+"}else".+?^$()|[]{}\\".includes(n)?(t+="\\"+n,r+=1):(t+=n,r+=1)}return new RegExp(`^${t}$`)}var le="/_devix/server";function P(e,t,r){let n=A({statusCode:e,message:t,code:r});return new Response(JSON.stringify(n),{status:e,headers:{"Content-Type":"application/json"}})}function Qe(e){if(!e.startsWith(le+"/"))return null;let t=e.slice(le.length+1),r=t.indexOf("/");return r===-1?{namespace:t,path:"/"}:{namespace:t.slice(0,r),path:t.slice(r)}}async function ue(e,t){let r=new URL(e.url),n=Qe(r.pathname);if(!n)return P(404,"Not found","PROXY_NOT_FOUND");let o=t?.[n.namespace];if(!o)return P(404,`Backend "${n.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!B(n.path,o.allowedPaths))return P(403,"Path not allowed","PATH_NOT_ALLOWED");if(B(n.path,o.deniedPaths))return P(403,"Path denied","PATH_DENIED");let s=new URL(n.path+r.search,o.url),a=new Headers;if(o.prepare){let l={request:e,headers:a,url:s};try{let p=await o.prepare(l);if(p instanceof Response)return p}catch(p){return console.error(`[devix] server.${n.namespace}.prepare error:`,p),P(500,"Proxy prepare failed","PREPARE_ERROR")}}if(!a.has("Accept")){let l=e.headers.get("Accept");l&&a.set("Accept",l)}let f=e.headers.get("Content-Type");f&&!a.has("Content-Type")&&a.set("Content-Type",f);let m=null;e.method!=="GET"&&e.method!=="HEAD"&&(m=await e.arrayBuffer(),m.byteLength===0&&(m=null));try{let l=await fetch(s,{method:e.method,headers:a,body:m,redirect:"manual"});return new Response(l.body,{status:l.status,statusText:l.statusText,headers:tt(l.headers)})}catch(l){return console.error(`[devix] server.${n.namespace} fetch error:`,l),P(502,"Bad Gateway","BACKEND_UNREACHABLE")}}var et=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailers","transfer-encoding","upgrade"]);function tt(e){let t=new Headers;return e.forEach((r,n)=>{et.has(n.toLowerCase())||t.set(n,r)}),t}function de(e,{apiModule:t,renderModule:r,loaderTimeout:n,server:o}){o&&e.all("/_devix/server/*",async s=>{try{return await ue(s.req.raw,o)}catch(a){return console.error("[devix] proxy fatal error:",a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.all("/api/*",async s=>{try{return await t.handleApiRequest(s.req.url,s.req.raw,o)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.get("/_data/*",async s=>{try{let{pathname:a,search:f}=new URL(s.req.url,"http://localhost"),m=a.replace(/^\/_data/,"")+f,l=await r.runLoader(m,s.req.raw,{loaderTimeout:n,server:o});if(l.error)return s.json({statusCode:500,message:"Internal Server Error"},500);if("loaderError"in l){let p=A(l.loaderError);return s.json(p,p.statusCode)}return s.json(l)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}})}import y from"picocolors";import{networkInterfaces as rt}from"node:os";function nt(e){let t=rt();for(let r of Object.values(t))for(let n of r??[])if(n.family==="IPv4"&&!n.internal)return`http://${n.address}:${e}/`;return null}function pe(e){let t="0.5.3",r=nt(e);console.log(),console.log(` ${y.bold(y.yellow("devix"))} ${y.dim(`v${t}`)}`),console.log(),console.log(` ${y.green("\u279C")} ${y.bold("Local:")} ${y.cyan(`http://localhost:${e}/`)}`),console.log(r?` ${y.green("\u279C")} ${y.bold("Network:")} ${y.cyan(r)}`:` ${y.green("\u279C")} ${y.bold("Network:")} ${y.dim("use --host to expose")}`),console.log()}async function fe(e){let t=new Set;for(let[,r]of e.moduleGraph.idToModuleMap)r.id&&(r.id.endsWith(".css")||r.id.includes(".css?"))&&r.url.startsWith("/")&&t.add(r.url);return[...t]}function me(e){if(typeof e=="number")return e;let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/);if(!t)throw new Error(`[devix] Invalid duration: "${e}". Use a number (ms) or a string like "5s", "2m", "500ms".`);let r=parseFloat(t[1]);switch(t[2]){case"h":return r*36e5;case"m":return r*6e4;case"s":return r*1e3;default:return r}}import{loadEnv as ot}from"vite";function ge(e){let t=ot(e,process.cwd(),"");for(let[r,n]of Object.entries(t))process.env[r]===void 0&&(process.env[r]=n)}import{build as st}from"esbuild";import{join as ye}from"node:path";import{unlinkSync as it,writeFileSync as at}from"node:fs";import{pathToFileURL as ct}from"node:url";async function he(e){let t=await st({entryPoints:[ye(e,"devix.config.ts")],bundle:!0,write:!1,format:"esm",platform:"node",packages:"external"}),r=ye(e,`.devix-config-${Date.now()}.mjs`);at(r,t.outputFiles[0].text);try{return(await import(ct(r).href)).default}finally{it(r)}}ge("development");var xe="virtual:devix/render",ft="virtual:devix/api",v=await he(process.cwd()),Re=Number(process.env.PORT)||v.port||3e3,mt=typeof v.host=="string"?v.host:v.host?"0.0.0.0":"localhost",_=await ut({...ce(v),configFile:!1,appType:"custom",server:{middlewareMode:!0}}),ve={render:async(...e)=>(await _.ssrLoadModule(xe)).render(...e),runLoader:async(...e)=>(await _.ssrLoadModule(xe)).runLoader(...e)},gt={handleApiRequest:async(...e)=>(await _.ssrLoadModule(ft)).handleApiRequest(...e)},V=new pt;de(V,{renderModule:ve,apiModule:gt,server:v.server});V.get("*",async e=>{try{let{html:t,statusCode:r,headers:n}=await ve.render(e.req.url,e.req.raw,{loaderTimeout:me(v.loaderTimeout??1e4),server:v.server}),s=(await fe(_)).map(l=>`<link rel="stylesheet" href="${l}">`).join(`
|
|
270
270
|
`),a=s?t.replace("</head>",`${s}
|
|
271
271
|
</head>`):t,f=await _.transformIndexHtml(e.req.url,`<!DOCTYPE html>${a}`),m=e.html(f,r);for(let[l,p]of Object.entries(n))m.headers.set(l,p);return m}catch(t){return _.ssrFixStacktrace(t),console.error(t),e.text("Internal Server Error",500)}});var yt=dt(V.fetch);lt(async(e,t)=>{await new Promise(r=>_.middlewares(e,t,r)),t.writableEnded||await yt(e,t)}).listen(Re,mt,()=>{pe(Re)});
|
|
272
272
|
//# sourceMappingURL=dev-server.js.map
|
package/dist/cli/index.js
CHANGED
|
@@ -267,7 +267,7 @@ export type PageParams = NonNullable<Parameters<typeof loader>[0]>["params"]
|
|
|
267
267
|
`:`// auto-generado por devix - no editar
|
|
268
268
|
export type PageData = undefined
|
|
269
269
|
export type PageParams = Record<string, string>
|
|
270
|
-
`}function J(e,t){let r=E(t,e),o=Oe(r,"utf-8"),n=Ft(o,r),s=[];n.exists&&!n.isAsync&&!n.isReExport&&s.push(`[devix] ${e}: 'loader' must be async. Use 'export async function loader' or 'export const loader = async (...) => ...'.`);let a=E(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),m=E(a,"$types.d.ts"),g=r.replace(/\.(tsx?|jsx?)$/,""),l=Ie(a,g).replace(/\\/g,"/"),f=Mt(l,n.exists);return je(m)&&Oe(m,"utf-8")===f?{warnings:s}:(Dt(a,{recursive:!0}),jt(m,f,"utf-8"),{warnings:s})}function Me(e,t){let r=E(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),o=E(r,"$types.d.ts");je(o)&&At(o)}function q(e,t){let r=E(t,e,"pages"),o=[],n;try{n=Fe(r,t)}catch{return{warnings:o}}for(let s of n)try{let a=J(s,t);o.push(...a.warnings)}catch{}return{warnings:o}}var Le=d(()=>{"use strict"});import{mergeConfig as Lt}from"vite";import Ut from"@vitejs/plugin-react";import{fileURLToPath as kt}from"node:url";import{dirname as Nt,relative as Ht,resolve as h}from"node:path";import{createRequire as Bt}from"node:module";import{parseSync as Jt}from"oxc-parser";function ke(e){let t=e.appDir??"app",r=`${t}/pages`,o=(e.css??[]).map(c=>c.startsWith("/")?c:`/${c.replace(/^\.\//,"")}`),n=h(D,"../server/render.js").replace(/\\/g,"/"),s=h(D,"../server/api.js").replace(/\\/g,"/"),a=h(D,"../runtime/client-router.js").replace(/\\/g,"/"),m=h(D,"../server/routes.js").replace(/\\/g,"/"),g=h(D,"../utils/env.js").replace(/\\/g,"/"),l=Bt(import.meta.url),f=l.resolve("@hono/node-server").replace(/\\/g,"/"),L=l.resolve("@hono/node-server/serve-static").replace(/\\/g,"/"),lt=l.resolve("hono").replace(/\\/g,"/"),dt={name:"devix",enforce:"pre",resolveId(c){if(c===V)return`\0${V}`;if(c===W)return`\0${W}`;if(c===$)return`\0${$}`;if(c===A)return`\0${A}`;if(c===G)return`\0${G}`;if(c===X)return`\0${X}`},load(c){if(c===`\0${V}`)return le({cssUrls:o});if(c===`\0${W}`)return ue({pagesDir:r,matcherPath:a});if(c===`\0${$}`)return fe({pagesDir:r,renderPath:n});if(c===`\0${A}`)return ge({apiPath:s,appDir:t});if(c===`\0${G}`)return xe();if(c===`\0${X}`)return $e({routesPath:m,envPath:g,honoServerPath:f,honoServerStaticPath:L,honoPath:lt})},transform(c,u,P){if(P?.ssr)return;let w=h(process.cwd(),r);if(!u.startsWith(w))return;let b=Jt(u,c,{sourceType:"module"}),R=[];for(let p of b.program.body){if(p.type!=="ExportNamedDeclaration"||!p.declaration)continue;let i=p.declaration;if(i.type==="FunctionDeclaration"&&i.id&&Ue.has(i.id.name)&&R.push({start:p.start,end:p.end,name:i.id.name}),i.type==="VariableDeclaration"){let y=new Set;for(let C of i.declarations)C.id.type==="Identifier"&&Ue.has(C.id.name)&&(y.has(p.start)||(y.add(p.start),R.push({start:p.start,end:p.end,name:C.id.name})))}}if(R.length===0)return;R.sort((p,i)=>i.start-p.start);let x=c;for(let{start:p,end:i,name:y}of R)x=x.slice(0,p)+`export const ${y} = undefined`+x.slice(i);return{code:x,map:null}},buildStart(){let c=process.cwd(),u=H(t,c);B(U(u,`${t}/api`),c);let{warnings:P}=q(t,c);for(let w of P)console.warn(w)},configureServer(c){let u=process.cwd(),P=q(t,u);for(let i of P.warnings)console.warn(i);let w=()=>{let i=H(t,u);B(U(i,`${t}/api`),u)},b=i=>i.startsWith(h(u,r))&&!i.endsWith("layout.tsx")&&!i.endsWith("error.tsx"),R=i=>Ht(u,i).replace(/\\/g,"/"),x=i=>{let y=c.moduleGraph.getModuleById(`\0${i}`);y&&c.moduleGraph.invalidateModule(y)};c.watcher.add(h(u,"devix.config.ts")),c.watcher.on("change",i=>{i===h(u,"devix.config.ts")&&(console.log("[devix] Config changed, restarting..."),process.exit(75))});let p=i=>{try{let{warnings:y}=J(R(i),u);for(let C of y)console.warn(C)}catch{}};c.watcher.on("add",i=>{i.startsWith(h(u,r))&&x($),b(i)&&p(i),i.includes(`${t}/api`)&&(x(A),w())}),c.watcher.on("unlink",i=>{i.startsWith(h(u,r))&&x($),b(i)&&Me(R(i),u),i.includes(`${t}/api`)&&(x(A),w())}),c.watcher.on("change",i=>{b(i)&&p(i),i.includes(`${t}/api`)&&!i.endsWith("middleware.ts")&&w()})}},ut={plugins:[Ut(),dt],publicDir:h(process.cwd(),e.publicDir??"public"),ssr:{noExternal:["@devlusoft/devix"]},...e.envPrefix?{envPrefix:e.envPrefix}:{}};return Lt(ut,e.vite??{})}var D,V,W,$,A,G,X,Ue,Ne=d(()=>{"use strict";de();pe();me();he();ye();be();k();De();Ae();Le();D=Nt(kt(import.meta.url)),V="virtual:devix/entry-client",W="virtual:devix/client-routes",$="virtual:devix/render",A="virtual:devix/api",G="virtual:devix/context",X="virtual:devix/server-entry",Ue=new Set(["loader","guard","generateStaticParams","headers"])});function He(e){if(typeof e=="number")return e;let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/);if(!t)throw new Error(`[devix] Invalid duration: "${e}". Use a number (ms) or a string like "5s", "2m", "500ms".`);let r=parseFloat(t[1]);switch(t[2]){case"h":return r*36e5;case"m":return r*6e4;case"s":return r*1e3;default:return r}}var Be=d(()=>{"use strict"});import{build as qt}from"esbuild";import{join as Je}from"node:path";import{unlinkSync as Vt,writeFileSync as Wt}from"node:fs";import{pathToFileURL as Gt}from"node:url";async function _(e){let t=await qt({entryPoints:[Je(e,"devix.config.ts")],bundle:!0,write:!1,format:"esm",platform:"node",packages:"external"}),r=Je(e,`.devix-config-${Date.now()}.mjs`);Wt(r,t.outputFiles[0].text);try{return(await import(Gt(r).href)).default}finally{Vt(r)}}var F=d(()=>{"use strict"});var qe={};import{writeFileSync as Xt}from"node:fs";import{resolve as Yt}from"node:path";import{build as Y}from"vite";var O,z,zt,K=d(async()=>{"use strict";Ne();Be();F();O=await _(process.cwd()),z=ke(O);await Y({...z,configFile:!1,build:{outDir:"dist/client",manifest:!0,rolldownOptions:{input:"virtual:devix/entry-client"}}});await Y({...z,configFile:!1,build:{ssr:!0,outDir:"dist/server",copyPublicDir:!1,rolldownOptions:{input:{render:"virtual:devix/render",api:"virtual:devix/api"}}}});await Y({...z,configFile:!1,build:{ssr:!0,outDir:"dist/server",emptyOutDir:!1,copyPublicDir:!1,rolldownOptions:{input:{index:"virtual:devix/server-entry"}}}});zt={port:O.port??3e3,host:O.host??!1,loaderTimeout:He(O.loaderTimeout??1e4),output:O.output??"server"};Xt(Yt(process.cwd(),"dist/devix.config.json"),JSON.stringify(zt,null,2),"utf-8")});var tr={};import{readFileSync as Kt,mkdirSync as Ve,writeFileSync as We,rmSync as Zt}from"node:fs";import{resolve as ee,join as S}from"node:path";import{pathToFileURL as Qt}from"node:url";var Xe,er,Z,Ge,Q,Ye=d(async()=>{"use strict";F();Xe=await _(process.cwd());Xe.output!=="static"&&console.warn('[devix] Tip: set output: "static" in devix.config.ts to skip the SSR server at runtime.');await K().then(()=>qe);er=Date.now(),Z=await import(Qt(ee(process.cwd(),"dist/server/render.js")).href+`?t=${er}`),Ge=JSON.parse(Kt(ee(process.cwd(),"dist/client/.vite/manifest.json"),"utf-8")),Q=await Z.getStaticRoutes();console.log(`[devix] Generating ${Q.length} static page${Q.length===1?"":"s"}...`);for(let e of Q){let t=`http://localhost${e}`,{html:r,statusCode:o}=await Z.render(t,new Request(t),{manifest:Ge});if(o!==200){console.warn(`[devix] Skipping ${e} \u2014 status ${o}`);continue}let n=e==="/"?S(process.cwd(),"dist/client/index.html"):S(process.cwd(),"dist/client",e,"index.html");Ve(S(n,".."),{recursive:!0}),We(n,`<!DOCTYPE html>${r}`,"utf-8");let s=await Z.runLoader(t,new Request(t),{manifest:Ge}),a=e==="/"?S(process.cwd(),"dist/client/_data/index.json"):S(process.cwd(),"dist/client/_data",`${e}.json`);Ve(S(a,".."),{recursive:!0}),We(a,JSON.stringify(s),"utf-8"),console.log(` \u2713 ${e}`)}console.log("[devix] Generation complete.");Xe.output==="static"&&(Zt(ee(process.cwd(),"dist/server"),{recursive:!0,force:!0}),console.log("[devix] Removed dist/server (not needed in static mode)"))});function M(e){let t={statusCode:e.statusCode,message:e.message};return e.code!==void 0&&(t.code=e.code),e.data!==void 0&&(t.data=e.data),t}var te=d(()=>{"use strict"});function rr(e,t){return or(t).test(e)}function re(e,t){if(!t||t.length===0)return!1;for(let r of t)if(rr(e,r))return!0;return!1}function or(e){let t="",r=0;for(;r<e.length;){let o=e[r];if(o==="*"&&e[r+1]==="*")t+=".*",r+=2;else if(o==="*")t+="[^/]*",r+=1;else if(o===":"){for(r+=1;r<e.length&&/[a-zA-Z0-9_]/.test(e[r]);)r+=1;t+="[^/]+"}else".+?^$()|[]{}\\".includes(o)?(t+="\\"+o,r+=1):(t+=o,r+=1)}return new RegExp(`^${t}$`)}var ze=d(()=>{"use strict"});function T(e,t,r){let o=M({statusCode:e,message:t,code:r});return new Response(JSON.stringify(o),{status:e,headers:{"Content-Type":"application/json"}})}function nr(e){if(!e.startsWith(Ke+"/"))return null;let t=e.slice(Ke.length+1),r=t.indexOf("/");return r===-1?{namespace:t,path:"/"}:{namespace:t.slice(0,r),path:t.slice(r)}}async function Ze(e,t){let r=new URL(e.url),o=nr(r.pathname);if(!o)return T(404,"Not found","PROXY_NOT_FOUND");let n=t?.[o.namespace];if(!n)return T(404,`Backend "${o.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!re(o.path,n.allowedPaths))return T(403,"Path not allowed","PATH_NOT_ALLOWED");if(re(o.path,n.deniedPaths))return T(403,"Path denied","PATH_DENIED");let s=new URL(o.path+r.search,n.url),a=new Headers;if(n.prepare){let l={request:e,headers:a,url:s};try{let f=await n.prepare(l);if(f instanceof Response)return f}catch(f){return console.error(`[devix] server.${o.namespace}.prepare error:`,f),T(500,"Proxy prepare failed","PREPARE_ERROR")}}if(!a.has("Accept")){let l=e.headers.get("Accept");l&&a.set("Accept",l)}let m=e.headers.get("Content-Type");m&&!a.has("Content-Type")&&a.set("Content-Type",m);let g=null;e.method!=="GET"&&e.method!=="HEAD"&&(g=await e.arrayBuffer(),g.byteLength===0&&(g=null));try{let l=await fetch(s,{method:e.method,headers:a,body:g,redirect:"manual"});return new Response(l.body,{status:l.status,statusText:l.statusText,headers:ir(l.headers)})}catch(l){return console.error(`[devix] server.${o.namespace} fetch error:`,l),T(502,"Bad Gateway","BACKEND_UNREACHABLE")}}function ir(e){let t=new Headers;return e.forEach((r,o)=>{sr.has(o.toLowerCase())||t.set(o,r)}),t}var Ke,sr,Qe=d(()=>{"use strict";ze();te();Ke="/_devix/server";sr=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailers","transfer-encoding","upgrade"])});function et(e,{apiModule:t,renderModule:r,loaderTimeout:o,server:n}){n&&e.all("/_devix/server/*",async s=>{try{return await Ze(s.req.raw,n)}catch(a){return console.error("[devix] proxy fatal error:",a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.all("/api/*",async s=>{try{return await t.handleApiRequest(s.req.url,s.req.raw,n)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.get("/_data/*",async s=>{try{let{pathname:a,search:m}=new URL(s.req.url,"http://localhost"),g=a.replace(/^\/_data/,"")+m,l=await r.runLoader(g,s.req.raw,{loaderTimeout:o,server:n});if(l.error)return s.json({statusCode:500,message:"Internal Server Error"},500);if("loaderError"in l){let f=M(l.loaderError);return s.json(f,f.statusCode)}return s.json(l)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}})}function tt(e,{renderModule:t,manifest:r,loaderTimeout:o,server:n}){e.get("*",async s=>{try{let{html:a,statusCode:m,headers:g}=await t.render(s.req.url,s.req.raw,{manifest:r,loaderTimeout:o,server:n}),l=s.html(`<!DOCTYPE html>${a}`,m);for(let[f,L]of Object.entries(g))l.headers.set(f,L);return l}catch(a){return console.error(a),s.text("Internal Server Error",500)}})}var rt=d(()=>{"use strict";te();Qe()});import{loadEnv as ar}from"vite";function ot(e){let t=ar(e,process.cwd(),"");for(let[r,o]of Object.entries(t))process.env[r]===void 0&&(process.env[r]=o)}var nt=d(()=>{"use strict"});var fr={};import{readFileSync as oe}from"node:fs";import{serve as cr}from"@hono/node-server";import{serveStatic as lr}from"@hono/node-server/serve-static";import{Hono as dr}from"hono";import{resolve as st,join as j}from"node:path";import{pathToFileURL as it}from"node:url";var ne,se,ie,v,ur,pr,I,ae,at=d(async()=>{"use strict";rt();nt();F();ot("production");try{v=JSON.parse(oe(j(process.cwd(),"dist/devix.config.json"),"utf-8")),v.output!=="static"&&(ne=await import(it(st(process.cwd(),"dist/server/render.js")).href),se=await import(it(st(process.cwd(),"dist/server/api.js")).href)),ie=JSON.parse(oe(j(process.cwd(),"dist/client/.vite/manifest.json"),"utf-8"))}catch{console.error('[devix] Build not found. Run "devix build" first.'),process.exit(1)}ur=Number(process.env.PORT)||v.port||3e3,pr=typeof v.host=="string"?v.host:v.host?"0.0.0.0":process.env.HOST||"0.0.0.0",I=new dr,ae=j(process.cwd(),"dist/client");v.output==="static"&&I.get("/_data/*",e=>{let t=e.req.path.replace(/^\/_data/,"")||"/",r=t==="/"?j(ae,"_data/index.json"):j(ae,"_data",`${t}.json`);try{let o=oe(r,"utf-8");return e.json(JSON.parse(o))}catch{return e.json({error:"not found"},404)}});I.use("/*",lr({root:ae,onFound:(e,t)=>{t.header("Cache-Control",e.includes("/assets/")?"public, immutable, max-age=31536000":"no-cache")}}));if(v.output==="static")console.log("[devix] Static mode \u2014 serving pre-generated files from dist/client");else{let e=await _(process.cwd()).catch(()=>null);et(I,{renderModule:ne,apiModule:se,manifest:ie,server:e?.server}),tt(I,{renderModule:ne,apiModule:se,manifest:ie,loaderTimeout:v.loaderTimeout})}cr({fetch:I.fetch,port:ur,hostname:pr},e=>console.log(`http://${e.address}:${e.port}`))});var ct=process.argv[2];switch(ct){case"dev":await Promise.resolve().then(()=>(ce(),xt));break;case"build":await K().then(()=>qe);break;case"generate":await Ye().then(()=>tr);break;case"start":await at().then(()=>fr);break;case"--version":case"-v":{console.log("0.5.2");break}case"--help":case"-h":console.log(`
|
|
270
|
+
`}function J(e,t){let r=E(t,e),o=Oe(r,"utf-8"),n=Ft(o,r),s=[];n.exists&&!n.isAsync&&!n.isReExport&&s.push(`[devix] ${e}: 'loader' must be async. Use 'export async function loader' or 'export const loader = async (...) => ...'.`);let a=E(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),m=E(a,"$types.d.ts"),g=r.replace(/\.(tsx?|jsx?)$/,""),l=Ie(a,g).replace(/\\/g,"/"),f=Mt(l,n.exists);return je(m)&&Oe(m,"utf-8")===f?{warnings:s}:(Dt(a,{recursive:!0}),jt(m,f,"utf-8"),{warnings:s})}function Me(e,t){let r=E(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),o=E(r,"$types.d.ts");je(o)&&At(o)}function q(e,t){let r=E(t,e,"pages"),o=[],n;try{n=Fe(r,t)}catch{return{warnings:o}}for(let s of n)try{let a=J(s,t);o.push(...a.warnings)}catch{}return{warnings:o}}var Le=d(()=>{"use strict"});import{mergeConfig as Lt}from"vite";import Ut from"@vitejs/plugin-react";import{fileURLToPath as kt}from"node:url";import{dirname as Nt,relative as Ht,resolve as h}from"node:path";import{createRequire as Bt}from"node:module";import{parseSync as Jt}from"oxc-parser";function ke(e){let t=e.appDir??"app",r=`${t}/pages`,o=(e.css??[]).map(c=>c.startsWith("/")?c:`/${c.replace(/^\.\//,"")}`),n=h(D,"../server/render.js").replace(/\\/g,"/"),s=h(D,"../server/api.js").replace(/\\/g,"/"),a=h(D,"../runtime/client-router.js").replace(/\\/g,"/"),m=h(D,"../server/routes.js").replace(/\\/g,"/"),g=h(D,"../utils/env.js").replace(/\\/g,"/"),l=Bt(import.meta.url),f=l.resolve("@hono/node-server").replace(/\\/g,"/"),L=l.resolve("@hono/node-server/serve-static").replace(/\\/g,"/"),lt=l.resolve("hono").replace(/\\/g,"/"),dt={name:"devix",enforce:"pre",resolveId(c){if(c===V)return`\0${V}`;if(c===W)return`\0${W}`;if(c===$)return`\0${$}`;if(c===A)return`\0${A}`;if(c===G)return`\0${G}`;if(c===X)return`\0${X}`},load(c){if(c===`\0${V}`)return le({cssUrls:o});if(c===`\0${W}`)return ue({pagesDir:r,matcherPath:a});if(c===`\0${$}`)return fe({pagesDir:r,renderPath:n});if(c===`\0${A}`)return ge({apiPath:s,appDir:t});if(c===`\0${G}`)return xe();if(c===`\0${X}`)return $e({routesPath:m,envPath:g,honoServerPath:f,honoServerStaticPath:L,honoPath:lt})},transform(c,u,P){if(P?.ssr)return;let w=h(process.cwd(),r);if(!u.startsWith(w))return;let b=Jt(u,c,{sourceType:"module"}),R=[];for(let p of b.program.body){if(p.type!=="ExportNamedDeclaration"||!p.declaration)continue;let i=p.declaration;if(i.type==="FunctionDeclaration"&&i.id&&Ue.has(i.id.name)&&R.push({start:p.start,end:p.end,name:i.id.name}),i.type==="VariableDeclaration"){let y=new Set;for(let C of i.declarations)C.id.type==="Identifier"&&Ue.has(C.id.name)&&(y.has(p.start)||(y.add(p.start),R.push({start:p.start,end:p.end,name:C.id.name})))}}if(R.length===0)return;R.sort((p,i)=>i.start-p.start);let x=c;for(let{start:p,end:i,name:y}of R)x=x.slice(0,p)+`export const ${y} = undefined`+x.slice(i);return{code:x,map:null}},buildStart(){let c=process.cwd(),u=H(t,c);B(U(u,`${t}/api`),c);let{warnings:P}=q(t,c);for(let w of P)console.warn(w)},configureServer(c){let u=process.cwd(),P=q(t,u);for(let i of P.warnings)console.warn(i);let w=()=>{let i=H(t,u);B(U(i,`${t}/api`),u)},b=i=>i.startsWith(h(u,r))&&!i.endsWith("layout.tsx")&&!i.endsWith("error.tsx"),R=i=>Ht(u,i).replace(/\\/g,"/"),x=i=>{let y=c.moduleGraph.getModuleById(`\0${i}`);y&&c.moduleGraph.invalidateModule(y)};c.watcher.add(h(u,"devix.config.ts")),c.watcher.on("change",i=>{i===h(u,"devix.config.ts")&&(console.log("[devix] Config changed, restarting..."),process.exit(75))});let p=i=>{try{let{warnings:y}=J(R(i),u);for(let C of y)console.warn(C)}catch{}};c.watcher.on("add",i=>{i.startsWith(h(u,r))&&x($),b(i)&&p(i),i.includes(`${t}/api`)&&(x(A),w())}),c.watcher.on("unlink",i=>{i.startsWith(h(u,r))&&x($),b(i)&&Me(R(i),u),i.includes(`${t}/api`)&&(x(A),w())}),c.watcher.on("change",i=>{b(i)&&p(i),i.includes(`${t}/api`)&&!i.endsWith("middleware.ts")&&w()})}},ut={plugins:[Ut(),dt],publicDir:h(process.cwd(),e.publicDir??"public"),ssr:{noExternal:["@devlusoft/devix"]},...e.envPrefix?{envPrefix:e.envPrefix}:{}};return Lt(ut,e.vite??{})}var D,V,W,$,A,G,X,Ue,Ne=d(()=>{"use strict";de();pe();me();he();ye();be();k();De();Ae();Le();D=Nt(kt(import.meta.url)),V="virtual:devix/entry-client",W="virtual:devix/client-routes",$="virtual:devix/render",A="virtual:devix/api",G="virtual:devix/context",X="virtual:devix/server-entry",Ue=new Set(["loader","guard","generateStaticParams","headers"])});function He(e){if(typeof e=="number")return e;let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/);if(!t)throw new Error(`[devix] Invalid duration: "${e}". Use a number (ms) or a string like "5s", "2m", "500ms".`);let r=parseFloat(t[1]);switch(t[2]){case"h":return r*36e5;case"m":return r*6e4;case"s":return r*1e3;default:return r}}var Be=d(()=>{"use strict"});import{build as qt}from"esbuild";import{join as Je}from"node:path";import{unlinkSync as Vt,writeFileSync as Wt}from"node:fs";import{pathToFileURL as Gt}from"node:url";async function _(e){let t=await qt({entryPoints:[Je(e,"devix.config.ts")],bundle:!0,write:!1,format:"esm",platform:"node",packages:"external"}),r=Je(e,`.devix-config-${Date.now()}.mjs`);Wt(r,t.outputFiles[0].text);try{return(await import(Gt(r).href)).default}finally{Vt(r)}}var F=d(()=>{"use strict"});var qe={};import{writeFileSync as Xt}from"node:fs";import{resolve as Yt}from"node:path";import{build as Y}from"vite";var O,z,zt,K=d(async()=>{"use strict";Ne();Be();F();O=await _(process.cwd()),z=ke(O);await Y({...z,configFile:!1,build:{outDir:"dist/client",manifest:!0,rolldownOptions:{input:"virtual:devix/entry-client"}}});await Y({...z,configFile:!1,build:{ssr:!0,outDir:"dist/server",copyPublicDir:!1,rolldownOptions:{input:{render:"virtual:devix/render",api:"virtual:devix/api"}}}});await Y({...z,configFile:!1,build:{ssr:!0,outDir:"dist/server",emptyOutDir:!1,copyPublicDir:!1,rolldownOptions:{input:{index:"virtual:devix/server-entry"}}}});zt={port:O.port??3e3,host:O.host??!1,loaderTimeout:He(O.loaderTimeout??1e4),output:O.output??"server"};Xt(Yt(process.cwd(),"dist/devix.config.json"),JSON.stringify(zt,null,2),"utf-8")});var tr={};import{readFileSync as Kt,mkdirSync as Ve,writeFileSync as We,rmSync as Zt}from"node:fs";import{resolve as ee,join as S}from"node:path";import{pathToFileURL as Qt}from"node:url";var Xe,er,Z,Ge,Q,Ye=d(async()=>{"use strict";F();Xe=await _(process.cwd());Xe.output!=="static"&&console.warn('[devix] Tip: set output: "static" in devix.config.ts to skip the SSR server at runtime.');await K().then(()=>qe);er=Date.now(),Z=await import(Qt(ee(process.cwd(),"dist/server/render.js")).href+`?t=${er}`),Ge=JSON.parse(Kt(ee(process.cwd(),"dist/client/.vite/manifest.json"),"utf-8")),Q=await Z.getStaticRoutes();console.log(`[devix] Generating ${Q.length} static page${Q.length===1?"":"s"}...`);for(let e of Q){let t=`http://localhost${e}`,{html:r,statusCode:o}=await Z.render(t,new Request(t),{manifest:Ge});if(o!==200){console.warn(`[devix] Skipping ${e} \u2014 status ${o}`);continue}let n=e==="/"?S(process.cwd(),"dist/client/index.html"):S(process.cwd(),"dist/client",e,"index.html");Ve(S(n,".."),{recursive:!0}),We(n,`<!DOCTYPE html>${r}`,"utf-8");let s=await Z.runLoader(t,new Request(t),{manifest:Ge}),a=e==="/"?S(process.cwd(),"dist/client/_data/index.json"):S(process.cwd(),"dist/client/_data",`${e}.json`);Ve(S(a,".."),{recursive:!0}),We(a,JSON.stringify(s),"utf-8"),console.log(` \u2713 ${e}`)}console.log("[devix] Generation complete.");Xe.output==="static"&&(Zt(ee(process.cwd(),"dist/server"),{recursive:!0,force:!0}),console.log("[devix] Removed dist/server (not needed in static mode)"))});function M(e){let t={statusCode:e.statusCode,message:e.message};return e.code!==void 0&&(t.code=e.code),e.data!==void 0&&(t.data=e.data),t}var te=d(()=>{"use strict"});function rr(e,t){return or(t).test(e)}function re(e,t){if(!t||t.length===0)return!1;for(let r of t)if(rr(e,r))return!0;return!1}function or(e){let t="",r=0;for(;r<e.length;){let o=e[r];if(o==="*"&&e[r+1]==="*")t+=".*",r+=2;else if(o==="*")t+="[^/]*",r+=1;else if(o===":"){for(r+=1;r<e.length&&/[a-zA-Z0-9_]/.test(e[r]);)r+=1;t+="[^/]+"}else".+?^$()|[]{}\\".includes(o)?(t+="\\"+o,r+=1):(t+=o,r+=1)}return new RegExp(`^${t}$`)}var ze=d(()=>{"use strict"});function T(e,t,r){let o=M({statusCode:e,message:t,code:r});return new Response(JSON.stringify(o),{status:e,headers:{"Content-Type":"application/json"}})}function nr(e){if(!e.startsWith(Ke+"/"))return null;let t=e.slice(Ke.length+1),r=t.indexOf("/");return r===-1?{namespace:t,path:"/"}:{namespace:t.slice(0,r),path:t.slice(r)}}async function Ze(e,t){let r=new URL(e.url),o=nr(r.pathname);if(!o)return T(404,"Not found","PROXY_NOT_FOUND");let n=t?.[o.namespace];if(!n)return T(404,`Backend "${o.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!re(o.path,n.allowedPaths))return T(403,"Path not allowed","PATH_NOT_ALLOWED");if(re(o.path,n.deniedPaths))return T(403,"Path denied","PATH_DENIED");let s=new URL(o.path+r.search,n.url),a=new Headers;if(n.prepare){let l={request:e,headers:a,url:s};try{let f=await n.prepare(l);if(f instanceof Response)return f}catch(f){return console.error(`[devix] server.${o.namespace}.prepare error:`,f),T(500,"Proxy prepare failed","PREPARE_ERROR")}}if(!a.has("Accept")){let l=e.headers.get("Accept");l&&a.set("Accept",l)}let m=e.headers.get("Content-Type");m&&!a.has("Content-Type")&&a.set("Content-Type",m);let g=null;e.method!=="GET"&&e.method!=="HEAD"&&(g=await e.arrayBuffer(),g.byteLength===0&&(g=null));try{let l=await fetch(s,{method:e.method,headers:a,body:g,redirect:"manual"});return new Response(l.body,{status:l.status,statusText:l.statusText,headers:ir(l.headers)})}catch(l){return console.error(`[devix] server.${o.namespace} fetch error:`,l),T(502,"Bad Gateway","BACKEND_UNREACHABLE")}}function ir(e){let t=new Headers;return e.forEach((r,o)=>{sr.has(o.toLowerCase())||t.set(o,r)}),t}var Ke,sr,Qe=d(()=>{"use strict";ze();te();Ke="/_devix/server";sr=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailers","transfer-encoding","upgrade"])});function et(e,{apiModule:t,renderModule:r,loaderTimeout:o,server:n}){n&&e.all("/_devix/server/*",async s=>{try{return await Ze(s.req.raw,n)}catch(a){return console.error("[devix] proxy fatal error:",a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.all("/api/*",async s=>{try{return await t.handleApiRequest(s.req.url,s.req.raw,n)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}}),e.get("/_data/*",async s=>{try{let{pathname:a,search:m}=new URL(s.req.url,"http://localhost"),g=a.replace(/^\/_data/,"")+m,l=await r.runLoader(g,s.req.raw,{loaderTimeout:o,server:n});if(l.error)return s.json({statusCode:500,message:"Internal Server Error"},500);if("loaderError"in l){let f=M(l.loaderError);return s.json(f,f.statusCode)}return s.json(l)}catch(a){return console.error(a),s.json({statusCode:500,message:"Internal Server Error"},500)}})}function tt(e,{renderModule:t,manifest:r,loaderTimeout:o,server:n}){e.get("*",async s=>{try{let{html:a,statusCode:m,headers:g}=await t.render(s.req.url,s.req.raw,{manifest:r,loaderTimeout:o,server:n}),l=s.html(`<!DOCTYPE html>${a}`,m);for(let[f,L]of Object.entries(g))l.headers.set(f,L);return l}catch(a){return console.error(a),s.text("Internal Server Error",500)}})}var rt=d(()=>{"use strict";te();Qe()});import{loadEnv as ar}from"vite";function ot(e){let t=ar(e,process.cwd(),"");for(let[r,o]of Object.entries(t))process.env[r]===void 0&&(process.env[r]=o)}var nt=d(()=>{"use strict"});var fr={};import{readFileSync as oe}from"node:fs";import{serve as cr}from"@hono/node-server";import{serveStatic as lr}from"@hono/node-server/serve-static";import{Hono as dr}from"hono";import{resolve as st,join as j}from"node:path";import{pathToFileURL as it}from"node:url";var ne,se,ie,v,ur,pr,I,ae,at=d(async()=>{"use strict";rt();nt();F();ot("production");try{v=JSON.parse(oe(j(process.cwd(),"dist/devix.config.json"),"utf-8")),v.output!=="static"&&(ne=await import(it(st(process.cwd(),"dist/server/render.js")).href),se=await import(it(st(process.cwd(),"dist/server/api.js")).href)),ie=JSON.parse(oe(j(process.cwd(),"dist/client/.vite/manifest.json"),"utf-8"))}catch{console.error('[devix] Build not found. Run "devix build" first.'),process.exit(1)}ur=Number(process.env.PORT)||v.port||3e3,pr=typeof v.host=="string"?v.host:v.host?"0.0.0.0":process.env.HOST||"0.0.0.0",I=new dr,ae=j(process.cwd(),"dist/client");v.output==="static"&&I.get("/_data/*",e=>{let t=e.req.path.replace(/^\/_data/,"")||"/",r=t==="/"?j(ae,"_data/index.json"):j(ae,"_data",`${t}.json`);try{let o=oe(r,"utf-8");return e.json(JSON.parse(o))}catch{return e.json({error:"not found"},404)}});I.use("/*",lr({root:ae,onFound:(e,t)=>{t.header("Cache-Control",e.includes("/assets/")?"public, immutable, max-age=31536000":"no-cache")}}));if(v.output==="static")console.log("[devix] Static mode \u2014 serving pre-generated files from dist/client");else{let e=await _(process.cwd()).catch(()=>null);et(I,{renderModule:ne,apiModule:se,manifest:ie,server:e?.server}),tt(I,{renderModule:ne,apiModule:se,manifest:ie,loaderTimeout:v.loaderTimeout})}cr({fetch:I.fetch,port:ur,hostname:pr},e=>console.log(`http://${e.address}:${e.port}`))});var ct=process.argv[2];switch(ct){case"dev":await Promise.resolve().then(()=>(ce(),xt));break;case"build":await K().then(()=>qe);break;case"generate":await Ye().then(()=>tr);break;case"start":await at().then(()=>fr);break;case"--version":case"-v":{console.log("0.5.3");break}case"--help":case"-h":console.log(`
|
|
271
271
|
devix \u2014 a lightweight SSR framework
|
|
272
272
|
|
|
273
273
|
Usage:
|
package/dist/utils/banner.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import o from"picocolors";import{networkInterfaces as r}from"node:os";function s(e){let l=r();for(let n of Object.values(l))for(let t of n??[])if(t.family==="IPv4"&&!t.internal)return`http://${t.address}:${e}/`;return null}function $(e){let l="0.5.
|
|
1
|
+
import o from"picocolors";import{networkInterfaces as r}from"node:os";function s(e){let l=r();for(let n of Object.values(l))for(let t of n??[])if(t.family==="IPv4"&&!t.internal)return`http://${t.address}:${e}/`;return null}function $(e){let l="0.5.3",n=s(e);console.log(),console.log(` ${o.bold(o.yellow("devix"))} ${o.dim(`v${l}`)}`),console.log(),console.log(` ${o.green("\u279C")} ${o.bold("Local:")} ${o.cyan(`http://localhost:${e}/`)}`),console.log(n?` ${o.green("\u279C")} ${o.bold("Network:")} ${o.cyan(n)}`:` ${o.green("\u279C")} ${o.bold("Network:")} ${o.dim("use --host to expose")}`),console.log()}export{$ as printDevBanner};
|
|
2
2
|
//# sourceMappingURL=banner.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devlusoft/devix",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A lightweight React SSR meta-framework — devix",
|
|
6
6
|
"author": "devlusoft",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"react": ">=19",
|
|
59
59
|
"react-dom": ">=19",
|
|
60
|
-
"vite": "8.0.
|
|
60
|
+
"vite": ">=8.0.11"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@hono/node-server": "1.19.13",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"react-dom": "19.2.4",
|
|
78
78
|
"tsx": "4.21.0",
|
|
79
79
|
"typescript": "5.9.3",
|
|
80
|
-
"vite": "8.0.
|
|
80
|
+
"vite": "8.0.11",
|
|
81
81
|
"vitest": "4.1.0"
|
|
82
82
|
}
|
|
83
83
|
}
|