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