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