@bobtail.software/b-ssr 1.0.56 → 1.0.57

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,19 +1,19 @@
1
- "use strict";var me=Object.create;var W=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var Te=(i,p)=>{for(var P in p)W(i,P,{get:p[P],enumerable:!0})},te=(i,p,P,A)=>{if(p&&typeof p=="object"||typeof p=="function")for(let x of ye(p))!be.call(i,x)&&x!==P&&W(i,x,{get:()=>p[x],enumerable:!(A=fe(p,x))||A.enumerable});return i};var re=(i,p,P)=>(P=i!=null?me(he(i)):{},te(p||!i||!i.__esModule?W(P,"default",{value:i,enumerable:!0}):P,i)),Pe=i=>te(W({},"__esModule",{value:!0}),i);var Fe={};Te(Fe,{rpcGeneratorPlugin:()=>xe});module.exports=Pe(Fe);var se=re(require("fast-glob"),1),q=require("fs/promises"),c=re(require("path"),1),K=require("prettier"),r=require("ts-morph"),k="virtual:b-ssr-rpc-universal:";function we(i){let p=i.replace(/[^a-zA-Z0-9]+(.)?/g,(P,A)=>A?A.toUpperCase():"");return p.charAt(0).toLowerCase()+p.slice(1)}function Z(i,p,P){let A=c.default.basename(P,c.default.extname(P))||"Index",x=p.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),j=`${i} ${x} ${A}`;return we(j)}function xe(i={}){let{routerPattern:p="src-ts/routers/**/*.mts",tsConfigFilePath:P="tsconfig.json",routerBaseDir:A="src-ts/routers"}=i,x=new Map,j=new Set,B=new r.Project({tsConfigFilePath:P,skipAddingFilesFromTsConfig:!1}),ne=c.default.resolve(process.cwd(),A||".");async function I(t){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(a,n)=>{if(!c.default.isAbsolute(n))return a;let o=n;if(!c.default.extname(o)){let T=B.getSourceFile(y=>y.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===n);T&&(o=T.getFilePath())}let l=c.default.relative(c.default.dirname(M),o).replace(/\\/g,"/");return l.startsWith(".")||(l="./"+l),`import("${l}")`})},O=function(e,a){if(e.getSymbol()?.getName()==="Promise"){let d=e.getAwaitedType();if(d)return`Promise<${O(d,a)}>`}let n=e.getAliasSymbol()??e.getSymbol();if(n?.getName()==="__object")return D(e.getText(a,r.ts.TypeFormatFlags.NoTruncation|r.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!n){let d=(f,h=0)=>{if(!(h>5)){if(f.isArray()){let w=f.getArrayElementType();w&&d(w,h);return}if(f.isObject()&&!f.getSymbol()&&!f.getAliasSymbol()){for(let w of f.getApparentProperties()){let $=w.getValueDeclaration();$&&d(w.getTypeAtLocation($),h+1)}return}O(f,a)}};return d(e),D(e.getText(a,r.ts.TypeFormatFlags.NoTruncation|r.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!n)return D(e.getText(a,r.ts.TypeFormatFlags.NoTruncation));let o=n.getDeclarations()[0];if(!o)return n.getName();if(r.Node.isImportSpecifier(o)||r.Node.isImportClause(o)){let d=o.getFirstAncestorByKind(r.SyntaxKind.ImportDeclaration);if(d){let f=d.getModuleSpecifierValue(),h=n.getName();return v.has(f)||v.set(f,new Set),v.get(f)?.add(h),h}}let l=o.getSourceFile();if(l.getFilePath()===b.getFilePath())return n.getName();if(l.isInNodeModules())return D(e.getText(a,r.ts.TypeFormatFlags.NoTruncation));let T=c.default.relative(c.default.dirname(M),l.getFilePath()).replace(/\\/g,"/"),E=T.startsWith(".")?T:`./${T}`,S=n.getName();return v.has(E)||v.set(E,new Set),v.get(E)?.add(S),S},Q=function(e){let a;if(r.Node.isFunctionLikeDeclaration(e)||r.Node.isArrowFunction(e)){let n=e.getDescendantsOfKind(r.SyntaxKind.ReturnStatement);for(let o of n){let l=o.getExpression();if(l?.isKind(r.SyntaxKind.SatisfiesExpression)){a=l.getTypeNode()?.getType();break}}}if(a)return O(a,e);{let n=e.getType().getCallSignatures();if(n.length>0){let o=n[0]?.getReturnType();return O(o,e)}}return"unknown"};var m=D,s=O,g=Q;let b=B.addSourceFileAtPath(t);await b.refreshFromFileSystem(),B.resolveSourceFileDependencies();let u=b.getDescendantsOfKind(r.SyntaxKind.CallExpression),C=(e,a)=>{if(!r.Node.isCallExpression(e))return!1;let n=e.getExpression();return r.Node.isPropertyAccessExpression(n)?n.getName()===a:!1},F=u.filter(e=>C(e,"addRpcRoute")),R=u.filter(e=>C(e,"addRenderRoute")),L=u.filter(e=>C(e,"addLoaderRoute")),ce=c.default.extname(t),M=t.substring(0,t.length-ce.length)+".universal.d.ts",V=c.default.resolve(t);if(F.length===0&&R.length===0&&L.length===0){x.delete(V),j.delete(V),M!==t&&await(0,q.unlink)(M).catch(()=>{});return}j.add(V);let _=[],v=new Map;v.has("fastify")||v.set("fastify",new Set),v.get("fastify")?.add("FastifyRequest"),v.get("fastify")?.add("FastifyReply");let pe=e=>{let a="unknown",n="unknown",o="unknown",l=!1;if(!e||!r.Node.isObjectLiteralExpression(e))return{paramsType:a,queryType:n,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 d=S.getFirstDescendantByKind(r.SyntaxKind.ObjectLiteralExpression);d&&(y=d)}}if(y&&r.Node.isObjectLiteralExpression(y)){let E=y.getProperty("consumes");if(E?.isKind(r.SyntaxKind.PropertyAssignment)){let d=E.getInitializer();r.Node.isArrayLiteralExpression(d)&&(l=d.getElements().some(f=>f.isKind(r.SyntaxKind.StringLiteral)&&f.getLiteralValue()==="multipart/form-data"))}let S=d=>{let f=y.getProperty(d);if(f?.isKind(r.SyntaxKind.PropertyAssignment)){let h=f.getInitializer();if(h){let w=h.getType(),$=w.getProperty("_output");return O($?$.getTypeAtLocation(h).getApparentType():w,h)}}return"unknown"};if(a=S("params"),n=S("querystring"),o=S("body"),l){let d="{ file: File }";o=o!=="unknown"&&o.trim().startsWith("{")?`(${o} & ${d})`:d}}}return{paramsType:a,queryType:n,bodyType:o,isMultipart:l}},N=c.default.relative(ne,c.default.dirname(t)).split(c.default.sep).join("/"),ue=N==="."||!N?"":N.startsWith("/")?N:"/"+N,z=(e,a)=>{let[n,o]=e.getArguments(),l="";if(r.Node.isStringLiteral(n))l=n.getLiteralValue();else if(r.Node.isNoSubstitutionTemplateLiteral(n))l=n.getLiteralText();else return;let T="unknown",y=ue,{paramsType:E,queryType:S,bodyType:d,isMultipart:f}=pe(o);if(o?.isKind(r.SyntaxKind.ObjectLiteralExpression)){let $=o.getProperty("prefix");if($?.isKind(r.SyntaxKind.PropertyAssignment)){let U=$.getInitializer();U?.isKind(r.SyntaxKind.StringLiteral)&&(y=U.getLiteralValue())}let ee=o.getProperty("handler");if(ee?.isKind(r.SyntaxKind.PropertyAssignment)){let U=ee.getInitializer();U&&(T=Q(U),T.startsWith("Promise<")||(T=`Promise<${T}>`))}}let h="",w="";a==="rpc"?(h=c.default.join(y,"rpc",l).replace(/\\/g,"/"),w=Z("action",y,l)):a==="loader"?(h=c.default.join(y,"loader",l).replace(/\\/g,"/"),w=Z("loader",y,l)):a==="api"&&(h=c.default.join(y,"api",l).replace(/\\/g,"/"),w=Z("get",y,l)),w&&_.push({type:a,name:w,returnType:T,url:l,rpcUrl:h,loaderUrl:h,paramsType:E,queryType:S,bodyType:d,isMultipart:f})};F.forEach(e=>z(e,"rpc")),R.forEach(e=>z(e,"loader")),L.forEach(e=>z(e,"api"));let H=[];for(let[e,a]of v.entries())H.push(`import type { ${[...a].sort().join(", ")} } from "${e}";`);let X=[];_.forEach(e=>{X.push(ie(e))});let G=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
1
+ "use strict";var fe=Object.create;var W=Object.defineProperty;var ye=Object.getOwnPropertyDescriptor;var he=Object.getOwnPropertyNames;var be=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var Pe=(c,u)=>{for(var b in u)W(c,b,{get:u[b],enumerable:!0})},re=(c,u,b,E)=>{if(u&&typeof u=="object"||typeof u=="function")for(let T of he(u))!Se.call(c,T)&&T!==b&&W(c,T,{get:()=>u[T],enumerable:!(E=ye(u,T))||E.enumerable});return c};var ne=(c,u,b)=>(b=c!=null?fe(be(c)):{},re(u||!c||!c.__esModule?W(b,"default",{value:c,enumerable:!0}):b,c)),Te=c=>re(W({},"__esModule",{value:!0}),c);var Fe={};Pe(Fe,{rpcGeneratorPlugin:()=>xe});module.exports=Te(Fe);var se=ne(require("fast-glob"),1),q=require("fs/promises"),i=ne(require("path"),1),V=require("prettier"),r=require("ts-morph"),L="virtual:b-ssr-rpc-universal:";function we(c){let u=c.replace(/[^a-zA-Z0-9]+(.)?/g,(b,E)=>E?E.toUpperCase():"");return u.charAt(0).toLowerCase()+u.slice(1)}function Q(c,u,b){let E=i.default.basename(b,i.default.extname(b))||"Index",T=u.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),j=`${c} ${T} ${E}`;return we(j)}function xe(c={}){let{routerPattern:u="src-ts/routers/**/*.mts",tsConfigFilePath:b="tsconfig.json",routerBaseDir:E="src-ts/routers"}=c,T=new Map,j=new Set;console.log(`[B-SSR Debug] Initializing Project with tsconfig: ${b}`);let U=new r.Project({tsConfigFilePath:b,skipAddingFilesFromTsConfig:!1}),oe=i.default.resolve(process.cwd(),E||".");async function I(t){let g=i.default.basename(t);try{let k=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(a,s)=>{if(!i.default.isAbsolute(s))return a;let l=s;if(!i.default.extname(l)){let S=U.getSourceFile(y=>y.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===s);S&&(l=S.getFilePath())}let p=i.default.relative(i.default.dirname(A),l).replace(/\\/g,"/");return p.startsWith(".")||(p="./"+p),`import("${p}")`})},D=function(e,a){if(e.getSymbol()?.getName()==="Promise"){let m=e.getAwaitedType();if(m)return`Promise<${D(m,a)}>`}let s=e.getAliasSymbol()??e.getSymbol();if(s?.getName()==="__object")return k(e.getText(a,r.ts.TypeFormatFlags.NoTruncation|r.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!s){let m=(f,h=0)=>{if(!(h>5)){if(f.isArray()){let P=f.getArrayElementType();P&&m(P,h);return}if(f.isObject()&&!f.getSymbol()&&!f.getAliasSymbol()){for(let P of f.getApparentProperties()){let O=P.getValueDeclaration();O&&m(P.getTypeAtLocation(O),h+1)}return}D(f,a)}};return m(e),k(e.getText(a,r.ts.TypeFormatFlags.NoTruncation|r.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!s)return k(e.getText(a,r.ts.TypeFormatFlags.NoTruncation));let l=s.getDeclarations()[0];if(!l)return s.getName();if(r.Node.isImportSpecifier(l)||r.Node.isImportClause(l)){let m=l.getFirstAncestorByKind(r.SyntaxKind.ImportDeclaration);if(m){let f=m.getModuleSpecifierValue(),h=s.getName();return $.has(f)||$.set(f,new Set),$.get(f)?.add(h),h}}let p=l.getSourceFile();if(o&&p.getFilePath()===o?.getFilePath())return s.getName();if(p.isInNodeModules())return k(e.getText(a,r.ts.TypeFormatFlags.NoTruncation));let S=i.default.relative(i.default.dirname(A),p.getFilePath()).replace(/\\/g,"/"),C=S.startsWith(".")?S:`./${S}`,R=s.getName();return $.has(C)||$.set(C,new Set),$.get(C)?.add(R),R},X=function(e){let a;if(r.Node.isFunctionLikeDeclaration(e)||r.Node.isArrowFunction(e)){let s=e.getDescendantsOfKind(r.SyntaxKind.ReturnStatement);for(let l of s){let p=l.getExpression();if(p?.isKind(r.SyntaxKind.SatisfiesExpression)){a=p.getTypeNode()?.getType();break}}}if(a)return D(a,e);{let s=e.getType().getCallSignatures();if(s.length>0){let l=s[0]?.getReturnType();return D(l,e)}}return"unknown"};var n=k,d=D,F=X;let o=U.getSourceFile(t);o?await o.refreshFromFileSystem():o=U.addSourceFileAtPath(t),U.resolveSourceFileDependencies();let v=o.getDescendantsOfKind(r.SyntaxKind.CallExpression),x=(e,a)=>{if(!r.Node.isCallExpression(e))return!1;let s=e.getExpression();return r.Node.isPropertyAccessExpression(s)||s.getKindName()==="PropertyAccessChain"?s.getName()===a:!1},w=v.filter(e=>x(e,"addRpcRoute")),M=v.filter(e=>x(e,"addRenderRoute")),K=v.filter(e=>x(e,"addLoaderRoute"));(w.length>0||M.length>0||K.length>0)&&console.log(`[B-SSR Debug] \u2705 ${g} -> Found: ${w.length} RPC, ${M.length} Render, ${K.length} Loader`);let pe=i.default.extname(t),A=t.substring(0,t.length-pe.length)+".universal.d.ts",z=i.default.resolve(t);if(w.length===0&&M.length===0&&K.length===0){T.delete(z),j.delete(z);try{await(0,q.access)(A),await(0,q.unlink)(A),console.log(`[B-SSR Debug] \u{1F5D1}\uFE0F Deleted unused d.ts: ${i.default.basename(A)}`)}catch{}return}j.add(z);let _=[],$=new Map;$.has("fastify")||$.set("fastify",new Set),$.get("fastify")?.add("FastifyRequest"),$.get("fastify")?.add("FastifyReply");let ue=e=>{let a="unknown",s="unknown",l="unknown",p=!1;if(!e||!r.Node.isObjectLiteralExpression(e))return{paramsType:a,queryType:s,bodyType:l,isMultipart:p};let S=e.getProperty("schema");if(S?.isKind(r.SyntaxKind.PropertyAssignment)){let y=S.getInitializer();if(y?.isKind(r.SyntaxKind.Identifier)){let R=y.getSymbol()?.getValueDeclaration();if(R){let m=R.getFirstDescendantByKind(r.SyntaxKind.ObjectLiteralExpression);m&&(y=m)}}if(y&&r.Node.isObjectLiteralExpression(y)){let C=y.getProperty("consumes");if(C?.isKind(r.SyntaxKind.PropertyAssignment)){let m=C.getInitializer();r.Node.isArrayLiteralExpression(m)&&(p=m.getElements().some(f=>f.isKind(r.SyntaxKind.StringLiteral)&&f.getLiteralValue()==="multipart/form-data"))}let R=m=>{let f=y.getProperty(m);if(f?.isKind(r.SyntaxKind.PropertyAssignment)){let h=f.getInitializer();if(h){let P=h.getType(),O=P.getProperty("_output");return D(O?O.getTypeAtLocation(h).getApparentType():P,h)}}return"unknown"};if(a=R("params"),s=R("querystring"),l=R("body"),p){let m="{ file: File }";l=l!=="unknown"&&l.trim().startsWith("{")?`(${l} & ${m})`:m}}}return{paramsType:a,queryType:s,bodyType:l,isMultipart:p}},N=i.default.relative(oe,i.default.dirname(t)).split(i.default.sep).join("/"),ge=N==="."||!N?"":N.startsWith("/")?N:"/"+N,H=(e,a)=>{let[s,l]=e.getArguments(),p="";if(r.Node.isStringLiteral(s))p=s.getLiteralValue();else if(r.Node.isNoSubstitutionTemplateLiteral(s))p=s.getLiteralText();else{console.log(`[B-SSR Debug] \u26A0\uFE0F ${g} -> Invalid URL argument type in ${a}`);return}let S="unknown",y=ge,{paramsType:C,queryType:R,bodyType:m,isMultipart:f}=ue(l);if(l?.isKind(r.SyntaxKind.ObjectLiteralExpression)){let O=l.getProperty("prefix");if(O?.isKind(r.SyntaxKind.PropertyAssignment)){let B=O.getInitializer();B?.isKind(r.SyntaxKind.StringLiteral)&&(y=B.getLiteralValue())}let te=l.getProperty("handler");if(te?.isKind(r.SyntaxKind.PropertyAssignment)){let B=te.getInitializer();B&&(S=X(B),S.startsWith("Promise<")||(S=`Promise<${S}>`))}}let h="",P="";a==="rpc"?(h=i.default.join(y,"rpc",p).replace(/\\/g,"/"),P=Q("action",y,p)):a==="loader"?(h=i.default.join(y,"loader",p).replace(/\\/g,"/"),P=Q("loader",y,p)):a==="api"&&(h=i.default.join(y,"api",p).replace(/\\/g,"/"),P=Q("get",y,p)),P&&_.push({type:a,name:P,returnType:S,url:p,rpcUrl:h,loaderUrl:h,paramsType:C,queryType:R,bodyType:m,isMultipart:f})};w.forEach(e=>H(e,"rpc")),M.forEach(e=>H(e,"loader")),K.forEach(e=>H(e,"api"));let G=[];for(let[e,a]of $.entries())G.push(`import type { ${[...a].sort().join(", ")} } from "${e}";`);let Y=[];_.forEach(e=>{Y.push(ae(e))});let Z=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
2
  /* eslint-disable */
3
3
 
4
- `+(H.length>0?H.join(`
4
+ `+(G.length>0?G.join(`
5
5
  `)+`
6
6
 
7
- `:"")+X.join(`
7
+ `:"")+Y.join(`
8
8
 
9
- `);try{let e=await(0,K.resolveConfig)(M)||{};G=await(0,K.format)(G,{...e,parser:"typescript",filepath:M})}catch{}await(0,q.writeFile)(M,G);let Y=[],J=[];_.forEach(e=>{let n=e.type==="rpc"?"POST":"GET",o=e.type==="loader"?e.loaderUrl:e.rpcUrl;J.push({name:e.name,rpcUrl:o,method:n,isMultipart:!!e.isMultipart}),Y.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ge=`
9
+ `);try{let e=await(0,V.resolveConfig)(A)||{};Z=await(0,V.format)(Z,{...e,parser:"typescript",filepath:A})}catch{}await(0,q.writeFile)(A,Z),console.log(`[B-SSR Debug] \u{1F4BE} Generated: ${i.default.basename(A)}`);let J=[],ee=[];_.forEach(e=>{let s=e.type==="rpc"?"POST":"GET",l=e.type==="loader"?e.loaderUrl:e.rpcUrl;ee.push({name:e.name,rpcUrl:l,method:s,isMultipart:!!e.isMultipart}),J.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let de=`
10
10
  import { createClientRpc } from '@bobtail.software/b-ssr/client';
11
11
 
12
12
  if (import.meta.env.DEV) {
13
- console.debug('\u{1F6E1}\uFE0F [B-SSR Security] Loaded SAFE Client-Stub for: ${c.default.basename(t)}');
13
+ console.debug('\u{1F6E1}\uFE0F [B-SSR Security] Loaded SAFE Client-Stub for: ${i.default.basename(t)}');
14
14
  }
15
15
 
16
- ${J.map(e=>`
16
+ ${ee.map(e=>`
17
17
  export const ${e.name} = createClientRpc({
18
18
  url: '${e.rpcUrl}',
19
19
  method: '${e.method}',
@@ -21,17 +21,17 @@
21
21
  });
22
22
  `).join(`
23
23
  `)}
24
- `,de=ae(Y,t);x.set(c.default.resolve(t),{client:ge,server:de})}catch(b){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:b})}}let oe=(t,m,s)=>{if(m.includes("node_modules")||m.startsWith(k))return null;if(s?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(m)){let g=/\brequire\s*\(/.test(t),b=/\bmodule\.exports\b/.test(t),u=/\bexports\./.test(t);if(g||b||u)return"import { createRequire } from 'module';"+`
24
+ `,me=le(J,t);T.set(i.default.resolve(t),{client:de,server:me})}catch(o){console.error(`[B-SSR Debug] \u274C Error processing ${g}:`,o)}}let ie=(t,g,n)=>{if(g.includes("node_modules")||g.startsWith(L))return null;if(n?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(g)){let d=/\brequire\s*\(/.test(t),F=/\bmodule\.exports\b/.test(t),o=/\bexports\./.test(t);if(d||F||o)return"import { createRequire } from 'module';"+`
25
25
  const require = createRequire(import.meta.url);
26
26
  const module = { exports: {} };
27
27
  const exports = module.exports;
28
28
  `+t+`
29
- export default module.exports;`}return null};function ie(t){let m=Se(t),s="";return m.length>0&&(s=`args: { ${m.join("; ")} }`),s||(s="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${s}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ae(t,m){if(t.length===0)return"";let s=c.default.relative(process.cwd(),m).replace(/\\/g,"/");return`
29
+ export default module.exports;`}return null};function ae(t){let g=Re(t),n="";return g.length>0&&(n=`args: { ${g.join("; ")} }`),n||(n="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${n}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function le(t,g){if(t.length===0)return"";let n=i.default.relative(process.cwd(),g).replace(/\\/g,"/");return`
30
30
  import path from 'path';
31
31
  import { pathToFileURL } from 'url';
32
32
 
33
33
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
34
- throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${`./${c.default.relative(process.cwd(),m).replace(/\\/g,"/")}`}');
34
+ throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${`./${i.default.relative(process.cwd(),g).replace(/\\/g,"/")}`}');
35
35
  }
36
36
 
37
37
  let initPromise;
@@ -45,7 +45,7 @@ export default module.exports;`}return null};function ie(t){let m=Se(t),s="";ret
45
45
  renderOptionsMap = new Map();
46
46
  loaderApiOptionsMap = new Map();
47
47
  const projectRoot = process.cwd();
48
- const absolutePath = path.resolve(projectRoot, '${s}');
48
+ const absolutePath = path.resolve(projectRoot, '${n}');
49
49
  const serverModuleUrl = pathToFileURL(absolutePath).href;
50
50
 
51
51
  if (typeof globalThis.require === 'undefined') {
@@ -93,46 +93,46 @@ export default module.exports;`}return null};function ie(t){let m=Se(t),s="";ret
93
93
  return initPromise;
94
94
  }
95
95
 
96
- ${t.map(u=>{let C=[];u.requiresArgs&&C.push("args"),C.push("ssrContext");let F=u.requiresArgs?"args":"{}",R="";return u.type==="rpc"?R=`
96
+ ${t.map(o=>{let v=[];o.requiresArgs&&v.push("args"),v.push("ssrContext");let x=o.requiresArgs?"args":"{}",w="";return o.type==="rpc"?w=`
97
97
  if (fn.isMultipart) throw new Error('RPC multipart no soportado en SSR.');
98
98
  await getOptionsMaps();
99
- const options = rpcOptionsMap.get('${u.url}');
100
- if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${u.name}');
101
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${F});
99
+ const options = rpcOptionsMap.get('${o.url}');
100
+ if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${o.name}');
101
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${x});
102
102
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
103
- `:u.type==="api"?R=`
103
+ `:o.type==="api"?w=`
104
104
  await getOptionsMaps();
105
- const options = loaderApiOptionsMap.get('${u.url}');
105
+ const options = loaderApiOptionsMap.get('${o.url}');
106
106
  if (!options?.handler) {
107
- console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${u.name}', 'URL:', '${u.url}');
107
+ console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${o.name}', 'URL:', '${o.url}');
108
108
  return null;
109
109
  }
110
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${F});
110
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${x});
111
111
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
112
- `:R=`
112
+ `:w=`
113
113
  await getOptionsMaps();
114
- const options = renderOptionsMap.get('${u.url}');
114
+ const options = renderOptionsMap.get('${o.url}');
115
115
  if (!options) return {};
116
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${F});
116
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${x});
117
117
  let customData = {};
