@bobtail.software/b-ssr 1.0.34 → 1.0.36

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 g=Object.create;var S=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var G=(e,r)=>{for(var d in r)S(e,d,{get:r[d],enumerable:!0})},T=(e,r,d,f)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of O(r))!D.call(e,m)&&m!==d&&S(e,m,{get:()=>r[m],enumerable:!(f=x(r,m))||f.enumerable});return e};var R=(e,r,d)=>(d=e!=null?g(I(e)):{},T(r||!e||!e.__esModule?S(d,"default",{value:e,enumerable:!0}):d,e)),k=e=>T(S({},"__esModule",{value:!0}),e);var C={};G(C,{default:()=>A});module.exports=k(C);var H=require("@fastify/multipart"),v=R(require("fastify-plugin"),1),w=R(require("path"),1),F=async(e,r)=>{if(!e.isMultipart())return r.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let d=e.parts(),f={};for await(let m of d)if(m.type==="field")f[m.fieldname]=m.value;else{let t=Symbol.for("file-stream");e[t]=m}e.body=f},P=async(e,r)=>{let d=t=>{if(r.errorHandler){let n=r.errorHandler(t);if(n)return n}return{message:"Internal Server Error",statusCode:500}};if(e.hasDecorator("viteInitDone")&&e.viteInitDone)return;if(!e.hasDecorator("multipartErrors"))try{let t=await import("@fastify/multipart");await e.register(t.default)}catch(t){if(t.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw t}let f=process.env.NODE_ENV==="production";if(!f){if(!e.hasDecorator("use"))try{let o=await import("@fastify/middie");await e.register(o.default,{hook:"onRequest"})}catch(o){if(o.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw o}let t=await import("vite"),n=r.viteConfig||{},l=await t.createServer({root:r.root,appType:"custom",...n,server:{hmr:{port:24678},...n.server,middlewareMode:!0}});e.use(l.middlewares),e.hasDecorator("viteServer")||e.decorate("viteServer",l),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}e.decorate("viteInitDone",!0);let m=async(t,n,l)=>{try{let o=t.raw.url;if(w.default.extname(o)!==""){n.status(404).send(`File not found: ${o}`);return}let u="";!f&&e.viteServer&&(u=await e.viteServer.transformIndexHtml(o,"<html><head></head><body></body></html>"),u=u.substring(u.indexOf("<head>")+6,u.indexOf("</head>")));let h=f?await import(r.prodEntryFile):await e.viteServer.ssrLoadModule(r.devEntryFile),s=h.render||h.default;if(typeof s!="function")throw new Error(`Entry file ${r.devEntryFile} must export a 'render' function.`);await s({req:t,reply:n,head:u,data:l})}catch(o){e.viteServer?.ssrFixStacktrace(o),console.error("[SSR Error]:",o),n.sent||n.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(t,n){let{handler:l,schema:o,...u}=n,h=`/rpc${t}`,s={...u,schema:o};if(o?.consumes?.includes("multipart/form-data")){let a=s.preValidation;s.preValidation=a?Array.isArray(a)?[F,...a]:[F,a]:F}this.route({method:"POST",url:h,...s,handler:async(a,i)=>{try{let p=await l.call(this,a,i);return i.sent?void 0:p}catch(p){if(console.error(`[RPC Error] ${h}:`,p),!i.sent){let{statusCode:y,message:E}=d(p);i.status(y).send({error:{message:E}})}}}})}),e.decorate("addRenderRoute",function(t,n){let{handler:l,schema:o,...u}=n||{},h=async(s,c,a)=>{try{let i=await l?.call(this,s,c);return a?i:m(s,c,i)}catch(i){if(console.error(`[Render Error] ${t}:`,i),!c.sent){let{statusCode:p,message:y}=d(i);if(a)c.status(p).send({error:{message:y}});else return m(s,c,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:t,schema:o,...u,handler:(s,c)=>h(s,c,!1)}),t!=="*"&&t!=="/*"){this.route({method:"GET",url:`/loader${t}`,schema:o,...u,handler:(a,i)=>h(a,i,!0)});let s=t.endsWith("/")?"*":"/*",c=`${t}${s}`;this.route({method:"GET",url:c,schema:o,...u,handler:(a,i)=>h(a,i,!1)})}}),e.decorate("addLoaderRoute",function(t,n){let{handler:l,schema:o,...u}=n,h=`/api${t}`;this.route({method:"GET",url:h,schema:o,...u,handler:async(s,c)=>{try{let a=await l.call(this,s,c);return c.sent?void 0:a}catch(a){if(console.error(`[Loader API Error] ${h}:`,a),!c.sent){let{statusCode:i,message:p}=d(a);c.status(i).send({error:{message:p}})}}}})})},A=(0,v.default)(P,{name:"fastify-b-ssr"});
1
+ "use strict";var g=Object.create;var S=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var G=(e,r)=>{for(var d in r)S(e,d,{get:r[d],enumerable:!0})},T=(e,r,d,f)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of O(r))!D.call(e,m)&&m!==d&&S(e,m,{get:()=>r[m],enumerable:!(f=x(r,m))||f.enumerable});return e};var R=(e,r,d)=>(d=e!=null?g(I(e)):{},T(r||!e||!e.__esModule?S(d,"default",{value:e,enumerable:!0}):d,e)),k=e=>T(S({},"__esModule",{value:!0}),e);var C={};G(C,{default:()=>A});module.exports=k(C);var H=require("@fastify/multipart"),w=R(require("fastify-plugin"),1),v=R(require("path"),1),F=async(e,r)=>{if(!e.isMultipart())return r.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let d=e.parts(),f={};for await(let m of d)if(m.type==="field")f[m.fieldname]=m.value;else{let t=Symbol.for("file-stream");e[t]=m}e.body=f},P=async(e,r)=>{let d=t=>{if(r.errorHandler){let n=r.errorHandler(t);if(n)return n}return{message:"Internal Server Error",statusCode:500}};if(e.hasDecorator("viteInitDone")&&e.viteInitDone)return;if(!e.hasDecorator("multipartErrors"))try{let t=await import("@fastify/multipart");await e.register(t.default)}catch(t){if(t.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw t}let f=process.env.NODE_ENV==="production";if(!f){if(!e.hasDecorator("use"))try{let o=await import("@fastify/middie");await e.register(o.default,{hook:"onRequest"})}catch(o){if(o.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw o}let t=await import("vite"),n=r.viteConfig||{},l=await t.createServer({root:r.root,appType:"custom",...n,server:{hmr:{port:24678},...n.server,middlewareMode:!0}});e.use(l.middlewares),e.hasDecorator("viteServer")||e.decorate("viteServer",l),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}e.decorate("viteInitDone",!0);let m=async(t,n,l)=>{try{let o=t.raw.url;if(v.default.extname(o)!==""){n.status(404).send(`File not found: ${o}`);return}let u="";!f&&e.viteServer&&(u=await e.viteServer.transformIndexHtml(o,"<html><head></head><body></body></html>"),u=u.substring(u.indexOf("<head>")+6,u.indexOf("</head>")));let h=f?await import(v.default.resolve(r.root,r.prodEntryFile)):await e.viteServer.ssrLoadModule(r.devEntryFile),s=h.render||h.default;if(typeof s!="function")throw new Error(`Entry file ${r.devEntryFile} must export a 'render' function.`);await s({req:t,reply:n,head:u,data:l})}catch(o){e.viteServer?.ssrFixStacktrace(o),console.error("[SSR Error]:",o),n.sent||n.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(t,n){let{handler:l,schema:o,...u}=n,h=`/rpc${t}`,s={...u,schema:o};if(o?.consumes?.includes("multipart/form-data")){let a=s.preValidation;s.preValidation=a?Array.isArray(a)?[F,...a]:[F,a]:F}this.route({method:"POST",url:h,...s,handler:async(a,i)=>{try{let p=await l.call(this,a,i);return i.sent?void 0:p}catch(p){if(console.error(`[RPC Error] ${h}:`,p),!i.sent){let{statusCode:y,message:E}=d(p);i.status(y).send({error:{message:E}})}}}})}),e.decorate("addRenderRoute",function(t,n){let{handler:l,schema:o,...u}=n||{},h=async(s,c,a)=>{try{let i=await l?.call(this,s,c);return a?i:m(s,c,i)}catch(i){if(console.error(`[Render Error] ${t}:`,i),!c.sent){let{statusCode:p,message:y}=d(i);if(a)c.status(p).send({error:{message:y}});else return m(s,c,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:t,schema:o,...u,handler:(s,c)=>h(s,c,!1)}),t!=="*"&&t!=="/*"){this.route({method:"GET",url:`/loader${t}`,schema:o,...u,handler:(a,i)=>h(a,i,!0)});let s=t.endsWith("/")?"*":"/*",c=`${t}${s}`;this.route({method:"GET",url:c,schema:o,...u,handler:(a,i)=>h(a,i,!1)})}}),e.decorate("addLoaderRoute",function(t,n){let{handler:l,schema:o,...u}=n,h=`/api${t}`;this.route({method:"GET",url:h,schema:o,...u,handler:async(s,c)=>{try{let a=await l.call(this,s,c);return c.sent?void 0:a}catch(a){if(console.error(`[Loader API Error] ${h}:`,a),!c.sent){let{statusCode:i,message:p}=d(a);c.status(i).send({error:{message:p}})}}}})})},A=(0,w.default)(P,{name:"fastify-b-ssr"});
@@ -1 +1 @@
1
- import"@fastify/multipart";import F from"fastify-plugin";import T from"path";var S=async(t,m)=>{if(!t.isMultipart())return m.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let p=t.parts(),f={};for await(let l of p)if(l.type==="field")f[l.fieldname]=l.value;else{let e=Symbol.for("file-stream");t[e]=l}t.body=f},v=async(t,m)=>{let p=e=>{if(m.errorHandler){let a=m.errorHandler(e);if(a)return a}return{message:"Internal Server Error",statusCode:500}};if(t.hasDecorator("viteInitDone")&&t.viteInitDone)return;if(!t.hasDecorator("multipartErrors"))try{let e=await import("@fastify/multipart");await t.register(e.default)}catch(e){if(e.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw e}let f=process.env.NODE_ENV==="production";if(!f){if(!t.hasDecorator("use"))try{let r=await import("@fastify/middie");await t.register(r.default,{hook:"onRequest"})}catch(r){if(r.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw r}let e=await import("vite"),a=m.viteConfig||{},u=await e.createServer({root:m.root,appType:"custom",...a,server:{hmr:{port:24678},...a.server,middlewareMode:!0}});t.use(u.middlewares),t.hasDecorator("viteServer")||t.decorate("viteServer",u),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}t.decorate("viteInitDone",!0);let l=async(e,a,u)=>{try{let r=e.raw.url;if(T.extname(r)!==""){a.status(404).send(`File not found: ${r}`);return}let c="";!f&&t.viteServer&&(c=await t.viteServer.transformIndexHtml(r,"<html><head></head><body></body></html>"),c=c.substring(c.indexOf("<head>")+6,c.indexOf("</head>")));let d=f?await import(m.prodEntryFile):await t.viteServer.ssrLoadModule(m.devEntryFile),n=d.render||d.default;if(typeof n!="function")throw new Error(`Entry file ${m.devEntryFile} must export a 'render' function.`);await n({req:e,reply:a,head:c,data:u})}catch(r){t.viteServer?.ssrFixStacktrace(r),console.error("[SSR Error]:",r),a.sent||a.status(500).send("Internal Server Error")}};t.decorate("addRpcRoute",function(e,a){let{handler:u,schema:r,...c}=a,d=`/rpc${e}`,n={...c,schema:r};if(r?.consumes?.includes("multipart/form-data")){let o=n.preValidation;n.preValidation=o?Array.isArray(o)?[S,...o]:[S,o]:S}this.route({method:"POST",url:d,...n,handler:async(o,s)=>{try{let h=await u.call(this,o,s);return s.sent?void 0:h}catch(h){if(console.error(`[RPC Error] ${d}:`,h),!s.sent){let{statusCode:R,message:y}=p(h);s.status(R).send({error:{message:y}})}}}})}),t.decorate("addRenderRoute",function(e,a){let{handler:u,schema:r,...c}=a||{},d=async(n,i,o)=>{try{let s=await u?.call(this,n,i);return o?s:l(n,i,s)}catch(s){if(console.error(`[Render Error] ${e}:`,s),!i.sent){let{statusCode:h,message:R}=p(s);if(o)i.status(h).send({error:{message:R}});else return l(n,i,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:e,schema:r,...c,handler:(n,i)=>d(n,i,!1)}),e!=="*"&&e!=="/*"){this.route({method:"GET",url:`/loader${e}`,schema:r,...c,handler:(o,s)=>d(o,s,!0)});let n=e.endsWith("/")?"*":"/*",i=`${e}${n}`;this.route({method:"GET",url:i,schema:r,...c,handler:(o,s)=>d(o,s,!1)})}}),t.decorate("addLoaderRoute",function(e,a){let{handler:u,schema:r,...c}=a,d=`/api${e}`;this.route({method:"GET",url:d,schema:r,...c,handler:async(n,i)=>{try{let o=await u.call(this,n,i);return i.sent?void 0:o}catch(o){if(console.error(`[Loader API Error] ${d}:`,o),!i.sent){let{statusCode:s,message:h}=p(o);i.status(s).send({error:{message:h}})}}}})})},x=F(v,{name:"fastify-b-ssr"});export{x as default};
1
+ import"@fastify/multipart";import v from"fastify-plugin";import y from"path";var S=async(t,u)=>{if(!t.isMultipart())return u.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let p=t.parts(),f={};for await(let l of p)if(l.type==="field")f[l.fieldname]=l.value;else{let e=Symbol.for("file-stream");t[e]=l}t.body=f},T=async(t,u)=>{let p=e=>{if(u.errorHandler){let a=u.errorHandler(e);if(a)return a}return{message:"Internal Server Error",statusCode:500}};if(t.hasDecorator("viteInitDone")&&t.viteInitDone)return;if(!t.hasDecorator("multipartErrors"))try{let e=await import("@fastify/multipart");await t.register(e.default)}catch(e){if(e.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw e}let f=process.env.NODE_ENV==="production";if(!f){if(!t.hasDecorator("use"))try{let r=await import("@fastify/middie");await t.register(r.default,{hook:"onRequest"})}catch(r){if(r.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw r}let e=await import("vite"),a=u.viteConfig||{},m=await e.createServer({root:u.root,appType:"custom",...a,server:{hmr:{port:24678},...a.server,middlewareMode:!0}});t.use(m.middlewares),t.hasDecorator("viteServer")||t.decorate("viteServer",m),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}t.decorate("viteInitDone",!0);let l=async(e,a,m)=>{try{let r=e.raw.url;if(y.extname(r)!==""){a.status(404).send(`File not found: ${r}`);return}let c="";!f&&t.viteServer&&(c=await t.viteServer.transformIndexHtml(r,"<html><head></head><body></body></html>"),c=c.substring(c.indexOf("<head>")+6,c.indexOf("</head>")));let d=f?await import(y.resolve(u.root,u.prodEntryFile)):await t.viteServer.ssrLoadModule(u.devEntryFile),n=d.render||d.default;if(typeof n!="function")throw new Error(`Entry file ${u.devEntryFile} must export a 'render' function.`);await n({req:e,reply:a,head:c,data:m})}catch(r){t.viteServer?.ssrFixStacktrace(r),console.error("[SSR Error]:",r),a.sent||a.status(500).send("Internal Server Error")}};t.decorate("addRpcRoute",function(e,a){let{handler:m,schema:r,...c}=a,d=`/rpc${e}`,n={...c,schema:r};if(r?.consumes?.includes("multipart/form-data")){let o=n.preValidation;n.preValidation=o?Array.isArray(o)?[S,...o]:[S,o]:S}this.route({method:"POST",url:d,...n,handler:async(o,s)=>{try{let h=await m.call(this,o,s);return s.sent?void 0:h}catch(h){if(console.error(`[RPC Error] ${d}:`,h),!s.sent){let{statusCode:R,message:F}=p(h);s.status(R).send({error:{message:F}})}}}})}),t.decorate("addRenderRoute",function(e,a){let{handler:m,schema:r,...c}=a||{},d=async(n,i,o)=>{try{let s=await m?.call(this,n,i);return o?s:l(n,i,s)}catch(s){if(console.error(`[Render Error] ${e}:`,s),!i.sent){let{statusCode:h,message:R}=p(s);if(o)i.status(h).send({error:{message:R}});else return l(n,i,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:e,schema:r,...c,handler:(n,i)=>d(n,i,!1)}),e!=="*"&&e!=="/*"){this.route({method:"GET",url:`/loader${e}`,schema:r,...c,handler:(o,s)=>d(o,s,!0)});let n=e.endsWith("/")?"*":"/*",i=`${e}${n}`;this.route({method:"GET",url:i,schema:r,...c,handler:(o,s)=>d(o,s,!1)})}}),t.decorate("addLoaderRoute",function(e,a){let{handler:m,schema:r,...c}=a,d=`/api${e}`;this.route({method:"GET",url:d,schema:r,...c,handler:async(n,i)=>{try{let o=await m.call(this,n,i);return i.sent?void 0:o}catch(o){if(console.error(`[Loader API Error] ${d}:`,o),!i.sent){let{statusCode:s,message:h}=p(o);i.status(s).send({error:{message:h}})}}}})})},x=v(T,{name:"fastify-b-ssr"});export{x as default};
@@ -1,4 +1,4 @@
1
- "use strict";var de=Object.create;var I=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var ye=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var be=(o,l)=>{for(var x in l)I(o,x,{get:l[x],enumerable:!0})},te=(o,l,x,C)=>{if(l&&typeof l=="object"||typeof l=="function")for(let w of fe(l))!he.call(o,w)&&w!==x&&I(o,w,{get:()=>l[w],enumerable:!(C=me(l,w))||C.enumerable});return o};var re=(o,l,x)=>(x=o!=null?de(ye(o)):{},te(l||!o||!o.__esModule?I(x,"default",{value:o,enumerable:!0}):x,o)),xe=o=>te(I({},"__esModule",{value:!0}),o);var Se={};be(Se,{rpcGeneratorPlugin:()=>Pe});module.exports=xe(Se);var ne=re(require("fast-glob"),1),O=require("fs/promises"),u=re(require("path"),1),K=require("prettier"),n=require("ts-morph"),k="virtual:b-ssr-rpc-universal:";function Te(o){let l=o.replace(/[^a-zA-Z0-9]+(.)?/g,(x,C)=>C?C.toUpperCase():"");return l.charAt(0).toLowerCase()+l.slice(1)}function Z(o,l,x){let C=u.default.basename(x,u.default.extname(x))||"Index",w=l.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),q=`${o} ${w} ${C}`;return Te(q)}function Pe(o={}){let{routerPattern:l="src-ts/routers/**/*.mts",tsConfigFilePath:x="tsconfig.json",routerBaseDir:C="src-ts/routers"}=o,w=new Map,q=new Set,U=new n.Project({tsConfigFilePath:x,skipAddingFilesFromTsConfig:!1}),se=u.default.resolve(process.cwd(),C||".");async function B(t){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(c,a)=>{if(!u.default.isAbsolute(a))return c;let i=a;if(!u.default.extname(i)){let b=U.getSourceFile(y=>y.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===a);b&&(i=b.getFilePath())}let p=u.default.relative(u.default.dirname($),i).replace(/\\/g,"/");return p.startsWith(".")||(p="./"+p),`import("${p}")`})},M=function(e,c){if(e.getSymbol()?.getName()==="Promise"){let g=e.getAwaitedType();if(g)return`Promise<${M(g,c)}>`}let a=e.getAliasSymbol()??e.getSymbol();if(a?.getName()==="__object")return D(e.getText(c,n.ts.TypeFormatFlags.NoTruncation|n.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!a){let g=(f,h=0)=>{if(!(h>5)){if(f.isArray()){let T=f.getArrayElementType();T&&g(T,h);return}if(f.isObject()&&!f.getSymbol()&&!f.getAliasSymbol()){for(let T of f.getApparentProperties()){let v=T.getValueDeclaration();v&&g(T.getTypeAtLocation(v),h+1)}return}M(f,c)}};return g(e),D(e.getText(c,n.ts.TypeFormatFlags.NoTruncation|n.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!a)return D(e.getText(c,n.ts.TypeFormatFlags.NoTruncation));let i=a.getDeclarations()[0];if(!i)return a.getName();if(n.Node.isImportSpecifier(i)||n.Node.isImportClause(i)){let g=i.getFirstAncestorByKind(n.SyntaxKind.ImportDeclaration);if(g){let f=g.getModuleSpecifierValue(),h=a.getName();return F.has(f)||F.set(f,new Set),F.get(f)?.add(h),h}}let p=i.getSourceFile();if(p.getFilePath()===m.getFilePath())return a.getName();if(p.isInNodeModules())return D(e.getText(c,n.ts.TypeFormatFlags.NoTruncation));let b=u.default.relative(u.default.dirname($),p.getFilePath()).replace(/\\/g,"/"),E=b.startsWith(".")?b:`./${b}`,S=a.getName();return F.has(E)||F.set(E,new Set),F.get(E)?.add(S),S},Q=function(e){let c;if(n.Node.isFunctionLikeDeclaration(e)||n.Node.isArrowFunction(e)){let a=e.getDescendantsOfKind(n.SyntaxKind.ReturnStatement);for(let i of a){let p=i.getExpression();if(p?.isKind(n.SyntaxKind.SatisfiesExpression)){c=p.getTypeNode()?.getType();break}}}if(c)return M(c,e);{let a=e.getType().getCallSignatures();if(a.length>0){let i=a[0]?.getReturnType();return M(i,e)}}return"unknown"};var d=D,s=M,r=Q;let m=U.addSourceFileAtPath(t);await m.refreshFromFileSystem(),U.resolveSourceFileDependencies();let P=m.getDescendantsOfKind(n.SyntaxKind.CallExpression),R=P.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),A=P.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),j=P.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),L=u.default.extname(t),$=t.substring(0,t.length-L.length)+".universal.d.ts",V=u.default.resolve(t);if(R.length===0&&A.length===0&&j.length===0){w.delete(V),q.delete(V),$!==t&&await(0,O.unlink)($).catch(()=>{});return}q.add(V);let _=[],F=new Map;F.has("fastify")||F.set("fastify",new Set),F.get("fastify")?.add("FastifyRequest"),F.get("fastify")?.add("FastifyReply");let ce=e=>{let c="unknown",a="unknown",i="unknown",p=!1;if(!e||!n.Node.isObjectLiteralExpression(e))return{paramsType:c,queryType:a,bodyType:i,isMultipart:p};let b=e.getProperty("schema");if(b?.isKind(n.SyntaxKind.PropertyAssignment)){let y=b.getInitializer();if(y?.isKind(n.SyntaxKind.Identifier)){let S=y.getSymbol()?.getValueDeclaration();if(S){let g=S.getFirstDescendantByKind(n.SyntaxKind.ObjectLiteralExpression);g&&(y=g)}}if(y&&n.Node.isObjectLiteralExpression(y)){let E=y.getProperty("consumes");if(E?.isKind(n.SyntaxKind.PropertyAssignment)){let g=E.getInitializer();n.Node.isArrayLiteralExpression(g)&&(p=g.getElements().some(f=>f.isKind(n.SyntaxKind.StringLiteral)&&f.getLiteralValue()==="multipart/form-data"))}let S=g=>{let f=y.getProperty(g);if(f?.isKind(n.SyntaxKind.PropertyAssignment)){let h=f.getInitializer();if(h){let T=h.getType(),v=T.getProperty("_output");return M(v?v.getTypeAtLocation(h).getApparentType():T,h)}}return"unknown"};if(c=S("params"),a=S("querystring"),i=S("body"),p){let g="{ file: File }";i=i!=="unknown"&&i.trim().startsWith("{")?`(${i} & ${g})`:g}}}return{paramsType:c,queryType:a,bodyType:i,isMultipart:p}},N=u.default.relative(se,u.default.dirname(t)).split(u.default.sep).join("/"),pe=N==="."||!N?"":N.startsWith("/")?N:"/"+N,z=(e,c)=>{let[a,i]=e.getArguments();if(!a?.isKind(n.SyntaxKind.StringLiteral))return;let p=a.getLiteralValue(),b="unknown",y=pe,{paramsType:E,queryType:S,bodyType:g,isMultipart:f}=ce(i);if(i?.isKind(n.SyntaxKind.ObjectLiteralExpression)){let v=i.getProperty("prefix");if(v?.isKind(n.SyntaxKind.PropertyAssignment)){let W=v.getInitializer();W?.isKind(n.SyntaxKind.StringLiteral)&&(y=W.getLiteralValue())}let ee=i.getProperty("handler");if(ee?.isKind(n.SyntaxKind.PropertyAssignment)){let W=ee.getInitializer();W&&(b=Q(W),b.startsWith("Promise<")||(b=`Promise<${b}>`))}}let h="",T="";c==="rpc"?(h=u.default.join(y,"rpc",p).replace(/\\/g,"/"),T=Z("action",y,p)):c==="loader"?(h=u.default.join(y,"loader",p).replace(/\\/g,"/"),T=Z("loader",y,p)):c==="api"&&(h=u.default.join(y,"api",p).replace(/\\/g,"/"),T=Z("get",y,p)),T&&_.push({type:c,name:T,returnType:b,url:p,rpcUrl:h,loaderUrl:h,paramsType:E,queryType:S,bodyType:g,isMultipart:f})};R.forEach(e=>z(e,"rpc")),A.forEach(e=>z(e,"loader")),j.forEach(e=>z(e,"api"));let H=[];for(let[e,c]of F.entries())H.push(`import type { ${[...c].sort().join(", ")} } from "${e}";`);let X=[];_.forEach(e=>{X.push(oe(e))});let G=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
1
+ "use strict";var de=Object.create;var K=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var ye=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var be=(o,l)=>{for(var x in l)K(o,x,{get:l[x],enumerable:!0})},te=(o,l,x,C)=>{if(l&&typeof l=="object"||typeof l=="function")for(let P of fe(l))!he.call(o,P)&&P!==x&&K(o,P,{get:()=>l[P],enumerable:!(C=me(l,P))||C.enumerable});return o};var re=(o,l,x)=>(x=o!=null?de(ye(o)):{},te(l||!o||!o.__esModule?K(x,"default",{value:o,enumerable:!0}):x,o)),xe=o=>te(K({},"__esModule",{value:!0}),o);var Se={};be(Se,{rpcGeneratorPlugin:()=>Pe});module.exports=xe(Se);var ne=re(require("fast-glob"),1),O=require("fs/promises"),u=re(require("path"),1),U=require("prettier"),s=require("ts-morph"),k="virtual:b-ssr-rpc-universal:";function Te(o){let l=o.replace(/[^a-zA-Z0-9]+(.)?/g,(x,C)=>C?C.toUpperCase():"");return l.charAt(0).toLowerCase()+l.slice(1)}function Z(o,l,x){let C=u.default.basename(x,u.default.extname(x))||"Index",P=l.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),q=`${o} ${P} ${C}`;return Te(q)}function Pe(o={}){let{routerPattern:l="src-ts/routers/**/*.mts",tsConfigFilePath:x="tsconfig.json",routerBaseDir:C="src-ts/routers"}=o,P=new Map,q=new Set,B=new s.Project({tsConfigFilePath:x,skipAddingFilesFromTsConfig:!1}),se=u.default.resolve(process.cwd(),C||".");async function I(t){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(c,a)=>{if(!u.default.isAbsolute(a))return c;let i=a;if(!u.default.extname(i)){let b=B.getSourceFile(y=>y.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===a);b&&(i=b.getFilePath())}let p=u.default.relative(u.default.dirname($),i).replace(/\\/g,"/");return p.startsWith(".")||(p="./"+p),`import("${p}")`})},M=function(e,c){if(e.getSymbol()?.getName()==="Promise"){let g=e.getAwaitedType();if(g)return`Promise<${M(g,c)}>`}let a=e.getAliasSymbol()??e.getSymbol();if(a?.getName()==="__object")return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!a){let g=(f,h=0)=>{if(!(h>5)){if(f.isArray()){let T=f.getArrayElementType();T&&g(T,h);return}if(f.isObject()&&!f.getSymbol()&&!f.getAliasSymbol()){for(let T of f.getApparentProperties()){let v=T.getValueDeclaration();v&&g(T.getTypeAtLocation(v),h+1)}return}M(f,c)}};return g(e),D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation|s.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!a)return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation));let i=a.getDeclarations()[0];if(!i)return a.getName();if(s.Node.isImportSpecifier(i)||s.Node.isImportClause(i)){let g=i.getFirstAncestorByKind(s.SyntaxKind.ImportDeclaration);if(g){let f=g.getModuleSpecifierValue(),h=a.getName();return F.has(f)||F.set(f,new Set),F.get(f)?.add(h),h}}let p=i.getSourceFile();if(p.getFilePath()===m.getFilePath())return a.getName();if(p.isInNodeModules())return D(e.getText(c,s.ts.TypeFormatFlags.NoTruncation));let b=u.default.relative(u.default.dirname($),p.getFilePath()).replace(/\\/g,"/"),E=b.startsWith(".")?b:`./${b}`,S=a.getName();return F.has(E)||F.set(E,new Set),F.get(E)?.add(S),S},Q=function(e){let c;if(s.Node.isFunctionLikeDeclaration(e)||s.Node.isArrowFunction(e)){let a=e.getDescendantsOfKind(s.SyntaxKind.ReturnStatement);for(let i of a){let p=i.getExpression();if(p?.isKind(s.SyntaxKind.SatisfiesExpression)){c=p.getTypeNode()?.getType();break}}}if(c)return M(c,e);{let a=e.getType().getCallSignatures();if(a.length>0){let i=a[0]?.getReturnType();return M(i,e)}}return"unknown"};var d=D,n=M,r=Q;let m=B.addSourceFileAtPath(t);await m.refreshFromFileSystem(),B.resolveSourceFileDependencies();let w=m.getDescendantsOfKind(s.SyntaxKind.CallExpression),R=w.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),A=w.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),j=w.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),L=u.default.extname(t),$=t.substring(0,t.length-L.length)+".universal.d.ts",V=u.default.resolve(t);if(R.length===0&&A.length===0&&j.length===0){P.delete(V),q.delete(V),$!==t&&await(0,O.unlink)($).catch(()=>{});return}q.add(V);let _=[],F=new Map;F.has("fastify")||F.set("fastify",new Set),F.get("fastify")?.add("FastifyRequest"),F.get("fastify")?.add("FastifyReply");let ce=e=>{let c="unknown",a="unknown",i="unknown",p=!1;if(!e||!s.Node.isObjectLiteralExpression(e))return{paramsType:c,queryType:a,bodyType:i,isMultipart:p};let b=e.getProperty("schema");if(b?.isKind(s.SyntaxKind.PropertyAssignment)){let y=b.getInitializer();if(y?.isKind(s.SyntaxKind.Identifier)){let S=y.getSymbol()?.getValueDeclaration();if(S){let g=S.getFirstDescendantByKind(s.SyntaxKind.ObjectLiteralExpression);g&&(y=g)}}if(y&&s.Node.isObjectLiteralExpression(y)){let E=y.getProperty("consumes");if(E?.isKind(s.SyntaxKind.PropertyAssignment)){let g=E.getInitializer();s.Node.isArrayLiteralExpression(g)&&(p=g.getElements().some(f=>f.isKind(s.SyntaxKind.StringLiteral)&&f.getLiteralValue()==="multipart/form-data"))}let S=g=>{let f=y.getProperty(g);if(f?.isKind(s.SyntaxKind.PropertyAssignment)){let h=f.getInitializer();if(h){let T=h.getType(),v=T.getProperty("_output");return M(v?v.getTypeAtLocation(h).getApparentType():T,h)}}return"unknown"};if(c=S("params"),a=S("querystring"),i=S("body"),p){let g="{ file: File }";i=i!=="unknown"&&i.trim().startsWith("{")?`(${i} & ${g})`:g}}}return{paramsType:c,queryType:a,bodyType:i,isMultipart:p}},N=u.default.relative(se,u.default.dirname(t)).split(u.default.sep).join("/"),pe=N==="."||!N?"":N.startsWith("/")?N:"/"+N,z=(e,c)=>{let[a,i]=e.getArguments();if(!a?.isKind(s.SyntaxKind.StringLiteral))return;let p=a.getLiteralValue(),b="unknown",y=pe,{paramsType:E,queryType:S,bodyType:g,isMultipart:f}=ce(i);if(i?.isKind(s.SyntaxKind.ObjectLiteralExpression)){let v=i.getProperty("prefix");if(v?.isKind(s.SyntaxKind.PropertyAssignment)){let W=v.getInitializer();W?.isKind(s.SyntaxKind.StringLiteral)&&(y=W.getLiteralValue())}let ee=i.getProperty("handler");if(ee?.isKind(s.SyntaxKind.PropertyAssignment)){let W=ee.getInitializer();W&&(b=Q(W),b.startsWith("Promise<")||(b=`Promise<${b}>`))}}let h="",T="";c==="rpc"?(h=u.default.join(y,"rpc",p).replace(/\\/g,"/"),T=Z("action",y,p)):c==="loader"?(h=u.default.join(y,"loader",p).replace(/\\/g,"/"),T=Z("loader",y,p)):c==="api"&&(h=u.default.join(y,"api",p).replace(/\\/g,"/"),T=Z("get",y,p)),T&&_.push({type:c,name:T,returnType:b,url:p,rpcUrl:h,loaderUrl:h,paramsType:E,queryType:S,bodyType:g,isMultipart:f})};R.forEach(e=>z(e,"rpc")),A.forEach(e=>z(e,"loader")),j.forEach(e=>z(e,"api"));let H=[];for(let[e,c]of F.entries())H.push(`import type { ${[...c].sort().join(", ")} } from "${e}";`);let X=[];_.forEach(e=>{X.push(oe(e))});let G=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
2
  /* eslint-disable */
3
3
 
4
4
  `+(H.length>0?H.join(`
@@ -6,7 +6,7 @@
6
6
 
7
7
  `:"")+X.join(`
8
8
 
9
- `);try{let e=await(0,K.resolveConfig)($)||{};G=await(0,K.format)(G,{...e,parser:"typescript",filepath:$})}catch{}await(0,O.writeFile)($,G);let Y=[],J=[];_.forEach(e=>{let a=e.type==="rpc"?"POST":"GET",i=e.type==="loader"?e.loaderUrl:e.rpcUrl;J.push({name:e.name,rpcUrl:i,method:a,isMultipart:!!e.isMultipart}),Y.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ue=`
9
+ `);try{let e=await(0,U.resolveConfig)($)||{};G=await(0,U.format)(G,{...e,parser:"typescript",filepath:$})}catch{}await(0,O.writeFile)($,G);let Y=[],J=[];_.forEach(e=>{let a=e.type==="rpc"?"POST":"GET",i=e.type==="loader"?e.loaderUrl:e.rpcUrl;J.push({name:e.name,rpcUrl:i,method:a,isMultipart:!!e.isMultipart}),Y.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ue=`
10
10
  import { createClientRpc } from '@bobtail.software/b-ssr/client';
11
11
 
12
12
  if (import.meta.env.DEV) {
@@ -21,15 +21,15 @@
21
21
  });
22
22
  `).join(`
23
23
  `)}
24
- `,ge=ae(Y,t);w.set(u.default.resolve(t),{client:ue,server:ge})}catch(m){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:m})}}let ie=(t,d,s)=>{if(d.includes("node_modules")||d.startsWith(k))return null;if(s?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(d)){let r=/\brequire\s*\(/.test(t),m=/\bmodule\.exports\b/.test(t),P=/\bexports\./.test(t);if(r||m||P)return"import { createRequire } from 'module';"+`
24
+ `,ge=ae(Y,t);P.set(u.default.resolve(t),{client:ue,server:ge})}catch(m){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:m})}}let ie=(t,d,n)=>{if(d.includes("node_modules")||d.startsWith(k))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(d)){let r=/\brequire\s*\(/.test(t),m=/\bmodule\.exports\b/.test(t),w=/\bexports\./.test(t);if(r||m||w)return"import { createRequire } from 'module';"+`
25
25
  const require = createRequire(import.meta.url);
26
26
  const module = { exports: {} };
27
27
  const exports = module.exports;
28
28
  `+t+`
29
- export default module.exports;`}return null};function oe(t){let d=we(t),s="";return d.length>0&&(s=`args: { ${d.join("; ")} }`),s||(s="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${s}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ae(t,d){if(t.length===0)return"";let s=d.replace(/\\/g,"/");return`
29
+ export default module.exports;`}return null};function oe(t){let d=we(t),n="";return d.length>0&&(n=`args: { ${d.join("; ")} }`),n||(n="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${n}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ae(t,d){if(t.length===0)return"";let n=d.replace(/\\/g,"/");return`
30
30
 
31
31
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
32
- throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${s}');
32
+ throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${n}');
33
33
  }
34
34
 
35
35
  let initPromise;
@@ -42,7 +42,7 @@ export default module.exports;`}return null};function oe(t){let d=we(t),s="";ret
42
42
  rpcOptionsMap = new Map();
43
43
  renderOptionsMap = new Map();
44
44
  loaderApiOptionsMap = new Map();
45
- const serverModulePath = '${s}';
45
+ const serverModulePath = '${n}';
46
46
 
47
47
  if (typeof globalThis.require === 'undefined') {
48
48
  try {
@@ -89,12 +89,12 @@ export default module.exports;`}return null};function oe(t){let d=we(t),s="";ret
89
89
  return initPromise;
90
90
  }
