@bobtail.software/b-ssr 1.0.44 → 1.0.46

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.
@@ -1 +1 @@
1
- "use strict";var O=Object.create;var v=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var P=(e,s)=>{for(var l in s)v(e,l,{get:s[l],enumerable:!0})},w=(e,s,l,p)=>{if(s&&typeof s=="object"||typeof s=="function")for(let d of I(s))!G.call(e,d)&&d!==l&&v(e,d,{get:()=>s[d],enumerable:!(p=D(s,d))||p.enumerable});return e};var y=(e,s,l)=>(l=e!=null?O(k(e)):{},w(s||!e||!e.__esModule?v(l,"default",{value:e,enumerable:!0}):l,e)),C=e=>w(v({},"__esModule",{value:!0}),e);var b={};P(b,{default:()=>$});module.exports=C(b);var M=require("@fastify/multipart"),E=y(require("fastify-plugin"),1),T=require("fs/promises"),R=y(require("path"),1),g=async(e,s)=>{if(!e.isMultipart())return s.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let l=e.parts(),p={};for await(let d of l)if(d.type==="field")p[d.fieldname]=d.value;else{let F=Symbol.for("file-stream");e[F]=d}e.body=p},A=async(e,s)=>{let l=r=>{if(s.errorHandler){let a=s.errorHandler(r);if(a)return a}return{message:"Internal Server Error",statusCode:500}};if(e.hasDecorator("viteInitDone")&&e.viteInitDone)return;if(!e.hasDecorator("multipartErrors"))try{let r=await import("@fastify/multipart");await e.register(r.default)}catch(r){if(r.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw r}let p=process.env.NODE_ENV==="production",d;if(p){if(s.clientDistDir){let r=R.default.resolve(s.root,s.clientDistDir);if(s.serveStaticAssets!==!1)try{let u=await import("@fastify/static");await e.register(u.default,{root:r,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Plugin is serving static assets from: ${r}`)}catch(u){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",u)}let a=R.default.resolve(r,".vite/manifest.json");try{d=JSON.parse(await(0,T.readFile)(a,"utf-8"))}catch{let n=R.default.resolve(r,"manifest.json");try{d=JSON.parse(await(0,T.readFile)(n,"utf-8"))}catch{console.error(`\u274C [Fastify-SSR] Failed to load manifest.json from ${a} or ${n}. Client assets will not load.`)}}}}else{if(!e.hasDecorator("use"))try{let n=await import("@fastify/middie");await e.register(n.default,{hook:"onRequest"})}catch(n){if(n.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw n}let r=await import("vite"),a=s.viteConfig||{},u=await r.createServer({root:s.root,appType:"custom",...a,server:{hmr:{port:24678},...a.server,middlewareMode:!0}});e.use(u.middlewares),e.hasDecorator("viteServer")||e.decorate("viteServer",u),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}e.decorate("viteInitDone",!0);let F=async(r,a,u)=>{try{let n=r.raw.url;if(R.default.extname(n)!==""){a.status(404).send(`File not found: ${n}`);return}let m=[],h=[],c="";if(!p&&e.viteServer){let t=await e.viteServer.transformIndexHtml(n,"<html><head></head><body></body></html>");c=t.substring(t.indexOf("<head>")+6,t.indexOf("</head>"))}else if(p&&d){let t=s.devClientEntryFile;t.startsWith("/")?t=t.substring(1):t.startsWith("./")&&(t=t.substring(2));let f=d[t];f?(m.push({rel:"modulepreload",as:"script",crossOrigin:"",href:`/${f.file}`}),f.css&&f.css.forEach(S=>{m.push({rel:"stylesheet",href:`/${S}`})}),h.push({type:"module",src:`/${f.file}`})):console.error(`\u274C [Fastify-SSR] Entry "${t}" not found in manifest.`)}let i=p?await import(R.default.resolve(s.root,s.prodEntryFile)):await e.viteServer.ssrLoadModule(s.devEntryFile),o=i.render||i.default;if(typeof o!="function")throw new Error(`Entry file ${s.devEntryFile} must export a 'render' function.`);await o({req:r,reply:a,head:c,manifestLinks:m,manifestScripts:h,data:u})}catch(n){e.viteServer?.ssrFixStacktrace(n),console.error("[SSR Error]:",n),a.sent||a.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(r,a){let{handler:u,schema:n,...m}=a,h=`/rpc${r}`,c={...m,schema:n};if(n?.consumes?.includes("multipart/form-data")){let o=c.preValidation;c.preValidation=o?Array.isArray(o)?[g,...o]:[g,o]:g}this.route({method:"POST",url:h,...c,handler:async(o,t)=>{try{let f=await u.call(this,o,t);return t.sent?void 0:f}catch(f){if(console.error(`[RPC Error] ${h}:`,f),!t.sent){let{statusCode:S,message:x}=l(f);t.status(S).send({error:{message:x}})}}}})}),e.decorate("addRenderRoute",function(r,a){let{handler:u,schema:n,...m}=a||{},h=async(c,i,o)=>{try{let t=await u?.call(this,c,i);return o?t:F(c,i,t)}catch(t){if(console.error(`[Render Error] ${r}:`,t),!i.sent){let{statusCode:f,message:S}=l(t);if(o)i.status(f).send({error:{message:S}});else return F(c,i,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:r,schema:n,...m,handler:(c,i)=>h(c,i,!1)}),r!=="*"&&r!=="/*"){this.route({method:"GET",url:`/loader${r}`,schema:n,...m,handler:(o,t)=>h(o,t,!0)});let c=r.endsWith("/")?"*":"/*",i=`${r}${c}`;this.route({method:"GET",url:i,schema:n,...m,handler:(o,t)=>h(o,t,!1)})}}),e.decorate("addLoaderRoute",function(r,a){let{handler:u,schema:n,...m}=a,h=`/api${r}`;this.route({method:"GET",url:h,schema:n,...m,handler:async(c,i)=>{try{let o=await u.call(this,c,i);return i.sent?void 0:o}catch(o){if(console.error(`[Loader API Error] ${h}:`,o),!i.sent){let{statusCode:t,message:f}=l(o);i.status(t).send({error:{message:f}})}}}})})},$=(0,E.default)(A,{name:"fastify-b-ssr"});
1
+ "use strict";var E=Object.create;var S=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var G=(e,r)=>{for(var d in r)S(e,d,{get:r[d],enumerable:!0})},T=(e,r,d,f)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of D(r))!I.call(e,m)&&m!==d&&S(e,m,{get:()=>r[m],enumerable:!(f=x(r,m))||f.enumerable});return e};var R=(e,r,d)=>(d=e!=null?E(O(e)):{},T(r||!e||!e.__esModule?S(d,"default",{value:e,enumerable:!0}):d,e)),k=e=>T(S({},"__esModule",{value:!0}),e);var C={};G(C,{default:()=>A});module.exports=k(C);var H=require("@fastify/multipart"),w=R(require("fastify-plugin"),1),y=R(require("path"),1),v=async(e,r)=>{if(!e.isMultipart())return r.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let d=e.parts(),f={};for await(let m of d)if(m.type==="field")f[m.fieldname]=m.value;else{let t=Symbol.for("file-stream");e[t]=m}e.body=f},P=async(e,r)=>{let d=t=>{if(r.errorHandler){let a=r.errorHandler(t);if(a)return a}return{message:"Internal Server Error",statusCode:500}};if(e.hasDecorator("viteInitDone")&&e.viteInitDone)return;if(!e.hasDecorator("multipartErrors"))try{let t=await import("@fastify/multipart");await e.register(t.default)}catch(t){if(t.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw t}let f=process.env.NODE_ENV==="production";if(f){if(r.clientDistDir)try{let t=await import("@fastify/static"),a=y.default.resolve(r.root,r.clientDistDir);await e.register(t.default,{root:a,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Serving static assets from: ${a}`)}catch(t){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",t)}}else{if(!e.hasDecorator("use"))try{let o=await import("@fastify/middie");await e.register(o.default,{hook:"onRequest"})}catch(o){if(o.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw o}let t=await import("vite"),a=r.viteConfig||{},h=await t.createServer({root:r.root,appType:"custom",...a,server:{hmr:{port:24678},...a.server,middlewareMode:!0}});e.use(h.middlewares),e.hasDecorator("viteServer")||e.decorate("viteServer",h),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}e.decorate("viteInitDone",!0);let m=async(t,a,h)=>{try{let o=t.raw.url;if(y.default.extname(o)!==""){a.status(404).send(`File not found: ${o}`);return}let u="";!f&&e.viteServer&&(u=await e.viteServer.transformIndexHtml(o,"<html><head></head><body></body></html>"),u=u.substring(u.indexOf("<head>")+6,u.indexOf("</head>")));let l=f?await import(y.default.resolve(r.root,r.prodEntryFile)):await e.viteServer.ssrLoadModule(r.devEntryFile),s=l.render||l.default;if(typeof s!="function")throw new Error(`Entry file ${r.devEntryFile} must export a 'render' function.`);await s({req:t,reply:a,head:u,data:h})}catch(o){e.viteServer?.ssrFixStacktrace(o),console.error("[SSR Error]:",o),a.sent||a.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(t,a){let{handler:h,schema:o,...u}=a,l=`/rpc${t}`,s={...u,schema:o};if(o?.consumes?.includes("multipart/form-data")){let n=s.preValidation;s.preValidation=n?Array.isArray(n)?[v,...n]:[v,n]:v}this.route({method:"POST",url:l,...s,handler:async(n,i)=>{try{let p=await h.call(this,n,i);return i.sent?void 0:p}catch(p){if(console.error(`[RPC Error] ${l}:`,p),!i.sent){let{statusCode:F,message:g}=d(p);i.status(F).send({error:{message:g}})}}}})}),e.decorate("addRenderRoute",function(t,a){let{handler:h,schema:o,...u}=a||{},l=async(s,c,n)=>{try{let i=await h?.call(this,s,c);return n?i:m(s,c,i)}catch(i){if(console.error(`[Render Error] ${t}:`,i),!c.sent){let{statusCode:p,message:F}=d(i);if(n)c.status(p).send({error:{message:F}});else return m(s,c,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:t,schema:o,...u,handler:(s,c)=>l(s,c,!1)}),t!=="*"&&t!=="/*"){this.route({method:"GET",url:`/loader${t}`,schema:o,...u,handler:(n,i)=>l(n,i,!0)});let s=t.endsWith("/")?"*":"/*",c=`${t}${s}`;this.route({method:"GET",url:c,schema:o,...u,handler:(n,i)=>l(n,i,!1)})}}),e.decorate("addLoaderRoute",function(t,a){let{handler:h,schema:o,...u}=a,l=`/api${t}`;this.route({method:"GET",url:l,schema:o,...u,handler:async(s,c)=>{try{let n=await h.call(this,s,c);return c.sent?void 0:n}catch(n){if(console.error(`[Loader API Error] ${l}:`,n),!c.sent){let{statusCode:i,message:p}=d(n);c.status(i).send({error:{message:p}})}}}})})},A=(0,w.default)(P,{name:"fastify-b-ssr"});
@@ -30,8 +30,6 @@ interface FastifyReactSsrOptions {
30
30
  root: string;
31
31
  /** Ruta al archivo de entrada SSR en desarrollo (ej: '/src/entry-ssr-server.tsx') */
32
32
  devEntryFile: string;
33
- /** Ruta al archivo de entrada del CLIENTE en desarrollo (ej: '/src-ts/entry-client.tsx') */
34
- devClientEntryFile: string;
35
33
  /** Ruta relativa al archivo compilado del servidor SSR en producción (ej: './dist-react/server/entry-server.mjs') */
36
34
  prodEntryFile: string;
37
35
  /**
@@ -39,11 +37,6 @@ interface FastifyReactSsrOptions {
39
37
  * Requerido para servir assets (CSS, JS) en producción.
40
38
  */
41
39
  clientDistDir?: string;
42
- /**
43
- * Si es `true` (por defecto), el plugin registrará @fastify/static para servir los assets del cliente.
44
- * Ponlo en `false` si ya estás sirviendo la carpeta de assets manualmente.
45
- */
46
- serveStaticAssets?: boolean;
47
40
  /** Configuración extra para Vite (opcional) */
48
41
  viteConfig?: InlineConfig;
49
42
  /** Manejador de errores personalizado */
@@ -30,8 +30,6 @@ interface FastifyReactSsrOptions {
30
30
  root: string;
31
31
  /** Ruta al archivo de entrada SSR en desarrollo (ej: '/src/entry-ssr-server.tsx') */
32
32
  devEntryFile: string;
33
- /** Ruta al archivo de entrada del CLIENTE en desarrollo (ej: '/src-ts/entry-client.tsx') */
34
- devClientEntryFile: string;
35
33
  /** Ruta relativa al archivo compilado del servidor SSR en producción (ej: './dist-react/server/entry-server.mjs') */
36
34
  prodEntryFile: string;
37
35
  /**
@@ -39,11 +37,6 @@ interface FastifyReactSsrOptions {
39
37
  * Requerido para servir assets (CSS, JS) en producción.
40
38
  */
41
39
  clientDistDir?: string;
42
- /**
43
- * Si es `true` (por defecto), el plugin registrará @fastify/static para servir los assets del cliente.
44
- * Ponlo en `false` si ya estás sirviendo la carpeta de assets manualmente.
45
- */
46
- serveStaticAssets?: boolean;
47
40
  /** Configuración extra para Vite (opcional) */
48
41
  viteConfig?: InlineConfig;
49
42
  /** Manejador de errores personalizado */
@@ -1 +1 @@
1
- import"@fastify/multipart";import T from"fastify-plugin";import{readFile as v}from"fs/promises";import R from"path";var F=async(r,c)=>{if(!r.isMultipart())return c.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let p=r.parts(),h={};for await(let m of p)if(m.type==="field")h[m.fieldname]=m.value;else{let S=Symbol.for("file-stream");r[S]=m}r.body=h},w=async(r,c)=>{let p=t=>{if(c.errorHandler){let o=c.errorHandler(t);if(o)return o}return{message:"Internal Server Error",statusCode:500}};if(r.hasDecorator("viteInitDone")&&r.viteInitDone)return;if(!r.hasDecorator("multipartErrors"))try{let t=await import("@fastify/multipart");await r.register(t.default)}catch(t){if(t.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw t}let h=process.env.NODE_ENV==="production",m;if(h){if(c.clientDistDir){let t=R.resolve(c.root,c.clientDistDir);if(c.serveStaticAssets!==!1)try{let d=await import("@fastify/static");await r.register(d.default,{root:t,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Plugin is serving static assets from: ${t}`)}catch(d){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",d)}let o=R.resolve(t,".vite/manifest.json");try{m=JSON.parse(await v(o,"utf-8"))}catch{let s=R.resolve(t,"manifest.json");try{m=JSON.parse(await v(s,"utf-8"))}catch{console.error(`\u274C [Fastify-SSR] Failed to load manifest.json from ${o} or ${s}. Client assets will not load.`)}}}}else{if(!r.hasDecorator("use"))try{let s=await import("@fastify/middie");await r.register(s.default,{hook:"onRequest"})}catch(s){if(s.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw s}let t=await import("vite"),o=c.viteConfig||{},d=await t.createServer({root:c.root,appType:"custom",...o,server:{hmr:{port:24678},...o.server,middlewareMode:!0}});r.use(d.middlewares),r.hasDecorator("viteServer")||r.decorate("viteServer",d),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}r.decorate("viteInitDone",!0);let S=async(t,o,d)=>{try{let s=t.raw.url;if(R.extname(s)!==""){o.status(404).send(`File not found: ${s}`);return}let l=[],f=[],i="";if(!h&&r.viteServer){let e=await r.viteServer.transformIndexHtml(s,"<html><head></head><body></body></html>");i=e.substring(e.indexOf("<head>")+6,e.indexOf("</head>"))}else if(h&&m){let e=c.devClientEntryFile;e.startsWith("/")?e=e.substring(1):e.startsWith("./")&&(e=e.substring(2));let u=m[e];u?(l.push({rel:"modulepreload",as:"script",crossOrigin:"",href:`/${u.file}`}),u.css&&u.css.forEach(y=>{l.push({rel:"stylesheet",href:`/${y}`})}),f.push({type:"module",src:`/${u.file}`})):console.error(`\u274C [Fastify-SSR] Entry "${e}" not found in manifest.`)}let a=h?await import(R.resolve(c.root,c.prodEntryFile)):await r.viteServer.ssrLoadModule(c.devEntryFile),n=a.render||a.default;if(typeof n!="function")throw new Error(`Entry file ${c.devEntryFile} must export a 'render' function.`);await n({req:t,reply:o,head:i,manifestLinks:l,manifestScripts:f,data:d})}catch(s){r.viteServer?.ssrFixStacktrace(s),console.error("[SSR Error]:",s),o.sent||o.status(500).send("Internal Server Error")}};r.decorate("addRpcRoute",function(t,o){let{handler:d,schema:s,...l}=o,f=`/rpc${t}`,i={...l,schema:s};if(s?.consumes?.includes("multipart/form-data")){let n=i.preValidation;i.preValidation=n?Array.isArray(n)?[F,...n]:[F,n]:F}this.route({method:"POST",url:f,...i,handler:async(n,e)=>{try{let u=await d.call(this,n,e);return e.sent?void 0:u}catch(u){if(console.error(`[RPC Error] ${f}:`,u),!e.sent){let{statusCode:y,message:g}=p(u);e.status(y).send({error:{message:g}})}}}})}),r.decorate("addRenderRoute",function(t,o){let{handler:d,schema:s,...l}=o||{},f=async(i,a,n)=>{try{let e=await d?.call(this,i,a);return n?e:S(i,a,e)}catch(e){if(console.error(`[Render Error] ${t}:`,e),!a.sent){let{statusCode:u,message:y}=p(e);if(n)a.status(u).send({error:{message:y}});else return S(i,a,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:t,schema:s,...l,handler:(i,a)=>f(i,a,!1)}),t!=="*"&&t!=="/*"){this.route({method:"GET",url:`/loader${t}`,schema:s,...l,handler:(n,e)=>f(n,e,!0)});let i=t.endsWith("/")?"*":"/*",a=`${t}${i}`;this.route({method:"GET",url:a,schema:s,...l,handler:(n,e)=>f(n,e,!1)})}}),r.decorate("addLoaderRoute",function(t,o){let{handler:d,schema:s,...l}=o,f=`/api${t}`;this.route({method:"GET",url:f,schema:s,...l,handler:async(i,a)=>{try{let n=await d.call(this,i,a);return a.sent?void 0:n}catch(n){if(console.error(`[Loader API Error] ${f}:`,n),!a.sent){let{statusCode:e,message:u}=p(n);a.status(e).send({error:{message:u}})}}}})})},I=T(w,{name:"fastify-b-ssr"});export{I as default};
1
+ import"@fastify/multipart";import v from"fastify-plugin";import S from"path";var y=async(t,d)=>{if(!t.isMultipart())return d.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let p=t.parts(),f={};for await(let h of p)if(h.type==="field")f[h.fieldname]=h.value;else{let e=Symbol.for("file-stream");t[e]=h}t.body=f},T=async(t,d)=>{let p=e=>{if(d.errorHandler){let o=d.errorHandler(e);if(o)return o}return{message:"Internal Server Error",statusCode:500}};if(t.hasDecorator("viteInitDone")&&t.viteInitDone)return;if(!t.hasDecorator("multipartErrors"))try{let e=await import("@fastify/multipart");await t.register(e.default)}catch(e){if(e.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw e}let f=process.env.NODE_ENV==="production";if(f){if(d.clientDistDir)try{let e=await import("@fastify/static"),o=S.resolve(d.root,d.clientDistDir);await t.register(e.default,{root:o,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Serving static assets from: ${o}`)}catch(e){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",e)}}else{if(!t.hasDecorator("use"))try{let r=await import("@fastify/middie");await t.register(r.default,{hook:"onRequest"})}catch(r){if(r.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw r}let e=await import("vite"),o=d.viteConfig||{},m=await e.createServer({root:d.root,appType:"custom",...o,server:{hmr:{port:24678},...o.server,middlewareMode:!0}});t.use(m.middlewares),t.hasDecorator("viteServer")||t.decorate("viteServer",m),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}t.decorate("viteInitDone",!0);let h=async(e,o,m)=>{try{let r=e.raw.url;if(S.extname(r)!==""){o.status(404).send(`File not found: ${r}`);return}let c="";!f&&t.viteServer&&(c=await t.viteServer.transformIndexHtml(r,"<html><head></head><body></body></html>"),c=c.substring(c.indexOf("<head>")+6,c.indexOf("</head>")));let u=f?await import(S.resolve(d.root,d.prodEntryFile)):await t.viteServer.ssrLoadModule(d.devEntryFile),n=u.render||u.default;if(typeof n!="function")throw new Error(`Entry file ${d.devEntryFile} must export a 'render' function.`);await n({req:e,reply:o,head:c,data:m})}catch(r){t.viteServer?.ssrFixStacktrace(r),console.error("[SSR Error]:",r),o.sent||o.status(500).send("Internal Server Error")}};t.decorate("addRpcRoute",function(e,o){let{handler:m,schema:r,...c}=o,u=`/rpc${e}`,n={...c,schema:r};if(r?.consumes?.includes("multipart/form-data")){let a=n.preValidation;n.preValidation=a?Array.isArray(a)?[y,...a]:[y,a]:y}this.route({method:"POST",url:u,...n,handler:async(a,s)=>{try{let l=await m.call(this,a,s);return s.sent?void 0:l}catch(l){if(console.error(`[RPC Error] ${u}:`,l),!s.sent){let{statusCode:R,message:F}=p(l);s.status(R).send({error:{message:F}})}}}})}),t.decorate("addRenderRoute",function(e,o){let{handler:m,schema:r,...c}=o||{},u=async(n,i,a)=>{try{let s=await m?.call(this,n,i);return a?s:h(n,i,s)}catch(s){if(console.error(`[Render Error] ${e}:`,s),!i.sent){let{statusCode:l,message:R}=p(s);if(a)i.status(l).send({error:{message:R}});else return h(n,i,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:e,schema:r,...c,handler:(n,i)=>u(n,i,!1)}),e!=="*"&&e!=="/*"){this.route({method:"GET",url:`/loader${e}`,schema:r,...c,handler:(a,s)=>u(a,s,!0)});let n=e.endsWith("/")?"*":"/*",i=`${e}${n}`;this.route({method:"GET",url:i,schema:r,...c,handler:(a,s)=>u(a,s,!1)})}}),t.decorate("addLoaderRoute",function(e,o){let{handler:m,schema:r,...c}=o,u=`/api${e}`;this.route({method:"GET",url:u,schema:r,...c,handler:async(n,i)=>{try{let a=await m.call(this,n,i);return i.sent?void 0:a}catch(a){if(console.error(`[Loader API Error] ${u}:`,a),!i.sent){let{statusCode:s,message:l}=p(a);i.status(s).send({error:{message:l}})}}}})})},x=v(T,{name:"fastify-b-ssr"});export{x as default};
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var T=(t,e)=>{for(var r in e)l(t,r,{get:e[r],enumerable:!0})},S=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of m(e))!H.call(t,s)&&s!==r&&l(t,s,{get:()=>e[s],enumerable:!(n=y(e,s))||n.enumerable});return t};var M=t=>S(l({},"__esModule",{value:!0}),t);var k={};T(k,{createServerHandler:()=>b});module.exports=M(k);var a=require("@tanstack/react-router/ssr/server"),h=require("react/jsx-runtime");function A(t){let e=t.protocol,r=t.hostname,n=`${e}://${r}`,s=new URL(t.url,n||"http://localhost:3000").href,d=new Headers;for(let[f,i]of Object.entries(t.headers))i&&d.set(f,Array.isArray(i)?i.join(", "):i);return new Request(s,{method:t.method,headers:d})}function b(t){return async function({req:r,reply:n,manifestLinks:s=[],manifestScripts:d=[],head:f,data:i}){let L=A(r),p=await(0,a.createRequestHandler)({request:L,createRouter:()=>{let o=t(),c=o.options.context||{},u={...i,manifestLinks:s,manifestScripts:d},R=`<script>window.__SSR_DATA__ = ${JSON.stringify(u)}</script>`;return o.update({context:{...c,head:f,scripts:R,req:r,reply:n,loaderData:u}}),o}})(({request:o,responseHeaders:c,router:u})=>(0,a.renderRouterToStream)({request:o,responseHeaders:c,router:u,children:(0,h.jsx)(a.RouterServer,{router:u})}));return n.status(p.status),p.headers.forEach((o,c)=>{n.header(c,o)}),n.send(p.body)}}0&&(module.exports={createServerHandler});
1
+ "use strict";var h=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var q=(e,t)=>{for(var r in t)h(e,r,{get:t[r],enumerable:!0})},F=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of p(t))!m.call(e,n)&&n!==r&&h(e,n,{get:()=>t[n],enumerable:!(o=l(t,n))||o.enumerable});return e};var w=e=>F(h({},"__esModule",{value:!0}),e);var v={};q(v,{createServerHandler:()=>g});module.exports=w(v);var a=require("@tanstack/react-router/ssr/server"),y=require("react/jsx-runtime");function x(e){let t=e.protocol,r=e.hostname,o=`${t}://${r}`,n=new URL(e.url,o||"http://localhost:3000").href,i=new Headers;for(let[d,u]of Object.entries(e.headers))u&&i.set(d,Array.isArray(u)?u.join(", "):u);return new Request(n,{method:e.method,headers:i})}function g(e){return async function({req:r,reply:o,head:n,data:i}){let d=x(r),f=await(0,a.createRequestHandler)({request:d,createRouter:()=>{let s=e(),c=s.options.context||{};return s.update({context:{...c,head:n,req:r,reply:o,loaderData:i}}),s}})(({request:s,responseHeaders:c,router:R})=>(0,a.renderRouterToStream)({request:s,responseHeaders:c,router:R,children:(0,y.jsx)(a.RouterServer,{router:R})}));return o.status(f.status),f.headers.forEach((s,c)=>{o.header(c,s)}),o.send(f.body)}}0&&(module.exports={createServerHandler});
@@ -1,12 +1,9 @@
1
1
  import { FastifyRequest, FastifyReply } from 'fastify';
2
- import { DetailedHTMLProps, LinkHTMLAttributes, ScriptHTMLAttributes } from 'react';
3
2
 
4
3
  interface RenderOptions {
5
4
  req: FastifyRequest;
6
5
  reply: FastifyReply;
7
- head?: string;
8
- manifestLinks?: (DetailedHTMLProps<LinkHTMLAttributes<HTMLLinkElement>, HTMLLinkElement> | undefined)[];
9
- manifestScripts?: (DetailedHTMLProps<ScriptHTMLAttributes<HTMLScriptElement>, HTMLScriptElement> | undefined)[];
6
+ head: string;
10
7
  data?: unknown;
11
8
  }
12
9
  /**
@@ -15,6 +12,6 @@ interface RenderOptions {
15
12
  * @param createRouterFn Función que devuelve una instancia del Router
16
13
  * @returns Una función `render` lista para ser exportada en entry-server.tsx
17
14
  */
18
- declare function createServerHandler(createRouterFn: () => any): ({ req, reply, manifestLinks, manifestScripts, head, data, }: RenderOptions) => Promise<never>;
15
+ declare function createServerHandler(createRouterFn: () => any): ({ req, reply, head, data }: RenderOptions) => Promise<never>;
19
16
 
20
17
  export { type RenderOptions, createServerHandler };
@@ -1,12 +1,9 @@
1
1
  import { FastifyRequest, FastifyReply } from 'fastify';
2
- import { DetailedHTMLProps, LinkHTMLAttributes, ScriptHTMLAttributes } from 'react';
3
2
 
4
3
  interface RenderOptions {
5
4
  req: FastifyRequest;
6
5
  reply: FastifyReply;
7
- head?: string;
8
- manifestLinks?: (DetailedHTMLProps<LinkHTMLAttributes<HTMLLinkElement>, HTMLLinkElement> | undefined)[];
9
- manifestScripts?: (DetailedHTMLProps<ScriptHTMLAttributes<HTMLScriptElement>, HTMLScriptElement> | undefined)[];
6
+ head: string;
10
7
  data?: unknown;
11
8
  }
12
9
  /**
@@ -15,6 +12,6 @@ interface RenderOptions {
15
12
  * @param createRouterFn Función que devuelve una instancia del Router
16
13
  * @returns Una función `render` lista para ser exportada en entry-server.tsx
17
14
  */
18
- declare function createServerHandler(createRouterFn: () => any): ({ req, reply, manifestLinks, manifestScripts, head, data, }: RenderOptions) => Promise<never>;
15
+ declare function createServerHandler(createRouterFn: () => any): ({ req, reply, head, data }: RenderOptions) => Promise<never>;
19
16
 
20
17
  export { type RenderOptions, createServerHandler };
@@ -1 +1 @@
1
- import{createRequestHandler as h,renderRouterToStream as L,RouterServer as R}from"@tanstack/react-router/ssr/server";import{jsx as m}from"react/jsx-runtime";function y(t){let f=t.protocol,i=t.hostname,r=`${f}://${i}`,c=new URL(t.url,r||"http://localhost:3000").href,a=new Headers;for(let[u,n]of Object.entries(t.headers))n&&a.set(u,Array.isArray(n)?n.join(", "):n);return new Request(c,{method:t.method,headers:a})}function S(t){return async function({req:i,reply:r,manifestLinks:c=[],manifestScripts:a=[],head:u,data:n}){let p=y(i),d=await h({request:p,createRouter:()=>{let e=t(),s=e.options.context||{},o={...n,manifestLinks:c,manifestScripts:a},l=`<script>window.__SSR_DATA__ = ${JSON.stringify(o)}</script>`;return e.update({context:{...s,head:u,scripts:l,req:i,reply:r,loaderData:o}}),e}})(({request:e,responseHeaders:s,router:o})=>L({request:e,responseHeaders:s,router:o,children:m(R,{router:o})}));return r.status(d.status),d.headers.forEach((e,s)=>{r.header(s,e)}),r.send(d.body)}}export{S as createServerHandler};
1
+ import{createRequestHandler as h,renderRouterToStream as R,RouterServer as y}from"@tanstack/react-router/ssr/server";import{jsx as p}from"react/jsx-runtime";function l(e){let d=e.protocol,s=e.hostname,r=`${d}://${s}`,u=new URL(e.url,r||"http://localhost:3000").href,a=new Headers;for(let[c,o]of Object.entries(e.headers))o&&a.set(c,Array.isArray(o)?o.join(", "):o);return new Request(u,{method:e.method,headers:a})}function q(e){return async function({req:s,reply:r,head:u,data:a}){let c=l(s),i=await h({request:c,createRouter:()=>{let t=e(),n=t.options.context||{};return t.update({context:{...n,head:u,req:s,reply:r,loaderData:a}}),t}})(({request:t,responseHeaders:n,router:f})=>R({request:t,responseHeaders:n,router:f,children:p(y,{router:f})}));return r.status(i.status),i.headers.forEach((t,n)=>{r.header(n,t)}),r.send(i.body)}}export{q as createServerHandler};
@@ -1,4 +1,4 @@
1
- "use strict";var de=Object.create;var K=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var ye=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var be=(o,l)=>{for(var x in l)K(o,x,{get:l[x],enumerable:!0})},te=(o,l,x,C)=>{if(l&&typeof l=="object"||typeof l=="function")for(let P of fe(l))!he.call(o,P)&&P!==x&&K(o,P,{get:()=>l[P],enumerable:!(C=me(l,P))||C.enumerable});return o};var re=(o,l,x)=>(x=o!=null?de(ye(o)):{},te(l||!o||!o.__esModule?K(x,"default",{value:o,enumerable:!0}):x,o)),xe=o=>te(K({},"__esModule",{value:!0}),o);var Se={};be(Se,{rpcGeneratorPlugin:()=>Pe});module.exports=xe(Se);var ne=re(require("fast-glob"),1),O=require("fs/promises"),u=re(require("path"),1),U=require("prettier"),s=require("ts-morph"),k="virtual:b-ssr-rpc-universal:";function Te(o){let l=o.replace(/[^a-zA-Z0-9]+(.)?/g,(x,C)=>C?C.toUpperCase():"");return l.charAt(0).toLowerCase()+l.slice(1)}function Z(o,l,x){let C=u.default.basename(x,u.default.extname(x))||"Index",P=l.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),q=`${o} ${P} ${C}`;return Te(q)}function Pe(o={}){let{routerPattern:l="src-ts/routers/**/*.mts",tsConfigFilePath:x="tsconfig.json",routerBaseDir:C="src-ts/routers"}=o,P=new Map,q=new Set,B=new s.Project({tsConfigFilePath:x,skipAddingFilesFromTsConfig:!1}),se=u.default.resolve(process.cwd(),C||".");async function I(t){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(c,a)=>{if(!u.default.isAbsolute(a))return c;let i=a;if(!u.default.extname(i)){let b=B.getSourceFile(y=>y.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===a);b&&(i=b.getFilePath())}let p=u.default.relative(u.default.dirname($),i).replace(/\\/g,"/");return p.startsWith(".")||(p="./"+p),`import("${p}")`})},M=function(e,c){if(e.getSymbol()?.getName()==="Promise"){let g=e.getAwaitedType();if(g)return`Promise<${M(g,c)}>`}let a=e.getAliasSymbol()??e.getSymbol();if(a?.getName()==="__object")return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!a){let g=(f,h=0)=>{if(!(h>5)){if(f.isArray()){let T=f.getArrayElementType();T&&g(T,h);return}if(f.isObject()&&!f.getSymbol()&&!f.getAliasSymbol()){for(let T of f.getApparentProperties()){let v=T.getValueDeclaration();v&&g(T.getTypeAtLocation(v),h+1)}return}M(f,c)}};return g(e),D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!a)return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation));let i=a.getDeclarations()[0];if(!i)return a.getName();if(s.Node.isImportSpecifier(i)||s.Node.isImportClause(i)){let g=i.getFirstAncestorByKind(s.SyntaxKind.ImportDeclaration);if(g){let f=g.getModuleSpecifierValue(),h=a.getName();return F.has(f)||F.set(f,new Set),F.get(f)?.add(h),h}}let p=i.getSourceFile();if(p.getFilePath()===m.getFilePath())return a.getName();if(p.isInNodeModules())return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation));let b=u.default.relative(u.default.dirname($),p.getFilePath()).replace(/\\/g,"/"),E=b.startsWith(".")?b:`./${b}`,S=a.getName();return F.has(E)||F.set(E,new Set),F.get(E)?.add(S),S},Q=function(e){let c;if(s.Node.isFunctionLikeDeclaration(e)||s.Node.isArrowFunction(e)){let a=e.getDescendantsOfKind(s.SyntaxKind.ReturnStatement);for(let i of a){let p=i.getExpression();if(p?.isKind(s.SyntaxKind.SatisfiesExpression)){c=p.getTypeNode()?.getType();break}}}if(c)return M(c,e);{let a=e.getType().getCallSignatures();if(a.length>0){let i=a[0]?.getReturnType();return M(i,e)}}return"unknown"};var d=D,n=M,r=Q;let m=B.addSourceFileAtPath(t);await m.refreshFromFileSystem(),B.resolveSourceFileDependencies();let w=m.getDescendantsOfKind(s.SyntaxKind.CallExpression),R=w.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),A=w.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),j=w.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),L=u.default.extname(t),$=t.substring(0,t.length-L.length)+".universal.d.ts",V=u.default.resolve(t);if(R.length===0&&A.length===0&&j.length===0){P.delete(V),q.delete(V),$!==t&&await(0,O.unlink)($).catch(()=>{});return}q.add(V);let _=[],F=new Map;F.has("fastify")||F.set("fastify",new Set),F.get("fastify")?.add("FastifyRequest"),F.get("fastify")?.add("FastifyReply");let ce=e=>{let c="unknown",a="unknown",i="unknown",p=!1;if(!e||!s.Node.isObjectLiteralExpression(e))return{paramsType:c,queryType:a,bodyType:i,isMultipart:p};let b=e.getProperty("schema");if(b?.isKind(s.SyntaxKind.PropertyAssignment)){let y=b.getInitializer();if(y?.isKind(s.SyntaxKind.Identifier)){let S=y.getSymbol()?.getValueDeclaration();if(S){let g=S.getFirstDescendantByKind(s.SyntaxKind.ObjectLiteralExpression);g&&(y=g)}}if(y&&s.Node.isObjectLiteralExpression(y)){let E=y.getProperty("consumes");if(E?.isKind(s.SyntaxKind.PropertyAssignment)){let g=E.getInitializer();s.Node.isArrayLiteralExpression(g)&&(p=g.getElements().some(f=>f.isKind(s.SyntaxKind.StringLiteral)&&f.getLiteralValue()==="multipart/form-data"))}let S=g=>{let f=y.getProperty(g);if(f?.isKind(s.SyntaxKind.PropertyAssignment)){let h=f.getInitializer();if(h){let T=h.getType(),v=T.getProperty("_output");return M(v?v.getTypeAtLocation(h).getApparentType():T,h)}}return"unknown"};if(c=S("params"),a=S("querystring"),i=S("body"),p){let g="{ file: File }";i=i!=="unknown"&&i.trim().startsWith("{")?`(${i} & ${g})`:g}}}return{paramsType:c,queryType:a,bodyType:i,isMultipart:p}},N=u.default.relative(se,u.default.dirname(t)).split(u.default.sep).join("/"),pe=N==="."||!N?"":N.startsWith("/")?N:"/"+N,z=(e,c)=>{let[a,i]=e.getArguments();if(!a?.isKind(s.SyntaxKind.StringLiteral))return;let p=a.getLiteralValue(),b="unknown",y=pe,{paramsType:E,queryType:S,bodyType:g,isMultipart:f}=ce(i);if(i?.isKind(s.SyntaxKind.ObjectLiteralExpression)){let v=i.getProperty("prefix");if(v?.isKind(s.SyntaxKind.PropertyAssignment)){let W=v.getInitializer();W?.isKind(s.SyntaxKind.StringLiteral)&&(y=W.getLiteralValue())}let ee=i.getProperty("handler");if(ee?.isKind(s.SyntaxKind.PropertyAssignment)){let W=ee.getInitializer();W&&(b=Q(W),b.startsWith("Promise<")||(b=`Promise<${b}>`))}}let h="",T="";c==="rpc"?(h=u.default.join(y,"rpc",p).replace(/\\/g,"/"),T=Z("action",y,p)):c==="loader"?(h=u.default.join(y,"loader",p).replace(/\\/g,"/"),T=Z("loader",y,p)):c==="api"&&(h=u.default.join(y,"api",p).replace(/\\/g,"/"),T=Z("get",y,p)),T&&_.push({type:c,name:T,returnType:b,url:p,rpcUrl:h,loaderUrl:h,paramsType:E,queryType:S,bodyType:g,isMultipart:f})};R.forEach(e=>z(e,"rpc")),A.forEach(e=>z(e,"loader")),j.forEach(e=>z(e,"api"));let H=[];for(let[e,c]of F.entries())H.push(`import type { ${[...c].sort().join(", ")} } from "${e}";`);let X=[];_.forEach(e=>{X.push(oe(e))});let G=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
1
+ "use strict";var de=Object.create;var K=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var ye=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var be=(o,l)=>{for(var x in l)K(o,x,{get:l[x],enumerable:!0})},te=(o,l,x,C)=>{if(l&&typeof l=="object"||typeof l=="function")for(let w of fe(l))!he.call(o,w)&&w!==x&&K(o,w,{get:()=>l[w],enumerable:!(C=me(l,w))||C.enumerable});return o};var re=(o,l,x)=>(x=o!=null?de(ye(o)):{},te(l||!o||!o.__esModule?K(x,"default",{value:o,enumerable:!0}):x,o)),xe=o=>te(K({},"__esModule",{value:!0}),o);var Pe={};be(Pe,{rpcGeneratorPlugin:()=>we});module.exports=xe(Pe);var ne=re(require("fast-glob"),1),M=require("fs/promises"),u=re(require("path"),1),U=require("prettier"),s=require("ts-morph"),k="virtual:b-ssr-rpc-universal:";function Te(o){let l=o.replace(/[^a-zA-Z0-9]+(.)?/g,(x,C)=>C?C.toUpperCase():"");return l.charAt(0).toLowerCase()+l.slice(1)}function Z(o,l,x){let C=u.default.basename(x,u.default.extname(x))||"Index",w=l.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),q=`${o} ${w} ${C}`;return Te(q)}function we(o={}){let{routerPattern:l="src-ts/routers/**/*.mts",tsConfigFilePath:x="tsconfig.json",routerBaseDir:C="src-ts/routers"}=o,w=new Map,q=new Set,B=new s.Project({tsConfigFilePath:x,skipAddingFilesFromTsConfig:!1}),se=u.default.resolve(process.cwd(),C||".");async function I(t){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(c,a)=>{if(!u.default.isAbsolute(a))return c;let i=a;if(!u.default.extname(i)){let b=B.getSourceFile(y=>y.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===a);b&&(i=b.getFilePath())}let p=u.default.relative(u.default.dirname(v),i).replace(/\\/g,"/");return p.startsWith(".")||(p="./"+p),`import("${p}")`})},O=function(e,c){if(e.getSymbol()?.getName()==="Promise"){let g=e.getAwaitedType();if(g)return`Promise<${O(g,c)}>`}let a=e.getAliasSymbol()??e.getSymbol();if(a?.getName()==="__object")return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!a){let g=(f,h=0)=>{if(!(h>5)){if(f.isArray()){let T=f.getArrayElementType();T&&g(T,h);return}if(f.isObject()&&!f.getSymbol()&&!f.getAliasSymbol()){for(let T of f.getApparentProperties()){let A=T.getValueDeclaration();A&&g(T.getTypeAtLocation(A),h+1)}return}O(f,c)}};return g(e),D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!a)return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation));let i=a.getDeclarations()[0];if(!i)return a.getName();if(s.Node.isImportSpecifier(i)||s.Node.isImportClause(i)){let g=i.getFirstAncestorByKind(s.SyntaxKind.ImportDeclaration);if(g){let f=g.getModuleSpecifierValue(),h=a.getName();return F.has(f)||F.set(f,new Set),F.get(f)?.add(h),h}}let p=i.getSourceFile();if(p.getFilePath()===m.getFilePath())return a.getName();if(p.isInNodeModules())return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation));let b=u.default.relative(u.default.dirname(v),p.getFilePath()).replace(/\\/g,"/"),R=b.startsWith(".")?b:`./${b}`,P=a.getName();return F.has(R)||F.set(R,new Set),F.get(R)?.add(P),P},Q=function(e){let c;if(s.Node.isFunctionLikeDeclaration(e)||s.Node.isArrowFunction(e)){let a=e.getDescendantsOfKind(s.SyntaxKind.ReturnStatement);for(let i of a){let p=i.getExpression();if(p?.isKind(s.SyntaxKind.SatisfiesExpression)){c=p.getTypeNode()?.getType();break}}}if(c)return O(c,e);{let a=e.getType().getCallSignatures();if(a.length>0){let i=a[0]?.getReturnType();return O(i,e)}}return"unknown"};var d=D,n=O,r=Q;let m=B.addSourceFileAtPath(t);await m.refreshFromFileSystem(),B.resolveSourceFileDependencies();let S=m.getDescendantsOfKind(s.SyntaxKind.CallExpression),E=S.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),$=S.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),j=S.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),L=u.default.extname(t),v=t.substring(0,t.length-L.length)+".universal.d.ts",V=u.default.resolve(t);if(E.length===0&&$.length===0&&j.length===0){w.delete(V),q.delete(V),v!==t&&await(0,M.unlink)(v).catch(()=>{});return}q.add(V);let _=[],F=new Map;F.has("fastify")||F.set("fastify",new Set),F.get("fastify")?.add("FastifyRequest"),F.get("fastify")?.add("FastifyReply");let ce=e=>{let c="unknown",a="unknown",i="unknown",p=!1;if(!e||!s.Node.isObjectLiteralExpression(e))return{paramsType:c,queryType:a,bodyType:i,isMultipart:p};let b=e.getProperty("schema");if(b?.isKind(s.SyntaxKind.PropertyAssignment)){let y=b.getInitializer();if(y?.isKind(s.SyntaxKind.Identifier)){let P=y.getSymbol()?.getValueDeclaration();if(P){let g=P.getFirstDescendantByKind(s.SyntaxKind.ObjectLiteralExpression);g&&(y=g)}}if(y&&s.Node.isObjectLiteralExpression(y)){let R=y.getProperty("consumes");if(R?.isKind(s.SyntaxKind.PropertyAssignment)){let g=R.getInitializer();s.Node.isArrayLiteralExpression(g)&&(p=g.getElements().some(f=>f.isKind(s.SyntaxKind.StringLiteral)&&f.getLiteralValue()==="multipart/form-data"))}let P=g=>{let f=y.getProperty(g);if(f?.isKind(s.SyntaxKind.PropertyAssignment)){let h=f.getInitializer();if(h){let T=h.getType(),A=T.getProperty("_output");return O(A?A.getTypeAtLocation(h).getApparentType():T,h)}}return"unknown"};if(c=P("params"),a=P("querystring"),i=P("body"),p){let g="{ file: File }";i=i!=="unknown"&&i.trim().startsWith("{")?`(${i} & ${g})`:g}}}return{paramsType:c,queryType:a,bodyType:i,isMultipart:p}},N=u.default.relative(se,u.default.dirname(t)).split(u.default.sep).join("/"),pe=N==="."||!N?"":N.startsWith("/")?N:"/"+N,z=(e,c)=>{let[a,i]=e.getArguments();if(!a?.isKind(s.SyntaxKind.StringLiteral))return;let p=a.getLiteralValue(),b="unknown",y=pe,{paramsType:R,queryType:P,bodyType:g,isMultipart:f}=ce(i);if(i?.isKind(s.SyntaxKind.ObjectLiteralExpression)){let A=i.getProperty("prefix");if(A?.isKind(s.SyntaxKind.PropertyAssignment)){let W=A.getInitializer();W?.isKind(s.SyntaxKind.StringLiteral)&&(y=W.getLiteralValue())}let ee=i.getProperty("handler");if(ee?.isKind(s.SyntaxKind.PropertyAssignment)){let W=ee.getInitializer();W&&(b=Q(W),b.startsWith("Promise<")||(b=`Promise<${b}>`))}}let h="",T="";c==="rpc"?(h=u.default.join(y,"rpc",p).replace(/\\/g,"/"),T=Z("action",y,p)):c==="loader"?(h=u.default.join(y,"loader",p).replace(/\\/g,"/"),T=Z("loader",y,p)):c==="api"&&(h=u.default.join(y,"api",p).replace(/\\/g,"/"),T=Z("get",y,p)),T&&_.push({type:c,name:T,returnType:b,url:p,rpcUrl:h,loaderUrl:h,paramsType:R,queryType:P,bodyType:g,isMultipart:f})};E.forEach(e=>z(e,"rpc")),$.forEach(e=>z(e,"loader")),j.forEach(e=>z(e,"api"));let H=[];for(let[e,c]of F.entries())H.push(`import type { ${[...c].sort().join(", ")} } from "${e}";`);let X=[];_.forEach(e=>{X.push(oe(e))});let G=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
2
  /* eslint-disable */