118
118
  try {
119
119
  if (options.handler) {
120
120
  customData = (await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply)) || {};
121
121
  }
122
122
  } catch (handlerErr) {
123
- console.error('\u274C [B-SSR Handler Error] ${u.name}:', handlerErr);
123
+ console.error('\u274C [B-SSR Handler Error] ${o.name}:', handlerErr);
124
124
  return {};
125
125
  }
126
126
  if (ssrContext.reply.sent) return;
127
127
  return { ...customData };
128
- `,`export const ${u.name} = async (${C.join(", ")}) => {
128
+ `,`export const ${o.name} = async (${v.join(", ")}) => {
129
129
  try {
130
- if (!ssrContext?.req) throw new Error('ssrContext requerido en ${u.name} (SSR)');
131
- ${R}
130
+ if (!ssrContext?.req) throw new Error('ssrContext requerido en ${o.name} (SSR)');
131
+ ${w}
132
132
  } catch (error) {
133
- console.error('\u274C [B-SSR Error] ${u.name}:', error);
133
+ console.error('\u274C [B-SSR Error] ${o.name}:', error);
134
134
  throw error;
135
135
  }
136
136
  };`}).join(`
137
137
  `)}
138
- `}async function le(){let t=await(0,se.default)(p,{absolute:!0});await Promise.all(t.map(m=>I(m)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await le()},configureServer(t){let m=s=>s.endsWith(".mts")||s.endsWith(".ts");t.watcher.on("add",s=>m(s)&&I(s)),t.watcher.on("change",s=>m(s)&&I(s)),t.watcher.on("unlink",s=>{if(m(s)){let g=c.default.resolve(s);x.delete(g),j.delete(g);let b=c.default.extname(s),u=s.substring(0,s.length-b.length)+".universal.d.ts";(0,q.unlink)(u).catch(()=>{})}})},async resolveId(t,m,s){if(t.startsWith(k))return null;if(t.includes(".universal")){let g=t.split("?")[0],b=g;if(g.endsWith(".universal"))b=g;else if(g.endsWith(".universal.ts"))b=g.slice(0,-3);else if(g.endsWith(".universal.mts"))b=g.slice(0,-4);else if(g.endsWith(".universal.js"))b=g.slice(0,-3);else return null;let u=[".mts",".ts"];for(let C of u){let F=b.slice(0,-10)+C,R=await this.resolve(F,m,{skipSelf:!0});if(R){let L=s?.ssr?"?mode=ssr":"?mode=client";return k+R.id+L}try{await(0,q.access)(F);let L=s?.ssr?"?mode=ssr":"?mode=client";return k+F+L}catch{}}}return null},async load(t,m){if(t.startsWith(k)){let s=t.slice(k.length).split("?")[0],g=x.get(s);return g||(await I(s),g=x.get(s)),g?m?.ssr===!0?g.server:g.client:null}if(m?.ssr!==!0){let s=c.default.resolve(t);if(j.has(s))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${c.default.basename(t)}");`}return null},transform:oe}}function Se(i){let p=[];return i.paramsType!=="unknown"&&p.push(`params: ${i.paramsType}`),i.queryType!=="unknown"&&p.push(`query: ${i.queryType}`),i.bodyType!=="unknown"&&p.push(`body: ${i.bodyType}`),p.push("signal?: AbortSignal"),p}0&&(module.exports={rpcGeneratorPlugin});
138
+ `}async function ce(){console.log("[B-SSR Debug] \u{1F3C1} Starting full scan...");let t=await(0,se.default)(u,{absolute:!0});console.log(`[B-SSR Debug] \u{1F4C2} Found ${t.length} potential files.`),await Promise.all(t.map(g=>I(g)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ce()},configureServer(t){let g=n=>n.endsWith(".mts")||n.endsWith(".ts");t.watcher.on("add",n=>g(n)&&I(n)),t.watcher.on("change",n=>g(n)&&I(n)),t.watcher.on("unlink",n=>{if(g(n)){let d=i.default.resolve(n);T.delete(d),j.delete(d);let F=i.default.extname(n),o=n.substring(0,n.length-F.length)+".universal.d.ts";(0,q.unlink)(o).catch(()=>{})}})},async resolveId(t,g,n){if(t.startsWith(L))return null;if(t.includes(".universal")){let d=t.split("?")[0],F=d;if(d.endsWith(".universal"))F=d;else if(d.endsWith(".universal.ts"))F=d.slice(0,-3);else if(d.endsWith(".universal.mts"))F=d.slice(0,-4);else if(d.endsWith(".universal.js"))F=d.slice(0,-3);else return null;let o=[".mts",".ts"];for(let v of o){let x=F.slice(0,-10)+v,w=await this.resolve(x,g,{skipSelf:!0});if(w){let M=n?.ssr?"?mode=ssr":"?mode=client";return L+w.id+M}try{await(0,q.access)(x);let M=n?.ssr?"?mode=ssr":"?mode=client";return L+x+M}catch{}}}return null},async load(t,g){if(t.startsWith(L)){let n=t.slice(L.length).split("?")[0],d=T.get(n);return d||(await I(n),d=T.get(n)),d?g?.ssr===!0?d.server:d.client:null}if(g?.ssr!==!0){let n=i.default.resolve(t);if(j.has(n))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${i.default.basename(t)}");`}return null},transform:ie}}function Re(c){let u=[];return c.paramsType!=="unknown"&&u.push(`params: ${c.paramsType}`),c.queryType!=="unknown"&&u.push(`query: ${c.queryType}`),c.bodyType!=="unknown"&&u.push(`body: ${c.bodyType}`),u.push("signal?: AbortSignal"),u}0&&(module.exports={rpcGeneratorPlugin});
@@ -1,19 +1,19 @@
1
- import ue from"fast-glob";import{access as ge,unlink as ee,writeFile as de}from"fs/promises";import a from"path";import{format as me,resolveConfig as fe}from"prettier";import{Node as R,Project as ye,SyntaxKind as b,ts as L}from"ts-morph";var k="virtual:b-ssr-rpc-universal:";function he(T){let P=T.replace(/[^a-zA-Z0-9]+(.)?/g,(D,O)=>O?O.toUpperCase():"");return P.charAt(0).toLowerCase()+P.slice(1)}function G(T,P,D){let O=a.basename(D,a.extname(D))||"Index",A=P.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),q=`${T} ${A} ${O}`;return he(q)}function ve(T={}){let{routerPattern:P="src-ts/routers/**/*.mts",tsConfigFilePath:D="tsconfig.json",routerBaseDir:O="src-ts/routers"}=T,A=new Map,q=new Set,K=new ye({tsConfigFilePath:D,skipAddingFilesFromTsConfig:!1}),te=a.resolve(process.cwd(),O||".");async function W(t){try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(o,s)=>{if(!a.isAbsolute(s))return o;let n=s;if(!a.extname(n)){let y=K.getSourceFile(d=>d.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===s);y&&(n=y.getFilePath())}let i=a.relative(a.dirname($),n).replace(/\\/g,"/");return i.startsWith(".")||(i="./"+i),`import("${i}")`})},M=function(e,o){if(e.getSymbol()?.getName()==="Promise"){let p=e.getAwaitedType();if(p)return`Promise<${M(p,o)}>`}let s=e.getAliasSymbol()??e.getSymbol();if(s?.getName()==="__object")return N(e.getText(o,L.TypeFormatFlags.NoTruncation|L.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!s){let p=(g,m=0)=>{if(!(m>5)){if(g.isArray()){let h=g.getArrayElementType();h&&p(h,m);return}if(g.isObject()&&!g.getSymbol()&&!g.getAliasSymbol()){for(let h of g.getApparentProperties()){let E=h.getValueDeclaration();E&&p(h.getTypeAtLocation(E),m+1)}return}M(g,o)}};return p(e),N(e.getText(o,L.TypeFormatFlags.NoTruncation|L.TypeFormatFlags.UseFullyQualifiedType))}if(!s)return N(e.getText(o,L.TypeFormatFlags.NoTruncation));let n=s.getDeclarations()[0];if(!n)return s.getName();if(R.isImportSpecifier(n)||R.isImportClause(n)){let p=n.getFirstAncestorByKind(b.ImportDeclaration);if(p){let g=p.getModuleSpecifierValue(),m=s.getName();return F.has(g)||F.set(g,new Set),F.get(g)?.add(m),m}}let i=n.getSourceFile();if(i.getFilePath()===f.getFilePath())return s.getName();if(i.isInNodeModules())return N(e.getText(o,L.TypeFormatFlags.NoTruncation));let y=a.relative(a.dirname($),i.getFilePath()).replace(/\\/g,"/"),C=y.startsWith(".")?y:`./${y}`,w=s.getName();return F.has(C)||F.set(C,new Set),F.get(C)?.add(w),w},Z=function(e){let o;if(R.isFunctionLikeDeclaration(e)||R.isArrowFunction(e)){let s=e.getDescendantsOfKind(b.ReturnStatement);for(let n of s){let i=n.getExpression();if(i?.isKind(b.SatisfiesExpression)){o=i.getTypeNode()?.getType();break}}}if(o)return M(o,e);{let s=e.getType().getCallSignatures();if(s.length>0){let n=s[0]?.getReturnType();return M(n,e)}}return"unknown"};var u=N,r=M,c=Z;let f=K.addSourceFileAtPath(t);await f.refreshFromFileSystem(),K.resolveSourceFileDependencies();let l=f.getDescendantsOfKind(b.CallExpression),v=(e,o)=>{if(!R.isCallExpression(e))return!1;let s=e.getExpression();return R.isPropertyAccessExpression(s)?s.getName()===o:!1},x=l.filter(e=>v(e,"addRpcRoute")),S=l.filter(e=>v(e,"addRenderRoute")),j=l.filter(e=>v(e,"addLoaderRoute")),ie=a.extname(t),$=t.substring(0,t.length-ie.length)+".universal.d.ts",B=a.resolve(t);if(x.length===0&&S.length===0&&j.length===0){A.delete(B),q.delete(B),$!==t&&await ee($).catch(()=>{});return}q.add(B);let V=[],F=new Map;F.has("fastify")||F.set("fastify",new Set),F.get("fastify")?.add("FastifyRequest"),F.get("fastify")?.add("FastifyReply");let ae=e=>{let o="unknown",s="unknown",n="unknown",i=!1;if(!e||!R.isObjectLiteralExpression(e))return{paramsType:o,queryType:s,bodyType:n,isMultipart:i};let y=e.getProperty("schema");if(y?.isKind(b.PropertyAssignment)){let d=y.getInitializer();if(d?.isKind(b.Identifier)){let w=d.getSymbol()?.getValueDeclaration();if(w){let p=w.getFirstDescendantByKind(b.ObjectLiteralExpression);p&&(d=p)}}if(d&&R.isObjectLiteralExpression(d)){let C=d.getProperty("consumes");if(C?.isKind(b.PropertyAssignment)){let p=C.getInitializer();R.isArrayLiteralExpression(p)&&(i=p.getElements().some(g=>g.isKind(b.StringLiteral)&&g.getLiteralValue()==="multipart/form-data"))}let w=p=>{let g=d.getProperty(p);if(g?.isKind(b.PropertyAssignment)){let m=g.getInitializer();if(m){let h=m.getType(),E=h.getProperty("_output");return M(E?E.getTypeAtLocation(m).getApparentType():h,m)}}return"unknown"};if(o=w("params"),s=w("querystring"),n=w("body"),i){let p="{ file: File }";n=n!=="unknown"&&n.trim().startsWith("{")?`(${n} & ${p})`:p}}}return{paramsType:o,queryType:s,bodyType:n,isMultipart:i}},U=a.relative(te,a.dirname(t)).split(a.sep).join("/"),le=U==="."||!U?"":U.startsWith("/")?U:"/"+U,_=(e,o)=>{let[s,n]=e.getArguments(),i="";if(R.isStringLiteral(s))i=s.getLiteralValue();else if(R.isNoSubstitutionTemplateLiteral(s))i=s.getLiteralText();else return;let y="unknown",d=le,{paramsType:C,queryType:w,bodyType:p,isMultipart:g}=ae(n);if(n?.isKind(b.ObjectLiteralExpression)){let E=n.getProperty("prefix");if(E?.isKind(b.PropertyAssignment)){let I=E.getInitializer();I?.isKind(b.StringLiteral)&&(d=I.getLiteralValue())}let J=n.getProperty("handler");if(J?.isKind(b.PropertyAssignment)){let I=J.getInitializer();I&&(y=Z(I),y.startsWith("Promise<")||(y=`Promise<${y}>`))}}let m="",h="";o==="rpc"?(m=a.join(d,"rpc",i).replace(/\\/g,"/"),h=G("action",d,i)):o==="loader"?(m=a.join(d,"loader",i).replace(/\\/g,"/"),h=G("loader",d,i)):o==="api"&&(m=a.join(d,"api",i).replace(/\\/g,"/"),h=G("get",d,i)),h&&V.push({type:o,name:h,returnType:y,url:i,rpcUrl:m,loaderUrl:m,paramsType:C,queryType:w,bodyType:p,isMultipart:g})};x.forEach(e=>_(e,"rpc")),S.forEach(e=>_(e,"loader")),j.forEach(e=>_(e,"api"));let z=[];for(let[e,o]of F.entries())z.push(`import type { ${[...o].sort().join(", ")} } from "${e}";`);let Q=[];V.forEach(e=>{Q.push(se(e))});let H=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
1
+ import de from"fast-glob";import{access as te,unlink as re,writeFile as me}from"fs/promises";import a from"path";import{format as fe,resolveConfig as ye}from"prettier";import{Node as F,Project as he,SyntaxKind as h,ts as L}from"ts-morph";var k="virtual:b-ssr-rpc-universal:";function be(S){let P=S.replace(/[^a-zA-Z0-9]+(.)?/g,(q,D)=>D?D.toUpperCase():"");return P.charAt(0).toLowerCase()+P.slice(1)}function Z(S,P,q){let D=a.basename(q,a.extname(q))||"Index",M=P.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),j=`${S} ${M} ${D}`;return be(j)}function ve(S={}){let{routerPattern:P="src-ts/routers/**/*.mts",tsConfigFilePath:q="tsconfig.json",routerBaseDir:D="src-ts/routers"}=S,M=new Map,j=new Set;console.log(`[B-SSR Debug] Initializing Project with tsconfig: ${q}`);let I=new he({tsConfigFilePath:q,skipAddingFilesFromTsConfig:!1}),ne=a.resolve(process.cwd(),D||".");async function K(t){let c=a.basename(t);try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(o,n)=>{if(!a.isAbsolute(n))return o;let i=n;if(!a.extname(i)){let f=I.getSourceFile(d=>d.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===n);f&&(i=f.getFilePath())}let l=a.relative(a.dirname(C),i).replace(/\\/g,"/");return l.startsWith(".")||(l="./"+l),`import("${l}")`})},O=function(e,o){if(e.getSymbol()?.getName()==="Promise"){let u=e.getAwaitedType();if(u)return`Promise<${O(u,o)}>`}let n=e.getAliasSymbol()??e.getSymbol();if(n?.getName()==="__object")return N(e.getText(o,L.TypeFormatFlags.NoTruncation|L.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!n){let u=(g,m=0)=>{if(!(m>5)){if(g.isArray()){let y=g.getArrayElementType();y&&u(y,m);return}if(g.isObject()&&!g.getSymbol()&&!g.getAliasSymbol()){for(let y of g.getApparentProperties()){let A=y.getValueDeclaration();A&&u(y.getTypeAtLocation(A),m+1)}return}O(g,o)}};return u(e),N(e.getText(o,L.TypeFormatFlags.NoTruncation|L.TypeFormatFlags.UseFullyQualifiedType))}if(!n)return N(e.getText(o,L.TypeFormatFlags.NoTruncation));let i=n.getDeclarations()[0];if(!i)return n.getName();if(F.isImportSpecifier(i)||F.isImportClause(i)){let u=i.getFirstAncestorByKind(h.ImportDeclaration);if(u){let g=u.getModuleSpecifierValue(),m=n.getName();return R.has(g)||R.set(g,new Set),R.get(g)?.add(m),m}}let l=i.getSourceFile();if(s&&l.getFilePath()===s?.getFilePath())return n.getName();if(l.isInNodeModules())return N(e.getText(o,L.TypeFormatFlags.NoTruncation));let f=a.relative(a.dirname(C),l.getFilePath()).replace(/\\/g,"/"),v=f.startsWith(".")?f:`./${f}`,w=n.getName();return R.has(v)||R.set(v,new Set),R.get(v)?.add(w),w},Q=function(e){let o;if(F.isFunctionLikeDeclaration(e)||F.isArrowFunction(e)){let n=e.getDescendantsOfKind(h.ReturnStatement);for(let i of n){let l=i.getExpression();if(l?.isKind(h.SatisfiesExpression)){o=l.getTypeNode()?.getType();break}}}if(o)return O(o,e);{let n=e.getType().getCallSignatures();if(n.length>0){let i=n[0]?.getReturnType();return O(i,e)}}return"unknown"};var r=N,p=O,x=Q;let s=I.getSourceFile(t);s?await s.refreshFromFileSystem():s=I.addSourceFileAtPath(t),I.resolveSourceFileDependencies();let $=s.getDescendantsOfKind(h.CallExpression),T=(e,o)=>{if(!F.isCallExpression(e))return!1;let n=e.getExpression();return F.isPropertyAccessExpression(n)||n.getKindName()==="PropertyAccessChain"?n.getName()===o:!1},b=$.filter(e=>T(e,"addRpcRoute")),E=$.filter(e=>T(e,"addRenderRoute")),W=$.filter(e=>T(e,"addLoaderRoute"));(b.length>0||E.length>0||W.length>0)&&console.log(`[B-SSR Debug] \u2705 ${c} -> Found: ${b.length} RPC, ${E.length} Render, ${W.length} Loader`);let le=a.extname(t),C=t.substring(0,t.length-le.length)+".universal.d.ts",V=a.resolve(t);if(b.length===0&&E.length===0&&W.length===0){M.delete(V),j.delete(V);try{await te(C),await re(C),console.log(`[B-SSR Debug] \u{1F5D1}\uFE0F Deleted unused d.ts: ${a.basename(C)}`)}catch{}return}j.add(V);let z=[],R=new Map;R.has("fastify")||R.set("fastify",new Set),R.get("fastify")?.add("FastifyRequest"),R.get("fastify")?.add("FastifyReply");let ce=e=>{let o="unknown",n="unknown",i="unknown",l=!1;if(!e||!F.isObjectLiteralExpression(e))return{paramsType:o,queryType:n,bodyType:i,isMultipart:l};let f=e.getProperty("schema");if(f?.isKind(h.PropertyAssignment)){let d=f.getInitializer();if(d?.isKind(h.Identifier)){let w=d.getSymbol()?.getValueDeclaration();if(w){let u=w.getFirstDescendantByKind(h.ObjectLiteralExpression);u&&(d=u)}}if(d&&F.isObjectLiteralExpression(d)){let v=d.getProperty("consumes");if(v?.isKind(h.PropertyAssignment)){let u=v.getInitializer();F.isArrayLiteralExpression(u)&&(l=u.getElements().some(g=>g.isKind(h.StringLiteral)&&g.getLiteralValue()==="multipart/form-data"))}let w=u=>{let g=d.getProperty(u);if(g?.isKind(h.PropertyAssignment)){let m=g.getInitializer();if(m){let y=m.getType(),A=y.getProperty("_output");return O(A?A.getTypeAtLocation(m).getApparentType():y,m)}}return"unknown"};if(o=w("params"),n=w("querystring"),i=w("body"),l){let u="{ file: File }";i=i!=="unknown"&&i.trim().startsWith("{")?`(${i} & ${u})`:u}}}return{paramsType:o,queryType:n,bodyType:i,isMultipart:l}},B=a.relative(ne,a.dirname(t)).split(a.sep).join("/"),pe=B==="."||!B?"":B.startsWith("/")?B:"/"+B,_=(e,o)=>{let[n,i]=e.getArguments(),l="";if(F.isStringLiteral(n))l=n.getLiteralValue();else if(F.isNoSubstitutionTemplateLiteral(n))l=n.getLiteralText();else{console.log(`[B-SSR Debug] \u26A0\uFE0F ${c} -> Invalid URL argument type in ${o}`);return}let f="unknown",d=pe,{paramsType:v,queryType:w,bodyType:u,isMultipart:g}=ce(i);if(i?.isKind(h.ObjectLiteralExpression)){let A=i.getProperty("prefix");if(A?.isKind(h.PropertyAssignment)){let U=A.getInitializer();U?.isKind(h.StringLiteral)&&(d=U.getLiteralValue())}let ee=i.getProperty("handler");if(ee?.isKind(h.PropertyAssignment)){let U=ee.getInitializer();U&&(f=Q(U),f.startsWith("Promise<")||(f=`Promise<${f}>`))}}let m="",y="";o==="rpc"?(m=a.join(d,"rpc",l).replace(/\\/g,"/"),y=Z("action",d,l)):o==="loader"?(m=a.join(d,"loader",l).replace(/\\/g,"/"),y=Z("loader",d,l)):o==="api"&&(m=a.join(d,"api",l).replace(/\\/g,"/"),y=Z("get",d,l)),y&&z.push({type:o,name:y,returnType:f,url:l,rpcUrl:m,loaderUrl:m,paramsType:v,queryType:w,bodyType:u,isMultipart:g})};b.forEach(e=>_(e,"rpc")),E.forEach(e=>_(e,"loader")),W.forEach(e=>_(e,"api"));let H=[];for(let[e,o]of R.entries())H.push(`import type { ${[...o].sort().join(", ")} } from "${e}";`);let X=[];z.forEach(e=>{X.push(oe(e))});let G=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
2
2
  /* eslint-disable */
3
3
 
4
- `+(z.length>0?z.join(`
4
+ `+(H.length>0?H.join(`
5
5
  `)+`
6
6
 
7
- `:"")+Q.join(`
7
+ `:"")+X.join(`
8
8
 
9
- `);try{let e=await fe($)||{};H=await me(H,{...e,parser:"typescript",filepath:$})}catch{}await de($,H);let X=[],Y=[];V.forEach(e=>{let s=e.type==="rpc"?"POST":"GET",n=e.type==="loader"?e.loaderUrl:e.rpcUrl;Y.push({name:e.name,rpcUrl:n,method:s,isMultipart:!!e.isMultipart}),X.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ce=`
9
+ `);try{let e=await ye(C)||{};G=await fe(G,{...e,parser:"typescript",filepath:C})}catch{}await me(C,G),console.log(`[B-SSR Debug] \u{1F4BE} Generated: ${a.basename(C)}`);let Y=[],J=[];z.forEach(e=>{let n=e.type==="rpc"?"POST":"GET",i=e.type==="loader"?e.loaderUrl:e.rpcUrl;J.push({name:e.name,rpcUrl:i,method:n,isMultipart:!!e.isMultipart}),Y.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let ue=`
10
10
  import { createClientRpc } from '@bobtail.software/b-ssr/client';
11
11
 
12
12
  if (import.meta.env.DEV) {
13
13
  console.debug('\u{1F6E1}\uFE0F [B-SSR Security] Loaded SAFE Client-Stub for: ${a.basename(t)}');
14
14
  }
15
15
 
16
- ${Y.map(e=>`
16
+ ${J.map(e=>`
17
17
  export const ${e.name} = createClientRpc({
18
18
  url: '${e.rpcUrl}',
19
19
  method: '${e.method}',
@@ -21,17 +21,17 @@ import ue from"fast-glob";import{access as ge,unlink as ee,writeFile as de}from"
21
21
  });
22
22
  `).join(`
23
23
  `)}
24
- `,pe=ne(X,t);A.set(a.resolve(t),{client:ce,server:pe})}catch(f){console.error(`[rpc-generator] Error al procesar ${t}:`,{error:f})}}let re=(t,u,r)=>{if(u.includes("node_modules")||u.startsWith(k))return null;if(r?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(u)){let c=/\brequire\s*\(/.test(t),f=/\bmodule\.exports\b/.test(t),l=/\bexports\./.test(t);if(c||f||l)return"import { createRequire } from 'module';"+`
24
+ `,ge=ie(Y,t);M.set(a.resolve(t),{client:ue,server:ge})}catch(s){console.error(`[B-SSR Debug] \u274C Error processing ${c}:`,s)}}let se=(t,c,r)=>{if(c.includes("node_modules")||c.startsWith(k))return null;if(r?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(c)){let p=/\brequire\s*\(/.test(t),x=/\bmodule\.exports\b/.test(t),s=/\bexports\./.test(t);if(p||x||s)return"import { createRequire } from 'module';"+`
25
25
  const require = createRequire(import.meta.url);
26
26
  const module = { exports: {} };
27
27
  const exports = module.exports;
28
28
  `+t+`
29
- export default module.exports;`}return null};function se(t){let u=be(t),r="";return u.length>0&&(r=`args: { ${u.join("; ")} }`),r||(r="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${r}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ne(t,u){if(t.length===0)return"";let r=a.relative(process.cwd(),u).replace(/\\/g,"/");return`
29
+ export default module.exports;`}return null};function oe(t){let c=Se(t),r="";return c.length>0&&(r=`args: { ${c.join("; ")} }`),r||(r="args: { signal?: AbortSignal }"),`export declare const ${t.name}: (${r}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`}function ie(t,c){if(t.length===0)return"";let r=a.relative(process.cwd(),c).replace(/\\/g,"/");return`
30
30
  import path from 'path';
31
31
  import { pathToFileURL } from 'url';
32
32
 
33
33
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
34
- throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${`./${a.relative(process.cwd(),u).replace(/\\/g,"/")}`}');
34
+ throw new Error('\u{1F6A8} [B-SSR SECURITY ALERT] Server-side code leaked to browser: ${`./${a.relative(process.cwd(),c).replace(/\\/g,"/")}`}');
35
35
  }
36
36
 
37
37
  let initPromise;
@@ -93,46 +93,46 @@ export default module.exports;`}return null};function se(t){let u=be(t),r="";ret
93
93
  return initPromise;
94
94
  }
95
95
 
96
- ${t.map(l=>{let v=[];l.requiresArgs&&v.push("args"),v.push("ssrContext");let x=l.requiresArgs?"args":"{}",S="";return l.type==="rpc"?S=`
96
+ ${t.map(s=>{let $=[];s.requiresArgs&&$.push("args"),$.push("ssrContext");let T=s.requiresArgs?"args":"{}",b="";return s.type==="rpc"?b=`
97
97
  if (fn.isMultipart) throw new Error('RPC multipart no soportado en SSR.');
98
98
  await getOptionsMaps();
99
- const options = rpcOptionsMap.get('${l.url}');
100
- if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${l.name}');
101
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${x});
99
+ const options = rpcOptionsMap.get('${s.url}');
100
+ if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${s.name}');
101
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${T});
102
102
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
103
- `:l.type==="api"?S=`
103
+ `:s.type==="api"?b=`
104
104
  await getOptionsMaps();
105
- const options = loaderApiOptionsMap.get('${l.url}');
105
+ const options = loaderApiOptionsMap.get('${s.url}');
106
106
  if (!options?.handler) {
107
- console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${l.name}', 'URL:', '${l.url}');
107
+ console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${s.name}', 'URL:', '${s.url}');
108
108
  return null;
109
109
  }
110
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${x});
110
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${T});
111
111
  return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
112
- `:S=`
112
+ `:b=`
113
113
  await getOptionsMaps();
114
- const options = renderOptionsMap.get('${l.url}');
114
+ const options = renderOptionsMap.get('${s.url}');
115
115
  if (!options) return {};
116
- const augmentedReq = Object.assign(Object.create(ssrContext.req), ${x});
116
+ const augmentedReq = Object.assign(Object.create(ssrContext.req), ${T});
117
117
  let customData = {};
118
118
  try {
119
119
  if (options.handler) {
120
120
  customData = (await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply)) || {};
121
121
  }
122
122
  } catch (handlerErr) {
123
- console.error('\u274C [B-SSR Handler Error] ${l.name}:', handlerErr);
123
+ console.error('\u274C [B-SSR Handler Error] ${s.name}:', handlerErr);
124
124
  return {};
125
125
  }
126
126
  if (ssrContext.reply.sent) return;
127
127
  return { ...customData };
128
- `,`export const ${l.name} = async (${v.join(", ")}) => {
128
+ `,`export const ${s.name} = async (${$.join(", ")}) => {
129
129
  try {
130
- if (!ssrContext?.req) throw new Error('ssrContext requerido en ${l.name} (SSR)');
131
- ${S}
130
+ if (!ssrContext?.req) throw new Error('ssrContext requerido en ${s.name} (SSR)');
131
+ ${b}
132
132
  } catch (error) {
133
- console.error('\u274C [B-SSR Error] ${l.name}:', error);
133
+ console.error('\u274C [B-SSR Error] ${s.name}:', error);
134
134
  throw error;
135
135
  }
136
136
  };`}).join(`
137
137
  `)}
138
- `}async function oe(){let t=await ue(P,{absolute:!0});await Promise.all(t.map(u=>W(u)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await oe()},configureServer(t){let u=r=>r.endsWith(".mts")||r.endsWith(".ts");t.watcher.on("add",r=>u(r)&&W(r)),t.watcher.on("change",r=>u(r)&&W(r)),t.watcher.on("unlink",r=>{if(u(r)){let c=a.resolve(r);A.delete(c),q.delete(c);let f=a.extname(r),l=r.substring(0,r.length-f.length)+".universal.d.ts";ee(l).catch(()=>{})}})},async resolveId(t,u,r){if(t.startsWith(k))return null;if(t.includes(".universal")){let c=t.split("?")[0],f=c;if(c.endsWith(".universal"))f=c;else if(c.endsWith(".universal.ts"))f=c.slice(0,-3);else if(c.endsWith(".universal.mts"))f=c.slice(0,-4);else if(c.endsWith(".universal.js"))f=c.slice(0,-3);else return null;let l=[".mts",".ts"];for(let v of l){let x=f.slice(0,-10)+v,S=await this.resolve(x,u,{skipSelf:!0});if(S){let j=r?.ssr?"?mode=ssr":"?mode=client";return k+S.id+j}try{await ge(x);let j=r?.ssr?"?mode=ssr":"?mode=client";return k+x+j}catch{}}}return null},async load(t,u){if(t.startsWith(k)){let r=t.slice(k.length).split("?")[0],c=A.get(r);return c||(await W(r),c=A.get(r)),c?u?.ssr===!0?c.server:c.client:null}if(u?.ssr!==!0){let r=a.resolve(t);if(q.has(r))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${a.basename(t)}");`}return null},transform:re}}function be(T){let P=[];return T.paramsType!=="unknown"&&P.push(`params: ${T.paramsType}`),T.queryType!=="unknown"&&P.push(`query: ${T.queryType}`),T.bodyType!=="unknown"&&P.push(`body: ${T.bodyType}`),P.push("signal?: AbortSignal"),P}export{ve as rpcGeneratorPlugin};
138
+ `}async function ae(){console.log("[B-SSR Debug] \u{1F3C1} Starting full scan...");let t=await de(P,{absolute:!0});console.log(`[B-SSR Debug] \u{1F4C2} Found ${t.length} potential files.`),await Promise.all(t.map(c=>K(c)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ae()},configureServer(t){let c=r=>r.endsWith(".mts")||r.endsWith(".ts");t.watcher.on("add",r=>c(r)&&K(r)),t.watcher.on("change",r=>c(r)&&K(r)),t.watcher.on("unlink",r=>{if(c(r)){let p=a.resolve(r);M.delete(p),j.delete(p);let x=a.extname(r),s=r.substring(0,r.length-x.length)+".universal.d.ts";re(s).catch(()=>{})}})},async resolveId(t,c,r){if(t.startsWith(k))return null;if(t.includes(".universal")){let p=t.split("?")[0],x=p;if(p.endsWith(".universal"))x=p;else if(p.endsWith(".universal.ts"))x=p.slice(0,-3);else if(p.endsWith(".universal.mts"))x=p.slice(0,-4);else if(p.endsWith(".universal.js"))x=p.slice(0,-3);else return null;let s=[".mts",".ts"];for(let $ of s){let T=x.slice(0,-10)+$,b=await this.resolve(T,c,{skipSelf:!0});if(b){let E=r?.ssr?"?mode=ssr":"?mode=client";return k+b.id+E}try{await te(T);let E=r?.ssr?"?mode=ssr":"?mode=client";return k+T+E}catch{}}}return null},async load(t,c){if(t.startsWith(k)){let r=t.slice(k.length).split("?")[0],p=M.get(r);return p||(await K(r),p=M.get(r)),p?c?.ssr===!0?p.server:p.client:null}if(c?.ssr!==!0){let r=a.resolve(t);if(j.has(r))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${a.basename(t)}");`}return null},transform:se}}function Se(S){let P=[];return S.paramsType!=="unknown"&&P.push(`params: ${S.paramsType}`),S.queryType!=="unknown"&&P.push(`query: ${S.queryType}`),S.bodyType!=="unknown"&&P.push(`body: ${S.bodyType}`),P.push("signal?: AbortSignal"),P}export{ve as rpcGeneratorPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobtail.software/b-ssr",
3
- "version": "1.0.56",
3
+ "version": "1.0.57",
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",