91
91
 
92
- ${t.map(r=>{let m=[];r.requiresArgs&&m.push("args"),m.push("ssrContext");let P=r.requiresArgs?"args":"{}",R="";return r.type==="rpc"?R=`
92
+ ${t.map(r=>{let m=[];r.requiresArgs&&m.push("args"),m.push("ssrContext");let w=r.requiresArgs?"args":"{}",R="";return r.type==="rpc"?R=`
93
93
  if (fn.isMultipart) throw new Error('RPC multipart no soportado en SSR.');
94
94
  await getOptionsMaps();
95
95
  const options = rpcOptionsMap.get('${r.url}');
96
96
  if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${r.name}');
97
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${P});
97
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${w});
98
98
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
99
99
  `:r.type==="api"?R=`
100
100
  await getOptionsMaps();
@@ -103,13 +103,13 @@ export default module.exports;`}return null};function oe(t){let d=we(t),s="";ret
103
103
  console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${r.name}', 'URL:', '${r.url}');
104
104
  return null;
105
105
  }
106
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${P});
106
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${w});
107
107
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
108
108
  `:R=`
109
109
  await getOptionsMaps();
110
110
  const options = renderOptionsMap.get('${r.url}');
111
111
  if (!options) return {};
112
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${P});
112
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${w});
113
113
  let customData = {};
114
114
  try {
115
115
  if (options.handler) {
@@ -131,4 +131,4 @@ export default module.exports;`}return null};function oe(t){let d=we(t),s="";ret
131
131
  }