3
3
 
4
4
  `+(H.length>0?H.join(`
@@ -6,7 +6,7 @@
6
6
 
7
7
  `:"")+X.join(`
8
8
 
9
- `);try{let e=await(0,U.resolveConfig)($)||{};G=await(0,U.format)(G,{...e,parser:"typescript",filepath:$})}catch{}await(0,O.writeFile)($,G);let Y=[],J=[];_.forEach(e=>{let a=e.type==="rpc"?"POST":"GET",i=e.type==="loader"?e.loaderUrl:e.rpcUrl;J.push({name:e.name,rpcUrl:i,method:a,isMultipart:!!e.isMultipart}),Y.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ue=`
9
+ `);try{let e=await(0,U.resolveConfig)(v)||{};G=await(0,U.format)(G,{...e,parser:"typescript",filepath:v})}catch{}await(0,M.writeFile)(v,G);let Y=[],J=[];_.forEach(e=>{let a=e.type==="rpc"?"POST":"GET",i=e.type==="loader"?e.loaderUrl:e.rpcUrl;J.push({name:e.name,rpcUrl:i,method:a,isMultipart:!!e.isMultipart}),Y.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ue=`
10
10
  import { createClientRpc } from '@bobtail.software/b-ssr/client';
11
11
 
12
12
  if (import.meta.env.DEV) {
@@ -21,13 +21,14 @@
21
21
  });
