@bobtail.software/b-ssr 1.0.61 → 1.0.65

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 E=Object.create;var S=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var I=(e,r)=>{for(var d in r)S(e,d,{get:r[d],enumerable:!0})},v=(e,r,d,f)=>{if(r&&typeof r=="object"||typeof r=="function")for(let l of D(r))!G.call(e,l)&&l!==d&&S(e,l,{get:()=>r[l],enumerable:!(f=x(r,l))||f.enumerable});return e};var R=(e,r,d)=>(d=e!=null?E(O(e)):{},v(r||!e||!e.__esModule?S(d,"default",{value:e,enumerable:!0}):d,e)),k=e=>v(S({},"__esModule",{value:!0}),e);var A={};I(A,{default:()=>b});module.exports=k(A);var _=require("@fastify/multipart"),T=R(require("fastify-plugin"),1),y=R(require("path"),1),g=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 l of d)if(l.type==="field")f[l.fieldname]=l.value;else{let t=Symbol.for("file-stream");e[t]=l}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 l=async(t,a,h)=>{try{let o=t.raw.url,m=r.getGlobalSettings?await r.getGlobalSettings(t):void 0;if(y.default.extname(o)!==""){a.status(404).send(`File not found: ${o}`);return}let s="";!f&&e.viteServer&&(s=await e.viteServer.transformIndexHtml(o,"<html><head></head><body></body></html>"),s=s.substring(s.indexOf("<head>")+6,s.indexOf("</head>"))),s=(m?`<script>window.__GLOBAL_SETTINGS__ = ${JSON.stringify(m)}</script>`:"")+s;let i=f?await import(y.default.resolve(r.root,r.prodEntryFile)):await e.viteServer.ssrLoadModule(r.devEntryFile),n=i.render||i.default;if(typeof n!="function")throw new Error(`Entry file ${r.devEntryFile} must export a 'render' function.`);await n({req:t,reply:a,head:s,data:h,globalSettings:m})}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,...m}=a,s=`/rpc${t}`,u={...m,schema:o};if(o?.consumes?.includes("multipart/form-data")){let n=u.preValidation;u.preValidation=n?Array.isArray(n)?[g,...n]:[g,n]:g}this.route({method:"POST",url:s,...u,handler:async(n,c)=>{try{let p=await h.call(this,n,c);return c.sent?void 0:p}catch(p){if(console.error(`[RPC Error] ${s}:`,p),!c.sent){let{statusCode:F,message:w}=d(p);c.status(F).send({error:{message:w}})}}}})}),e.decorate("addRenderRoute",function(t,a){let{handler:h,schema:o,...m}=a||{},s=async(u,i,n)=>{try{let c=await h?.call(this,u,i);return n?c:l(u,i,c)}catch(c){if(console.error(`[Render Error] ${t}:`,c),!i.sent){let{statusCode:p,message:F}=d(c);if(n)i.status(p).send({error:{message:F}});else return l(u,i,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:t,schema:o,...m,handler:(u,i)=>s(u,i,!1)}),t!=="*"&&t!=="/*"){this.route({method:"GET",url:`/loader${t}`,schema:o,...m,handler:(n,c)=>s(n,c,!0)});let u=t.endsWith("/")?"*":"/*",i=`${t}${u}`;this.route({method:"GET",url:i,schema:o,...m,handler:(n,c)=>s(n,c,!1)})}}),e.decorate("addLoaderRoute",function(t,a){let{handler:h,schema:o,...m}=a,s=`/api${t}`;this.route({method:"GET",url:s,schema:o,...m,handler:async(u,i)=>{try{let n=await h.call(this,u,i);return i.sent?void 0:n}catch(n){if(console.error(`[Loader API Error] ${s}:`,n),!i.sent){let{statusCode:c,message:p}=d(n);i.status(c).send({error:{message:p}})}}}})})},b=(0,T.default)(P,{name:"fastify-b-ssr"});
1
+ "use strict";var D=Object.create;var g=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty;var k=(e,t)=>{for(var o in t)g(e,o,{get:t[o],enumerable:!0})},E=(e,t,o,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of G(t))!P.call(e,s)&&s!==o&&g(e,s,{get:()=>t[s],enumerable:!(d=I(t,s))||d.enumerable});return e};var y=(e,t,o)=>(o=e!=null?D(C(e)):{},E(t||!e||!e.__esModule?g(o,"default",{value:e,enumerable:!0}):o,e)),A=e=>E(g({},"__esModule",{value:!0}),e);var N={};k(N,{default:()=>_});module.exports=A(N);var H=require("@fastify/multipart"),b=y(require("fastify-plugin"),1),v=y(require("path"),1),R=require("zod");async function x(e=24678){let t=await import("net");return new Promise((o,d)=>{let s=t.createServer();s.listen(e,"127.0.0.1",()=>{let r=s.address(),n=typeof r=="object"&&r!==null?r.port:e;s.close(()=>o(n))}),s.on("error",r=>{r.code==="EADDRINUSE"?s.close(()=>o(x(e+1))):d(r)})})}function w(e){if(!e)return;console.log("[B-SSR] Converting schema:",JSON.stringify(e,null,2));let t={},o=d=>!d||typeof d!="object"?!1:!!(d._def||d.def);return e.body&&o(e.body)&&(console.log("[B-SSR] Converting body schema"),t.body=R.z.toJSONSchema(e.body,{target:"draft-7",unrepresentable:"any",io:"input"}),console.log("[B-SSR] Converted body:",JSON.stringify(t.body,null,2))),e.params&&o(e.params)&&(console.log("[B-SSR] Converting params schema"),t.params=R.z.toJSONSchema(e.params,{target:"draft-7",unrepresentable:"any",io:"input"})),e.querystring&&o(e.querystring)&&(console.log("[B-SSR] Converting querystring schema"),t.querystring=R.z.toJSONSchema(e.querystring,{target:"draft-7",unrepresentable:"any",io:"input"})),e.headers&&o(e.headers)&&(console.log("[B-SSR] Converting headers schema"),t.headers=R.z.toJSONSchema(e.headers,{target:"draft-7",unrepresentable:"any",io:"input"})),e.consumes&&(t.consumes=e.consumes),e.produces&&(t.produces=e.produces),e.response&&(t.response=e.response),e.tags&&(t.tags=e.tags),e.description&&(t.description=e.description),e.summary&&(t.summary=e.summary),e.deprecated&&(t.deprecated=e.deprecated),console.log("[B-SSR] Converted schema result:",JSON.stringify(t,null,2)),t}var T=async(e,t)=>{if(!e.isMultipart())return t.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let o=e.parts(),d={};for await(let s of o)if(s.type==="field")d[s.fieldname]=s.value;else{let r=Symbol.for("file-stream");e[r]=s}e.body=d},q=async(e,t)=>{let o=r=>{if(t.errorHandler){let n=t.errorHandler(r);if(n)return n}return{message:r instanceof Error?r.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 d=process.env.NODE_ENV==="production";if(d){if(t.clientDistDir)try{let r=await import("@fastify/static"),n=v.default.resolve(t.root,t.clientDistDir);await e.register(r.default,{root:n,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Serving static assets from: ${n}`)}catch(r){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",r)}}else{if(!e.hasDecorator("use"))try{let l=await import("@fastify/middie");await e.register(l.default,{hook:"onRequest"})}catch(l){if(l.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw l}let r=await import("vite"),n=t.viteConfig||{},p;n.server?.hmr&&typeof n.server.hmr=="object"&&"port"in n.server.hmr?p=n.server.hmr.port:p=t.hmrPort??await x();let u=await r.createServer({root:t.root,appType:"custom",...n,server:{hmr:{port:p},...n.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 s=async(r,n,p)=>{try{let u=r.raw.url,l=t.getGlobalSettings?await t.getGlobalSettings(r):void 0;if(v.default.extname(u)!==""){n.status(404).send(`File not found: ${u}`);return}let a="";!d&&e.viteServer&&(a=await e.viteServer.transformIndexHtml(u,"<html><head></head><body></body></html>"),a=a.substring(a.indexOf("<head>")+6,a.indexOf("</head>"))),a=(l?`<script>window.__GLOBAL_SETTINGS__ = ${JSON.stringify(l)}</script>`:"")+a;let f=d?await import(v.default.resolve(t.root,t.prodEntryFile)):await e.viteServer.ssrLoadModule(t.devEntryFile),i=f.render||f.default;if(typeof i!="function")throw new Error(`Entry file ${t.devEntryFile} must export a 'render' function.`);await i({req:r,reply:n,head:a,data:p,globalSettings:l})}catch(u){e.viteServer?.ssrFixStacktrace(u),console.error("[SSR Error]:",u),n.sent||n.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(r,n){let{handler:p,schema:u,...l}=n,a=`/rpc${r}`,S=w(u),f={...l,schema:S};if(u?.consumes?.includes("multipart/form-data")){let c=f.preValidation;f.preValidation=c?Array.isArray(c)?[T,...c]:[T,c]:T}this.route({method:"POST",url:a,...f,handler:async(c,m)=>{try{let h=await p.call(this,c,m);return m.sent?void 0:h}catch(h){if(console.error(`[RPC Error] ${a}:`,h),!m.sent){let{statusCode:F,message:O}=o(h);m.status(F).send({error:{message:O}})}}}})}),e.decorate("addRenderRoute",function(r,n){let{handler:p,schema:u,...l}=n||{},a=w(u),S=async(f,i,c)=>{try{let m=await p?.call(this,f,i);return c?m:s(f,i,m)}catch(m){if(console.error(`[Render Error] ${r}:`,m),!i.sent){let{statusCode:h,message:F}=o(m);if(c)i.status(h).send({error:{message:F}});else return s(f,i,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:r,schema:a,...l,handler:(f,i)=>S(f,i,!1)}),r!=="*"&&r!=="/*"){this.route({method:"GET",url:`/loader${r}`,schema:a,...l,handler:(c,m)=>S(c,m,!0)});let f=r.endsWith("/")?"*":"/*",i=`${r}${f}`;this.route({method:"GET",url:i,schema:a,...l,handler:(c,m)=>S(c,m,!1)})}}),e.decorate("addLoaderRoute",function(r,n){let{handler:p,schema:u,...l}=n,a=`/api${r}`,S=w(u);this.route({method:"GET",url:a,schema:S,...l,handler:async(f,i)=>{try{let c=await p.call(this,f,i);return i.sent?void 0:c}catch(c){if(console.error(`[Loader API Error] ${a}:`,c),!i.sent){let{statusCode:m,message:h}=o(c);i.status(m).send({error:{message:h}})}}}})})},_=(0,b.default)(q,{name:"fastify-b-ssr"});
@@ -46,6 +46,8 @@ interface FastifyReactSsrOptions {
46
46
  } | null | undefined;
47
47
  /** Función opcional para obtener ajustes globales (ej: de MySQL) que se inyectarán en el SSR */
48
48
  getGlobalSettings?: (req: FastifyRequest) => Promise<unknown> | unknown;
49
+ /** Puerto HMR para Vite en desarrollo (por defecto: 24678, se busca puerto disponible si está en uso) */
50
+ hmrPort?: number;
49
51
  }
50
52
  declare module 'fastify' {
51
53
  interface FastifyInstance {
@@ -46,6 +46,8 @@ interface FastifyReactSsrOptions {
46
46
  } | null | undefined;
47
47
  /** Función opcional para obtener ajustes globales (ej: de MySQL) que se inyectarán en el SSR */
48
48
  getGlobalSettings?: (req: FastifyRequest) => Promise<unknown> | unknown;
49
+ /** Puerto HMR para Vite en desarrollo (por defecto: 24678, se busca puerto disponible si está en uso) */
50
+ hmrPort?: number;
49
51
  }
50
52
  declare module 'fastify' {
51
53
  interface FastifyInstance {
@@ -1 +1 @@
1
- import"@fastify/multipart";import g from"fastify-plugin";import S from"path";var y=async(t,c)=>{if(!t.isMultipart())return c.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},v=async(t,c)=>{let p=e=>{if(c.errorHandler){let o=c.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(c.clientDistDir)try{let e=await import("@fastify/static"),o=S.resolve(c.root,c.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 n=await import("@fastify/middie");await t.register(n.default,{hook:"onRequest"})}catch(n){if(n.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw n}let e=await import("vite"),o=c.viteConfig||{},l=await e.createServer({root:c.root,appType:"custom",...o,server:{hmr:{port:24678},...o.server,middlewareMode:!0}});t.use(l.middlewares),t.hasDecorator("viteServer")||t.decorate("viteServer",l),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}t.decorate("viteInitDone",!0);let h=async(e,o,l)=>{try{let n=e.raw.url,u=c.getGlobalSettings?await c.getGlobalSettings(e):void 0;if(S.extname(n)!==""){o.status(404).send(`File not found: ${n}`);return}let a="";!f&&t.viteServer&&(a=await t.viteServer.transformIndexHtml(n,"<html><head></head><body></body></html>"),a=a.substring(a.indexOf("<head>")+6,a.indexOf("</head>"))),a=(u?`<script>window.__GLOBAL_SETTINGS__ = ${JSON.stringify(u)}</script>`:"")+a;let s=f?await import(S.resolve(c.root,c.prodEntryFile)):await t.viteServer.ssrLoadModule(c.devEntryFile),r=s.render||s.default;if(typeof r!="function")throw new Error(`Entry file ${c.devEntryFile} must export a 'render' function.`);await r({req:e,reply:o,head:a,data:l,globalSettings:u})}catch(n){t.viteServer?.ssrFixStacktrace(n),console.error("[SSR Error]:",n),o.sent||o.status(500).send("Internal Server Error")}};t.decorate("addRpcRoute",function(e,o){let{handler:l,schema:n,...u}=o,a=`/rpc${e}`,d={...u,schema:n};if(n?.consumes?.includes("multipart/form-data")){let r=d.preValidation;d.preValidation=r?Array.isArray(r)?[y,...r]:[y,r]:y}this.route({method:"POST",url:a,...d,handler:async(r,i)=>{try{let m=await l.call(this,r,i);return i.sent?void 0:m}catch(m){if(console.error(`[RPC Error] ${a}:`,m),!i.sent){let{statusCode:R,message:F}=p(m);i.status(R).send({error:{message:F}})}}}})}),t.decorate("addRenderRoute",function(e,o){let{handler:l,schema:n,...u}=o||{},a=async(d,s,r)=>{try{let i=await l?.call(this,d,s);return r?i:h(d,s,i)}catch(i){if(console.error(`[Render Error] ${e}:`,i),!s.sent){let{statusCode:m,message:R}=p(i);if(r)s.status(m).send({error:{message:R}});else return h(d,s,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:e,schema:n,...u,handler:(d,s)=>a(d,s,!1)}),e!=="*"&&e!=="/*"){this.route({method:"GET",url:`/loader${e}`,schema:n,...u,handler:(r,i)=>a(r,i,!0)});let d=e.endsWith("/")?"*":"/*",s=`${e}${d}`;this.route({method:"GET",url:s,schema:n,...u,handler:(r,i)=>a(r,i,!1)})}}),t.decorate("addLoaderRoute",function(e,o){let{handler:l,schema:n,...u}=o,a=`/api${e}`;this.route({method:"GET",url:a,schema:n,...u,handler:async(d,s)=>{try{let r=await l.call(this,d,s);return s.sent?void 0:r}catch(r){if(console.error(`[Loader API Error] ${a}:`,r),!s.sent){let{statusCode:i,message:m}=p(r);s.status(i).send({error:{message:m}})}}}})})},x=g(v,{name:"fastify-b-ssr"});export{x as default};
1
+ import"@fastify/multipart";import E from"fastify-plugin";import g from"path";import{z as y}from"zod";async function w(e=24678){let r=await import("net");return new Promise((l,f)=>{let m=r.createServer();m.listen(e,"127.0.0.1",()=>{let t=m.address(),n=typeof t=="object"&&t!==null?t.port:e;m.close(()=>l(n))}),m.on("error",t=>{t.code==="EADDRINUSE"?m.close(()=>l(w(e+1))):f(t)})})}function v(e){if(!e)return;console.log("[B-SSR] Converting schema:",JSON.stringify(e,null,2));let r={},l=f=>!f||typeof f!="object"?!1:!!(f._def||f.def);return e.body&&l(e.body)&&(console.log("[B-SSR] Converting body schema"),r.body=y.toJSONSchema(e.body,{target:"draft-7",unrepresentable:"any",io:"input"}),console.log("[B-SSR] Converted body:",JSON.stringify(r.body,null,2))),e.params&&l(e.params)&&(console.log("[B-SSR] Converting params schema"),r.params=y.toJSONSchema(e.params,{target:"draft-7",unrepresentable:"any",io:"input"})),e.querystring&&l(e.querystring)&&(console.log("[B-SSR] Converting querystring schema"),r.querystring=y.toJSONSchema(e.querystring,{target:"draft-7",unrepresentable:"any",io:"input"})),e.headers&&l(e.headers)&&(console.log("[B-SSR] Converting headers schema"),r.headers=y.toJSONSchema(e.headers,{target:"draft-7",unrepresentable:"any",io:"input"})),e.consumes&&(r.consumes=e.consumes),e.produces&&(r.produces=e.produces),e.response&&(r.response=e.response),e.tags&&(r.tags=e.tags),e.description&&(r.description=e.description),e.summary&&(r.summary=e.summary),e.deprecated&&(r.deprecated=e.deprecated),console.log("[B-SSR] Converted schema result:",JSON.stringify(r,null,2)),r}var F=async(e,r)=>{if(!e.isMultipart())return r.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let l=e.parts(),f={};for await(let m of l)if(m.type==="field")f[m.fieldname]=m.value;else{let t=Symbol.for("file-stream");e[t]=m}e.body=f},b=async(e,r)=>{let l=t=>{if(r.errorHandler){let n=r.errorHandler(t);if(n)return n}return{message:t instanceof Error?t.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"),n=g.resolve(r.root,r.clientDistDir);await e.register(t.default,{root:n,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Serving static assets from: ${n}`)}catch(t){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",t)}}else{if(!e.hasDecorator("use"))try{let c=await import("@fastify/middie");await e.register(c.default,{hook:"onRequest"})}catch(c){if(c.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw c}let t=await import("vite"),n=r.viteConfig||{},p;n.server?.hmr&&typeof n.server.hmr=="object"&&"port"in n.server.hmr?p=n.server.hmr.port:p=r.hmrPort??await w();let i=await t.createServer({root:r.root,appType:"custom",...n,server:{hmr:{port:p},...n.server,middlewareMode:!0}});e.use(i.middlewares),e.hasDecorator("viteServer")||e.decorate("viteServer",i),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}e.decorate("viteInitDone",!0);let m=async(t,n,p)=>{try{let i=t.raw.url,c=r.getGlobalSettings?await r.getGlobalSettings(t):void 0;if(g.extname(i)!==""){n.status(404).send(`File not found: ${i}`);return}let o="";!f&&e.viteServer&&(o=await e.viteServer.transformIndexHtml(i,"<html><head></head><body></body></html>"),o=o.substring(o.indexOf("<head>")+6,o.indexOf("</head>"))),o=(c?`<script>window.__GLOBAL_SETTINGS__ = ${JSON.stringify(c)}</script>`:"")+o;let d=f?await import(g.resolve(r.root,r.prodEntryFile)):await e.viteServer.ssrLoadModule(r.devEntryFile),s=d.render||d.default;if(typeof s!="function")throw new Error(`Entry file ${r.devEntryFile} must export a 'render' function.`);await s({req:t,reply:n,head:o,data:p,globalSettings:c})}catch(i){e.viteServer?.ssrFixStacktrace(i),console.error("[SSR Error]:",i),n.sent||n.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(t,n){let{handler:p,schema:i,...c}=n,o=`/rpc${t}`,S=v(i),d={...c,schema:S};if(i?.consumes?.includes("multipart/form-data")){let a=d.preValidation;d.preValidation=a?Array.isArray(a)?[F,...a]:[F,a]:F}this.route({method:"POST",url:o,...d,handler:async(a,u)=>{try{let h=await p.call(this,a,u);return u.sent?void 0:h}catch(h){if(console.error(`[RPC Error] ${o}:`,h),!u.sent){let{statusCode:R,message:T}=l(h);u.status(R).send({error:{message:T}})}}}})}),e.decorate("addRenderRoute",function(t,n){let{handler:p,schema:i,...c}=n||{},o=v(i),S=async(d,s,a)=>{try{let u=await p?.call(this,d,s);return a?u:m(d,s,u)}catch(u){if(console.error(`[Render Error] ${t}:`,u),!s.sent){let{statusCode:h,message:R}=l(u);if(a)s.status(h).send({error:{message:R}});else return m(d,s,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:t,schema:o,...c,handler:(d,s)=>S(d,s,!1)}),t!=="*"&&t!=="/*"){this.route({method:"GET",url:`/loader${t}`,schema:o,...c,handler:(a,u)=>S(a,u,!0)});let d=t.endsWith("/")?"*":"/*",s=`${t}${d}`;this.route({method:"GET",url:s,schema:o,...c,handler:(a,u)=>S(a,u,!1)})}}),e.decorate("addLoaderRoute",function(t,n){let{handler:p,schema:i,...c}=n,o=`/api${t}`,S=v(i);this.route({method:"GET",url:o,schema:S,...c,handler:async(d,s)=>{try{let a=await p.call(this,d,s);return s.sent?void 0:a}catch(a){if(console.error(`[Loader API Error] ${o}:`,a),!s.sent){let{statusCode:u,message:h}=l(a);s.status(u).send({error:{message:h}})}}}})})},C=E(b,{name:"fastify-b-ssr"});export{C as default};
@@ -0,0 +1,9 @@
1
+ "use strict";var ae=Object.create;var K=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ge=Object.prototype.hasOwnProperty;var ue=(a,l)=>{for(var y in l)K(a,y,{get:l[y],enumerable:!0})},X=(a,l,y,x)=>{if(l&&typeof l=="object"||typeof l=="function")for(let h of le(l))!ge.call(a,h)&&h!==y&&K(a,h,{get:()=>l[h],enumerable:!(x=ce(l,h))||x.enumerable});return a};var Y=(a,l,y)=>(y=a!=null?ae(pe(a)):{},X(l||!a||!a.__esModule?K(y,"default",{value:a,enumerable:!0}):y,a)),fe=a=>X(K({},"__esModule",{value:!0}),a);var de={};ue(de,{generateRpcTypes:()=>ye});module.exports=fe(de);var G=Y(require("fast-glob"),1),E=require("fs/promises"),u=Y(require("path"),1),k=require("prettier"),t=require("ts-morph");function me(a){let l=a.replace(/[^a-zA-Z0-9]+(.)?/g,(y,x)=>x?x.toUpperCase():"");return l.charAt(0).toLowerCase()+l.slice(1)}function z(a,l,y){let x=u.default.basename(y,u.default.extname(y))||"Index",h=l.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),C=`${a} ${h} ${x}`;return me(C)}async function ye(a={}){let{routerPattern:l="src-ts/routers/**/*.mts",tsConfigFilePath:y="tsconfig.json",routerBaseDir:x="src-ts/routers",clean:h=!1}=a,C=[],L=[],v=[];try{let V=function(f){let P=[];return f.paramsType!=="unknown"&&P.push(`params: ${f.paramsType}`),f.queryType!=="unknown"&&P.push(`query: ${f.queryType}`),f.bodyType!=="unknown"&&P.push(`body: ${f.bodyType}`),P.push("signal?: AbortSignal"),P};var Te=V;let A=new t.Project({tsConfigFilePath:y,skipAddingFilesFromTsConfig:!1}),ee=u.default.resolve(process.cwd(),x||".");async function te(f){try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(n,r)=>{if(!u.default.isAbsolute(r))return n;let s=r;if(!u.default.extname(s)){let m=A.getSourceFile(p=>p.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===r);m&&(s=m.getFilePath())}let i=u.default.relative(u.default.dirname(b),s).replace(/\\/g,"/");return i.startsWith(".")||(i="./"+i),`import("${i}")`})},j=function(e,n){if(e.getSymbol()?.getName()==="Promise"){let o=e.getAwaitedType();if(o)return`Promise<${j(o,n)}>`}let r=e.getAliasSymbol()??e.getSymbol();if(r?.getName()==="__object")return N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation|t.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!r){let o=(c,g=0)=>{if(!(g>5)){if(c.isArray()){let d=c.getArrayElementType();d&&o(d,g);return}if(c.isObject()&&!c.getSymbol()&&!c.getAliasSymbol()){for(let d of c.getApparentProperties()){let w=d.getValueDeclaration();w&&o(d.getTypeAtLocation(w),g+1)}return}j(c,n)}};return o(e),N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation|t.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!r)return N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation));let s=r.getDeclarations()[0];if(!s)return r.getName();if(t.Node.isImportSpecifier(s)||t.Node.isImportClause(s)){let o=s.getFirstAncestorByKind(t.SyntaxKind.ImportDeclaration);if(o){let c=o.getModuleSpecifierValue(),g=r.getName();return F.has(c)||F.set(c,new Set),F.get(c)?.add(g),g}}let i=s.getSourceFile();if(i.getFilePath()===$.getFilePath())return r.getName();if(i.isInNodeModules())return N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation));let m=u.default.relative(u.default.dirname(b),i.getFilePath()).replace(/\\/g,"/"),S=m.startsWith(".")?m:`./${m}`,T=r.getName();return F.has(S)||F.set(S,new Set),F.get(S)?.add(T),T},Q=function(e){let n;if(t.Node.isFunctionLikeDeclaration(e)||t.Node.isArrowFunction(e)){let r=e.getDescendantsOfKind(t.SyntaxKind.ReturnStatement);for(let s of r){let i=s.getExpression();if(i?.isKind(t.SyntaxKind.SatisfiesExpression)){n=i.getTypeNode()?.getType();break}}}if(n)return j(n,e);{let r=e.getType().getCallSignatures();if(r.length>0){let s=r[0]?.getReturnType();return j(s,e)}}return"unknown"};var P=N,B=j,se=Q;let $=A.addSourceFileAtPath(f);await $.refreshFromFileSystem(),A.resolveSourceFileDependencies();let O=$.getDescendantsOfKind(t.SyntaxKind.CallExpression),M=O.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),_=O.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),Z=O.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),ne=u.default.extname(f),b=f.substring(0,f.length-ne.length)+".universal.d.ts";if(M.length===0&&_.length===0&&Z.length===0){if(h)try{await(0,E.unlink)(b),L.push(b)}catch{}return!1}let q=[],F=new Map;F.has("fastify")||F.set("fastify",new Set),F.get("fastify")?.add("FastifyRequest"),F.get("fastify")?.add("FastifyReply");let ie=e=>{let n="unknown",r="unknown",s="unknown",i=!1;if(!e||!t.Node.isObjectLiteralExpression(e))return{paramsType:n,queryType:r,bodyType:s,isMultipart:i};let m=e.getProperty("schema");if(m?.isKind(t.SyntaxKind.PropertyAssignment)){let p=m.getInitializer();if(p?.isKind(t.SyntaxKind.Identifier)){let T=p.getSymbol()?.getValueDeclaration();if(T){let o=T.getFirstDescendantByKind(t.SyntaxKind.ObjectLiteralExpression);o&&(p=o)}}if(p&&t.Node.isObjectLiteralExpression(p)){let S=p.getProperty("consumes");if(S?.isKind(t.SyntaxKind.PropertyAssignment)){let o=S.getInitializer();t.Node.isArrayLiteralExpression(o)&&(i=o.getElements().some(c=>c.isKind(t.SyntaxKind.StringLiteral)&&c.getLiteralValue()==="multipart/form-data"))}let T=o=>{let c=p.getProperty(o);if(c?.isKind(t.SyntaxKind.PropertyAssignment)){let g=c.getInitializer();if(g){let d=g.getType(),w=d.getProperty("_output");return j(w?w.getTypeAtLocation(g).getApparentType():d,g)}}return"unknown"};if(n=T("params"),r=T("querystring"),s=T("body"),i){let o="{ file: File }";s=s!=="unknown"&&s.trim().startsWith("{")?`(${s} & ${o})`:o}}}return{paramsType:n,queryType:r,bodyType:s,isMultipart:i}},D=u.default.relative(ee,u.default.dirname(f)).split(u.default.sep).join("/"),oe=D==="."||!D?"":D.startsWith("/")?D:"/"+D,I=(e,n)=>{let[r,s]=e.getArguments();if(!r?.isKind(t.SyntaxKind.StringLiteral))return;let i=r.getLiteralValue(),m="unknown",p=oe,{paramsType:S,queryType:T,bodyType:o,isMultipart:c}=ie(s);if(s?.isKind(t.SyntaxKind.ObjectLiteralExpression)){let w=s.getProperty("prefix");if(w?.isKind(t.SyntaxKind.PropertyAssignment)){let R=w.getInitializer();R?.isKind(t.SyntaxKind.StringLiteral)&&(p=R.getLiteralValue())}let J=s.getProperty("handler");if(J?.isKind(t.SyntaxKind.PropertyAssignment)){let R=J.getInitializer();R&&(m=Q(R),m.startsWith("Promise<")||(m=`Promise<${m}>`))}}let g="",d="";n==="rpc"?(g=u.default.join(p,"rpc",i).replace(/\\/g,"/"),d=z("action",p,i)):n==="loader"?(g=u.default.join(p,"loader",i).replace(/\\/g,"/"),d=z("loader",p,i)):n==="api"&&(g=u.default.join(p,"api",i).replace(/\\/g,"/"),d=z("get",p,i)),d&&q.push({type:n,name:d,returnType:m,url:i,rpcUrl:g,loaderUrl:g,paramsType:S,queryType:T,bodyType:o,isMultipart:c})};if(M.forEach(e=>I(e,"rpc")),_.forEach(e=>I(e,"loader")),Z.forEach(e=>I(e,"api")),q.length===0){if(h)try{await(0,E.unlink)(b),L.push(b)}catch{}return!1}let W=[];for(let[e,n]of F.entries())W.push(`import type { ${[...n].sort().join(", ")} } from "${e}";`);let H=[];q.forEach(e=>{let n=V(e),r="";n.length>0&&(r=`args: { ${n.join("; ")} }`),r||(r="args: { signal?: AbortSignal }"),H.push(`export declare const ${e.name}: (${r}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${e.returnType};`)});let U=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
+ /* eslint-disable */
3
+
4
+ `+(W.length>0?W.join(`
5
+ `)+`
6
+
7
+ `:"")+H.join(`
8
+
9
+ `);try{let e=await(0,k.resolveConfig)(b)||{};U=await(0,k.format)(U,{...e,parser:"typescript",filepath:b})}catch{}return await(0,E.writeFile)(b,U),C.push(b),!0}catch($){return v.push(`Error processing ${f}: ${$ instanceof Error?$.message:String($)}`),!1}}let re=await(0,G.default)(l,{absolute:!0});if(await Promise.all(re.map(f=>te(f))),h){let f=await(0,G.default)(u.default.join(x,"**/*.universal.d.ts"),{absolute:!0});for(let P of f){let B=P.replace(".universal.d.ts",".mts").replace(".universal.d.ts",".ts");if(!await(0,E.access)(B).then(()=>!0).catch(()=>!1))try{await(0,E.unlink)(P),L.push(P)}catch{}}}}catch(A){v.push(`Fatal error: ${A instanceof Error?A.message:String(A)}`)}return{generated:C,cleaned:L,errors:v}}0&&(module.exports={generateRpcTypes});
@@ -0,0 +1,14 @@
1
+ interface GenerateRpcTypesOptions {
2
+ routerPattern?: string;
3
+ tsConfigFilePath?: string;
4
+ routerBaseDir?: string;
5
+ clean?: boolean;
6
+ }
7
+ interface GenerateResult {
8
+ generated: string[];
9
+ cleaned: string[];
10
+ errors: string[];
11
+ }
12
+ declare function generateRpcTypes(options?: GenerateRpcTypesOptions): Promise<GenerateResult>;
13
+
14
+ export { type GenerateResult, type GenerateRpcTypesOptions, generateRpcTypes };
@@ -0,0 +1,14 @@
1
+ interface GenerateRpcTypesOptions {
2
+ routerPattern?: string;
3
+ tsConfigFilePath?: string;
4
+ routerBaseDir?: string;
5
+ clean?: boolean;
6
+ }
7
+ interface GenerateResult {
8
+ generated: string[];
9
+ cleaned: string[];
10
+ errors: string[];
11
+ }
12
+ declare function generateRpcTypes(options?: GenerateRpcTypesOptions): Promise<GenerateResult>;
13
+
14
+ export { type GenerateResult, type GenerateRpcTypesOptions, generateRpcTypes };
@@ -0,0 +1,9 @@
1
+ import J from"fast-glob";import{access as ie,unlink as U,writeFile as oe}from"fs/promises";import p from"path";import{format as ae,resolveConfig as ce}from"prettier";import{Node as w,Project as le,SyntaxKind as u,ts as A}from"ts-morph";function pe($){let E=$.replace(/[^a-zA-Z0-9]+(.)?/g,(j,x)=>x?x.toUpperCase():"");return E.charAt(0).toLowerCase()+E.slice(1)}function z($,E,j){let x=p.basename(j,p.extname(j))||"Index",N=E.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),L=`${$} ${N} ${x}`;return pe(L)}async function Fe($={}){let{routerPattern:E="src-ts/routers/**/*.mts",tsConfigFilePath:j="tsconfig.json",routerBaseDir:x="src-ts/routers",clean:N=!1}=$,L=[],K=[],k=[];try{let G=function(l){let d=[];return l.paramsType!=="unknown"&&d.push(`params: ${l.paramsType}`),l.queryType!=="unknown"&&d.push(`query: ${l.queryType}`),l.bodyType!=="unknown"&&d.push(`body: ${l.bodyType}`),d.push("signal?: AbortSignal"),d};var ge=G;let P=new le({tsConfigFilePath:j,skipAddingFilesFromTsConfig:!1}),X=p.resolve(process.cwd(),x||".");async function Y(l){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(s,t)=>{if(!p.isAbsolute(t))return s;let r=t;if(!p.extname(r)){let g=P.getSourceFile(a=>a.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===t);g&&(r=g.getFilePath())}let n=p.relative(p.dirname(T),r).replace(/\\/g,"/");return n.startsWith(".")||(n="./"+n),`import("${n}")`})},S=function(e,s){if(e.getSymbol()?.getName()==="Promise"){let i=e.getAwaitedType();if(i)return`Promise<${S(i,s)}>`}let t=e.getAliasSymbol()??e.getSymbol();if(t?.getName()==="__object")return D(e.getText(s,A.TypeFormatFlags.NoTruncation|A.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!t){let i=(o,c=0)=>{if(!(c>5)){if(o.isArray()){let f=o.getArrayElementType();f&&i(f,c);return}if(o.isObject()&&!o.getSymbol()&&!o.getAliasSymbol()){for(let f of o.getApparentProperties()){let F=f.getValueDeclaration();F&&i(f.getTypeAtLocation(F),c+1)}return}S(o,s)}};return i(e),D(e.getText(s,A.TypeFormatFlags.NoTruncation|A.TypeFormatFlags.UseFullyQualifiedType))}if(!t)return D(e.getText(s,A.TypeFormatFlags.NoTruncation));let r=t.getDeclarations()[0];if(!r)return t.getName();if(w.isImportSpecifier(r)||w.isImportClause(r)){let i=r.getFirstAncestorByKind(u.ImportDeclaration);if(i){let o=i.getModuleSpecifierValue(),c=t.getName();return y.has(o)||y.set(o,new Set),y.get(o)?.add(c),c}}let n=r.getSourceFile();if(n.getFilePath()===b.getFilePath())return t.getName();if(n.isInNodeModules())return D(e.getText(s,A.TypeFormatFlags.NoTruncation));let g=p.relative(p.dirname(T),n.getFilePath()).replace(/\\/g,"/"),h=g.startsWith(".")?g:`./${g}`,m=t.getName();return y.has(h)||y.set(h,new Set),y.get(h)?.add(m),m},Z=function(e){let s;if(w.isFunctionLikeDeclaration(e)||w.isArrowFunction(e)){let t=e.getDescendantsOfKind(u.ReturnStatement);for(let r of t){let n=r.getExpression();if(n?.isKind(u.SatisfiesExpression)){s=n.getTypeNode()?.getType();break}}}if(s)return S(s,e);{let t=e.getType().getCallSignatures();if(t.length>0){let r=t[0]?.getReturnType();return S(r,e)}}return"unknown"};var d=D,V=S,te=Z;let b=P.addSourceFileAtPath(l);await b.refreshFromFileSystem(),P.resolveSourceFileDependencies();let v=b.getDescendantsOfKind(u.CallExpression),B=v.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),M=v.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),_=v.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),re=p.extname(l),T=l.substring(0,l.length-re.length)+".universal.d.ts";if(B.length===0&&M.length===0&&_.length===0){if(N)try{await U(T),K.push(T)}catch{}return!1}let O=[],y=new Map;y.has("fastify")||y.set("fastify",new Set),y.get("fastify")?.add("FastifyRequest"),y.get("fastify")?.add("FastifyReply");let se=e=>{let s="unknown",t="unknown",r="unknown",n=!1;if(!e||!w.isObjectLiteralExpression(e))return{paramsType:s,queryType:t,bodyType:r,isMultipart:n};let g=e.getProperty("schema");if(g?.isKind(u.PropertyAssignment)){let a=g.getInitializer();if(a?.isKind(u.Identifier)){let m=a.getSymbol()?.getValueDeclaration();if(m){let i=m.getFirstDescendantByKind(u.ObjectLiteralExpression);i&&(a=i)}}if(a&&w.isObjectLiteralExpression(a)){let h=a.getProperty("consumes");if(h?.isKind(u.PropertyAssignment)){let i=h.getInitializer();w.isArrayLiteralExpression(i)&&(n=i.getElements().some(o=>o.isKind(u.StringLiteral)&&o.getLiteralValue()==="multipart/form-data"))}let m=i=>{let o=a.getProperty(i);if(o?.isKind(u.PropertyAssignment)){let c=o.getInitializer();if(c){let f=c.getType(),F=f.getProperty("_output");return S(F?F.getTypeAtLocation(c).getApparentType():f,c)}}return"unknown"};if(s=m("params"),t=m("querystring"),r=m("body"),n){let i="{ file: File }";r=r!=="unknown"&&r.trim().startsWith("{")?`(${r} & ${i})`:i}}}return{paramsType:s,queryType:t,bodyType:r,isMultipart:n}},R=p.relative(X,p.dirname(l)).split(p.sep).join("/"),ne=R==="."||!R?"":R.startsWith("/")?R:"/"+R,q=(e,s)=>{let[t,r]=e.getArguments();if(!t?.isKind(u.StringLiteral))return;let n=t.getLiteralValue(),g="unknown",a=ne,{paramsType:h,queryType:m,bodyType:i,isMultipart:o}=se(r);if(r?.isKind(u.ObjectLiteralExpression)){let F=r.getProperty("prefix");if(F?.isKind(u.PropertyAssignment)){let C=F.getInitializer();C?.isKind(u.StringLiteral)&&(a=C.getLiteralValue())}let H=r.getProperty("handler");if(H?.isKind(u.PropertyAssignment)){let C=H.getInitializer();C&&(g=Z(C),g.startsWith("Promise<")||(g=`Promise<${g}>`))}}let c="",f="";s==="rpc"?(c=p.join(a,"rpc",n).replace(/\\/g,"/"),f=z("action",a,n)):s==="loader"?(c=p.join(a,"loader",n).replace(/\\/g,"/"),f=z("loader",a,n)):s==="api"&&(c=p.join(a,"api",n).replace(/\\/g,"/"),f=z("get",a,n)),f&&O.push({type:s,name:f,returnType:g,url:n,rpcUrl:c,loaderUrl:c,paramsType:h,queryType:m,bodyType:i,isMultipart:o})};if(B.forEach(e=>q(e,"rpc")),M.forEach(e=>q(e,"loader")),_.forEach(e=>q(e,"api")),O.length===0){if(N)try{await U(T),K.push(T)}catch{}return!1}let I=[];for(let[e,s]of y.entries())I.push(`import type { ${[...s].sort().join(", ")} } from "${e}";`);let Q=[];O.forEach(e=>{let s=G(e),t="";s.length>0&&(t=`args: { ${s.join("; ")} }`),t||(t="args: { signal?: AbortSignal }"),Q.push(`export declare const ${e.name}: (${t}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${e.returnType};`)});let W=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
+ /* eslint-disable */
3
+
4
+ `+(I.length>0?I.join(`
5
+ `)+`
6
+
7
+ `:"")+Q.join(`
8
+
9
+ `);try{let e=await ce(T)||{};W=await ae(W,{...e,parser:"typescript",filepath:T})}catch{}return await oe(T,W),L.push(T),!0}catch(b){return k.push(`Error processing ${l}: ${b instanceof Error?b.message:String(b)}`),!1}}let ee=await J(E,{absolute:!0});if(await Promise.all(ee.map(l=>Y(l))),N){let l=await J(p.join(x,"**/*.universal.d.ts"),{absolute:!0});for(let d of l){let V=d.replace(".universal.d.ts",".mts").replace(".universal.d.ts",".ts");if(!await ie(V).then(()=>!0).catch(()=>!1))try{await U(d),K.push(d)}catch{}}}}catch(P){k.push(`Fatal error: ${P instanceof Error?P.message:String(P)}`)}return{generated:L,cleaned:K,errors:k}}export{Fe as generateRpcTypes};
@@ -1,19 +1,27 @@
1
- "use strict";var de=Object.create;var I=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)I(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&&I(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?I(x,"default",{value:o,enumerable:!0}):x,o)),Te=o=>te(I({},"__esModule",{value:!0}),o);var Se={};be(Se,{rpcGeneratorPlugin:()=>Pe});module.exports=Te(Se);var se=re(require("fast-glob"),1),q=require("fs/promises"),a=re(require("path"),1),K=require("prettier"),s=require("ts-morph"),L="virtual:b-ssr-rpc-universal:";function xe(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=a.default.basename(x,a.default.extname(x))||"Index",w=l.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),j=`${o} ${w} ${C}`;return xe(j)}function Pe(o={}){let{routerPattern:l="src-ts/routers/**/*.mts",tsConfigFilePath:x="tsconfig.json",routerBaseDir:C="src-ts/routers"}=o,w=new Map,j=new Set,B=new s.Project({tsConfigFilePath:x,skipAddingFilesFromTsConfig:!1}),ne=a.default.resolve(process.cwd(),C||".");async function W(t){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(p,i)=>{if(!a.default.isAbsolute(i))return p;let n=i;if(!a.default.extname(n)){let T=B.getSourceFile(y=>y.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===i);T&&(n=T.getFilePath())}let u=a.default.relative(a.default.dirname(M),n).replace(/\\/g,"/");return u.startsWith(".")||(u="./"+u),`import("${u}")`})},O=function(e,p){if(e.getSymbol()?.getName()==="Promise"){let d=e.getAwaitedType();if(d)return`Promise<${O(d,p)}>`}let i=e.getAliasSymbol()??e.getSymbol();if(i?.getName()==="__object")return D(e.getText(p,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!i){let d=(f,h=0)=>{if(!(h>5)){if(f.isArray()){let P=f.getArrayElementType();P&&d(P,h);return}if(f.isObject()&&!f.getSymbol()&&!f.getAliasSymbol()){for(let P of f.getApparentProperties()){let $=P.getValueDeclaration();$&&d(P.getTypeAtLocation($),h+1)}return}O(f,p)}};return d(e),D(e.getText(p,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!i)return D(e.getText(p,s.ts.TypeFormatFlags.NoTruncation));let n=i.getDeclarations()[0];if(!n)return i.getName();if(s.Node.isImportSpecifier(n)||s.Node.isImportClause(n)){let d=n.getFirstAncestorByKind(s.SyntaxKind.ImportDeclaration);if(d){let f=d.getModuleSpecifierValue(),h=i.getName();return v.has(f)||v.set(f,new Set),v.get(f)?.add(h),h}}let u=n.getSourceFile();if(u.getFilePath()===b.getFilePath())return i.getName();if(u.isInNodeModules())return D(e.getText(p,s.ts.TypeFormatFlags.NoTruncation));let T=a.default.relative(a.default.dirname(M),u.getFilePath()).replace(/\\/g,"/"),E=T.startsWith(".")?T:`./${T}`,S=i.getName();return v.has(E)||v.set(E,new Set),v.get(E)?.add(S),S},Q=function(e){let p;if(s.Node.isFunctionLikeDeclaration(e)||s.Node.isArrowFunction(e)){let i=e.getDescendantsOfKind(s.SyntaxKind.ReturnStatement);for(let n of i){let u=n.getExpression();if(u?.isKind(s.SyntaxKind.SatisfiesExpression)){p=u.getTypeNode()?.getType();break}}}if(p)return O(p,e);{let i=e.getType().getCallSignatures();if(i.length>0){let n=i[0]?.getReturnType();return O(n,e)}}return"unknown"};var m=D,r=O,g=Q;let b=B.addSourceFileAtPath(t);await b.refreshFromFileSystem(),B.resolveSourceFileDependencies();let c=b.getDescendantsOfKind(s.SyntaxKind.CallExpression),A=c.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),F=c.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),R=c.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),k=a.default.extname(t),M=t.substring(0,t.length-k.length)+".universal.d.ts",V=a.default.resolve(t);if(A.length===0&&F.length===0&&R.length===0){w.delete(V),j.delete(V),M!==t&&await(0,q.unlink)(M).catch(()=>{});return}j.add(V);let _=[],v=new Map;v.has("fastify")||v.set("fastify",new Set),v.get("fastify")?.add("FastifyRequest"),v.get("fastify")?.add("FastifyReply");let ce=e=>{let p="unknown",i="unknown",n="unknown",u=!1;if(!e||!s.Node.isObjectLiteralExpression(e))return{paramsType:p,queryType:i,bodyType:n,isMultipart:u};let T=e.getProperty("schema");if(T?.isKind(s.SyntaxKind.PropertyAssignment)){let y=T.getInitializer();if(y?.isKind(s.SyntaxKind.Identifier)){let S=y.getSymbol()?.getValueDeclaration();if(S){let d=S.getFirstDescendantByKind(s.SyntaxKind.ObjectLiteralExpression);d&&(y=d)}}if(y&&s.Node.isObjectLiteralExpression(y)){let E=y.getProperty("consumes");if(E?.isKind(s.SyntaxKind.PropertyAssignment)){let d=E.getInitializer();s.Node.isArrayLiteralExpression(d)&&(u=d.getElements().some(f=>f.isKind(s.SyntaxKind.StringLiteral)&&f.getLiteralValue()==="multipart/form-data"))}let S=d=>{let f=y.getProperty(d);if(f?.isKind(s.SyntaxKind.PropertyAssignment)){let h=f.getInitializer();if(h){let P=h.getType(),$=P.getProperty("_output");return O($?$.getTypeAtLocation(h).getApparentType():P,h)}}return"unknown"};if(p=S("params"),i=S("querystring"),n=S("body"),u){let d="{ file: File }";n=n!=="unknown"&&n.trim().startsWith("{")?`(${n} & ${d})`:d}}}return{paramsType:p,queryType:i,bodyType:n,isMultipart:u}},N=a.default.relative(ne,a.default.dirname(t)).split(a.default.sep).join("/"),pe=N==="."||!N?"":N.startsWith("/")?N:"/"+N,z=(e,p)=>{let[i,n]=e.getArguments();if(!i?.isKind(s.SyntaxKind.StringLiteral))return;let u=i.getLiteralValue(),T="unknown",y=pe,{paramsType:E,queryType:S,bodyType:d,isMultipart:f}=ce(n);if(n?.isKind(s.SyntaxKind.ObjectLiteralExpression)){let $=n.getProperty("prefix");if($?.isKind(s.SyntaxKind.PropertyAssignment)){let U=$.getInitializer();U?.isKind(s.SyntaxKind.StringLiteral)&&(y=U.getLiteralValue())}let ee=n.getProperty("handler");if(ee?.isKind(s.SyntaxKind.PropertyAssignment)){let U=ee.getInitializer();U&&(T=Q(U),T.startsWith("Promise<")||(T=`Promise<${T}>`))}}let h="",P="";p==="rpc"?(h=a.default.join(y,"rpc",u).replace(/\\/g,"/"),P=Z("action",y,u)):p==="loader"?(h=a.default.join(y,"loader",u).replace(/\\/g,"/"),P=Z("loader",y,u)):p==="api"&&(h=a.default.join(y,"api",u).replace(/\\/g,"/"),P=Z("get",y,u)),P&&_.push({type:p,name:P,returnType:T,url:u,rpcUrl:h,loaderUrl:h,paramsType:E,queryType:S,bodyType:d,isMultipart:f})};A.forEach(e=>z(e,"rpc")),F.forEach(e=>z(e,"loader")),R.forEach(e=>z(e,"api"));let H=[];for(let[e,p]of v.entries())H.push(`import type { ${[...p].sort().join(", ")} } from "${e}";`);let X=[];_.forEach(e=>{X.push(ie(e))});let G=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
1
+ "use strict";var Pe=Object.create;var ie=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty;var Re=(u,d)=>{for(var A in d)ie(u,A,{get:d[A],enumerable:!0})},he=(u,d,A,j)=>{if(d&&typeof d=="object"||typeof d=="function")for(let $ of we(d))!Ee.call(u,$)&&$!==A&&ie(u,$,{get:()=>d[$],enumerable:!(j=Fe(d,$))||j.enumerable});return u};var oe=(u,d,A)=>(A=u!=null?Pe(Se(u)):{},he(d||!u||!u.__esModule?ie(A,"default",{value:u,enumerable:!0}):A,u)),Ae=u=>he(ie({},"__esModule",{value:!0}),u);var Oe={};Re(Oe,{generateRpcTypes:()=>Te,rpcGeneratorPlugin:()=>ve});module.exports=Ae(Oe);var be=oe(require("fast-glob"),1),X=require("fs/promises"),w=oe(require("path"),1),le=require("prettier"),f=require("ts-morph");var me=oe(require("fast-glob"),1),_=require("fs/promises"),v=oe(require("path"),1),ae=require("prettier"),g=require("ts-morph");function $e(u){let d=u.replace(/[^a-zA-Z0-9]+(.)?/g,(A,j)=>j?j.toUpperCase():"");return d.charAt(0).toLowerCase()+d.slice(1)}function fe(u,d,A){let j=v.default.basename(A,v.default.extname(A))||"Index",$=d.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),N=`${u} ${$} ${j}`;return $e(N)}async function Te(u={}){let{routerPattern:d="src-ts/routers/**/*.mts",tsConfigFilePath:A="tsconfig.json",routerBaseDir:j="src-ts/routers",clean:$=!1}=u,N=[],B=[],J=[];try{let ne=function(o){let s=[];return o.paramsType!=="unknown"&&s.push(`params: ${o.paramsType}`),o.queryType!=="unknown"&&s.push(`query: ${o.queryType}`),o.bodyType!=="unknown"&&s.push(`body: ${o.bodyType}`),s.push("signal?: AbortSignal"),s};var ee=ne;let I=new g.Project({tsConfigFilePath:A,skipAddingFilesFromTsConfig:!1}),ce=v.default.resolve(process.cwd(),j||".");async function pe(o){try{let K=function(t){return t.replace(/import\(['"](.*?)['"]\)/g,(T,y)=>{if(!v.default.isAbsolute(y))return T;let b=y;if(!v.default.extname(b)){let i=I.getSourceFile(r=>r.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===y);i&&(b=i.getFilePath())}let e=v.default.relative(v.default.dirname(M),b).replace(/\\/g,"/");return e.startsWith(".")||(e="./"+e),`import("${e}")`})},O=function(t,T){if(t.getSymbol()?.getName()==="Promise"){let l=t.getAwaitedType();if(l)return`Promise<${O(l,T)}>`}let y=t.getAliasSymbol()??t.getSymbol();if(y?.getName()==="__object")return K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation|g.ts.TypeFormatFlags.UseFullyQualifiedType));if(t.isObject()&&!y){let l=(c,x=0)=>{if(!(x>5)){if(c.isArray()){let P=c.getArrayElementType();P&&l(P,x);return}if(c.isObject()&&!c.getSymbol()&&!c.getAliasSymbol()){for(let P of c.getApparentProperties()){let h=P.getValueDeclaration();h&&l(P.getTypeAtLocation(h),x+1)}return}O(c,T)}};return l(t),K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation|g.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!y)return K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation));let b=y.getDeclarations()[0];if(!b)return y.getName();if(g.Node.isImportSpecifier(b)||g.Node.isImportClause(b)){let l=b.getFirstAncestorByKind(g.SyntaxKind.ImportDeclaration);if(l){let c=l.getModuleSpecifierValue(),x=y.getName();return E.has(c)||E.set(c,new Set),E.get(c)?.add(x),x}}let e=b.getSourceFile();if(e.getFilePath()===m.getFilePath())return y.getName();if(e.isInNodeModules())return K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation));let i=v.default.relative(v.default.dirname(M),e.getFilePath()).replace(/\\/g,"/"),a=i.startsWith(".")?i:`./${i}`,p=y.getName();return E.has(a)||E.set(a,new Set),E.get(a)?.add(p),p},te=function(t){let T;if(g.Node.isFunctionLikeDeclaration(t)||g.Node.isArrowFunction(t)){let y=t.getDescendantsOfKind(g.SyntaxKind.ReturnStatement);for(let b of y){let e=b.getExpression();if(e?.isKind(g.SyntaxKind.SatisfiesExpression)){T=e.getTypeNode()?.getType();break}}}if(T)return O(T,t);{let y=t.getType().getCallSignatures();if(y.length>0){let b=y[0]?.getReturnType();return O(b,t)}}return"unknown"};var s=K,F=O,C=te;let m=I.addSourceFileAtPath(o);await m.refreshFromFileSystem(),I.resolveSourceFileDependencies();let k=m.getDescendantsOfKind(g.SyntaxKind.CallExpression),q=k.filter(t=>t.getExpression().getText().endsWith(".addRpcRoute")),L=k.filter(t=>t.getExpression().getText().endsWith(".addRenderRoute")),V=k.filter(t=>t.getExpression().getText().endsWith(".addLoaderRoute")),U=v.default.extname(o),M=o.substring(0,o.length-U.length)+".universal.d.ts";if(q.length===0&&L.length===0&&V.length===0){if($)try{await(0,_.unlink)(M),B.push(M)}catch{}return!1}let G=[],E=new Map;E.has("fastify")||E.set("fastify",new Set),E.get("fastify")?.add("FastifyRequest"),E.get("fastify")?.add("FastifyReply");let ue=t=>{let T="unknown",y="unknown",b="unknown",e=!1;if(!t||!g.Node.isObjectLiteralExpression(t))return{paramsType:T,queryType:y,bodyType:b,isMultipart:e};let i=t.getProperty("schema");if(i?.isKind(g.SyntaxKind.PropertyAssignment)){let r=i.getInitializer();if(r?.isKind(g.SyntaxKind.Identifier)){let p=r.getSymbol()?.getValueDeclaration();if(p){let l=p.getFirstDescendantByKind(g.SyntaxKind.ObjectLiteralExpression);l&&(r=l)}}if(r&&g.Node.isObjectLiteralExpression(r)){let a=r.getProperty("consumes");if(a?.isKind(g.SyntaxKind.PropertyAssignment)){let l=a.getInitializer();g.Node.isArrayLiteralExpression(l)&&(e=l.getElements().some(c=>c.isKind(g.SyntaxKind.StringLiteral)&&c.getLiteralValue()==="multipart/form-data"))}let p=l=>{let c=r.getProperty(l);if(c?.isKind(g.SyntaxKind.PropertyAssignment)){let x=c.getInitializer();if(x){let P=x.getType(),h=P.getProperty("_output");return O(h?h.getTypeAtLocation(x).getApparentType():P,x)}}return"unknown"};if(T=p("params"),y=p("querystring"),b=p("body"),e){let l="{ file: File }";b=b!=="unknown"&&b.trim().startsWith("{")?`(${b} & ${l})`:l}}}return{paramsType:T,queryType:y,bodyType:b,isMultipart:e}},W=v.default.relative(ce,v.default.dirname(o)).split(v.default.sep).join("/"),ge=W==="."||!W?"":W.startsWith("/")?W:"/"+W,Z=(t,T)=>{let[y,b]=t.getArguments();if(!y?.isKind(g.SyntaxKind.StringLiteral))return;let e=y.getLiteralValue(),i="unknown",r=ge,{paramsType:a,queryType:p,bodyType:l,isMultipart:c}=ue(b);if(b?.isKind(g.SyntaxKind.ObjectLiteralExpression)){let h=b.getProperty("prefix");if(h?.isKind(g.SyntaxKind.PropertyAssignment)){let S=h.getInitializer();S?.isKind(g.SyntaxKind.StringLiteral)&&(r=S.getLiteralValue())}let R=b.getProperty("handler");if(R?.isKind(g.SyntaxKind.PropertyAssignment)){let S=R.getInitializer();S&&(i=te(S),i.startsWith("Promise<")||(i=`Promise<${i}>`))}}let x="",P="";T==="rpc"?(x=v.default.join(r,"rpc",e).replace(/\\/g,"/"),P=fe("action",r,e)):T==="loader"?(x=v.default.join(r,"loader",e).replace(/\\/g,"/"),P=fe("loader",r,e)):T==="api"&&(x=v.default.join(r,"api",e).replace(/\\/g,"/"),P=fe("get",r,e)),P&&G.push({type:T,name:P,returnType:i,url:e,rpcUrl:x,loaderUrl:x,paramsType:a,queryType:p,bodyType:l,isMultipart:c})};if(q.forEach(t=>Z(t,"rpc")),L.forEach(t=>Z(t,"loader")),V.forEach(t=>Z(t,"api")),G.length===0){if($)try{await(0,_.unlink)(M),B.push(M)}catch{}return!1}let H=[];for(let[t,T]of E.entries())H.push(`import type { ${[...T].sort().join(", ")} } from "${t}";`);let re=[];G.forEach(t=>{let T=ne(t),y="";T.length>0&&(y=`args: { ${T.join("; ")} }`),y||(y="args: { signal?: AbortSignal }"),re.push(`export declare const ${t.name}: (${y}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`)});let Q=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
2
  /* eslint-disable */
3
3
 
4
4
  `+(H.length>0?H.join(`
5
5
  `)+`
6
6
 
7
- `:"")+X.join(`
7
+ `:"")+re.join(`
8
8
 
9
- `);try{let e=await(0,K.resolveConfig)(M)||{};G=await(0,K.format)(G,{...e,parser:"typescript",filepath:M})}catch{}await(0,q.writeFile)(M,G);let Y=[],J=[];_.forEach(e=>{let i=e.type==="rpc"?"POST":"GET",n=e.type==="loader"?e.loaderUrl:e.rpcUrl;J.push({name:e.name,rpcUrl:n,method:i,isMultipart:!!e.isMultipart}),Y.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ue=`
9
+ `);try{let t=await(0,ae.resolveConfig)(M)||{};Q=await(0,ae.format)(Q,{...t,parser:"typescript",filepath:M})}catch{}return await(0,_.writeFile)(M,Q),N.push(M),!0}catch(m){return J.push(`Error processing ${o}: ${m instanceof Error?m.message:String(m)}`),!1}}let n=await(0,me.default)(d,{absolute:!0});if(await Promise.all(n.map(o=>pe(o))),$){let o=await(0,me.default)(v.default.join(j,"**/*.universal.d.ts"),{absolute:!0});for(let s of o){let F=s.replace(".universal.d.ts",".mts").replace(".universal.d.ts",".ts");if(!await(0,_.access)(F).then(()=>!0).catch(()=>!1))try{await(0,_.unlink)(s),B.push(s)}catch{}}}}catch(I){J.push(`Fatal error: ${I instanceof Error?I.message:String(I)}`)}return{generated:N,cleaned:B,errors:J}}var Y="virtual:b-ssr-rpc-universal:";function Ce(u){let d=u.replace(/[^a-zA-Z0-9]+(.)?/g,(A,j)=>j?j.toUpperCase():"");return d.charAt(0).toLowerCase()+d.slice(1)}function de(u,d,A){let j=w.default.basename(A,w.default.extname(A))||"Index",$=d.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),N=`${u} ${$} ${j}`;return Ce(N)}function ve(u={}){let{routerPattern:d="src-ts/routers/**/*.mts",tsConfigFilePath:A="tsconfig.json",routerBaseDir:j="src-ts/routers"}=u,$=new Map,N=new Set,B=new f.Project({tsConfigFilePath:A,skipAddingFilesFromTsConfig:!1}),J=w.default.resolve(process.cwd(),j||".");async function ee(n){try{let K=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(i,r)=>{if(!w.default.isAbsolute(r))return i;let a=r;if(!w.default.extname(a)){let l=B.getSourceFile(c=>c.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===r);l&&(a=l.getFilePath())}let p=w.default.relative(w.default.dirname(U),a).replace(/\\/g,"/");return p.startsWith(".")||(p="./"+p),`import("${p}")`})},O=function(e,i){if(e.getSymbol()?.getName()==="Promise"){let h=e.getAwaitedType();if(h)return`Promise<${O(h,i)}>`}let r=e.getAliasSymbol()??e.getSymbol();if(r?.getName()==="__object")return K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation|f.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!r){let h=(R,S=0)=>{if(!(S>5)){if(R.isArray()){let D=R.getArrayElementType();D&&h(D,S);return}if(R.isObject()&&!R.getSymbol()&&!R.getAliasSymbol()){for(let D of R.getApparentProperties()){let z=D.getValueDeclaration();z&&h(D.getTypeAtLocation(z),S+1)}return}O(R,i)}};return h(e),K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation|f.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!r)return K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation));let a=r.getDeclarations()[0];if(!a)return r.getName();if(f.Node.isImportSpecifier(a)||f.Node.isImportClause(a)){let h=a.getFirstAncestorByKind(f.SyntaxKind.ImportDeclaration);if(h){let R=h.getModuleSpecifierValue(),S=r.getName();return E.has(R)||E.set(R,new Set),E.get(R)?.add(S),S}}let p=a.getSourceFile();if(p.getFilePath()===C.getFilePath())return r.getName();if(p.isInNodeModules())return K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation));let l=w.default.relative(w.default.dirname(U),p.getFilePath()).replace(/\\/g,"/"),x=l.startsWith(".")?l:`./${l}`,P=r.getName();return E.has(x)||E.set(x,new Set),E.get(x)?.add(P),P},te=function(e){let i;if(f.Node.isFunctionLikeDeclaration(e)||f.Node.isArrowFunction(e)){let r=e.getDescendantsOfKind(f.SyntaxKind.ReturnStatement);for(let a of r){let p=a.getExpression();if(p?.isKind(f.SyntaxKind.SatisfiesExpression)){i=p.getTypeNode()?.getType();break}}}if(i)return O(i,e);{let r=e.getType().getCallSignatures();if(r.length>0){let a=r[0]?.getReturnType();return O(a,e)}}return"unknown"};var o=K,s=O,F=te;let C=B.addSourceFileAtPath(n);await C.refreshFromFileSystem(),B.resolveSourceFileDependencies();let m=C.getDescendantsOfKind(f.SyntaxKind.CallExpression),k=m.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),q=m.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),L=m.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),V=w.default.extname(n),U=n.substring(0,n.length-V.length)+".universal.d.ts",M=w.default.resolve(n);if(k.length===0&&q.length===0&&L.length===0){$.delete(M),N.delete(M),U!==n&&await(0,X.unlink)(U).catch(()=>{});return}N.add(M);let G=[],E=new Map;E.has("fastify")||E.set("fastify",new Set),E.get("fastify")?.add("FastifyRequest"),E.get("fastify")?.add("FastifyReply");let ue=e=>{let i="unknown",r="unknown",a="unknown",p=!1;if(!e||!f.Node.isObjectLiteralExpression(e))return{paramsType:i,queryType:r,bodyType:a,isMultipart:p};let l=e.getProperty("schema");if(l?.isKind(f.SyntaxKind.PropertyAssignment)){let c=l.getInitializer();if(c?.isKind(f.SyntaxKind.Identifier)){let P=c.getSymbol()?.getValueDeclaration();if(P){let h=P.getFirstDescendantByKind(f.SyntaxKind.ObjectLiteralExpression);h&&(c=h)}}if(c&&f.Node.isObjectLiteralExpression(c)){let x=c.getProperty("consumes");if(x?.isKind(f.SyntaxKind.PropertyAssignment)){let h=x.getInitializer();f.Node.isArrayLiteralExpression(h)&&(p=h.getElements().some(R=>R.isKind(f.SyntaxKind.StringLiteral)&&R.getLiteralValue()==="multipart/form-data"))}let P=h=>{let R=c.getProperty(h);if(R?.isKind(f.SyntaxKind.PropertyAssignment)){let S=R.getInitializer();if(S){let D=S.getType(),z=D.getProperty("_output");return O(z?z.getTypeAtLocation(S).getApparentType():D,S)}}return"unknown"};if(i=P("params"),r=P("querystring"),a=P("body"),p){let h="{ file: File }";a=a!=="unknown"&&a.trim().startsWith("{")?`(${a} & ${h})`:h}}}return{paramsType:i,queryType:r,bodyType:a,isMultipart:p}},W=w.default.relative(J,w.default.dirname(n)).split(w.default.sep).join("/"),ge=W==="."||!W?"":W.startsWith("/")?W:"/"+W,Z=(e,i)=>{let[r,a]=e.getArguments();if(!r?.isKind(f.SyntaxKind.StringLiteral))return;let p=r.getLiteralValue(),l="unknown",c=ge,{paramsType:x,queryType:P,bodyType:h,isMultipart:R}=ue(a);if(a?.isKind(f.SyntaxKind.ObjectLiteralExpression)){let z=a.getProperty("prefix");if(z?.isKind(f.SyntaxKind.PropertyAssignment)){let se=z.getInitializer();se?.isKind(f.SyntaxKind.StringLiteral)&&(c=se.getLiteralValue())}let ye=a.getProperty("handler");if(ye?.isKind(f.SyntaxKind.PropertyAssignment)){let se=ye.getInitializer();se&&(l=te(se),l.startsWith("Promise<")||(l=`Promise<${l}>`))}}let S="",D="";i==="rpc"?(S=w.default.join(c,"rpc",p).replace(/\\/g,"/"),D=de("action",c,p)):i==="loader"?(S=w.default.join(c,"loader",p).replace(/\\/g,"/"),D=de("loader",c,p)):i==="api"&&(S=w.default.join(c,"api",p).replace(/\\/g,"/"),D=de("get",c,p)),D&&G.push({type:i,name:D,returnType:l,url:p,rpcUrl:S,loaderUrl:S,paramsType:x,queryType:P,bodyType:h,isMultipart:R})};k.forEach(e=>Z(e,"rpc")),q.forEach(e=>Z(e,"loader")),L.forEach(e=>Z(e,"api"));let H=[];for(let[e,i]of E.entries())H.push(`import type { ${[...i].sort().join(", ")} } from "${e}";`);let re=[];G.forEach(e=>{re.push(ce(e))});let Q=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
10
+ /* eslint-disable */
11
+
12
+ `+(H.length>0?H.join(`
13
+ `)+`
14
+
15
+ `:"")+re.join(`
16
+
17
+ `);try{let e=await(0,le.resolveConfig)(U)||{};Q=await(0,le.format)(Q,{...e,parser:"typescript",filepath:U})}catch{}await(0,X.writeFile)(U,Q);let t=[],T=[];G.forEach(e=>{let r=e.type==="rpc"?"POST":"GET",a=e.type==="loader"?e.loaderUrl:e.rpcUrl;T.push({name:e.name,rpcUrl:a,method:r,isMultipart:!!e.isMultipart}),t.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let y=`
10
18
  import { createClientRpc } from '@bobtail.software/b-ssr/client';
11
19
 
12
20
  if (import.meta.env.DEV) {
13
- console.debug('\u{1F6E1}\uFE0F [B-SSR Security] Loaded SAFE Client-Stub for: ${a.default.basename(t)}');
21
+ console.debug('\u{1F6E1}\uFE0F [B-SSR Security] Loaded SAFE Client-Stub for: ${w.default.basename(n)}');
14
22
  }
15
23
 
16
- ${J.map(e=>`
24
+ ${T.map(e=>`
17
25
  export const ${e.name} = createClientRpc({
18
26
  url: '${e.rpcUrl}',
19
27
  method: '${e.method}',
@@ -21,17 +29,17 @@
21
29
  });
22
30
  `).join(`
23
31
  `)}
24
- `,ge=ae(Y,t);w.set(a.default.resolve(t),{client:ue,server:ge})}catch(b){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:b})}}let oe=(t,m,r)=>{if(m.includes("node_modules")||m.startsWith(L))return null;if(r?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(m)){let g=/\brequire\s*\(/.test(t),b=/\bmodule\.exports\b/.test(t),c=/\bexports\./.test(t);if(g||b||c)return"import { createRequire } from 'module';"+`
32
+ `,b=pe(t,n);$.set(w.default.resolve(n),{client:y,server:b})}catch(C){console.error(`[rpc-generator] Error al procesar ${n}:`,{error:C})}}let I=(n,o,s)=>{if(o.includes("node_modules")||o.startsWith(Y))return null;if(s?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(o)){let F=/\brequire\s*\(/.test(n),C=/\bmodule\.exports\b/.test(n),m=/\bexports\./.test(n);if(F||C||m)return"import { createRequire } from 'module';"+`
25
33
  const require = createRequire(import.meta.url);
26
34
  const module = { exports: {} };
27
35
  const exports = module.exports;
28
- `+t+`
29
- export default module.exports;`}return null};function ie(t){let m=we(t),r="";return m.length>0&&(r=`args: { ${m.join("; ")} }`),r||(r="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${r}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ae(t,m){if(t.length===0)return"";let r=a.default.relative(process.cwd(),m).replace(/\\/g,"/");return`
36
+ `+n+`
37
+ export default module.exports;`}return null};function ce(n){let o=je(n),s="";return o.length>0&&(s=`args: { ${o.join("; ")} }`),s||(s="args: { signal?: AbortSignal }"),`export declare const ${n.name}: (${s}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${n.returnType};`}function pe(n,o){if(n.length===0)return"";let s=w.default.relative(process.cwd(),o).replace(/\\/g,"/");return`
30
38
  import path from 'path';
31
39
  import { pathToFileURL } from 'url';
32
40
 
33
41
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
34
- throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${`./${a.default.relative(process.cwd(),m).replace(/\\/g,"/")}`}');
42
+ throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${`./${w.default.relative(process.cwd(),o).replace(/\\/g,"/")}`}');
35
43
  }
36
44
 
37
45
  let initPromise;
@@ -45,7 +53,7 @@ export default module.exports;`}return null};function ie(t){let m=we(t),r="";ret
45
53
  renderOptionsMap = new Map();
46
54
  loaderApiOptionsMap = new Map();
47
55
  const projectRoot = process.cwd();
48
- const absolutePath = path.resolve(projectRoot, '${r}');
56
+ const absolutePath = path.resolve(projectRoot, '${s}');
49
57
  const serverModuleUrl = pathToFileURL(absolutePath).href;
50
58
 
51
59
  if (typeof globalThis.require === 'undefined') {
@@ -93,46 +101,46 @@ export default module.exports;`}return null};function ie(t){let m=we(t),r="";ret
93
101
  return initPromise;
94
102
  }
95
103
 
96
- ${t.map(c=>{let A=[];c.requiresArgs&&A.push("args"),A.push("ssrContext");let F=c.requiresArgs?"args":"{}",R="";return c.type==="rpc"?R=`
104
+ ${n.map(m=>{let k=[];m.requiresArgs&&k.push("args"),k.push("ssrContext");let q=m.requiresArgs?"args":"{}",L="";return m.type==="rpc"?L=`
97
105
  if (fn.isMultipart) throw new Error('RPC multipart no soportado en SSR.');
98
106
  await getOptionsMaps();
99
- const options = rpcOptionsMap.get('${c.url}');
100
- if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${c.name}');
101
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${F});
107
+ const options = rpcOptionsMap.get('${m.url}');
108
+ if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${m.name}');
109
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${q});
102
110
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
103
- `:c.type==="api"?R=`
111
+ `:m.type==="api"?L=`
104
112
  await getOptionsMaps();
105
- const options = loaderApiOptionsMap.get('${c.url}');
113
+ const options = loaderApiOptionsMap.get('${m.url}');
106
114
  if (!options?.handler) {
107
- console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${c.name}', 'URL:', '${c.url}');
115
+ console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${m.name}', 'URL:', '${m.url}');
108
116
  return null;
109
117
  }
110
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${F});
118
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${q});
111
119
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
112
- `:R=`
120
+ `:L=`
113
121
  await getOptionsMaps();
114
- const options = renderOptionsMap.get('${c.url}');
122
+ const options = renderOptionsMap.get('${m.url}');
115
123
  if (!options) return {};
116
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${F});
124
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${q});
117
125
  let customData = {};
118
126
  try {
119
127
  if (options.handler) {
120
128
  customData = (await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply)) || {};
121
129
  }
122
130
  } catch (handlerErr) {
123
- console.error('\u274C [B-SSR Handler Error] ${c.name}:', handlerErr);
131
+ console.error('\u274C [B-SSR Handler Error] ${m.name}:', handlerErr);
124
132
  return {};
125
133
  }
126
134
  if (ssrContext.reply.sent) return;
127
135
  return { ...customData };
128
- `,`export const ${c.name} = async (${A.join(", ")}) => {
136
+ `,`export const ${m.name} = async (${k.join(", ")}) => {
129
137
  try {
130
- if (!ssrContext?.req) throw new Error('ssrContext requerido en ${c.name} (SSR)');
131
- ${R}
138
+ if (!ssrContext?.req) throw new Error('ssrContext requerido en ${m.name} (SSR)');
139
+ ${L}
132
140
  } catch (error) {
133
- console.error('\u274C [B-SSR Error] ${c.name}:', error);
141
+ console.error('\u274C [B-SSR Error] ${m.name}:', error);
134
142
  throw error;
135
143
  }
136
144
  };`}).join(`
137
145
  `)}
138
- `}async function le(){let t=await(0,se.default)(l,{absolute:!0});await Promise.all(t.map(m=>W(m)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await le()},configureServer(t){let m=r=>r.endsWith(".mts")||r.endsWith(".ts");t.watcher.on("add",r=>m(r)&&W(r)),t.watcher.on("change",r=>m(r)&&W(r)),t.watcher.on("unlink",r=>{if(m(r)){let g=a.default.resolve(r);w.delete(g),j.delete(g);let b=a.default.extname(r),c=r.substring(0,r.length-b.length)+".universal.d.ts";(0,q.unlink)(c).catch(()=>{})}})},async resolveId(t,m,r){if(t.startsWith(L))return null;if(t.includes(".universal")){let g=t.split("?")[0],b=g;if(g.endsWith(".universal"))b=g;else if(g.endsWith(".universal.ts"))b=g.slice(0,-3);else if(g.endsWith(".universal.mts"))b=g.slice(0,-4);else if(g.endsWith(".universal.js"))b=g.slice(0,-3);else return null;let c=[".mts",".ts"];for(let A of c){let F=b.slice(0,-10)+A,R=await this.resolve(F,m,{skipSelf:!0});if(R){let k=r?.ssr?"?mode=ssr":"?mode=client";return L+R.id+k}try{await(0,q.access)(F);let k=r?.ssr?"?mode=ssr":"?mode=client";return L+F+k}catch{}}}return null},async load(t,m){if(t.startsWith(L)){let r=t.slice(L.length).split("?")[0],g=w.get(r);return g||(await W(r),g=w.get(r)),g?m?.ssr===!0?g.server:g.client:null}if(m?.ssr!==!0){let r=a.default.resolve(t);if(j.has(r))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${a.default.basename(t)}");`}return null},transform:oe}}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});
146
+ `}async function ne(){let n=await(0,be.default)(d,{absolute:!0});await Promise.all(n.map(o=>ee(o)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ne()},configureServer(n){let o=s=>s.endsWith(".mts")||s.endsWith(".ts");n.watcher.on("add",s=>o(s)&&ee(s)),n.watcher.on("change",s=>o(s)&&ee(s)),n.watcher.on("unlink",s=>{if(o(s)){let F=w.default.resolve(s);$.delete(F),N.delete(F);let C=w.default.extname(s),m=s.substring(0,s.length-C.length)+".universal.d.ts";(0,X.unlink)(m).catch(()=>{})}})},async resolveId(n,o,s){if(n.startsWith(Y))return null;if(n.includes(".universal")){let F=n.split("?")[0],C=F;if(F.endsWith(".universal"))C=F;else if(F.endsWith(".universal.ts"))C=F.slice(0,-3);else if(F.endsWith(".universal.mts"))C=F.slice(0,-4);else if(F.endsWith(".universal.js"))C=F.slice(0,-3);else return null;let m=[".mts",".ts"];for(let k of m){let q=C.slice(0,-10)+k,L=await this.resolve(q,o,{skipSelf:!0});if(L){let V=s?.ssr?"?mode=ssr":"?mode=client";return Y+L.id+V}try{await(0,X.access)(q);let V=s?.ssr?"?mode=ssr":"?mode=client";return Y+q+V}catch{}}}return null},async load(n,o){if(n.startsWith(Y)){let s=n.slice(Y.length).split("?")[0],F=$.get(s);return F||(await ee(s),F=$.get(s)),F?o?.ssr===!0?F.server:F.client:null}if(o?.ssr!==!0){let s=w.default.resolve(n);if(N.has(s))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${w.default.basename(n)}");`}return null},transform:I}}function je(u){let d=[];return u.paramsType!=="unknown"&&d.push(`params: ${u.paramsType}`),u.queryType!=="unknown"&&d.push(`query: ${u.queryType}`),u.bodyType!=="unknown"&&d.push(`body: ${u.bodyType}`),d.push("signal?: AbortSignal"),d}0&&(module.exports={generateRpcTypes,rpcGeneratorPlugin});
@@ -1,4 +1,5 @@
1
1
  import { Plugin } from 'vite';
2
+ export { GenerateResult, GenerateRpcTypesOptions, generateRpcTypes } from './rpc-type-generator.cjs';
2
3
 
3
4
  interface RpcPluginOptions {
4
5
  routerPattern?: string;
@@ -1,4 +1,5 @@
1
1
  import { Plugin } from 'vite';
2
+ export { GenerateResult, GenerateRpcTypesOptions, generateRpcTypes } from './rpc-type-generator.js';
2
3
 
3
4
  interface RpcPluginOptions {
4
5
  routerPattern?: string;