132
132
  };`}).join(`
133
133
  `)}
134
- `}async function le(){let t=await(0,ne.default)(l,{absolute:!0});await Promise.all(t.map(d=>B(d)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await le()},configureServer(t){let d=s=>s.endsWith(".mts")||s.endsWith(".ts");t.watcher.on("add",s=>d(s)&&B(s)),t.watcher.on("change",s=>d(s)&&B(s)),t.watcher.on("unlink",s=>{if(d(s)){let r=u.default.resolve(s);w.delete(r),q.delete(r);let m=u.default.extname(s),P=s.substring(0,s.length-m.length)+".universal.d.ts";(0,O.unlink)(P).catch(()=>{})}})},async resolveId(t,d,s){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],m=r;if(r.endsWith(".universal"))m=r;else if(r.endsWith(".universal.ts"))m=r.slice(0,-3);else if(r.endsWith(".universal.mts"))m=r.slice(0,-4);else if(r.endsWith(".universal.js"))m=r.slice(0,-3);else return null;let P=[".mts",".ts"];for(let R of P){let A=m.slice(0,-10)+R,j=await this.resolve(A,d,{skipSelf:!0});if(j){let L=s?.ssr?"?mode=ssr":"?mode=client";return k+j.id+L}try{await(0,O.access)(A);let L=s?.ssr?"?mode=ssr":"?mode=client";return k+A+L}catch{}}}return null},load(t,d){if(t.startsWith(k)){let s=t.slice(k.length).split("?")[0],r=w.get(s);return r?d?.ssr===!0?r.server:r.client:null}if(d?.ssr!==!0){let s=u.default.resolve(t);if(q.has(s))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${u.default.basename(t)}");`}return null},transform:ie}}function we(o){let l=[];return o.paramsType!=="unknown"&&l.push(`params: ${o.paramsType}`),o.queryType!=="unknown"&&l.push(`query: ${o.queryType}`),o.bodyType!=="unknown"&&l.push(`body: ${o.bodyType}`),l.push("signal?: AbortSignal"),l}0&&(module.exports={rpcGeneratorPlugin});
134
+ `}async function le(){let t=await(0,ne.default)(l,{absolute:!0});await Promise.all(t.map(d=>I(d)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await le()},configureServer(t){let d=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>d(n)&&I(n)),t.watcher.on("change",n=>d(n)&&I(n)),t.watcher.on("unlink",n=>{if(d(n)){let r=u.default.resolve(n);P.delete(r),q.delete(r);let m=u.default.extname(n),w=n.substring(0,n.length-m.length)+".universal.d.ts";(0,O.unlink)(w).catch(()=>{})}})},async resolveId(t,d,n){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],m=r;if(r.endsWith(".universal"))m=r;else if(r.endsWith(".universal.ts"))m=r.slice(0,-3);else if(r.endsWith(".universal.mts"))m=r.slice(0,-4);else if(r.endsWith(".universal.js"))m=r.slice(0,-3);else return null;let w=[".mts",".ts"];for(let R of w){let A=m.slice(0,-10)+R,j=await this.resolve(A,d,{skipSelf:!0});if(j){let L=n?.ssr?"?mode=ssr":"?mode=client";return k+j.id+L}try{await(0,O.access)(A);let L=n?.ssr?"?mode=ssr":"?mode=client";return k+A+L}catch{}}}return null},async load(t,d){if(t.startsWith(k)){let n=t.slice(k.length).split("?")[0],r=P.get(n);return r||(await I(n),r=P.get(n)),r?d?.ssr===!0?r.server:r.client:null}if(d?.ssr!==!0){let n=u.default.resolve(t);if(q.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${u.default.basename(t)}");`}return null},transform:ie}}function we(o){let l=[];return o.paramsType!=="unknown"&&l.push(`params: ${o.paramsType}`),o.queryType!=="unknown"&&l.push(`query: ${o.queryType}`),o.bodyType!=="unknown"&&l.push(`body: ${o.bodyType}`),l.push("signal?: AbortSignal"),l}0&&(module.exports={rpcGeneratorPlugin});
@@ -1,4 +1,4 @@
1
- import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"fs/promises";import l from"path";import{format as de,resolveConfig as me}from"prettier";import{Node as A,Project as fe,SyntaxKind as y,ts as j}from"ts-morph";var k="virtual:b-ssr-rpc-universal:";function ye(x){let T=x.replace(/[^a-zA-Z0-9]+(.)?/g,(L,$)=>$?$.toUpperCase():"");return T.charAt(0).toLowerCase()+T.slice(1)}function G(x,T,L){let $=l.basename(L,l.extname(L))||"Index",M=T.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),O=`${x} ${M} ${$}`;return ye(O)}function Re(x={}){let{routerPattern:T="src-ts/routers/**/*.mts",tsConfigFilePath:L="tsconfig.json",routerBaseDir:$="src-ts/routers"}=x,M=new Map,O=new Set,K=new fe({tsConfigFilePath:L,skipAddingFilesFromTsConfig:!1}),te=l.resolve(process.cwd(),$||".");async function U(t){try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(o,i)=>{if(!l.isAbsolute(i))return o;let s=i;if(!l.extname(s)){let f=K.getSourceFile(d=>d.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===i);f&&(s=f.getFilePath())}let a=l.relative(l.dirname(C),s).replace(/\\/g,"/");return a.startsWith(".")||(a="./"+a),`import("${a}")`})},v=function(e,o){if(e.getSymbol()?.getName()==="Promise"){let c=e.getAwaitedType();if(c)return`Promise<${v(c,o)}>`}let i=e.getAliasSymbol()??e.getSymbol();if(i?.getName()==="__object")return N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!i){let c=(g,m=0)=>{if(!(m>5)){if(g.isArray()){let h=g.getArrayElementType();h&&c(h,m);return}if(g.isObject()&&!g.getSymbol()&&!g.getAliasSymbol()){for(let h of g.getApparentProperties()){let R=h.getValueDeclaration();R&&c(h.getTypeAtLocation(R),m+1)}return}v(g,o)}};return c(e),N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType))}if(!i)return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let s=i.getDeclarations()[0];if(!s)return i.getName();if(A.isImportSpecifier(s)||A.isImportClause(s)){let c=s.getFirstAncestorByKind(y.ImportDeclaration);if(c){let g=c.getModuleSpecifierValue(),m=i.getName();return w.has(g)||w.set(g,new Set),w.get(g)?.add(m),m}}let a=s.getSourceFile();if(a.getFilePath()===u.getFilePath())return i.getName();if(a.isInNodeModules())return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let f=l.relative(l.dirname(C),a.getFilePath()).replace(/\\/g,"/"),F=f.startsWith(".")?f:`./${f}`,P=i.getName();return w.has(F)||w.set(F,new Set),w.get(F)?.add(P),P},Z=function(e){let o;if(A.isFunctionLikeDeclaration(e)||A.isArrowFunction(e)){let i=e.getDescendantsOfKind(y.ReturnStatement);for(let s of i){let a=s.getExpression();if(a?.isKind(y.SatisfiesExpression)){o=a.getTypeNode()?.getType();break}}}if(o)return v(o,e);{let i=e.getType().getCallSignatures();if(i.length>0){let s=i[0]?.getReturnType();return v(s,e)}}return"unknown"};var p=N,n=v,r=Z;let u=K.addSourceFileAtPath(t);await u.refreshFromFileSystem(),K.resolveSourceFileDependencies();let b=u.getDescendantsOfKind(y.CallExpression),S=b.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),E=b.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),q=b.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),D=l.extname(t),C=t.substring(0,t.length-D.length)+".universal.d.ts",B=l.resolve(t);if(S.length===0&&E.length===0&&q.length===0){M.delete(B),O.delete(B),C!==t&&await ee(C).catch(()=>{});return}O.add(B);let V=[],w=new Map;w.has("fastify")||w.set("fastify",new Set),w.get("fastify")?.add("FastifyRequest"),w.get("fastify")?.add("FastifyReply");let oe=e=>{let o="unknown",i="unknown",s="unknown",a=!1;if(!e||!A.isObjectLiteralExpression(e))return{paramsType:o,queryType:i,bodyType:s,isMultipart:a};let f=e.getProperty("schema");if(f?.isKind(y.PropertyAssignment)){let d=f.getInitializer();if(d?.isKind(y.Identifier)){let P=d.getSymbol()?.getValueDeclaration();if(P){let c=P.getFirstDescendantByKind(y.ObjectLiteralExpression);c&&(d=c)}}if(d&&A.isObjectLiteralExpression(d)){let F=d.getProperty("consumes");if(F?.isKind(y.PropertyAssignment)){let c=F.getInitializer();A.isArrayLiteralExpression(c)&&(a=c.getElements().some(g=>g.isKind(y.StringLiteral)&&g.getLiteralValue()==="multipart/form-data"))}let P=c=>{let g=d.getProperty(c);if(g?.isKind(y.PropertyAssignment)){let m=g.getInitializer();if(m){let h=m.getType(),R=h.getProperty("_output");return v(R?R.getTypeAtLocation(m).getApparentType():h,m)}}return"unknown"};if(o=P("params"),i=P("querystring"),s=P("body"),a){let c="{ file: File }";s=s!=="unknown"&&s.trim().startsWith("{")?`(${s} & ${c})`:c}}}return{paramsType:o,queryType:i,bodyType:s,isMultipart:a}},W=l.relative(te,l.dirname(t)).split(l.sep).join("/"),ae=W==="."||!W?"":W.startsWith("/")?W:"/"+W,_=(e,o)=>{let[i,s]=e.getArguments();if(!i?.isKind(y.StringLiteral))return;let a=i.getLiteralValue(),f="unknown",d=ae,{paramsType:F,queryType:P,bodyType:c,isMultipart:g}=oe(s);if(s?.isKind(y.ObjectLiteralExpression)){let R=s.getProperty("prefix");if(R?.isKind(y.PropertyAssignment)){let I=R.getInitializer();I?.isKind(y.StringLiteral)&&(d=I.getLiteralValue())}let J=s.getProperty("handler");if(J?.isKind(y.PropertyAssignment)){let I=J.getInitializer();I&&(f=Z(I),f.startsWith("Promise<")||(f=`Promise<${f}>`))}}let m="",h="";o==="rpc"?(m=l.join(d,"rpc",a).replace(/\\/g,"/"),h=G("action",d,a)):o==="loader"?(m=l.join(d,"loader",a).replace(/\\/g,"/"),h=G("loader",d,a)):o==="api"&&(m=l.join(d,"api",a).replace(/\\/g,"/"),h=G("get",d,a)),h&&V.push({type:o,name:h,returnType:f,url:a,rpcUrl:m,loaderUrl:m,paramsType:F,queryType:P,bodyType:c,isMultipart:g})};S.forEach(e=>_(e,"rpc")),E.forEach(e=>_(e,"loader")),q.forEach(e=>_(e,"api"));let z=[];for(let[e,o]of w.entries())z.push(`import type { ${[...o].sort().join(", ")} } from "${e}";`);let Q=[];V.forEach(e=>{Q.push(ne(e))});let H=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
1
+ import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"fs/promises";import l from"path";import{format as de,resolveConfig as me}from"prettier";import{Node as $,Project as fe,SyntaxKind as y,ts as j}from"ts-morph";var k="virtual:b-ssr-rpc-universal:";function ye(x){let T=x.replace(/[^a-zA-Z0-9]+(.)?/g,(L,M)=>M?M.toUpperCase():"");return T.charAt(0).toLowerCase()+T.slice(1)}function G(x,T,L){let M=l.basename(L,l.extname(L))||"Index",E=T.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),O=`${x} ${E} ${M}`;return ye(O)}function Re(x={}){let{routerPattern:T="src-ts/routers/**/*.mts",tsConfigFilePath:L="tsconfig.json",routerBaseDir:M="src-ts/routers"}=x,E=new Map,O=new Set,U=new fe({tsConfigFilePath:L,skipAddingFilesFromTsConfig:!1}),te=l.resolve(process.cwd(),M||".");async function K(t){try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(o,i)=>{if(!l.isAbsolute(i))return o;let s=i;if(!l.extname(s)){let f=U.getSourceFile(d=>d.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===i);f&&(s=f.getFilePath())}let a=l.relative(l.dirname(v),s).replace(/\\/g,"/");return a.startsWith(".")||(a="./"+a),`import("${a}")`})},A=function(e,o){if(e.getSymbol()?.getName()==="Promise"){let c=e.getAwaitedType();if(c)return`Promise<${A(c,o)}>`}let i=e.getAliasSymbol()??e.getSymbol();if(i?.getName()==="__object")return N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!i){let c=(g,m=0)=>{if(!(m>5)){if(g.isArray()){let h=g.getArrayElementType();h&&c(h,m);return}if(g.isObject()&&!g.getSymbol()&&!g.getAliasSymbol()){for(let h of g.getApparentProperties()){let R=h.getValueDeclaration();R&&c(h.getTypeAtLocation(R),m+1)}return}A(g,o)}};return c(e),N(e.getText(o,j.TypeFormatFlags.NoTruncation|j.TypeFormatFlags.UseFullyQualifiedType))}if(!i)return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let s=i.getDeclarations()[0];if(!s)return i.getName();if($.isImportSpecifier(s)||$.isImportClause(s)){let c=s.getFirstAncestorByKind(y.ImportDeclaration);if(c){let g=c.getModuleSpecifierValue(),m=i.getName();return w.has(g)||w.set(g,new Set),w.get(g)?.add(m),m}}let a=s.getSourceFile();if(a.getFilePath()===u.getFilePath())return i.getName();if(a.isInNodeModules())return N(e.getText(o,j.TypeFormatFlags.NoTruncation));let f=l.relative(l.dirname(v),a.getFilePath()).replace(/\\/g,"/"),F=f.startsWith(".")?f:`./${f}`,P=i.getName();return w.has(F)||w.set(F,new Set),w.get(F)?.add(P),P},Z=function(e){let o;if($.isFunctionLikeDeclaration(e)||$.isArrowFunction(e)){let i=e.getDescendantsOfKind(y.ReturnStatement);for(let s of i){let a=s.getExpression();if(a?.isKind(y.SatisfiesExpression)){o=a.getTypeNode()?.getType();break}}}if(o)return A(o,e);{let i=e.getType().getCallSignatures();if(i.length>0){let s=i[0]?.getReturnType();return A(s,e)}}return"unknown"};var p=N,n=A,r=Z;let u=U.addSourceFileAtPath(t);await u.refreshFromFileSystem(),U.resolveSourceFileDependencies();let b=u.getDescendantsOfKind(y.CallExpression),S=b.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),C=b.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),q=b.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),D=l.extname(t),v=t.substring(0,t.length-D.length)+".universal.d.ts",B=l.resolve(t);if(S.length===0&&C.length===0&&q.length===0){E.delete(B),O.delete(B),v!==t&&await ee(v).catch(()=>{});return}O.add(B);let V=[],w=new Map;w.has("fastify")||w.set("fastify",new Set),w.get("fastify")?.add("FastifyRequest"),w.get("fastify")?.add("FastifyReply");let oe=e=>{let o="unknown",i="unknown",s="unknown",a=!1;if(!e||!$.isObjectLiteralExpression(e))return{paramsType:o,queryType:i,bodyType:s,isMultipart:a};let f=e.getProperty("schema");if(f?.isKind(y.PropertyAssignment)){let d=f.getInitializer();if(d?.isKind(y.Identifier)){let P=d.getSymbol()?.getValueDeclaration();if(P){let c=P.getFirstDescendantByKind(y.ObjectLiteralExpression);c&&(d=c)}}if(d&&$.isObjectLiteralExpression(d)){let F=d.getProperty("consumes");if(F?.isKind(y.PropertyAssignment)){let c=F.getInitializer();$.isArrayLiteralExpression(c)&&(a=c.getElements().some(g=>g.isKind(y.StringLiteral)&&g.getLiteralValue()==="multipart/form-data"))}let P=c=>{let g=d.getProperty(c);if(g?.isKind(y.PropertyAssignment)){let m=g.getInitializer();if(m){let h=m.getType(),R=h.getProperty("_output");return A(R?R.getTypeAtLocation(m).getApparentType():h,m)}}return"unknown"};if(o=P("params"),i=P("querystring"),s=P("body"),a){let c="{ file: File }";s=s!=="unknown"&&s.trim().startsWith("{")?`(${s} & ${c})`:c}}}return{paramsType:o,queryType:i,bodyType:s,isMultipart:a}},W=l.relative(te,l.dirname(t)).split(l.sep).join("/"),ae=W==="."||!W?"":W.startsWith("/")?W:"/"+W,_=(e,o)=>{let[i,s]=e.getArguments();if(!i?.isKind(y.StringLiteral))return;let a=i.getLiteralValue(),f="unknown",d=ae,{paramsType:F,queryType:P,bodyType:c,isMultipart:g}=oe(s);if(s?.isKind(y.ObjectLiteralExpression)){let R=s.getProperty("prefix");if(R?.isKind(y.PropertyAssignment)){let I=R.getInitializer();I?.isKind(y.StringLiteral)&&(d=I.getLiteralValue())}let J=s.getProperty("handler");if(J?.isKind(y.PropertyAssignment)){let I=J.getInitializer();I&&(f=Z(I),f.startsWith("Promise<")||(f=`Promise<${f}>`))}}let m="",h="";o==="rpc"?(m=l.join(d,"rpc",a).replace(/\\/g,"/"),h=G("action",d,a)):o==="loader"?(m=l.join(d,"loader",a).replace(/\\/g,"/"),h=G("loader",d,a)):o==="api"&&(m=l.join(d,"api",a).replace(/\\/g,"/"),h=G("get",d,a)),h&&V.push({type:o,name:h,returnType:f,url:a,rpcUrl:m,loaderUrl:m,paramsType:F,queryType:P,bodyType:c,isMultipart:g})};S.forEach(e=>_(e,"rpc")),C.forEach(e=>_(e,"loader")),q.forEach(e=>_(e,"api"));let z=[];for(let[e,o]of w.entries())z.push(`import type { ${[...o].sort().join(", ")} } from "${e}";`);let Q=[];V.forEach(e=>{Q.push(ne(e))});let H=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
2
  /* eslint-disable */