22
22
  `).join(`
23
23
  `)}
24
- `,ge=ae(Y,t);P.set(u.default.resolve(t),{client:ue,server:ge})}catch(m){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:m})}}let ie=(t,d,n)=>{if(d.includes("node_modules")||d.startsWith(k))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(d)){let r=/\brequire\s*\(/.test(t),m=/\bmodule\.exports\b/.test(t),w=/\bexports\./.test(t);if(r||m||w)return"import { createRequire } from 'module';"+`
24
+ `,ge=ae(Y,t);w.set(u.default.resolve(t),{client:ue,server:ge})}catch(m){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:m})}}let ie=(t,d,n)=>{if(d.includes("node_modules")||d.startsWith(k))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(d)){let r=/\brequire\s*\(/.test(t),m=/\bmodule\.exports\b/.test(t),S=/\bexports\./.test(t);if(r||m||S)return"import { createRequire } from 'module';"+`
25
25
  const require = createRequire(import.meta.url);
26
26
  const module = { exports: {} };
27
27
  const exports = module.exports;
28
28
  `+t+`
29
- export default module.exports;`}return null};function oe(t){let d=we(t),n="";return d.length>0&&(n=`args: { ${d.join("; ")} }`),n||(n="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${n}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ae(t,d){if(t.length===0)return"";let n=d.replace(/\\/g,"/");return`
30
-
29
+ export default module.exports;`}return null};function oe(t){let d=Se(t),n="";return d.length>0&&(n=`args: { ${d.join("; ")} }`),n||(n="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${n}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ae(t,d){if(t.length===0)return"";let n=d.replace(/\\/g,"/");return`
30
+ import * as routeModule from '${n}';
31
+
31
32
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
32
33
  throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${n}');
33
34
  }
@@ -42,17 +43,6 @@ export default module.exports;`}return null};function oe(t){let d=we(t),n="";ret
42
43
  rpcOptionsMap = new Map();
43
44
  renderOptionsMap = new Map();
44
45
  loaderApiOptionsMap = new Map();
45
- const serverModulePath = '${n}';
46
-
47
- if (typeof globalThis.require === 'undefined') {
48
- try {
49
- const { createRequire } = await import('module');
50
- globalThis.require = createRequire(serverModulePath);
51
- } catch (e) {}
52
- }
53
-
54
- const routeModule = await import(/* @vite-ignore */ serverModulePath);
55
-
56
46
  const mockMethods = {
57
47
  addRpcRoute: (url, options) => rpcOptionsMap.set(url, options),
58
48
  addRenderRoute: (url, options) => renderOptionsMap.set(url, options),
@@ -81,7 +71,7 @@ export default module.exports;`}return null};function oe(t){let d=we(t),n="";ret
81
71
  try {
82
72
  await entryPoint(mockFastify);
83
73
  } catch (err) {
84
- console.error('\u274C [B-SSR CRITICAL] Error inicializando rutas backend:', serverModulePath, err);
74
+ console.error('\u274C [B-SSR CRITICAL] Error inicializando rutas backend:', '${n}', err);
85
75
  }
86
76
  }
