@bobtail.software/b-ssr 1.0.85 → 1.1.1

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