3
3
 
4
4
  `+(z.length>0?z.join(`
@@ -6,7 +6,7 @@ import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"
6
6
 
7
7
  `:"")+Q.join(`
8
8
 
9
- `);try{let e=await me(C)||{};H=await de(H,{...e,parser:"typescript",filepath:C})}catch{}await ge(C,H);let X=[],Y=[];V.forEach(e=>{let i=e.type==="rpc"?"POST":"GET",s=e.type==="loader"?e.loaderUrl:e.rpcUrl;Y.push({name:e.name,rpcUrl:s,method:i,isMultipart:!!e.isMultipart}),X.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let le=`
9
+ `);try{let e=await me(v)||{};H=await de(H,{...e,parser:"typescript",filepath:v})}catch{}await ge(v,H);let X=[],Y=[];V.forEach(e=>{let i=e.type==="rpc"?"POST":"GET",s=e.type==="loader"?e.loaderUrl:e.rpcUrl;Y.push({name:e.name,rpcUrl:s,method:i,isMultipart:!!e.isMultipart}),X.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let le=`
10
10
  import { createClientRpc } from '@bobtail.software/b-ssr/client';
11
11
 
12
12
  if (import.meta.env.DEV) {
@@ -21,7 +21,7 @@ import pe from"fast-glob";import{access as ue,unlink as ee,writeFile as ge}from"
21
21
  });