87
77
  })();
@@ -89,27 +79,27 @@ export default module.exports;`}return null};function oe(t){let d=we(t),n="";ret
89
79
  return initPromise;
90
80
  }
91
81
 
92
- ${t.map(r=>{let m=[];r.requiresArgs&&m.push("args"),m.push("ssrContext");let w=r.requiresArgs?"args":"{}",R="";return r.type==="rpc"?R=`
82
+ ${t.map(r=>{let m=[];r.requiresArgs&&m.push("args"),m.push("ssrContext");let S=r.requiresArgs?"args":"{}",E="";return r.type==="rpc"?E=`
93
83
  if (fn.isMultipart) throw new Error('RPC multipart no soportado en SSR.');
94
84
  await getOptionsMaps();
95
85
  const options = rpcOptionsMap.get('${r.url}');
96
86
  if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${r.name}');
97
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${w});
87
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${S});
98
88
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
99
- `:r.type==="api"?R=`
89
+ `:r.type==="api"?E=`
100
90
  await getOptionsMaps();
101
91
  const options = loaderApiOptionsMap.get('${r.url}');
102
92
  if (!options?.handler) {
103
93
  console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${r.name}', 'URL:', '${r.url}');
104
94
  return null;
105
95
  }
106
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${w});
96
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${S});
107
97
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
108
- `:R=`
98
+ `:E=`
109
99
  await getOptionsMaps();
110
100
  const options = renderOptionsMap.get('${r.url}');
111
101
  if (!options) return {};
112
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${w});
102
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${S});
113
103
  let customData = {};
114
104
  try {
115
105
  if (options.handler) {
@@ -124,11 +114,11 @@ export default module.exports;`}return null};function oe(t){let d=we(t),n="";ret
124
114
  `,`export const ${r.name} = async (${m.join(", ")}) => {
125
115
  try {
126
116
  if (!ssrContext?.req) throw new Error('ssrContext requerido en ${r.name} (SSR)');
127
- ${R}
117
+ ${E}
128
118
  } catch (error) {
129
119
  console.error('\u274C [B-SSR Error] ${r.name}:', error);
130
120
  throw error;
131
121
  }
132
122
  };`}).join(`
133
123
  `)}
134
- `}async function le(){let t=await(0,ne.default)(l,{absolute:!0});await Promise.all(t.map(d=>I(d)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await le()},configureServer(t){let d=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>d(n)&&I(n)),t.watcher.on("change",n=>d(n)&&I(n)),t.watcher.on("unlink",n=>{if(d(n)){let r=u.default.resolve(n);P.delete(r),q.delete(r);let m=u.default.extname(n),w=n.substring(0,n.length-m.length)+".universal.d.ts";(0,O.unlink)(w).catch(()=>{})}})},async resolveId(t,d,n){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],m=r;if(r.endsWith(".universal"))m=r;else if(r.endsWith(".universal.ts"))m=r.slice(0,-3);else if(r.endsWith(".universal.mts"))m=r.slice(0,-4);else if(r.endsWith(".universal.js"))m=r.slice(0,-3);else return null;let w=[".mts",".ts"];for(let R of w){let A=m.slice(0,-10)+R,j=await this.resolve(A,d,{skipSelf:!0});if(j){let L=n?.ssr?"?mode=ssr":"?mode=client";return k+j.id+L}try{await(0,O.access)(A);let L=n?.ssr?"?mode=ssr":"?mode=client";return k+A+L}catch{}}}return null},async load(t,d){if(t.startsWith(k)){let n=t.slice(k.length).split("?")[0],r=P.get(n);return r||(await I(n),r=P.get(n)),r?d?.ssr===!0?r.server:r.client:null}if(d?.ssr!==!0){let n=u.default.resolve(t);if(q.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${u.default.basename(t)}");`}return null},transform:ie}}function we(o){let l=[];return o.paramsType!=="unknown"&&l.push(`params: ${o.paramsType}`),o.queryType!=="unknown"&&l.push(`query: ${o.queryType}`),o.bodyType!=="unknown"&&l.push(`body: ${o.bodyType}`),l.push("signal?: AbortSignal"),l}0&&(module.exports={rpcGeneratorPlugin});
124
+ `}async function le(){let t=await(0,ne.default)(l,{absolute:!0});await Promise.all(t.map(d=>I(d)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await le()},configureServer(t){let d=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>d(n)&&I(n)),t.watcher.on("change",n=>d(n)&&I(n)),t.watcher.on("unlink",n=>{if(d(n)){let r=u.default.resolve(n);w.delete(r),q.delete(r);let m=u.default.extname(n),S=n.substring(0,n.length-m.length)+".universal.d.ts";(0,M.unlink)(S).catch(()=>{})}})},async resolveId(t,d,n){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],m=r;if(r.endsWith(".universal"))m=r;else if(r.endsWith(".universal.ts"))m=r.slice(0,-3);else if(r.endsWith(".universal.mts"))m=r.slice(0,-4);else if(r.endsWith(".universal.js"))m=r.slice(0,-3);else return null;let S=[".mts",".ts"];for(let E of S){let $=m.slice(0,-10)+E,j=await this.resolve($,d,{skipSelf:!0});if(j){let L=n?.ssr?"?mode=ssr":"?mode=client";return k+j.id+L}try{await(0,M.access)($);let L=n?.ssr?"?mode=ssr":"?mode=client";return k+$+L}catch{}}}return null},async load(t,d){if(t.startsWith(k)){let n=t.slice(k.length).split("?")[0],r=w.get(n);return r||(await I(n),r=w.get(n)),r?d?.ssr===!0?r.server:r.client:null}if(d?.ssr!==!0){let n=u.default.resolve(t);if(q.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${u.default.basename(t)}");`}return null},transform:ie}}function Se(o){let l=[];return o.paramsType!=="unknown"&&l.push(`params: ${o.paramsType}`),o.queryType!=="unknown"&&l.push(`query: ${o.queryType}`),o.bodyType!=="unknown"&&l.push(`body: ${o.bodyType}`),l.push("signal?: AbortSignal"),l}0&&(module.exports={rpcGeneratorPlugin});
@@ -1,4 +1,4 @@
1
- import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"fs/promises";import l from"path";import{format as de,resolveConfig as me}from"prettier";import{Node as $,Project as fe,SyntaxKind as y,ts as j}from"ts-morph";var k="virtual:b-ssr-rpc-universal:";function ye(x){let T=x.replace(/[^a-zA-Z0-9]+(.)?/g,(L,M)=>M?M.toUpperCase():"");return T.charAt(0).toLowerCase()+T.slice(1)}function G(x,T,L){let M=l.basename(L,l.extname(L))||"Index",E=T.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),O=`${x} ${E} ${M}`;return ye(O)}function Re(x={}){let{routerPattern:T="src-ts/routers/**/*.mts",tsConfigFilePath:L="tsconfig.json",routerBaseDir:M="src-ts/routers"}=x,E=new Map,O=new Set,U=new fe({tsConfigFilePath:L,skipAddingFilesFromTsConfig:!1}),te=l.resolve(process.cwd(),M||".");async function K(t){try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(o,i)=>{if(!l.isAbsolute(i))return o;let s=i;if(!l.extname(s)){let f=U.getSourceFile(d=>d.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===i);f&&(s=f.getFilePath())}let a=l.relative(l.dirname(v),s).replace(/\\/g,"/");return a.startsWith(".")||(a="./"+a),`import("${a}")`})},A=function(e,o){if(e.getSymbol()?.getName()==="Promise"){let c=e.getAwaitedType();if(c)return`Promise<${A(c,o)}>`}let i=e.getAliasSymbol()??e.getSymbol();if(i?.getName()==="__object")return N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!i){let c=(g,m=0)=>{if(!(m>5)){if(g.isArray()){let h=g.getArrayElementType();h&&c(h,m);return}if(g.isObject()&&!g.getSymbol()&&!g.getAliasSymbol()){for(let h of g.getApparentProperties()){let R=h.getValueDeclaration();R&&c(h.getTypeAtLocation(R),m+1)}return}A(g,o)}};return c(e),N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType))}if(!i)return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let s=i.getDeclarations()[0];if(!s)return i.getName();if($.isImportSpecifier(s)||$.isImportClause(s)){let c=s.getFirstAncestorByKind(y.ImportDeclaration);if(c){let g=c.getModuleSpecifierValue(),m=i.getName();return w.has(g)||w.set(g,new Set),w.get(g)?.add(m),m}}let a=s.getSourceFile();if(a.getFilePath()===u.getFilePath())return i.getName();if(a.isInNodeModules())return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let f=l.relative(l.dirname(v),a.getFilePath()).replace(/\\/g,"/"),F=f.startsWith(".")?f:`./${f}`,P=i.getName();return w.has(F)||w.set(F,new Set),w.get(F)?.add(P),P},Z=function(e){let o;if($.isFunctionLikeDeclaration(e)||$.isArrowFunction(e)){let i=e.getDescendantsOfKind(y.ReturnStatement);for(let s of i){let a=s.getExpression();if(a?.isKind(y.SatisfiesExpression)){o=a.getTypeNode()?.getType();break}}}if(o)return A(o,e);{let i=e.getType().getCallSignatures();if(i.length>0){let s=i[0]?.getReturnType();return A(s,e)}}return"unknown"};var p=N,n=A,r=Z;let u=U.addSourceFileAtPath(t);await u.refreshFromFileSystem(),U.resolveSourceFileDependencies();let b=u.getDescendantsOfKind(y.CallExpression),S=b.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),C=b.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),q=b.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),D=l.extname(t),v=t.substring(0,t.length-D.length)+".universal.d.ts",B=l.resolve(t);if(S.length===0&&C.length===0&&q.length===0){E.delete(B),O.delete(B),v!==t&&await ee(v).catch(()=>{});return}O.add(B);let V=[],w=new Map;w.has("fastify")||w.set("fastify",new Set),w.get("fastify")?.add("FastifyRequest"),w.get("fastify")?.add("FastifyReply");let oe=e=>{let o="unknown",i="unknown",s="unknown",a=!1;if(!e||!$.isObjectLiteralExpression(e))return{paramsType:o,queryType:i,bodyType:s,isMultipart:a};let f=e.getProperty("schema");if(f?.isKind(y.PropertyAssignment)){let d=f.getInitializer();if(d?.isKind(y.Identifier)){let P=d.getSymbol()?.getValueDeclaration();if(P){let c=P.getFirstDescendantByKind(y.ObjectLiteralExpression);c&&(d=c)}}if(d&&$.isObjectLiteralExpression(d)){let F=d.getProperty("consumes");if(F?.isKind(y.PropertyAssignment)){let c=F.getInitializer();$.isArrayLiteralExpression(c)&&(a=c.getElements().some(g=>g.isKind(y.StringLiteral)&&g.getLiteralValue()==="multipart/form-data"))}let P=c=>{let g=d.getProperty(c);if(g?.isKind(y.PropertyAssignment)){let m=g.getInitializer();if(m){let h=m.getType(),R=h.getProperty("_output");return A(R?R.getTypeAtLocation(m).getApparentType():h,m)}}return"unknown"};if(o=P("params"),i=P("querystring"),s=P("body"),a){let c="{ file: File }";s=s!=="unknown"&&s.trim().startsWith("{")?`(${s} & ${c})`:c}}}return{paramsType:o,queryType:i,bodyType:s,isMultipart:a}},W=l.relative(te,l.dirname(t)).split(l.sep).join("/"),ae=W==="."||!W?"":W.startsWith("/")?W:"/"+W,_=(e,o)=>{let[i,s]=e.getArguments();if(!i?.isKind(y.StringLiteral))return;let a=i.getLiteralValue(),f="unknown",d=ae,{paramsType:F,queryType:P,bodyType:c,isMultipart:g}=oe(s);if(s?.isKind(y.ObjectLiteralExpression)){let R=s.getProperty("prefix");if(R?.isKind(y.PropertyAssignment)){let I=R.getInitializer();I?.isKind(y.StringLiteral)&&(d=I.getLiteralValue())}let J=s.getProperty("handler");if(J?.isKind(y.PropertyAssignment)){let I=J.getInitializer();I&&(f=Z(I),f.startsWith("Promise<")||(f=`Promise<${f}>`))}}let m="",h="";o==="rpc"?(m=l.join(d,"rpc",a).replace(/\\/g,"/"),h=G("action",d,a)):o==="loader"?(m=l.join(d,"loader",a).replace(/\\/g,"/"),h=G("loader",d,a)):o==="api"&&(m=l.join(d,"api",a).replace(/\\/g,"/"),h=G("get",d,a)),h&&V.push({type:o,name:h,returnType:f,url:a,rpcUrl:m,loaderUrl:m,paramsType:F,queryType:P,bodyType:c,isMultipart:g})};S.forEach(e=>_(e,"rpc")),C.forEach(e=>_(e,"loader")),q.forEach(e=>_(e,"api"));let z=[];for(let[e,o]of w.entries())z.push(`import type { ${[...o].sort().join(", ")} } from "${e}";`);let Q=[];V.forEach(e=>{Q.push(ne(e))});let H=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
1
+ import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"fs/promises";import l from"path";import{format as de,resolveConfig as me}from"prettier";import{Node as v,Project as fe,SyntaxKind as y,ts as j}from"ts-morph";var k="virtual:b-ssr-rpc-universal:";function ye(x){let T=x.replace(/[^a-zA-Z0-9]+(.)?/g,(L,O)=>O?O.toUpperCase():"");return T.charAt(0).toLowerCase()+T.slice(1)}function G(x,T,L){let O=l.basename(L,l.extname(L))||"Index",R=T.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),M=`${x} ${R} ${O}`;return ye(M)}function Ee(x={}){let{routerPattern:T="src-ts/routers/**/*.mts",tsConfigFilePath:L="tsconfig.json",routerBaseDir:O="src-ts/routers"}=x,R=new Map,M=new Set,U=new fe({tsConfigFilePath:L,skipAddingFilesFromTsConfig:!1}),te=l.resolve(process.cwd(),O||".");async function K(t){try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(o,i)=>{if(!l.isAbsolute(i))return o;let s=i;if(!l.extname(s)){let f=U.getSourceFile(d=>d.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===i);f&&(s=f.getFilePath())}let a=l.relative(l.dirname(A),s).replace(/\\/g,"/");return a.startsWith(".")||(a="./"+a),`import("${a}")`})},$=function(e,o){if(e.getSymbol()?.getName()==="Promise"){let c=e.getAwaitedType();if(c)return`Promise<${$(c,o)}>`}let i=e.getAliasSymbol()??e.getSymbol();if(i?.getName()==="__object")return N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!i){let c=(g,m=0)=>{if(!(m>5)){if(g.isArray()){let h=g.getArrayElementType();h&&c(h,m);return}if(g.isObject()&&!g.getSymbol()&&!g.getAliasSymbol()){for(let h of g.getApparentProperties()){let E=h.getValueDeclaration();E&&c(h.getTypeAtLocation(E),m+1)}return}$(g,o)}};return c(e),N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType))}if(!i)return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let s=i.getDeclarations()[0];if(!s)return i.getName();if(v.isImportSpecifier(s)||v.isImportClause(s)){let c=s.getFirstAncestorByKind(y.ImportDeclaration);if(c){let g=c.getModuleSpecifierValue(),m=i.getName();return S.has(g)||S.set(g,new Set),S.get(g)?.add(m),m}}let a=s.getSourceFile();if(a.getFilePath()===u.getFilePath())return i.getName();if(a.isInNodeModules())return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let f=l.relative(l.dirname(A),a.getFilePath()).replace(/\\/g,"/"),F=f.startsWith(".")?f:`./${f}`,w=i.getName();return S.has(F)||S.set(F,new Set),S.get(F)?.add(w),w},Z=function(e){let o;if(v.isFunctionLikeDeclaration(e)||v.isArrowFunction(e)){let i=e.getDescendantsOfKind(y.ReturnStatement);for(let s of i){let a=s.getExpression();if(a?.isKind(y.SatisfiesExpression)){o=a.getTypeNode()?.getType();break}}}if(o)return $(o,e);{let i=e.getType().getCallSignatures();if(i.length>0){let s=i[0]?.getReturnType();return $(s,e)}}return"unknown"};var p=N,n=$,r=Z;let u=U.addSourceFileAtPath(t);await u.refreshFromFileSystem(),U.resolveSourceFileDependencies();let b=u.getDescendantsOfKind(y.CallExpression),P=b.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),C=b.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),q=b.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),D=l.extname(t),A=t.substring(0,t.length-D.length)+".universal.d.ts",B=l.resolve(t);if(P.length===0&&C.length===0&&q.length===0){R.delete(B),M.delete(B),A!==t&&await ee(A).catch(()=>{});return}M.add(B);let V=[],S=new Map;S.has("fastify")||S.set("fastify",new Set),S.get("fastify")?.add("FastifyRequest"),S.get("fastify")?.add("FastifyReply");let oe=e=>{let o="unknown",i="unknown",s="unknown",a=!1;if(!e||!v.isObjectLiteralExpression(e))return{paramsType:o,queryType:i,bodyType:s,isMultipart:a};let f=e.getProperty("schema");if(f?.isKind(y.PropertyAssignment)){let d=f.getInitializer();if(d?.isKind(y.Identifier)){let w=d.getSymbol()?.getValueDeclaration();if(w){let c=w.getFirstDescendantByKind(y.ObjectLiteralExpression);c&&(d=c)}}if(d&&v.isObjectLiteralExpression(d)){let F=d.getProperty("consumes");if(F?.isKind(y.PropertyAssignment)){let c=F.getInitializer();v.isArrayLiteralExpression(c)&&(a=c.getElements().some(g=>g.isKind(y.StringLiteral)&&g.getLiteralValue()==="multipart/form-data"))}let w=c=>{let g=d.getProperty(c);if(g?.isKind(y.PropertyAssignment)){let m=g.getInitializer();if(m){let h=m.getType(),E=h.getProperty("_output");return $(E?E.getTypeAtLocation(m).getApparentType():h,m)}}return"unknown"};if(o=w("params"),i=w("querystring"),s=w("body"),a){let c="{ file: File }";s=s!=="unknown"&&s.trim().startsWith("{")?`(${s} & ${c})`:c}}}return{paramsType:o,queryType:i,bodyType:s,isMultipart:a}},W=l.relative(te,l.dirname(t)).split(l.sep).join("/"),ae=W==="."||!W?"":W.startsWith("/")?W:"/"+W,_=(e,o)=>{let[i,s]=e.getArguments();if(!i?.isKind(y.StringLiteral))return;let a=i.getLiteralValue(),f="unknown",d=ae,{paramsType:F,queryType:w,bodyType:c,isMultipart:g}=oe(s);if(s?.isKind(y.ObjectLiteralExpression)){let E=s.getProperty("prefix");if(E?.isKind(y.PropertyAssignment)){let I=E.getInitializer();I?.isKind(y.StringLiteral)&&(d=I.getLiteralValue())}let J=s.getProperty("handler");if(J?.isKind(y.PropertyAssignment)){let I=J.getInitializer();I&&(f=Z(I),f.startsWith("Promise<")||(f=`Promise<${f}>`))}}let m="",h="";o==="rpc"?(m=l.join(d,"rpc",a).replace(/\\/g,"/"),h=G("action",d,a)):o==="loader"?(m=l.join(d,"loader",a).replace(/\\/g,"/"),h=G("loader",d,a)):o==="api"&&(m=l.join(d,"api",a).replace(/\\/g,"/"),h=G("get",d,a)),h&&V.push({type:o,name:h,returnType:f,url:a,rpcUrl:m,loaderUrl:m,paramsType:F,queryType:w,bodyType:c,isMultipart:g})};P.forEach(e=>_(e,"rpc")),C.forEach(e=>_(e,"loader")),q.forEach(e=>_(e,"api"));let z=[];for(let[e,o]of S.entries())z.push(`import type { ${[...o].sort().join(", ")} } from "${e}";`);let Q=[];V.forEach(e=>{Q.push(ne(e))});let H=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
2
  /* eslint-disable */
