@bobtail.software/b-ssr 1.0.65 → 1.0.67

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