22
22
  `).join(`
23
23
  `)}
24
- `,ce=se(X,t);M.set(l.resolve(t),{client:le,server:ce})}catch(u){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:u})}}let re=(t,p,n)=>{if(p.includes("node_modules")||p.startsWith(k))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(p)){let r=/\brequire\s*\(/.test(t),u=/\bmodule\.exports\b/.test(t),b=/\bexports\./.test(t);if(r||u||b)return"import { createRequire } from 'module';"+`
24
+ `,ce=se(X,t);E.set(l.resolve(t),{client:le,server:ce})}catch(u){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:u})}}let re=(t,p,n)=>{if(p.includes("node_modules")||p.startsWith(k))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(p)){let r=/\brequire\s*\(/.test(t),u=/\bmodule\.exports\b/.test(t),b=/\bexports\./.test(t);if(r||u||b)return"import { createRequire } from 'module';"+`
25
25
  const require = createRequire(import.meta.url);
26
26
  const module = { exports: {} };
27
27
  const exports = module.exports;
@@ -131,4 +131,4 @@ export default module.exports;`}return null};function ne(t){let p=he(t),n="";ret
131
131
  }
132
132
  };`}).join(`
133
133
  `)}
134
- `}async function ie(){let t=await pe(T,{absolute:!0});await Promise.all(t.map(p=>U(p)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ie()},configureServer(t){let p=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>p(n)&&U(n)),t.watcher.on("change",n=>p(n)&&U(n)),t.watcher.on("unlink",n=>{if(p(n)){let r=l.resolve(n);M.delete(r),O.delete(r);let u=l.extname(n),b=n.substring(0,n.length-u.length)+".universal.d.ts";ee(b).catch(()=>{})}})},async resolveId(t,p,n){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],u=r;if(r.endsWith(".universal"))u=r;else if(r.endsWith(".universal.ts"))u=r.slice(0,-3);else if(r.endsWith(".universal.mts"))u=r.slice(0,-4);else if(r.endsWith(".universal.js"))u=r.slice(0,-3);else return null;let b=[".mts",".ts"];for(let S of b){let E=u.slice(0,-10)+S,q=await this.resolve(E,p,{skipSelf:!0});if(q){let D=n?.ssr?"?mode=ssr":"?mode=client";return k+q.id+D}try{await ue(E);let D=n?.ssr?"?mode=ssr":"?mode=client";return k+E+D}catch{}}}return null},load(t,p){if(t.startsWith(k)){let n=t.slice(k.length).split("?")[0],r=M.get(n);return r?p?.ssr===!0?r.server:r.client:null}if(p?.ssr!==!0){let n=l.resolve(t);if(O.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${l.basename(t)}");`}return null},transform:re}}function he(x){let T=[];return x.paramsType!=="unknown"&&T.push(`params: ${x.paramsType}`),x.queryType!=="unknown"&&T.push(`query: ${x.queryType}`),x.bodyType!=="unknown"&&T.push(`body: ${x.bodyType}`),T.push("signal?: AbortSignal"),T}export{Re as rpcGeneratorPlugin};
134
+ `}async function ie(){let t=await pe(T,{absolute:!0});await Promise.all(t.map(p=>K(p)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ie()},configureServer(t){let p=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>p(n)&&K(n)),t.watcher.on("change",n=>p(n)&&K(n)),t.watcher.on("unlink",n=>{if(p(n)){let r=l.resolve(n);E.delete(r),O.delete(r);let u=l.extname(n),b=n.substring(0,n.length-u.length)+".universal.d.ts";ee(b).catch(()=>{})}})},async resolveId(t,p,n){if(t.startsWith(k))return null;if(t.includes(".universal")){let r=t.split("?")[0],u=r;if(r.endsWith(".universal"))u=r;else if(r.endsWith(".universal.ts"))u=r.slice(0,-3);else if(r.endsWith(".universal.mts"))u=r.slice(0,-4);else if(r.endsWith(".universal.js"))u=r.slice(0,-3);else return null;let b=[".mts",".ts"];for(let S of b){let C=u.slice(0,-10)+S,q=await this.resolve(C,p,{skipSelf:!0});if(q){let D=n?.ssr?"?mode=ssr":"?mode=client";return k+q.id+D}try{await ue(C);let D=n?.ssr?"?mode=ssr":"?mode=client";return k+C+D}catch{}}}return null},async load(t,p){if(t.startsWith(k)){let n=t.slice(k.length).split("?")[0],r=E.get(n);return r||(await K(n),r=E.get(n)),r?p?.ssr===!0?r.server:r.client:null}if(p?.ssr!==!0){let n=l.resolve(t);if(O.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${l.basename(t)}");`}return null},transform:re}}function he(x){let T=[];return x.paramsType!=="unknown"&&T.push(`params: ${x.paramsType}`),x.queryType!=="unknown"&&T.push(`query: ${x.queryType}`),x.bodyType!=="unknown"&&T.push(`body: ${x.bodyType}`),T.push("signal?: AbortSignal"),T}export{Re as rpcGeneratorPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobtail.software/b-ssr",
3
- "version": "1.0.34",
3
+ "version": "1.0.36",
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",