3
3
 
4
4
  `+(z.length>0?z.join(`
@@ -6,7 +6,7 @@ import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"
6
6
 
7
7
  `:"")+Q.join(`
8
8
 
9
- `);try{let e=await me(v)||{};H=await de(H,{...e,parser:"typescript",filepath:v})}catch{}await ge(v,H);let X=[],Y=[];V.forEach(e=>{let i=e.type==="rpc"?"POST":"GET",s=e.type==="loader"?e.loaderUrl:e.rpcUrl;Y.push({name:e.name,rpcUrl:s,method:i,isMultipart:!!e.isMultipart}),X.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let le=`
9
+ `);try{let e=await me(A)||{};H=await de(H,{...e,parser:"typescript",filepath:A})}catch{}await ge(A,H);let X=[],Y=[];V.forEach(e=>{let i=e.type==="rpc"?"POST":"GET",s=e.type==="loader"?e.loaderUrl:e.rpcUrl;Y.push({name:e.name,rpcUrl:s,method:i,isMultipart:!!e.isMultipart}),X.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let le=`
10
10
  import { createClientRpc } from '@bobtail.software/b-ssr/client';
11
11
 
12
12
  if (import.meta.env.DEV) {
@@ -21,13 +21,14 @@ import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"
21
21
  });
