@devlusoft/devix 0.5.4 → 0.5.5
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/runtime/error-boundary.d.ts +5 -0
- package/dist/runtime/error-boundary.js +1 -1
- package/dist/runtime/error-boundary.js.map +3 -3
- package/dist/runtime/fetch.d.ts +1 -0
- package/dist/runtime/fetch.js +1 -1
- package/dist/runtime/fetch.js.map +3 -3
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +3 -3
- package/dist/runtime/router-provider.js +1 -1
- package/dist/runtime/router-provider.js.map +3 -3
- package/dist/runtime/server-app.js +1 -1
- package/dist/runtime/server-app.js.map +3 -3
- package/dist/runtime/server-client.js +1 -1
- package/dist/runtime/server-client.js.map +3 -3
- package/dist/server/api.js +1 -1
- package/dist/server/api.js.map +3 -3
- package/dist/server/render.js +1 -1
- package/dist/server/render.js.map +3 -3
- package/dist/server/server-bound.js +1 -1
- package/dist/server/server-bound.js.map +3 -3
- package/dist/utils/banner.js +1 -1
- package/package.json +1 -1
package/dist/cli/dev-server.js
CHANGED
|
@@ -275,7 +275,7 @@ export type PageParams = NonNullable<Parameters<typeof loader>[0]>["params"]
|
|
|
275
275
|
`:`// auto-generado por devix - no editar
|
|
276
276
|
export type PageData = undefined
|
|
277
277
|
export type PageParams = Record<string, string>
|
|
278
|
-
`}function j(e,t){let r=w(t,e),o=re(r,"utf-8"),n=Be(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=w(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),f=w(a,"$types.d.ts"),m=r.replace(/\.(tsx?|jsx?)$/,""),l=ne(a,m).replace(/\\/g,"/"),p=Ve(l,n.exists);return oe(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?)$/,"")),o=w(r,"$types.d.ts");oe(o)&&Fe(o)}function U(e,t){let r=w(t,e,"pages"),o=[],n;try{n=se(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 C=Ge(Je(import.meta.url)),F="virtual:devix/entry-client",N="virtual:devix/client-routes",D="virtual:devix/render",$="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`,o=(e.css??[]).map(c=>c.startsWith("/")?c:`/${c.replace(/^\.\//,"")}`),n=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===D)return`\0${D}`;if(c===$)return`\0${$}`;if(c===k)return`\0${k}`;if(c===H)return`\0${H}`},load(c){if(c===`\0${F}`)return q({cssUrls:o});if(c===`\0${N}`)return W({pagesDir:r,matcherPath:a});if(c===`\0${D}`)return J({pagesDir:r,renderPath:n});if(c===`\0${$}`)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 y=c;for(let{start:d,end:i,name:x}of R)y=y.slice(0,d)+`export const ${x} = undefined`+y.slice(i);return{code:y,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,"/"),y=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))&&y(D),S(i)&&d(i),i.includes(`${t}/api`)&&(y($),E())}),c.watcher.on("unlink",i=>{i.startsWith(g(u,r))&&y(D),S(i)&&ie(R(i),u),i.includes(`${t}/api`)&&(y($),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 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 le="/_devix/server";function P(e,t,r){let o=A({statusCode:e,message:t,code:r});return new Response(JSON.stringify(o),{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),o=Qe(r.pathname);if(!o)return P(404,"Not found","PROXY_NOT_FOUND");let n=t?.[o.namespace];if(!n)return P(404,`Backend "${o.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!B(o.path,n.allowedPaths))return P(403,"Path not allowed","PATH_NOT_ALLOWED");if(B(o.path,n.deniedPaths))return P(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 p=await n.prepare(l);if(p instanceof Response)return p}catch(p){return console.error(`[devix] server.${o.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.${o.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,o)=>{et.has(o.toLowerCase())||t.set(o,r)}),t}function de(e,{apiModule:t,renderModule:r,loaderTimeout:o,server:n}){n&&e.all("/_devix/server/*",async s=>{try{return await ue(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:f}=new URL(s.req.url,"http://localhost"),m=a.replace(/^\/_data/,"")+f,l=await r.runLoader(m,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 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 h from"picocolors";import{networkInterfaces as rt}from"node:os";function ot(e){let t=rt();for(let r of Object.values(t))for(let o of r??[])if(o.family==="IPv4"&&!o.internal)return`http://${o.address}:${e}/`;return null}function pe(e){let t="0.5.
|
|
278
|
+
`}function j(e,t){let r=w(t,e),o=re(r,"utf-8"),n=Be(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=w(t,".devix","pages",e.replace(/\.(tsx?|jsx?)$/,"")),f=w(a,"$types.d.ts"),m=r.replace(/\.(tsx?|jsx?)$/,""),l=ne(a,m).replace(/\\/g,"/"),p=Ve(l,n.exists);return oe(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?)$/,"")),o=w(r,"$types.d.ts");oe(o)&&Fe(o)}function U(e,t){let r=w(t,e,"pages"),o=[],n;try{n=se(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 C=Ge(Je(import.meta.url)),F="virtual:devix/entry-client",N="virtual:devix/client-routes",D="virtual:devix/render",$="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`,o=(e.css??[]).map(c=>c.startsWith("/")?c:`/${c.replace(/^\.\//,"")}`),n=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===D)return`\0${D}`;if(c===$)return`\0${$}`;if(c===k)return`\0${k}`;if(c===H)return`\0${H}`},load(c){if(c===`\0${F}`)return q({cssUrls:o});if(c===`\0${N}`)return W({pagesDir:r,matcherPath:a});if(c===`\0${D}`)return J({pagesDir:r,renderPath:n});if(c===`\0${$}`)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 y=c;for(let{start:d,end:i,name:x}of R)y=y.slice(0,d)+`export const ${x} = undefined`+y.slice(i);return{code:y,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,"/"),y=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))&&y(D),S(i)&&d(i),i.includes(`${t}/api`)&&(y($),E())}),c.watcher.on("unlink",i=>{i.startsWith(g(u,r))&&y(D),S(i)&&ie(R(i),u),i.includes(`${t}/api`)&&(y($),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 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 le="/_devix/server";function P(e,t,r){let o=A({statusCode:e,message:t,code:r});return new Response(JSON.stringify(o),{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),o=Qe(r.pathname);if(!o)return P(404,"Not found","PROXY_NOT_FOUND");let n=t?.[o.namespace];if(!n)return P(404,`Backend "${o.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!B(o.path,n.allowedPaths))return P(403,"Path not allowed","PATH_NOT_ALLOWED");if(B(o.path,n.deniedPaths))return P(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 p=await n.prepare(l);if(p instanceof Response)return p}catch(p){return console.error(`[devix] server.${o.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.${o.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,o)=>{et.has(o.toLowerCase())||t.set(o,r)}),t}function de(e,{apiModule:t,renderModule:r,loaderTimeout:o,server:n}){n&&e.all("/_devix/server/*",async s=>{try{return await ue(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:f}=new URL(s.req.url,"http://localhost"),m=a.replace(/^\/_data/,"")+f,l=await r.runLoader(m,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 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 h from"picocolors";import{networkInterfaces as rt}from"node:os";function ot(e){let t=rt();for(let r of Object.values(t))for(let o of r??[])if(o.family==="IPv4"&&!o.internal)return`http://${o.address}:${e}/`;return null}function pe(e){let t="0.5.5",r=ot(e);console.log(),console.log(` ${h.bold(h.yellow("devix"))} ${h.dim(`v${t}`)}`),console.log(),console.log(` ${h.green("\u279C")} ${h.bold("Local:")} ${h.cyan(`http://localhost:${e}/`)}`),console.log(r?` ${h.green("\u279C")} ${h.bold("Network:")} ${h.cyan(r)}`:` ${h.green("\u279C")} ${h.bold("Network:")} ${h.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 nt}from"vite";function ge(e){let t=nt(e,process.cwd(),"");for(let[r,o]of Object.entries(t))process.env[r]===void 0&&(process.env[r]=o)}import{build as st}from"esbuild";import{join as he}from"node:path";import{unlinkSync as it,writeFileSync as at}from"node:fs";import{pathToFileURL as ct}from"node:url";async function ye(e){let t=await st({entryPoints:[he(e,"devix.config.ts")],bundle:!0,write:!1,format:"esm",platform:"node",packages:"external"}),r=he(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 ye(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:o}=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(`
|
|
279
279
|
`),a=s?t.replace("</head>",`${s}
|
|
280
280
|
</head>`):t,f=await _.transformIndexHtml(e.req.url,`<!DOCTYPE html>${a}`),m=e.html(f,r);for(let[l,p]of Object.entries(o))m.headers.set(l,p);return m}catch(t){return _.ssrFixStacktrace(t),console.error(t),e.text("Internal Server Error",500)}});var ht=dt(V.fetch);lt(async(e,t)=>{await new Promise(r=>_.middlewares(e,t,r)),t.writableEnded||await ht(e,t)}).listen(Re,mt,()=>{pe(Re)});
|
|
281
281
|
//# sourceMappingURL=dev-server.js.map
|
package/dist/cli/index.js
CHANGED
|
@@ -276,7 +276,7 @@ export type PageParams = NonNullable<Parameters<typeof loader>[0]>["params"]
|
|
|
276
276
|
`:`// auto-generado por devix - no editar
|
|
277
277
|
export type PageData = undefined
|
|
278
278
|
export type PageParams = Record<string, string>
|
|
279
|
-
`}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,T){if(T?.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:T}=q(t,c);for(let w of T)console.warn(w)},configureServer(c){let u=process.cwd(),T=q(t,u);for(let i of T.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 P(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 P(404,"Not found","PROXY_NOT_FOUND");let n=t?.[o.namespace];if(!n)return P(404,`Backend "${o.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!re(o.path,n.allowedPaths))return P(403,"Path not allowed","PATH_NOT_ALLOWED");if(re(o.path,n.deniedPaths))return P(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),P(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),P(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.4");break}case"--help":case"-h":console.log(`
|
|
279
|
+
`}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,T){if(T?.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:T}=q(t,c);for(let w of T)console.warn(w)},configureServer(c){let u=process.cwd(),T=q(t,u);for(let i of T.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 P(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 P(404,"Not found","PROXY_NOT_FOUND");let n=t?.[o.namespace];if(!n)return P(404,`Backend "${o.namespace}" not configured`,"BACKEND_NOT_FOUND");if(!re(o.path,n.allowedPaths))return P(403,"Path not allowed","PATH_NOT_ALLOWED");if(re(o.path,n.deniedPaths))return P(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),P(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),P(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.5");break}case"--help":case"-h":console.log(`
|
|
280
280
|
devix \u2014 a lightweight SSR framework
|
|
281
281
|
|
|
282
282
|
Usage:
|
|
@@ -17,6 +17,11 @@ export interface DevixErrorOptions {
|
|
|
17
17
|
data?: unknown;
|
|
18
18
|
}
|
|
19
19
|
export declare class DevixError extends Error {
|
|
20
|
+
/**
|
|
21
|
+
* Custom `instanceof` que matchea por brand cross-bundle. Ver nota en
|
|
22
|
+
* `FetchError` para el detalle del dual package hazard.
|
|
23
|
+
*/
|
|
24
|
+
static [Symbol.hasInstance](value: unknown): boolean;
|
|
20
25
|
statusCode: number;
|
|
21
26
|
code?: string;
|
|
22
27
|
data?: unknown;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Component as
|
|
1
|
+
import{Component as p}from"react";import{jsx as n}from"react/jsx-runtime";var o=class extends p{state={error:null};static getDerivedStateFromError(r){return r instanceof t?{error:{statusCode:r.statusCode,message:r.message}}:{error:{statusCode:500,message:r instanceof Error?r.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?n(this.props.ErrorPage,{...this.state.error}):this.state.error?n("h1",{children:this.state.error.statusCode}):this.props.children}},s=Symbol.for("@devlusoft/devix.DevixError"),t=class extends Error{static[Symbol.hasInstance](r){return r!==null&&typeof r=="object"&&r[s]===!0}statusCode;code;data;constructor(r,i,e){super(i),this.name="DevixError",this.statusCode=r,this.code=e?.code,this.data=e?.data,this[s]=!0}};export{t as DevixError,o as DevixErrorBoundary};
|
|
2
2
|
//# sourceMappingURL=error-boundary.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/runtime/error-boundary.tsx"],
|
|
4
|
-
"sourcesContent": ["import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport interface DevixErrorOptions {\n code?: string\n data?: unknown\n}\n\nexport class DevixError extends Error {\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAQ,aAAAA,MAA0C,QA4B/B,cAAAC,MAAA,oBAhBZ,IAAMC,EAAN,cAAiCF,CAAwB,CAC5D,MAAe,CAAE,MAAO,IAAK,EAE7B,OAAO,yBAAyBG,EAAqB,CACjD,OAAIA,aAAeC,EACR,CACH,MAAO,CAAC,WAAYD,EAAI,WAAY,QAASA,EAAI,OAAO,CAC5D,EAEI,CACJ,MAAO,CAAC,WAAY,IAAK,QAASA,aAAe,MAAQA,EAAI,QAAU,eAAe,CAC1F,CACJ,CAEA,QAAS,CACL,OAAI,KAAK,MAAM,OAAS,KAAK,MAAM,UACxBF,EAAC,KAAK,MAAM,UAAX,CAAsB,GAAG,KAAK,MAAM,MAAO,EAEnD,KAAK,MAAM,MACJA,EAAC,MAAI,cAAK,MAAM,MAAM,WAAW,EAErC,KAAK,MAAM,QACtB,CACJ,
|
|
6
|
-
"names": ["Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "options"]
|
|
4
|
+
"sourcesContent": ["import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport interface DevixErrorOptions {\n code?: string\n data?: unknown\n}\n\nconst DEVIX_ERROR_BRAND = Symbol.for('@devlusoft/devix.DevixError')\n\nexport class DevixError extends Error {\n /**\n * Custom `instanceof` que matchea por brand cross-bundle. Ver nota en\n * `FetchError` para el detalle del dual package hazard.\n */\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[DEVIX_ERROR_BRAND] === true\n }\n\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n ;(this as any)[DEVIX_ERROR_BRAND] = true\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAQ,aAAAA,MAA0C,QA4B/B,cAAAC,MAAA,oBAhBZ,IAAMC,EAAN,cAAiCF,CAAwB,CAC5D,MAAe,CAAE,MAAO,IAAK,EAE7B,OAAO,yBAAyBG,EAAqB,CACjD,OAAIA,aAAeC,EACR,CACH,MAAO,CAAC,WAAYD,EAAI,WAAY,QAASA,EAAI,OAAO,CAC5D,EAEI,CACJ,MAAO,CAAC,WAAY,IAAK,QAASA,aAAe,MAAQA,EAAI,QAAU,eAAe,CAC1F,CACJ,CAEA,QAAS,CACL,OAAI,KAAK,MAAM,OAAS,KAAK,MAAM,UACxBF,EAAC,KAAK,MAAM,UAAX,CAAsB,GAAG,KAAK,MAAM,MAAO,EAEnD,KAAK,MAAM,MACJA,EAAC,MAAI,cAAK,MAAM,MAAM,WAAW,EAErC,KAAK,MAAM,QACtB,CACJ,EAOMI,EAAoB,OAAO,IAAI,6BAA6B,EAErDD,EAAN,cAAyB,KAAM,CAKlC,OAAQ,OAAO,WAAW,EAAEE,EAAyB,CACjD,OAAOA,IAAU,MAAQ,OAAOA,GAAU,UAAaA,EAAcD,CAAiB,IAAM,EAChG,CAEA,WACA,KACA,KACA,YAAYE,EAAoBC,EAAiBC,EAA6B,CAC1E,MAAMD,CAAO,EACb,KAAK,KAAO,aACZ,KAAK,WAAaD,EAClB,KAAK,KAAOE,GAAS,KACrB,KAAK,KAAOA,GAAS,KACnB,KAAaJ,CAAiB,EAAI,EACxC,CACJ",
|
|
6
|
+
"names": ["Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "DEVIX_ERROR_BRAND", "value", "statusCode", "message", "options"]
|
|
7
7
|
}
|
package/dist/runtime/fetch.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare class FetchError<E = unknown> extends Error {
|
|
|
4
4
|
readonly statusText: string;
|
|
5
5
|
readonly response: Response;
|
|
6
6
|
readonly body?: E | undefined;
|
|
7
|
+
static [Symbol.hasInstance](value: unknown): boolean;
|
|
7
8
|
constructor(status: number, statusText: string, response: Response, body?: E | undefined);
|
|
8
9
|
get code(): string | undefined;
|
|
9
10
|
}
|
package/dist/runtime/fetch.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function u(e){if(e&&typeof e=="object"&&"message"in e){let t=e.message;if(typeof t=="string"&&t.length>0)return t}return null}var o=Symbol.for("@devlusoft/devix.FetchError"),s=class extends Error{constructor(n,r,c,i){super(u(i)??`HTTP ${n}: ${r}`);this.status=n;this.statusText=r;this.response=c;this.body=i;this.name="FetchError",this[o]=!0}static[Symbol.hasInstance](n){return n!==null&&typeof n=="object"&&n[o]===!0}get code(){if(this.body&&typeof this.body=="object"&&"code"in this.body){let n=this.body.code;return typeof n=="string"?n:void 0}}};export{s as FetchError};
|
|
2
2
|
//# sourceMappingURL=fetch.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/runtime/fetch.ts"],
|
|
4
|
-
"sourcesContent": ["export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\nfunction extractMessage(body: unknown): string | null {\n if (body && typeof body === 'object' && 'message' in body) {\n const m = (body as {message: unknown}).message\n if (typeof m === 'string' && m.length > 0) return m\n }\n return null\n}\n\nexport class FetchError<E = unknown> extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly response: Response,\n public readonly body?: E,\n ) {\n super(extractMessage(body) ?? `HTTP ${status}: ${statusText}`)\n this.name = 'FetchError'\n }\n\n get code(): string | undefined {\n if (this.body && typeof this.body === 'object' && 'code' in this.body) {\n const c = (this.body as {code: unknown}).code\n return typeof c === 'string' ? c : undefined\n }\n return undefined\n }\n}\n"],
|
|
5
|
-
"mappings": "AAEA,SAASA,EAAeC,EAA8B,CAClD,GAAIA,GAAQ,OAAOA,GAAS,UAAY,YAAaA,EAAM,CACvD,IAAMC,EAAKD,EAA4B,QACvC,GAAI,OAAOC,GAAM,UAAYA,EAAE,OAAS,EAAG,OAAOA,CACtD,CACA,OAAO,IACX,
|
|
6
|
-
"names": ["extractMessage", "body", "m", "FetchError", "status", "statusText", "response", "c"]
|
|
4
|
+
"sourcesContent": ["export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\nfunction extractMessage(body: unknown): string | null {\n if (body && typeof body === 'object' && 'message' in body) {\n const m = (body as {message: unknown}).message\n if (typeof m === 'string' && m.length > 0) return m\n }\n return null\n}\n\nconst FETCH_ERROR_BRAND = Symbol.for('@devlusoft/devix.FetchError')\n\nexport class FetchError<E = unknown> extends Error {\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[FETCH_ERROR_BRAND] === true\n }\n\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly response: Response,\n public readonly body?: E,\n ) {\n super(extractMessage(body) ?? `HTTP ${status}: ${statusText}`)\n this.name = 'FetchError'\n ;(this as any)[FETCH_ERROR_BRAND] = true\n }\n\n get code(): string | undefined {\n if (this.body && typeof this.body === 'object' && 'code' in this.body) {\n const c = (this.body as {code: unknown}).code\n return typeof c === 'string' ? c : undefined\n }\n return undefined\n }\n}\n"],
|
|
5
|
+
"mappings": "AAEA,SAASA,EAAeC,EAA8B,CAClD,GAAIA,GAAQ,OAAOA,GAAS,UAAY,YAAaA,EAAM,CACvD,IAAMC,EAAKD,EAA4B,QACvC,GAAI,OAAOC,GAAM,UAAYA,EAAE,OAAS,EAAG,OAAOA,CACtD,CACA,OAAO,IACX,CAEA,IAAMC,EAAoB,OAAO,IAAI,6BAA6B,EAErDC,EAAN,cAAsC,KAAM,CAK/C,YACoBC,EACAC,EACAC,EACAN,EAClB,CACE,MAAMD,EAAeC,CAAI,GAAK,QAAQI,CAAM,KAAKC,CAAU,EAAE,EAL7C,YAAAD,EACA,gBAAAC,EACA,cAAAC,EACA,UAAAN,EAGhB,KAAK,KAAO,aACV,KAAaE,CAAiB,EAAI,EACxC,CAbA,OAAQ,OAAO,WAAW,EAAEK,EAAyB,CACjD,OAAOA,IAAU,MAAQ,OAAOA,GAAU,UAAaA,EAAcL,CAAiB,IAAM,EAChG,CAaA,IAAI,MAA2B,CAC3B,GAAI,KAAK,MAAQ,OAAO,KAAK,MAAS,UAAY,SAAU,KAAK,KAAM,CACnE,IAAMM,EAAK,KAAK,KAAyB,KACzC,OAAO,OAAOA,GAAM,SAAWA,EAAI,MACvC,CAEJ,CACJ",
|
|
6
|
+
"names": ["extractMessage", "body", "m", "FETCH_ERROR_BRAND", "FetchError", "status", "statusText", "response", "value", "c"]
|
|
7
7
|
}
|
package/dist/runtime/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useCallback as U,useContext as M,useEffect as he,useRef as Q,useState as se}from"react";import{Fragment as re,jsx as L}from"react/jsx-runtime";function ge(e,t){let n=[];e.title&&n.push({tag:"title",children:e.title}),e.description&&n.push({tag:"meta",name:"description",content:e.description}),e.keywords?.length&&n.push({tag:"meta",name:"keywords",content:e.keywords.join(", ")});let r=e.og?.title??e.title;r&&n.push({tag:"meta",property:"og:title",content:r});let a=e.og?.description??e.description;a&&n.push({tag:"meta",property:"og:description",content:a}),e.og?.image&&n.push({tag:"meta",property:"og:image",content:e.og.image}),e.og?.type&&n.push({tag:"meta",property:"og:type",content:e.og.type}),e.og?.url&&n.push({tag:"meta",property:"og:url",content:e.og.url});let i=e.twitter?.title??e.title;i&&n.push({tag:"meta",name:"twitter:title",content:i});let y=e.twitter?.description??e.description;if(y&&n.push({tag:"meta",name:"twitter:description",content:y}),e.twitter?.card&&n.push({tag:"meta",name:"twitter:card",content:e.twitter.card}),e.twitter?.image&&n.push({tag:"meta",name:"twitter:image",content:e.twitter.image}),e.twitter?.creator&&n.push({tag:"meta",name:"twitter:creator",content:e.twitter.creator}),e.canonical&&n.push({tag:"link",rel:"canonical",href:e.canonical}),e.robots&&n.push({tag:"meta",name:"robots",content:e.robots}),e.alternates)for(let[p,s]of Object.entries(e.alternates))n.push({tag:"link",rel:"alternate",href:s,hrefLang:p});if(e.icons){let p=Array.isArray(e.icons)?e.icons:[e.icons];for(let s of p){let f=typeof s=="string"?{href:s}:s;n.push({tag:"link",rel:f.rel??"icon",href:f.href,...f.type&&{type:f.type},...f.sizes&&{sizes:f.sizes}})}}if(t){let p=[];t.width!==void 0&&p.push(`width=${t.width}`),t.initialScale!==void 0&&p.push(`initial-scale=${t.initialScale}`),t.maximumScale!==void 0&&p.push(`maximum-scale=${t.maximumScale}`),t.userScalable!==void 0&&p.push(`user-scalable=${t.userScalable?"yes":"no"}`),p.length&&n.push({tag:"meta",name:"viewport",content:p.join(", ")}),t.themeColor&&n.push({tag:"meta",name:"theme-color",content:t.themeColor})}return n}function ne({metadata:e,viewport:t}){return typeof window>"u"||!e?null:L(re,{children:ye(e,t)})}function ye(e,t){let n=ge(e,t);return L(re,{children:n.map((r,a)=>r.tag==="title"?L("title",{children:r.children},a):r.tag==="link"?L("link",{rel:r.rel,href:r.href,hrefLang:r.hrefLang,type:r.type,sizes:r.sizes},a):L("meta",{name:r.name,property:r.property,content:r.content},a))})}import{createContext as Y}from"react";var D=globalThis;D.__devix_RouterContext__??=Y(null);var T=D.__devix_RouterContext__;D.__devix_PageMetaContext__??=Y(null);D.__devix_RouteDataContext__??=Y(null);var oe=D.__devix_PageMetaContext__,B=D.__devix_RouteDataContext__;import{Component as me}from"react";import{jsx as ae}from"react/jsx-runtime";var G=class extends me{state={error:null};static getDerivedStateFromError(t){return t instanceof K?{error:{statusCode:t.statusCode,message:t.message}}:{error:{statusCode:500,message:t instanceof Error?t.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?ae(this.props.ErrorPage,{...this.state.error}):this.state.error?ae("h1",{children:this.state.error.statusCode}):this.props.children}},K=class extends Error{statusCode;code;data;constructor(t,n,r){super(n),this.name="DevixError",this.statusCode=t,this.code=r?.code,this.data=r?.data}};function O(e){let t=new URL(window.location.href);t.pathname.endsWith("/")||(t.pathname+="/");let n=new URL(e,t);if(n.origin!==window.location.origin)return{kind:"external",url:n};let r=n.pathname.length>1?n.pathname.replace(/\/$/,""):n.pathname;return{kind:"internal",pathname:r,href:r+n.search+n.hash}}import{jsx as x,jsxs as De}from"react/jsx-runtime";var xe={width:"device-width",initialScale:1};function Re(){return M(T)}var we=()=>Promise.resolve(),Te=()=>Promise.resolve();function Pe(){return M(T)?.navigate??we}function Ce(){return M(T)?.revalidate??Te}function Ee(){let e=M(B);if(!e)throw new Error("useParams must be used within a route or layout");return e.params}function ve(){let e=M(B);if(!e)throw new Error("useLoaderData must be used within a route or layout");return e.loaderData}function ke(){let e=M(T);if(!e)throw new Error("useGuardData must be used within a route or layout");return e.guardData}function be({initialData:e,initialParams:t,initialPage:n,initialLayouts:r=[],initialLayoutsData:a=[],initialGuardData:i=null,initialMeta:y,initialViewport:p,initialError:s,initialErrorPage:f,clientEntry:F,matchClientRoute:v,loadErrorPage:P,getDefaultErrorPage:J}){let[o,k]=se({pathname:window.location.pathname,params:t,loaderData:e,layoutsData:a,guardData:i,Page:n,layouts:r,metadata:y??null,viewport:p,pendingError:s,ErrorPage:f}),j=Q(null),[ue,Z]=se(!1),S=Q(new Map),le=U(u=>{let l=O(u);if(l.kind==="external")return;let c=l.href;if(S.current.has(c))return;let d=v(l.pathname);if(!d)return;let g=new AbortController,h=Promise.all([Promise.all([d.load(),...d.loadLayouts.map(R=>R())]),fetch(`/_data${c}`,{headers:{Accept:"application/json"},signal:g.signal})]).then(async([[R,...m],H])=>{if(!H.ok||!R.default)return null;let I=await H.json();return{pageMod:R,layoutMods:m,data:I}}).catch(()=>null),_=setTimeout(()=>{g.abort(),S.current.delete(c)},3e3);h.finally(()=>clearTimeout(_)),S.current.set(c,{promise:h,controller:g})},[]),A=U(async(u,l)=>{let c=u.split("?")[0].split("#")[0],d=v(c);if(!d){let w=await P()??J();k(q=>({...q,pathname:c,pendingError:{statusCode:404,message:"Not found"},ErrorPage:w??void 0}));return}let g=S.current.get(u);g&&S.current.delete(u);let h=g?await g.promise:null;if(l.signal.aborted)return;let _,R,m;if(h)({pageMod:_,layoutMods:R,data:m}=h);else{let[[w,...q],C]=await Promise.all([Promise.all([d.load(),...d.loadLayouts.map($=>$())]),fetch(`/_data${u}`,{headers:{Accept:"application/json"},signal:l.signal})]);if(l.signal.aborted||!w.default)return;if(!C.ok){let $=C.headers.get("Content-Type")??"",b=null;try{$.includes("application/json")?b=await C.json():$.includes("text/plain")&&(b={message:await C.text()})}catch{}let te={};C.headers.forEach((X,fe)=>{te[fe]=X});let pe=await P()??J();k(X=>({...X,pathname:c,pendingError:{statusCode:b?.statusCode??C.status,message:b?.message??"Server error",code:b?.code,data:b?.data,headers:te},ErrorPage:pe??void 0}));return}_=w,R=q,m=await C.json()}if(m.redirect){m.redirectReplace?window.history.replaceState(null,"",m.redirect):window.history.pushState(null,"",m.redirect),await A(m.redirect,l);return}k({pathname:c,params:m.params??{},loaderData:m.loaderData,layoutsData:(m.layouts??[]).map(w=>w.loaderData),guardData:m.guardData??null,Page:_.default,layouts:R.map(w=>w.default),metadata:m.metadata??null,viewport:m.viewport??xe});let H=u.includes("#")?u.split("#")[1]:null,I=getComputedStyle(document.documentElement).scrollBehavior;H?requestAnimationFrame(()=>{document.getElementById(H)?.scrollIntoView({behavior:I})}):window.scrollTo({top:0,behavior:I})},[]),z=U(async(u,l)=>{let c=O(u);if(c.kind==="external"){window.location.href=c.url.href;return}let d=c.href;j.current?.abort();let g=new AbortController;j.current=g,Z(!0);let h=async()=>{window.history[l?.replace?"replaceState":"pushState"](null,"",d),await A(d,g)};try{l?.viewTransition&&"startViewTransition"in document?await document.startViewTransition(h).finished:await h()}finally{g.signal.aborted||Z(!1)}},[A]),ee=Q(null),ce=U(async()=>{ee.current?.abort();let u=new AbortController;ee.current=u;let l=window.location.pathname+window.location.search,c;try{c=await fetch(`/_data${l}`,{headers:{Accept:"application/json"},signal:u.signal})}catch(g){if(g.name==="AbortError")return;throw g}if(u.signal.aborted||!c.ok)return;let d=await c.json();if(!u.signal.aborted){if(d.redirect){await z(d.redirect,{replace:d.redirectReplace});return}k(g=>({...g,loaderData:d.loaderData,layoutsData:(d.layouts??[]).map(h=>h.loaderData),guardData:d.guardData??null,params:d.params??g.params,metadata:d.metadata??g.metadata,viewport:d.viewport??g.viewport}))}},[z]);he(()=>{let u=()=>{j.current?.abort();let l=new AbortController;j.current=l;let c=window.location.pathname+window.location.search;A(c,l).catch(d=>{d.name!=="AbortError"&&console.error("[router] popstate error:",d)})};return window.addEventListener("popstate",u),()=>window.removeEventListener("popstate",u)},[A]);let W;if(o.pendingError)W=o.ErrorPage?x(o.ErrorPage,{...o.pendingError}):x("h1",{children:o.pendingError.statusCode});else{let u=x(B,{value:{loaderData:o.loaderData,params:o.params},children:x(o.Page,{data:o.loaderData,params:o.params,url:o.pathname})});for(let l=o.layouts.length-1;l>=0;l--){let c=o.layouts[l],d=o.layoutsData[l];u=x(B,{value:{loaderData:d,params:o.params},children:x(c,{data:d,params:o.params,children:u})})}W=x(G,{ErrorPage:o.ErrorPage,children:u},o.pathname)}return De(oe,{value:{metadata:o.metadata,viewport:o.viewport,clientEntry:F},children:[x(ne,{metadata:o.metadata,viewport:o.viewport}),x(T,{value:{...o,isNavigating:ue,navigate:z,revalidate:ce,prefetchRoute:le},children:W})]})}import{useCallback as N,useContext as Me,useRef as Se}from"react";import{jsx as _e}from"react/jsx-runtime";function Ae({href:e,prefetch:t="hover",replace:n=!1,viewTransition:r=!1,children:a,...i}){let y=Me(T),p=Se(null),s=N(()=>{p.current!==null&&(clearTimeout(p.current),p.current=null)},[]),f=N(()=>{!y||t==="none"||y.prefetchRoute(e)},[e,t,y]),F=N(()=>{t!=="none"&&(p.current=setTimeout(f,50))},[t,f]),v=N(()=>{s()},[s]),P=N(()=>{s(),f()},[s,f]);return _e("a",{href:e,onClick:o=>{if(s(),!y||o.ctrlKey||o.metaKey||o.shiftKey||o.button!==0||O(e).kind==="external")return;o.preventDefault();let k={replace:n,viewTransition:r};y.navigate(e,k)},onMouseEnter:F,onMouseLeave:v,onTouchStart:P,...i,children:a})}function He(e,t){let n=e.headers.get("cookie");if(n)for(let r of n.split(";")){let[a,...i]=r.trim().split("=");if(a.trim()===t)return decodeURIComponent(i.join("="))}}function ie(e,t,n,r={}){let a=`${t}=${encodeURIComponent(n)}; Path=${r.path??"/"}`;r.domain&&(a+=`; Domain=${r.domain}`),r.maxAge!==void 0&&(a+=`; Max-Age=${r.maxAge}`),r.expires&&(a+=`; Expires=${r.expires.toUTCString()}`),r.httpOnly&&(a+="; HttpOnly"),r.secure&&(a+="; Secure"),r.sameSite&&(a+=`; SameSite=${r.sameSite}`),e.append("Set-Cookie",a)}function Le(e,t,n={}){ie(e,t,"",{...n,maxAge:0,expires:new Date(0)})}function Be(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var Oe=(e,t=200)=>new Response(e,{status:t,headers:{"Content-Type":"text/plain; charset=utf-8"}}),Ne=Symbol.for("devix.redirect");function Ve(e,t){let n=typeof t=="number"?t:t?.status??302,r=typeof t=="object"?t?.replace??!1:!1;return{[Ne]:!0,url:e,status:n,replace:r}}var Fe=Symbol.for("devix.loaderError");function je(e,t,n){return{[Fe]:!0,statusCode:e,message:t,code:n?.code,data:n?.data}}var de="__devix_handler__";function Ie(e,t){return t?{[de]:!0,fn:t,schema:e}:{[de]:!0,fn:e}}function $e(e){if(e&&typeof e=="object"&&"message"in e){let t=e.message;if(typeof t=="string"&&t.length>0)return t}return null}var E=class extends Error{constructor(n,r,a,i){super($e(i)??`HTTP ${n}: ${r}`);this.status=n;this.statusText=r;this.response=a;this.body=i;this.name="FetchError"}get code(){if(this.body&&typeof this.body=="object"&&"code"in this.body){let n=this.body.code;return typeof n=="string"?n:void 0}}};var Ge="/_devix/server";async function V(e,t,n,r,a){let i=new Headers(a?.headers),y;r!=null&&(r instanceof FormData||r instanceof Blob||r instanceof ArrayBuffer?y=r:(y=JSON.stringify(r),i.has("Content-Type")||i.set("Content-Type","application/json")));let p=`${Ge}/${e}${n}`,s=await fetch(p,{method:t,headers:i,body:y,signal:a?.signal}),f=s.status===204||s.headers.get("Content-Length")==="0";if(!s.ok){let v=s.headers.get("Content-Type")??"",P;if(!f&&v.includes("application/json"))try{P=await s.json()}catch{}throw new E(s.status,s.statusText,s,P)}return f?null:(s.headers.get("Content-Type")??"").includes("application/json")?await s.json():await s.text()}function Ke(e){return{get:(t,n)=>V(e,"GET",t,void 0,n),post:(t,n,r)=>V(e,"POST",t,n,r),put:(t,n,r)=>V(e,"PUT",t,n,r),patch:(t,n,r)=>V(e,"PATCH",t,n,r),delete:(t,n)=>V(e,"DELETE",t,void 0,n)}}var Ue=new Proxy({},{get(e,t){if(typeof t=="string")return e[t]||(e[t]=Ke(t)),e[t]}});async function Mt(e,t){let n=t?.method??"GET",r=new Headers(t?.headers),a;t?.body!==void 0&&(t.body instanceof FormData||t.body instanceof Blob||t.body instanceof ArrayBuffer?a=t.body:(a=JSON.stringify(t.body),r.has("Content-Type")||r.set("Content-Type","application/json")));let i=await fetch(e,{method:n,headers:r,body:a,signal:t?.signal}),y=i.status===204||i.headers.get("Content-Length")==="0";if(!i.ok){let s=i.headers.get("Content-Type")??"",f;if(!y&&s.includes("application/json"))try{f=await i.json()}catch{}throw new E(i.status,i.statusText,i,f)}return y?null:(i.headers.get("Content-Type")??"").includes("application/json")?i.json():i.text()}export{Mt as $fetch,Ue as $server,K as DevixError,E as FetchError,Ae as Link,be as RouterProvider,Ie as createHandler,Le as deleteCookie,je as error,He as getCookie,Be as json,Ve as redirect,ie as setCookie,Oe as text,ke as useGuardData,ve as useLoaderData,Pe as useNavigate,Ee as useParams,Ce as useRevalidate,Re as useRouter};
|
|
1
|
+
import{useCallback as U,useContext as M,useEffect as Re,useRef as Q,useState as ie}from"react";import{Fragment as re,jsx as B}from"react/jsx-runtime";function me(e,t){let n=[];e.title&&n.push({tag:"title",children:e.title}),e.description&&n.push({tag:"meta",name:"description",content:e.description}),e.keywords?.length&&n.push({tag:"meta",name:"keywords",content:e.keywords.join(", ")});let r=e.og?.title??e.title;r&&n.push({tag:"meta",property:"og:title",content:r});let a=e.og?.description??e.description;a&&n.push({tag:"meta",property:"og:description",content:a}),e.og?.image&&n.push({tag:"meta",property:"og:image",content:e.og.image}),e.og?.type&&n.push({tag:"meta",property:"og:type",content:e.og.type}),e.og?.url&&n.push({tag:"meta",property:"og:url",content:e.og.url});let i=e.twitter?.title??e.title;i&&n.push({tag:"meta",name:"twitter:title",content:i});let y=e.twitter?.description??e.description;if(y&&n.push({tag:"meta",name:"twitter:description",content:y}),e.twitter?.card&&n.push({tag:"meta",name:"twitter:card",content:e.twitter.card}),e.twitter?.image&&n.push({tag:"meta",name:"twitter:image",content:e.twitter.image}),e.twitter?.creator&&n.push({tag:"meta",name:"twitter:creator",content:e.twitter.creator}),e.canonical&&n.push({tag:"link",rel:"canonical",href:e.canonical}),e.robots&&n.push({tag:"meta",name:"robots",content:e.robots}),e.alternates)for(let[p,s]of Object.entries(e.alternates))n.push({tag:"link",rel:"alternate",href:s,hrefLang:p});if(e.icons){let p=Array.isArray(e.icons)?e.icons:[e.icons];for(let s of p){let f=typeof s=="string"?{href:s}:s;n.push({tag:"link",rel:f.rel??"icon",href:f.href,...f.type&&{type:f.type},...f.sizes&&{sizes:f.sizes}})}}if(t){let p=[];t.width!==void 0&&p.push(`width=${t.width}`),t.initialScale!==void 0&&p.push(`initial-scale=${t.initialScale}`),t.maximumScale!==void 0&&p.push(`maximum-scale=${t.maximumScale}`),t.userScalable!==void 0&&p.push(`user-scalable=${t.userScalable?"yes":"no"}`),p.length&&n.push({tag:"meta",name:"viewport",content:p.join(", ")}),t.themeColor&&n.push({tag:"meta",name:"theme-color",content:t.themeColor})}return n}function ne({metadata:e,viewport:t}){return typeof window>"u"||!e?null:B(re,{children:he(e,t)})}function he(e,t){let n=me(e,t);return B(re,{children:n.map((r,a)=>r.tag==="title"?B("title",{children:r.children},a):r.tag==="link"?B("link",{rel:r.rel,href:r.href,hrefLang:r.hrefLang,type:r.type,sizes:r.sizes},a):B("meta",{name:r.name,property:r.property,content:r.content},a))})}import{createContext as Y}from"react";var D=globalThis;D.__devix_RouterContext__??=Y(null);var T=D.__devix_RouterContext__;D.__devix_PageMetaContext__??=Y(null);D.__devix_RouteDataContext__??=Y(null);var oe=D.__devix_PageMetaContext__,L=D.__devix_RouteDataContext__;import{Component as xe}from"react";import{jsx as se}from"react/jsx-runtime";var G=class extends xe{state={error:null};static getDerivedStateFromError(t){return t instanceof K?{error:{statusCode:t.statusCode,message:t.message}}:{error:{statusCode:500,message:t instanceof Error?t.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?se(this.props.ErrorPage,{...this.state.error}):this.state.error?se("h1",{children:this.state.error.statusCode}):this.props.children}},ae=Symbol.for("@devlusoft/devix.DevixError"),K=class extends Error{static[Symbol.hasInstance](t){return t!==null&&typeof t=="object"&&t[ae]===!0}statusCode;code;data;constructor(t,n,r){super(n),this.name="DevixError",this.statusCode=t,this.code=r?.code,this.data=r?.data,this[ae]=!0}};function O(e){let t=new URL(window.location.href);t.pathname.endsWith("/")||(t.pathname+="/");let n=new URL(e,t);if(n.origin!==window.location.origin)return{kind:"external",url:n};let r=n.pathname.length>1?n.pathname.replace(/\/$/,""):n.pathname;return{kind:"internal",pathname:r,href:r+n.search+n.hash}}import{jsx as x,jsxs as Se}from"react/jsx-runtime";var we={width:"device-width",initialScale:1};function Te(){return M(T)}var Pe=()=>Promise.resolve(),Ce=()=>Promise.resolve();function Ee(){return M(T)?.navigate??Pe}function ve(){return M(T)?.revalidate??Ce}function ke(){let e=M(L);if(!e)throw new Error("useParams must be used within a route or layout");return e.params}function be(){let e=M(L);if(!e)throw new Error("useLoaderData must be used within a route or layout");return e.loaderData}function De(){let e=M(T);if(!e)throw new Error("useGuardData must be used within a route or layout");return e.guardData}function Me({initialData:e,initialParams:t,initialPage:n,initialLayouts:r=[],initialLayoutsData:a=[],initialGuardData:i=null,initialMeta:y,initialViewport:p,initialError:s,initialErrorPage:f,clientEntry:F,matchClientRoute:v,loadErrorPage:P,getDefaultErrorPage:J}){let[o,k]=ie({pathname:window.location.pathname,params:t,loaderData:e,layoutsData:a,guardData:i,Page:n,layouts:r,metadata:y??null,viewport:p,pendingError:s,ErrorPage:f}),I=Q(null),[ce,Z]=ie(!1),S=Q(new Map),pe=U(d=>{let l=O(d);if(l.kind==="external")return;let c=l.href;if(S.current.has(c))return;let u=v(l.pathname);if(!u)return;let g=new AbortController,h=Promise.all([Promise.all([u.load(),...u.loadLayouts.map(R=>R())]),fetch(`/_data${c}`,{headers:{Accept:"application/json"},signal:g.signal})]).then(async([[R,...m],H])=>{if(!H.ok||!R.default)return null;let j=await H.json();return{pageMod:R,layoutMods:m,data:j}}).catch(()=>null),_=setTimeout(()=>{g.abort(),S.current.delete(c)},3e3);h.finally(()=>clearTimeout(_)),S.current.set(c,{promise:h,controller:g})},[]),A=U(async(d,l)=>{let c=d.split("?")[0].split("#")[0],u=v(c);if(!u){let w=await P()??J();k(X=>({...X,pathname:c,pendingError:{statusCode:404,message:"Not found"},ErrorPage:w??void 0}));return}let g=S.current.get(d);g&&S.current.delete(d);let h=g?await g.promise:null;if(l.signal.aborted)return;let _,R,m;if(h)({pageMod:_,layoutMods:R,data:m}=h);else{let[[w,...X],C]=await Promise.all([Promise.all([u.load(),...u.loadLayouts.map($=>$())]),fetch(`/_data${d}`,{headers:{Accept:"application/json"},signal:l.signal})]);if(l.signal.aborted||!w.default)return;if(!C.ok){let $=C.headers.get("Content-Type")??"",b=null;try{$.includes("application/json")?b=await C.json():$.includes("text/plain")&&(b={message:await C.text()})}catch{}let te={};C.headers.forEach((q,ye)=>{te[ye]=q});let ge=await P()??J();k(q=>({...q,pathname:c,pendingError:{statusCode:b?.statusCode??C.status,message:b?.message??"Server error",code:b?.code,data:b?.data,headers:te},ErrorPage:ge??void 0}));return}_=w,R=X,m=await C.json()}if(m.redirect){m.redirectReplace?window.history.replaceState(null,"",m.redirect):window.history.pushState(null,"",m.redirect),await A(m.redirect,l);return}k({pathname:c,params:m.params??{},loaderData:m.loaderData,layoutsData:(m.layouts??[]).map(w=>w.loaderData),guardData:m.guardData??null,Page:_.default,layouts:R.map(w=>w.default),metadata:m.metadata??null,viewport:m.viewport??we});let H=d.includes("#")?d.split("#")[1]:null,j=getComputedStyle(document.documentElement).scrollBehavior;H?requestAnimationFrame(()=>{document.getElementById(H)?.scrollIntoView({behavior:j})}):window.scrollTo({top:0,behavior:j})},[]),z=U(async(d,l)=>{let c=O(d);if(c.kind==="external"){window.location.href=c.url.href;return}let u=c.href;I.current?.abort();let g=new AbortController;I.current=g,Z(!0);let h=async()=>{window.history[l?.replace?"replaceState":"pushState"](null,"",u),await A(u,g)};try{l?.viewTransition&&"startViewTransition"in document?await document.startViewTransition(h).finished:await h()}finally{g.signal.aborted||Z(!1)}},[A]),ee=Q(null),fe=U(async()=>{ee.current?.abort();let d=new AbortController;ee.current=d;let l=window.location.pathname+window.location.search,c;try{c=await fetch(`/_data${l}`,{headers:{Accept:"application/json"},signal:d.signal})}catch(g){if(g.name==="AbortError")return;throw g}if(d.signal.aborted||!c.ok)return;let u=await c.json();if(!d.signal.aborted){if(u.redirect){await z(u.redirect,{replace:u.redirectReplace});return}k(g=>({...g,loaderData:u.loaderData,layoutsData:(u.layouts??[]).map(h=>h.loaderData),guardData:u.guardData??null,params:u.params??g.params,metadata:u.metadata??g.metadata,viewport:u.viewport??g.viewport}))}},[z]);Re(()=>{let d=()=>{I.current?.abort();let l=new AbortController;I.current=l;let c=window.location.pathname+window.location.search;A(c,l).catch(u=>{u.name!=="AbortError"&&console.error("[router] popstate error:",u)})};return window.addEventListener("popstate",d),()=>window.removeEventListener("popstate",d)},[A]);let W;if(o.pendingError)W=o.ErrorPage?x(o.ErrorPage,{...o.pendingError}):x("h1",{children:o.pendingError.statusCode});else{let d=x(L,{value:{loaderData:o.loaderData,params:o.params},children:x(o.Page,{data:o.loaderData,params:o.params,url:o.pathname})});for(let l=o.layouts.length-1;l>=0;l--){let c=o.layouts[l],u=o.layoutsData[l];d=x(L,{value:{loaderData:u,params:o.params},children:x(c,{data:u,params:o.params,children:d})})}W=x(G,{ErrorPage:o.ErrorPage,children:d},o.pathname)}return Se(oe,{value:{metadata:o.metadata,viewport:o.viewport,clientEntry:F},children:[x(ne,{metadata:o.metadata,viewport:o.viewport}),x(T,{value:{...o,isNavigating:ce,navigate:z,revalidate:fe,prefetchRoute:pe},children:W})]})}import{useCallback as N,useContext as Ae,useRef as _e}from"react";import{jsx as Be}from"react/jsx-runtime";function He({href:e,prefetch:t="hover",replace:n=!1,viewTransition:r=!1,children:a,...i}){let y=Ae(T),p=_e(null),s=N(()=>{p.current!==null&&(clearTimeout(p.current),p.current=null)},[]),f=N(()=>{!y||t==="none"||y.prefetchRoute(e)},[e,t,y]),F=N(()=>{t!=="none"&&(p.current=setTimeout(f,50))},[t,f]),v=N(()=>{s()},[s]),P=N(()=>{s(),f()},[s,f]);return Be("a",{href:e,onClick:o=>{if(s(),!y||o.ctrlKey||o.metaKey||o.shiftKey||o.button!==0||O(e).kind==="external")return;o.preventDefault();let k={replace:n,viewTransition:r};y.navigate(e,k)},onMouseEnter:F,onMouseLeave:v,onTouchStart:P,...i,children:a})}function Le(e,t){let n=e.headers.get("cookie");if(n)for(let r of n.split(";")){let[a,...i]=r.trim().split("=");if(a.trim()===t)return decodeURIComponent(i.join("="))}}function ue(e,t,n,r={}){let a=`${t}=${encodeURIComponent(n)}; Path=${r.path??"/"}`;r.domain&&(a+=`; Domain=${r.domain}`),r.maxAge!==void 0&&(a+=`; Max-Age=${r.maxAge}`),r.expires&&(a+=`; Expires=${r.expires.toUTCString()}`),r.httpOnly&&(a+="; HttpOnly"),r.secure&&(a+="; Secure"),r.sameSite&&(a+=`; SameSite=${r.sameSite}`),e.append("Set-Cookie",a)}function Oe(e,t,n={}){ue(e,t,"",{...n,maxAge:0,expires:new Date(0)})}function Ne(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var Ve=(e,t=200)=>new Response(e,{status:t,headers:{"Content-Type":"text/plain; charset=utf-8"}}),Fe=Symbol.for("devix.redirect");function Ie(e,t){let n=typeof t=="number"?t:t?.status??302,r=typeof t=="object"?t?.replace??!1:!1;return{[Fe]:!0,url:e,status:n,replace:r}}var je=Symbol.for("devix.loaderError");function $e(e,t,n){return{[je]:!0,statusCode:e,message:t,code:n?.code,data:n?.data}}var de="__devix_handler__";function Ge(e,t){return t?{[de]:!0,fn:t,schema:e}:{[de]:!0,fn:e}}function Ke(e){if(e&&typeof e=="object"&&"message"in e){let t=e.message;if(typeof t=="string"&&t.length>0)return t}return null}var le=Symbol.for("@devlusoft/devix.FetchError"),E=class extends Error{constructor(n,r,a,i){super(Ke(i)??`HTTP ${n}: ${r}`);this.status=n;this.statusText=r;this.response=a;this.body=i;this.name="FetchError",this[le]=!0}static[Symbol.hasInstance](n){return n!==null&&typeof n=="object"&&n[le]===!0}get code(){if(this.body&&typeof this.body=="object"&&"code"in this.body){let n=this.body.code;return typeof n=="string"?n:void 0}}};var Ue="/_devix/server";async function V(e,t,n,r,a){let i=new Headers(a?.headers),y;r!=null&&(r instanceof FormData||r instanceof Blob||r instanceof ArrayBuffer?y=r:(y=JSON.stringify(r),i.has("Content-Type")||i.set("Content-Type","application/json")));let p=`${Ue}/${e}${n}`,s=await fetch(p,{method:t,headers:i,body:y,signal:a?.signal}),f=s.status===204||s.headers.get("Content-Length")==="0";if(!s.ok){let v=s.headers.get("Content-Type")??"",P;if(!f&&v.includes("application/json"))try{P=await s.json()}catch{}throw new E(s.status,s.statusText,s,P)}return f?null:(s.headers.get("Content-Type")??"").includes("application/json")?await s.json():await s.text()}function Je(e){return{get:(t,n)=>V(e,"GET",t,void 0,n),post:(t,n,r)=>V(e,"POST",t,n,r),put:(t,n,r)=>V(e,"PUT",t,n,r),patch:(t,n,r)=>V(e,"PATCH",t,n,r),delete:(t,n)=>V(e,"DELETE",t,void 0,n)}}var ze=new Proxy({},{get(e,t){if(typeof t=="string")return e[t]||(e[t]=Je(t)),e[t]}});async function At(e,t){let n=t?.method??"GET",r=new Headers(t?.headers),a;t?.body!==void 0&&(t.body instanceof FormData||t.body instanceof Blob||t.body instanceof ArrayBuffer?a=t.body:(a=JSON.stringify(t.body),r.has("Content-Type")||r.set("Content-Type","application/json")));let i=await fetch(e,{method:n,headers:r,body:a,signal:t?.signal}),y=i.status===204||i.headers.get("Content-Length")==="0";if(!i.ok){let s=i.headers.get("Content-Type")??"",f;if(!y&&s.includes("application/json"))try{f=await i.json()}catch{}throw new E(i.status,i.statusText,i,f)}return y?null:(i.headers.get("Content-Type")??"").includes("application/json")?i.json():i.text()}export{At as $fetch,ze as $server,K as DevixError,E as FetchError,He as Link,Me as RouterProvider,Ge as createHandler,Oe as deleteCookie,$e as error,Le as getCookie,Ne as json,Ie as redirect,ue as setCookie,Ve as text,De as useGuardData,be as useLoaderData,Ee as useNavigate,ke as useParams,ve as useRevalidate,Te as useRouter};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|