@bobtail.software/b-ssr 1.0.59 → 1.0.60

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