22
22
  `).join(`
23
23
  `)}
24
- `,ce=se(X,t);E.set(l.resolve(t),{client:le,server:ce})}catch(u){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:u})}}let re=(t,p,n)=>{if(p.includes("node_modules")||p.startsWith(k))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(p)){let r=/\brequire\s*\(/.test(t),u=/\bmodule\.exports\b/.test(t),b=/\bexports\./.test(t);if(r||u||b)return"import { createRequire } from 'module';"+`
24
+ `,ce=se(X,t);R.set(l.resolve(t),{client:le,server:ce})}catch(u){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:u})}}let re=(t,p,n)=>{if(p.includes("node_modules")||p.startsWith(k))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(p)){let r=/\brequire\s*\(/.test(t),u=/\bmodule\.exports\b/.test(t),b=/\bexports\./.test(t);if(r||u||b)return"import { createRequire } from 'module';"+`
25
25
  const require = createRequire(import.meta.url);
26
26
  const module = { exports: {} };
27
27
  const exports = module.exports;
28
28
  `+t+`
29
29
  export default module.exports;`}return null};function ne(t){let p=he(t),n="";return p.length>0&&(n=`args: { ${p.join("; ")} }`),n||(n="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${n}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function se(t,p){if(t.length===0)return"";let n=p.replace(/\\/g,"/");return`
30
-
30
+ import * as routeModule from '${n}';
31
+
31
32
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
32
33
  throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${n}');
33
34
  }
@@ -42,17 +43,6 @@ export default module.exports;`}return null};function ne(t){let p=he(t),n="";ret
42
43
  rpcOptionsMap = new Map();
43
44
  renderOptionsMap = new Map();
44
45
  loaderApiOptionsMap = new Map();
45
- const serverModulePath = '${n}';
46
-
47
- if (typeof globalThis.require === 'undefined') {
48
- try {
49
- const { createRequire } = await import('module');
50
- globalThis.require = createRequire(serverModulePath);
51
- } catch (e) {}
52
- }
53
-
54
- const routeModule = await import(/* @vite-ignore */ serverModulePath);
55
-
56
46
  const mockMethods = {
57
47
  addRpcRoute: (url, options) => rpcOptionsMap.set(url, options),
58
48
  addRenderRoute: (url, options) => renderOptionsMap.set(url, options),
@@ -81,7 +71,7 @@ export default module.exports;`}return null};function ne(t){let p=he(t),n="";ret
81
71
  try {
82
72
  await entryPoint(mockFastify);
83
73
  } catch (err) {
84
- console.error('\u274C [B-SSR CRITICAL] Error inicializando rutas backend:', serverModulePath, err);
74
+ console.error('\u274C [B-SSR CRITICAL] Error inicializando rutas backend:', '${n}', err);
85
75
  }
86
76
  }
87
77
  })();
@@ -89,14 +79,14 @@ export default module.exports;`}return null};function ne(t){let p=he(t),n="";ret
89
79
  return initPromise;
90
80
  }
91
81
 
92
- ${t.map(r=>{let u=[];r.requiresArgs&&u.push("args"),u.push("ssrContext");let b=r.requiresArgs?"args":"{}",S="";return r.type==="rpc"?S=`
82
+ ${t.map(r=>{let u=[];r.requiresArgs&&u.push("args"),u.push("ssrContext");let b=r.requiresArgs?"args":"{}",P="";return r.type==="rpc"?P=`
93
83
  if (fn.isMultipart) throw new Error('RPC multipart no soportado en SSR.');
94
84
  await getOptionsMaps();
95
85
  const options = rpcOptionsMap.get('${r.url}');
96
86
  if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${r.name}');
97
87
  const augmentedReq = Object.assign(Object.create(ssrContext.req), ${b});
98
88
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
99
- `:r.type==="api"?S=`
89
+ `:r.type==="api"?P=`
100
90
  await getOptionsMaps();
101
91
  const options = loaderApiOptionsMap.get('${r.url}');
102
92
  if (!options?.handler) {
@@ -105,7 +95,7 @@ export default module.exports;`}return null};function ne(t){let p=he(t),n="";ret
105
95
  }
106
96
  const augmentedReq = Object.assign(Object.create(ssrContext.req), ${b});
107
97
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
108
- `:S=`
98
+ `:P=`
109
99
  await getOptionsMaps();
110
100
  const options = renderOptionsMap.get('${r.url}');
111
101
  if (!options) return {};
@@ -124,11 +114,11 @@ export default module.exports;`}return null};function ne(t){let p=he(t),n="";ret
124
114
  `,`export const ${r.name} = async (${u.join(", ")}) => {
125
115
  try {
126
116
  if (!ssrContext?.req) throw new Error('ssrContext requerido en ${r.name} (SSR)');
127
- ${S}
117
+ ${P}
128
118
  } catch (error) {
129
119
  console.error('\u274C [B-SSR Error] ${r.name}:', error);
130
120
  throw error;
131
121
  }
132
122
  };`}).join(`
133
123
  `)}
134
- `}async function ie(){let t=await pe(T,{absolute:!0});await Promise.all(t.map(p=>K(p)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ie()},configureServer(t){let p=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>p(n)&&K(n)),t.watcher.on("change",n=>p(n)&&K(n)),t.watcher.on("unlink",n=>{if(p(n)){let r=l.resolve(n);E.delete(r),O.delete(r);let u=l.extname(n),b=n.substring(0,n.length-u.length)+".universal.d.ts";ee(b).catch(()=>{})}})},async resolveId(t,p,n){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],u=r;if(r.endsWith(".universal"))u=r;else if(r.endsWith(".universal.ts"))u=r.slice(0,-3);else if(r.endsWith(".universal.mts"))u=r.slice(0,-4);else if(r.endsWith(".universal.js"))u=r.slice(0,-3);else return null;let b=[".mts",".ts"];for(let S of b){let C=u.slice(0,-10)+S,q=await this.resolve(C,p,{skipSelf:!0});if(q){let D=n?.ssr?"?mode=ssr":"?mode=client";return k+q.id+D}try{await ue(C);let D=n?.ssr?"?mode=ssr":"?mode=client";return k+C+D}catch{}}}return null},async load(t,p){if(t.startsWith(k)){let n=t.slice(k.length).split("?")[0],r=E.get(n);return r||(await K(n),r=E.get(n)),r?p?.ssr===!0?r.server:r.client:null}if(p?.ssr!==!0){let n=l.resolve(t);if(O.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${l.basename(t)}");`}return null},transform:re}}function he(x){let T=[];return x.paramsType!=="unknown"&&T.push(`params: ${x.paramsType}`),x.queryType!=="unknown"&&T.push(`query: ${x.queryType}`),x.bodyType!=="unknown"&&T.push(`body: ${x.bodyType}`),T.push("signal?: AbortSignal"),T}export{Re as rpcGeneratorPlugin};
124
+ `}async function ie(){let t=await pe(T,{absolute:!0});await Promise.all(t.map(p=>K(p)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ie()},configureServer(t){let p=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>p(n)&&K(n)),t.watcher.on("change",n=>p(n)&&K(n)),t.watcher.on("unlink",n=>{if(p(n)){let r=l.resolve(n);R.delete(r),M.delete(r);let u=l.extname(n),b=n.substring(0,n.length-u.length)+".universal.d.ts";ee(b).catch(()=>{})}})},async resolveId(t,p,n){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],u=r;if(r.endsWith(".universal"))u=r;else if(r.endsWith(".universal.ts"))u=r.slice(0,-3);else if(r.endsWith(".universal.mts"))u=r.slice(0,-4);else if(r.endsWith(".universal.js"))u=r.slice(0,-3);else return null;let b=[".mts",".ts"];for(let P of b){let C=u.slice(0,-10)+P,q=await this.resolve(C,p,{skipSelf:!0});if(q){let D=n?.ssr?"?mode=ssr":"?mode=client";return k+q.id+D}try{await ue(C);let D=n?.ssr?"?mode=ssr":"?mode=client";return k+C+D}catch{}}}return null},async load(t,p){if(t.startsWith(k)){let n=t.slice(k.length).split("?")[0],r=R.get(n);return r||(await K(n),r=R.get(n)),r?p?.ssr===!0?r.server:r.client:null}if(p?.ssr!==!0){let n=l.resolve(t);if(M.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${l.basename(t)}");`}return null},transform:re}}function he(x){let T=[];return x.paramsType!=="unknown"&&T.push(`params: ${x.paramsType}`),x.queryType!=="unknown"&&T.push(`query: ${x.queryType}`),x.bodyType!=="unknown"&&T.push(`body: ${x.bodyType}`),T.push("signal?: AbortSignal"),T}export{Ee as rpcGeneratorPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobtail.software/b-ssr",
3
- "version": "1.0.44",
3
+ "version": "1.0.46",
4
4
  "description": "Fastify + Vite SSR Plugin wrapper with RPC",
5
5
  "author": "Victor Moreno <info@bobtail.software> (https://bobtail.software)",
6
6
  "license": "GPL-3.0",