@bobtail.software/b-ssr 1.0.61 → 1.0.65
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/README.md +593 -0
- package/bin/generate-rpc-types.mjs +91 -0
- package/dist/fastify-b-ssr-plugin.cjs +1 -1
- package/dist/fastify-b-ssr-plugin.d.cts +2 -0
- package/dist/fastify-b-ssr-plugin.d.ts +2 -0
- package/dist/fastify-b-ssr-plugin.js +1 -1
- package/dist/rpc-type-generator.cjs +9 -0
- package/dist/rpc-type-generator.d.cts +14 -0
- package/dist/rpc-type-generator.d.ts +14 -0
- package/dist/rpc-type-generator.js +9 -0
- package/dist/vite-rpc-plugin.cjs +35 -27
- package/dist/vite-rpc-plugin.d.cts +1 -0
- package/dist/vite-rpc-plugin.d.ts +1 -0
- package/dist/vite-rpc-plugin.js +36 -28
- package/package.json +27 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var D=Object.create;var g=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty;var k=(e,t)=>{for(var o in t)g(e,o,{get:t[o],enumerable:!0})},E=(e,t,o,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of G(t))!P.call(e,s)&&s!==o&&g(e,s,{get:()=>t[s],enumerable:!(d=I(t,s))||d.enumerable});return e};var y=(e,t,o)=>(o=e!=null?D(C(e)):{},E(t||!e||!e.__esModule?g(o,"default",{value:e,enumerable:!0}):o,e)),A=e=>E(g({},"__esModule",{value:!0}),e);var N={};k(N,{default:()=>_});module.exports=A(N);var H=require("@fastify/multipart"),b=y(require("fastify-plugin"),1),v=y(require("path"),1),R=require("zod");async function x(e=24678){let t=await import("net");return new Promise((o,d)=>{let s=t.createServer();s.listen(e,"127.0.0.1",()=>{let r=s.address(),n=typeof r=="object"&&r!==null?r.port:e;s.close(()=>o(n))}),s.on("error",r=>{r.code==="EADDRINUSE"?s.close(()=>o(x(e+1))):d(r)})})}function w(e){if(!e)return;console.log("[B-SSR] Converting schema:",JSON.stringify(e,null,2));let t={},o=d=>!d||typeof d!="object"?!1:!!(d._def||d.def);return e.body&&o(e.body)&&(console.log("[B-SSR] Converting body schema"),t.body=R.z.toJSONSchema(e.body,{target:"draft-7",unrepresentable:"any",io:"input"}),console.log("[B-SSR] Converted body:",JSON.stringify(t.body,null,2))),e.params&&o(e.params)&&(console.log("[B-SSR] Converting params schema"),t.params=R.z.toJSONSchema(e.params,{target:"draft-7",unrepresentable:"any",io:"input"})),e.querystring&&o(e.querystring)&&(console.log("[B-SSR] Converting querystring schema"),t.querystring=R.z.toJSONSchema(e.querystring,{target:"draft-7",unrepresentable:"any",io:"input"})),e.headers&&o(e.headers)&&(console.log("[B-SSR] Converting headers schema"),t.headers=R.z.toJSONSchema(e.headers,{target:"draft-7",unrepresentable:"any",io:"input"})),e.consumes&&(t.consumes=e.consumes),e.produces&&(t.produces=e.produces),e.response&&(t.response=e.response),e.tags&&(t.tags=e.tags),e.description&&(t.description=e.description),e.summary&&(t.summary=e.summary),e.deprecated&&(t.deprecated=e.deprecated),console.log("[B-SSR] Converted schema result:",JSON.stringify(t,null,2)),t}var T=async(e,t)=>{if(!e.isMultipart())return t.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let o=e.parts(),d={};for await(let s of o)if(s.type==="field")d[s.fieldname]=s.value;else{let r=Symbol.for("file-stream");e[r]=s}e.body=d},q=async(e,t)=>{let o=r=>{if(t.errorHandler){let n=t.errorHandler(r);if(n)return n}return{message:r instanceof Error?r.message:"Internal Server Error",statusCode:500}};if(e.hasDecorator("viteInitDone")&&e.viteInitDone)return;if(!e.hasDecorator("multipartErrors"))try{let r=await import("@fastify/multipart");await e.register(r.default)}catch(r){if(r.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw r}let d=process.env.NODE_ENV==="production";if(d){if(t.clientDistDir)try{let r=await import("@fastify/static"),n=v.default.resolve(t.root,t.clientDistDir);await e.register(r.default,{root:n,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Serving static assets from: ${n}`)}catch(r){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",r)}}else{if(!e.hasDecorator("use"))try{let l=await import("@fastify/middie");await e.register(l.default,{hook:"onRequest"})}catch(l){if(l.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw l}let r=await import("vite"),n=t.viteConfig||{},p;n.server?.hmr&&typeof n.server.hmr=="object"&&"port"in n.server.hmr?p=n.server.hmr.port:p=t.hmrPort??await x();let u=await r.createServer({root:t.root,appType:"custom",...n,server:{hmr:{port:p},...n.server,middlewareMode:!0}});e.use(u.middlewares),e.hasDecorator("viteServer")||e.decorate("viteServer",u),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}e.decorate("viteInitDone",!0);let s=async(r,n,p)=>{try{let u=r.raw.url,l=t.getGlobalSettings?await t.getGlobalSettings(r):void 0;if(v.default.extname(u)!==""){n.status(404).send(`File not found: ${u}`);return}let a="";!d&&e.viteServer&&(a=await e.viteServer.transformIndexHtml(u,"<html><head></head><body></body></html>"),a=a.substring(a.indexOf("<head>")+6,a.indexOf("</head>"))),a=(l?`<script>window.__GLOBAL_SETTINGS__ = ${JSON.stringify(l)}</script>`:"")+a;let f=d?await import(v.default.resolve(t.root,t.prodEntryFile)):await e.viteServer.ssrLoadModule(t.devEntryFile),i=f.render||f.default;if(typeof i!="function")throw new Error(`Entry file ${t.devEntryFile} must export a 'render' function.`);await i({req:r,reply:n,head:a,data:p,globalSettings:l})}catch(u){e.viteServer?.ssrFixStacktrace(u),console.error("[SSR Error]:",u),n.sent||n.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(r,n){let{handler:p,schema:u,...l}=n,a=`/rpc${r}`,S=w(u),f={...l,schema:S};if(u?.consumes?.includes("multipart/form-data")){let c=f.preValidation;f.preValidation=c?Array.isArray(c)?[T,...c]:[T,c]:T}this.route({method:"POST",url:a,...f,handler:async(c,m)=>{try{let h=await p.call(this,c,m);return m.sent?void 0:h}catch(h){if(console.error(`[RPC Error] ${a}:`,h),!m.sent){let{statusCode:F,message:O}=o(h);m.status(F).send({error:{message:O}})}}}})}),e.decorate("addRenderRoute",function(r,n){let{handler:p,schema:u,...l}=n||{},a=w(u),S=async(f,i,c)=>{try{let m=await p?.call(this,f,i);return c?m:s(f,i,m)}catch(m){if(console.error(`[Render Error] ${r}:`,m),!i.sent){let{statusCode:h,message:F}=o(m);if(c)i.status(h).send({error:{message:F}});else return s(f,i,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:r,schema:a,...l,handler:(f,i)=>S(f,i,!1)}),r!=="*"&&r!=="/*"){this.route({method:"GET",url:`/loader${r}`,schema:a,...l,handler:(c,m)=>S(c,m,!0)});let f=r.endsWith("/")?"*":"/*",i=`${r}${f}`;this.route({method:"GET",url:i,schema:a,...l,handler:(c,m)=>S(c,m,!1)})}}),e.decorate("addLoaderRoute",function(r,n){let{handler:p,schema:u,...l}=n,a=`/api${r}`,S=w(u);this.route({method:"GET",url:a,schema:S,...l,handler:async(f,i)=>{try{let c=await p.call(this,f,i);return i.sent?void 0:c}catch(c){if(console.error(`[Loader API Error] ${a}:`,c),!i.sent){let{statusCode:m,message:h}=o(c);i.status(m).send({error:{message:h}})}}}})})},_=(0,b.default)(q,{name:"fastify-b-ssr"});
|
|
@@ -46,6 +46,8 @@ interface FastifyReactSsrOptions {
|
|
|
46
46
|
} | null | undefined;
|
|
47
47
|
/** Función opcional para obtener ajustes globales (ej: de MySQL) que se inyectarán en el SSR */
|
|
48
48
|
getGlobalSettings?: (req: FastifyRequest) => Promise<unknown> | unknown;
|
|
49
|
+
/** Puerto HMR para Vite en desarrollo (por defecto: 24678, se busca puerto disponible si está en uso) */
|
|
50
|
+
hmrPort?: number;
|
|
49
51
|
}
|
|
50
52
|
declare module 'fastify' {
|
|
51
53
|
interface FastifyInstance {
|
|
@@ -46,6 +46,8 @@ interface FastifyReactSsrOptions {
|
|
|
46
46
|
} | null | undefined;
|
|
47
47
|
/** Función opcional para obtener ajustes globales (ej: de MySQL) que se inyectarán en el SSR */
|
|
48
48
|
getGlobalSettings?: (req: FastifyRequest) => Promise<unknown> | unknown;
|
|
49
|
+
/** Puerto HMR para Vite en desarrollo (por defecto: 24678, se busca puerto disponible si está en uso) */
|
|
50
|
+
hmrPort?: number;
|
|
49
51
|
}
|
|
50
52
|
declare module 'fastify' {
|
|
51
53
|
interface FastifyInstance {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"@fastify/multipart";import
|
|
1
|
+
import"@fastify/multipart";import E from"fastify-plugin";import g from"path";import{z as y}from"zod";async function w(e=24678){let r=await import("net");return new Promise((l,f)=>{let m=r.createServer();m.listen(e,"127.0.0.1",()=>{let t=m.address(),n=typeof t=="object"&&t!==null?t.port:e;m.close(()=>l(n))}),m.on("error",t=>{t.code==="EADDRINUSE"?m.close(()=>l(w(e+1))):f(t)})})}function v(e){if(!e)return;console.log("[B-SSR] Converting schema:",JSON.stringify(e,null,2));let r={},l=f=>!f||typeof f!="object"?!1:!!(f._def||f.def);return e.body&&l(e.body)&&(console.log("[B-SSR] Converting body schema"),r.body=y.toJSONSchema(e.body,{target:"draft-7",unrepresentable:"any",io:"input"}),console.log("[B-SSR] Converted body:",JSON.stringify(r.body,null,2))),e.params&&l(e.params)&&(console.log("[B-SSR] Converting params schema"),r.params=y.toJSONSchema(e.params,{target:"draft-7",unrepresentable:"any",io:"input"})),e.querystring&&l(e.querystring)&&(console.log("[B-SSR] Converting querystring schema"),r.querystring=y.toJSONSchema(e.querystring,{target:"draft-7",unrepresentable:"any",io:"input"})),e.headers&&l(e.headers)&&(console.log("[B-SSR] Converting headers schema"),r.headers=y.toJSONSchema(e.headers,{target:"draft-7",unrepresentable:"any",io:"input"})),e.consumes&&(r.consumes=e.consumes),e.produces&&(r.produces=e.produces),e.response&&(r.response=e.response),e.tags&&(r.tags=e.tags),e.description&&(r.description=e.description),e.summary&&(r.summary=e.summary),e.deprecated&&(r.deprecated=e.deprecated),console.log("[B-SSR] Converted schema result:",JSON.stringify(r,null,2)),r}var F=async(e,r)=>{if(!e.isMultipart())return r.status(415).send({statusCode:415,error:"Unsupported Media Type",message:"Multipart/form-data expected"});let l=e.parts(),f={};for await(let m of l)if(m.type==="field")f[m.fieldname]=m.value;else{let t=Symbol.for("file-stream");e[t]=m}e.body=f},b=async(e,r)=>{let l=t=>{if(r.errorHandler){let n=r.errorHandler(t);if(n)return n}return{message:t instanceof Error?t.message:"Internal Server Error",statusCode:500}};if(e.hasDecorator("viteInitDone")&&e.viteInitDone)return;if(!e.hasDecorator("multipartErrors"))try{let t=await import("@fastify/multipart");await e.register(t.default)}catch(t){if(t.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw t}let f=process.env.NODE_ENV==="production";if(f){if(r.clientDistDir)try{let t=await import("@fastify/static"),n=g.resolve(r.root,r.clientDistDir);await e.register(t.default,{root:n,wildcard:!1}),console.log(`\u{1F4C2} [Fastify-SSR] Serving static assets from: ${n}`)}catch(t){console.error("\u274C [Fastify-SSR] Error registering @fastify/static. Did you install it?",t)}}else{if(!e.hasDecorator("use"))try{let c=await import("@fastify/middie");await e.register(c.default,{hook:"onRequest"})}catch(c){if(c.code!=="FST_ERR_DEC_ALREADY_PRESENT")throw c}let t=await import("vite"),n=r.viteConfig||{},p;n.server?.hmr&&typeof n.server.hmr=="object"&&"port"in n.server.hmr?p=n.server.hmr.port:p=r.hmrPort??await w();let i=await t.createServer({root:r.root,appType:"custom",...n,server:{hmr:{port:p},...n.server,middlewareMode:!0}});e.use(i.middlewares),e.hasDecorator("viteServer")||e.decorate("viteServer",i),console.log("\u{1F680} [Fastify-SSR] Vite Dev Server Ready")}e.decorate("viteInitDone",!0);let m=async(t,n,p)=>{try{let i=t.raw.url,c=r.getGlobalSettings?await r.getGlobalSettings(t):void 0;if(g.extname(i)!==""){n.status(404).send(`File not found: ${i}`);return}let o="";!f&&e.viteServer&&(o=await e.viteServer.transformIndexHtml(i,"<html><head></head><body></body></html>"),o=o.substring(o.indexOf("<head>")+6,o.indexOf("</head>"))),o=(c?`<script>window.__GLOBAL_SETTINGS__ = ${JSON.stringify(c)}</script>`:"")+o;let d=f?await import(g.resolve(r.root,r.prodEntryFile)):await e.viteServer.ssrLoadModule(r.devEntryFile),s=d.render||d.default;if(typeof s!="function")throw new Error(`Entry file ${r.devEntryFile} must export a 'render' function.`);await s({req:t,reply:n,head:o,data:p,globalSettings:c})}catch(i){e.viteServer?.ssrFixStacktrace(i),console.error("[SSR Error]:",i),n.sent||n.status(500).send("Internal Server Error")}};e.decorate("addRpcRoute",function(t,n){let{handler:p,schema:i,...c}=n,o=`/rpc${t}`,S=v(i),d={...c,schema:S};if(i?.consumes?.includes("multipart/form-data")){let a=d.preValidation;d.preValidation=a?Array.isArray(a)?[F,...a]:[F,a]:F}this.route({method:"POST",url:o,...d,handler:async(a,u)=>{try{let h=await p.call(this,a,u);return u.sent?void 0:h}catch(h){if(console.error(`[RPC Error] ${o}:`,h),!u.sent){let{statusCode:R,message:T}=l(h);u.status(R).send({error:{message:T}})}}}})}),e.decorate("addRenderRoute",function(t,n){let{handler:p,schema:i,...c}=n||{},o=v(i),S=async(d,s,a)=>{try{let u=await p?.call(this,d,s);return a?u:m(d,s,u)}catch(u){if(console.error(`[Render Error] ${t}:`,u),!s.sent){let{statusCode:h,message:R}=l(u);if(a)s.status(h).send({error:{message:R}});else return m(d,s,{ssrError:{statusCode:500,message:"Internal Error"}})}}};if(this.route({method:"GET",url:t,schema:o,...c,handler:(d,s)=>S(d,s,!1)}),t!=="*"&&t!=="/*"){this.route({method:"GET",url:`/loader${t}`,schema:o,...c,handler:(a,u)=>S(a,u,!0)});let d=t.endsWith("/")?"*":"/*",s=`${t}${d}`;this.route({method:"GET",url:s,schema:o,...c,handler:(a,u)=>S(a,u,!1)})}}),e.decorate("addLoaderRoute",function(t,n){let{handler:p,schema:i,...c}=n,o=`/api${t}`,S=v(i);this.route({method:"GET",url:o,schema:S,...c,handler:async(d,s)=>{try{let a=await p.call(this,d,s);return s.sent?void 0:a}catch(a){if(console.error(`[Loader API Error] ${o}:`,a),!s.sent){let{statusCode:u,message:h}=l(a);s.status(u).send({error:{message:h}})}}}})})},C=E(b,{name:"fastify-b-ssr"});export{C as default};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";var ae=Object.create;var K=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ge=Object.prototype.hasOwnProperty;var ue=(a,l)=>{for(var y in l)K(a,y,{get:l[y],enumerable:!0})},X=(a,l,y,x)=>{if(l&&typeof l=="object"||typeof l=="function")for(let h of le(l))!ge.call(a,h)&&h!==y&&K(a,h,{get:()=>l[h],enumerable:!(x=ce(l,h))||x.enumerable});return a};var Y=(a,l,y)=>(y=a!=null?ae(pe(a)):{},X(l||!a||!a.__esModule?K(y,"default",{value:a,enumerable:!0}):y,a)),fe=a=>X(K({},"__esModule",{value:!0}),a);var de={};ue(de,{generateRpcTypes:()=>ye});module.exports=fe(de);var G=Y(require("fast-glob"),1),E=require("fs/promises"),u=Y(require("path"),1),k=require("prettier"),t=require("ts-morph");function me(a){let l=a.replace(/[^a-zA-Z0-9]+(.)?/g,(y,x)=>x?x.toUpperCase():"");return l.charAt(0).toLowerCase()+l.slice(1)}function z(a,l,y){let x=u.default.basename(y,u.default.extname(y))||"Index",h=l.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),C=`${a} ${h} ${x}`;return me(C)}async function ye(a={}){let{routerPattern:l="src-ts/routers/**/*.mts",tsConfigFilePath:y="tsconfig.json",routerBaseDir:x="src-ts/routers",clean:h=!1}=a,C=[],L=[],v=[];try{let V=function(f){let P=[];return f.paramsType!=="unknown"&&P.push(`params: ${f.paramsType}`),f.queryType!=="unknown"&&P.push(`query: ${f.queryType}`),f.bodyType!=="unknown"&&P.push(`body: ${f.bodyType}`),P.push("signal?: AbortSignal"),P};var Te=V;let A=new t.Project({tsConfigFilePath:y,skipAddingFilesFromTsConfig:!1}),ee=u.default.resolve(process.cwd(),x||".");async function te(f){try{let N=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(n,r)=>{if(!u.default.isAbsolute(r))return n;let s=r;if(!u.default.extname(s)){let m=A.getSourceFile(p=>p.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===r);m&&(s=m.getFilePath())}let i=u.default.relative(u.default.dirname(b),s).replace(/\\/g,"/");return i.startsWith(".")||(i="./"+i),`import("${i}")`})},j=function(e,n){if(e.getSymbol()?.getName()==="Promise"){let o=e.getAwaitedType();if(o)return`Promise<${j(o,n)}>`}let r=e.getAliasSymbol()??e.getSymbol();if(r?.getName()==="__object")return N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation|t.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!r){let o=(c,g=0)=>{if(!(g>5)){if(c.isArray()){let d=c.getArrayElementType();d&&o(d,g);return}if(c.isObject()&&!c.getSymbol()&&!c.getAliasSymbol()){for(let d of c.getApparentProperties()){let w=d.getValueDeclaration();w&&o(d.getTypeAtLocation(w),g+1)}return}j(c,n)}};return o(e),N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation|t.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!r)return N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation));let s=r.getDeclarations()[0];if(!s)return r.getName();if(t.Node.isImportSpecifier(s)||t.Node.isImportClause(s)){let o=s.getFirstAncestorByKind(t.SyntaxKind.ImportDeclaration);if(o){let c=o.getModuleSpecifierValue(),g=r.getName();return F.has(c)||F.set(c,new Set),F.get(c)?.add(g),g}}let i=s.getSourceFile();if(i.getFilePath()===$.getFilePath())return r.getName();if(i.isInNodeModules())return N(e.getText(n,t.ts.TypeFormatFlags.NoTruncation));let m=u.default.relative(u.default.dirname(b),i.getFilePath()).replace(/\\/g,"/"),S=m.startsWith(".")?m:`./${m}`,T=r.getName();return F.has(S)||F.set(S,new Set),F.get(S)?.add(T),T},Q=function(e){let n;if(t.Node.isFunctionLikeDeclaration(e)||t.Node.isArrowFunction(e)){let r=e.getDescendantsOfKind(t.SyntaxKind.ReturnStatement);for(let s of r){let i=s.getExpression();if(i?.isKind(t.SyntaxKind.SatisfiesExpression)){n=i.getTypeNode()?.getType();break}}}if(n)return j(n,e);{let r=e.getType().getCallSignatures();if(r.length>0){let s=r[0]?.getReturnType();return j(s,e)}}return"unknown"};var P=N,B=j,se=Q;let $=A.addSourceFileAtPath(f);await $.refreshFromFileSystem(),A.resolveSourceFileDependencies();let O=$.getDescendantsOfKind(t.SyntaxKind.CallExpression),M=O.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),_=O.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),Z=O.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),ne=u.default.extname(f),b=f.substring(0,f.length-ne.length)+".universal.d.ts";if(M.length===0&&_.length===0&&Z.length===0){if(h)try{await(0,E.unlink)(b),L.push(b)}catch{}return!1}let q=[],F=new Map;F.has("fastify")||F.set("fastify",new Set),F.get("fastify")?.add("FastifyRequest"),F.get("fastify")?.add("FastifyReply");let ie=e=>{let n="unknown",r="unknown",s="unknown",i=!1;if(!e||!t.Node.isObjectLiteralExpression(e))return{paramsType:n,queryType:r,bodyType:s,isMultipart:i};let m=e.getProperty("schema");if(m?.isKind(t.SyntaxKind.PropertyAssignment)){let p=m.getInitializer();if(p?.isKind(t.SyntaxKind.Identifier)){let T=p.getSymbol()?.getValueDeclaration();if(T){let o=T.getFirstDescendantByKind(t.SyntaxKind.ObjectLiteralExpression);o&&(p=o)}}if(p&&t.Node.isObjectLiteralExpression(p)){let S=p.getProperty("consumes");if(S?.isKind(t.SyntaxKind.PropertyAssignment)){let o=S.getInitializer();t.Node.isArrayLiteralExpression(o)&&(i=o.getElements().some(c=>c.isKind(t.SyntaxKind.StringLiteral)&&c.getLiteralValue()==="multipart/form-data"))}let T=o=>{let c=p.getProperty(o);if(c?.isKind(t.SyntaxKind.PropertyAssignment)){let g=c.getInitializer();if(g){let d=g.getType(),w=d.getProperty("_output");return j(w?w.getTypeAtLocation(g).getApparentType():d,g)}}return"unknown"};if(n=T("params"),r=T("querystring"),s=T("body"),i){let o="{ file: File }";s=s!=="unknown"&&s.trim().startsWith("{")?`(${s} & ${o})`:o}}}return{paramsType:n,queryType:r,bodyType:s,isMultipart:i}},D=u.default.relative(ee,u.default.dirname(f)).split(u.default.sep).join("/"),oe=D==="."||!D?"":D.startsWith("/")?D:"/"+D,I=(e,n)=>{let[r,s]=e.getArguments();if(!r?.isKind(t.SyntaxKind.StringLiteral))return;let i=r.getLiteralValue(),m="unknown",p=oe,{paramsType:S,queryType:T,bodyType:o,isMultipart:c}=ie(s);if(s?.isKind(t.SyntaxKind.ObjectLiteralExpression)){let w=s.getProperty("prefix");if(w?.isKind(t.SyntaxKind.PropertyAssignment)){let R=w.getInitializer();R?.isKind(t.SyntaxKind.StringLiteral)&&(p=R.getLiteralValue())}let J=s.getProperty("handler");if(J?.isKind(t.SyntaxKind.PropertyAssignment)){let R=J.getInitializer();R&&(m=Q(R),m.startsWith("Promise<")||(m=`Promise<${m}>`))}}let g="",d="";n==="rpc"?(g=u.default.join(p,"rpc",i).replace(/\\/g,"/"),d=z("action",p,i)):n==="loader"?(g=u.default.join(p,"loader",i).replace(/\\/g,"/"),d=z("loader",p,i)):n==="api"&&(g=u.default.join(p,"api",i).replace(/\\/g,"/"),d=z("get",p,i)),d&&q.push({type:n,name:d,returnType:m,url:i,rpcUrl:g,loaderUrl:g,paramsType:S,queryType:T,bodyType:o,isMultipart:c})};if(M.forEach(e=>I(e,"rpc")),_.forEach(e=>I(e,"loader")),Z.forEach(e=>I(e,"api")),q.length===0){if(h)try{await(0,E.unlink)(b),L.push(b)}catch{}return!1}let W=[];for(let[e,n]of F.entries())W.push(`import type { ${[...n].sort().join(", ")} } from "${e}";`);let H=[];q.forEach(e=>{let n=V(e),r="";n.length>0&&(r=`args: { ${n.join("; ")} }`),r||(r="args: { signal?: AbortSignal }"),H.push(`export declare const ${e.name}: (${r}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${e.returnType};`)});let U=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
`+(W.length>0?W.join(`
|
|
5
|
+
`)+`
|
|
6
|
+
|
|
7
|
+
`:"")+H.join(`
|
|
8
|
+
|
|
9
|
+
`);try{let e=await(0,k.resolveConfig)(b)||{};U=await(0,k.format)(U,{...e,parser:"typescript",filepath:b})}catch{}return await(0,E.writeFile)(b,U),C.push(b),!0}catch($){return v.push(`Error processing ${f}: ${$ instanceof Error?$.message:String($)}`),!1}}let re=await(0,G.default)(l,{absolute:!0});if(await Promise.all(re.map(f=>te(f))),h){let f=await(0,G.default)(u.default.join(x,"**/*.universal.d.ts"),{absolute:!0});for(let P of f){let B=P.replace(".universal.d.ts",".mts").replace(".universal.d.ts",".ts");if(!await(0,E.access)(B).then(()=>!0).catch(()=>!1))try{await(0,E.unlink)(P),L.push(P)}catch{}}}}catch(A){v.push(`Fatal error: ${A instanceof Error?A.message:String(A)}`)}return{generated:C,cleaned:L,errors:v}}0&&(module.exports={generateRpcTypes});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface GenerateRpcTypesOptions {
|
|
2
|
+
routerPattern?: string;
|
|
3
|
+
tsConfigFilePath?: string;
|
|
4
|
+
routerBaseDir?: string;
|
|
5
|
+
clean?: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface GenerateResult {
|
|
8
|
+
generated: string[];
|
|
9
|
+
cleaned: string[];
|
|
10
|
+
errors: string[];
|
|
11
|
+
}
|
|
12
|
+
declare function generateRpcTypes(options?: GenerateRpcTypesOptions): Promise<GenerateResult>;
|
|
13
|
+
|
|
14
|
+
export { type GenerateResult, type GenerateRpcTypesOptions, generateRpcTypes };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface GenerateRpcTypesOptions {
|
|
2
|
+
routerPattern?: string;
|
|
3
|
+
tsConfigFilePath?: string;
|
|
4
|
+
routerBaseDir?: string;
|
|
5
|
+
clean?: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface GenerateResult {
|
|
8
|
+
generated: string[];
|
|
9
|
+
cleaned: string[];
|
|
10
|
+
errors: string[];
|
|
11
|
+
}
|
|
12
|
+
declare function generateRpcTypes(options?: GenerateRpcTypesOptions): Promise<GenerateResult>;
|
|
13
|
+
|
|
14
|
+
export { type GenerateResult, type GenerateRpcTypesOptions, generateRpcTypes };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import J from"fast-glob";import{access as ie,unlink as U,writeFile as oe}from"fs/promises";import p from"path";import{format as ae,resolveConfig as ce}from"prettier";import{Node as w,Project as le,SyntaxKind as u,ts as A}from"ts-morph";function pe($){let E=$.replace(/[^a-zA-Z0-9]+(.)?/g,(j,x)=>x?x.toUpperCase():"");return E.charAt(0).toLowerCase()+E.slice(1)}function z($,E,j){let x=p.basename(j,p.extname(j))||"Index",N=E.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),L=`${$} ${N} ${x}`;return pe(L)}async function Fe($={}){let{routerPattern:E="src-ts/routers/**/*.mts",tsConfigFilePath:j="tsconfig.json",routerBaseDir:x="src-ts/routers",clean:N=!1}=$,L=[],K=[],k=[];try{let G=function(l){let d=[];return l.paramsType!=="unknown"&&d.push(`params: ${l.paramsType}`),l.queryType!=="unknown"&&d.push(`query: ${l.queryType}`),l.bodyType!=="unknown"&&d.push(`body: ${l.bodyType}`),d.push("signal?: AbortSignal"),d};var ge=G;let P=new le({tsConfigFilePath:j,skipAddingFilesFromTsConfig:!1}),X=p.resolve(process.cwd(),x||".");async function Y(l){try{let D=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(s,t)=>{if(!p.isAbsolute(t))return s;let r=t;if(!p.extname(r)){let g=P.getSourceFile(a=>a.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===t);g&&(r=g.getFilePath())}let n=p.relative(p.dirname(T),r).replace(/\\/g,"/");return n.startsWith(".")||(n="./"+n),`import("${n}")`})},S=function(e,s){if(e.getSymbol()?.getName()==="Promise"){let i=e.getAwaitedType();if(i)return`Promise<${S(i,s)}>`}let t=e.getAliasSymbol()??e.getSymbol();if(t?.getName()==="__object")return D(e.getText(s,A.TypeFormatFlags.NoTruncation|A.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!t){let i=(o,c=0)=>{if(!(c>5)){if(o.isArray()){let f=o.getArrayElementType();f&&i(f,c);return}if(o.isObject()&&!o.getSymbol()&&!o.getAliasSymbol()){for(let f of o.getApparentProperties()){let F=f.getValueDeclaration();F&&i(f.getTypeAtLocation(F),c+1)}return}S(o,s)}};return i(e),D(e.getText(s,A.TypeFormatFlags.NoTruncation|A.TypeFormatFlags.UseFullyQualifiedType))}if(!t)return D(e.getText(s,A.TypeFormatFlags.NoTruncation));let r=t.getDeclarations()[0];if(!r)return t.getName();if(w.isImportSpecifier(r)||w.isImportClause(r)){let i=r.getFirstAncestorByKind(u.ImportDeclaration);if(i){let o=i.getModuleSpecifierValue(),c=t.getName();return y.has(o)||y.set(o,new Set),y.get(o)?.add(c),c}}let n=r.getSourceFile();if(n.getFilePath()===b.getFilePath())return t.getName();if(n.isInNodeModules())return D(e.getText(s,A.TypeFormatFlags.NoTruncation));let g=p.relative(p.dirname(T),n.getFilePath()).replace(/\\/g,"/"),h=g.startsWith(".")?g:`./${g}`,m=t.getName();return y.has(h)||y.set(h,new Set),y.get(h)?.add(m),m},Z=function(e){let s;if(w.isFunctionLikeDeclaration(e)||w.isArrowFunction(e)){let t=e.getDescendantsOfKind(u.ReturnStatement);for(let r of t){let n=r.getExpression();if(n?.isKind(u.SatisfiesExpression)){s=n.getTypeNode()?.getType();break}}}if(s)return S(s,e);{let t=e.getType().getCallSignatures();if(t.length>0){let r=t[0]?.getReturnType();return S(r,e)}}return"unknown"};var d=D,V=S,te=Z;let b=P.addSourceFileAtPath(l);await b.refreshFromFileSystem(),P.resolveSourceFileDependencies();let v=b.getDescendantsOfKind(u.CallExpression),B=v.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),M=v.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),_=v.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),re=p.extname(l),T=l.substring(0,l.length-re.length)+".universal.d.ts";if(B.length===0&&M.length===0&&_.length===0){if(N)try{await U(T),K.push(T)}catch{}return!1}let O=[],y=new Map;y.has("fastify")||y.set("fastify",new Set),y.get("fastify")?.add("FastifyRequest"),y.get("fastify")?.add("FastifyReply");let se=e=>{let s="unknown",t="unknown",r="unknown",n=!1;if(!e||!w.isObjectLiteralExpression(e))return{paramsType:s,queryType:t,bodyType:r,isMultipart:n};let g=e.getProperty("schema");if(g?.isKind(u.PropertyAssignment)){let a=g.getInitializer();if(a?.isKind(u.Identifier)){let m=a.getSymbol()?.getValueDeclaration();if(m){let i=m.getFirstDescendantByKind(u.ObjectLiteralExpression);i&&(a=i)}}if(a&&w.isObjectLiteralExpression(a)){let h=a.getProperty("consumes");if(h?.isKind(u.PropertyAssignment)){let i=h.getInitializer();w.isArrayLiteralExpression(i)&&(n=i.getElements().some(o=>o.isKind(u.StringLiteral)&&o.getLiteralValue()==="multipart/form-data"))}let m=i=>{let o=a.getProperty(i);if(o?.isKind(u.PropertyAssignment)){let c=o.getInitializer();if(c){let f=c.getType(),F=f.getProperty("_output");return S(F?F.getTypeAtLocation(c).getApparentType():f,c)}}return"unknown"};if(s=m("params"),t=m("querystring"),r=m("body"),n){let i="{ file: File }";r=r!=="unknown"&&r.trim().startsWith("{")?`(${r} & ${i})`:i}}}return{paramsType:s,queryType:t,bodyType:r,isMultipart:n}},R=p.relative(X,p.dirname(l)).split(p.sep).join("/"),ne=R==="."||!R?"":R.startsWith("/")?R:"/"+R,q=(e,s)=>{let[t,r]=e.getArguments();if(!t?.isKind(u.StringLiteral))return;let n=t.getLiteralValue(),g="unknown",a=ne,{paramsType:h,queryType:m,bodyType:i,isMultipart:o}=se(r);if(r?.isKind(u.ObjectLiteralExpression)){let F=r.getProperty("prefix");if(F?.isKind(u.PropertyAssignment)){let C=F.getInitializer();C?.isKind(u.StringLiteral)&&(a=C.getLiteralValue())}let H=r.getProperty("handler");if(H?.isKind(u.PropertyAssignment)){let C=H.getInitializer();C&&(g=Z(C),g.startsWith("Promise<")||(g=`Promise<${g}>`))}}let c="",f="";s==="rpc"?(c=p.join(a,"rpc",n).replace(/\\/g,"/"),f=z("action",a,n)):s==="loader"?(c=p.join(a,"loader",n).replace(/\\/g,"/"),f=z("loader",a,n)):s==="api"&&(c=p.join(a,"api",n).replace(/\\/g,"/"),f=z("get",a,n)),f&&O.push({type:s,name:f,returnType:g,url:n,rpcUrl:c,loaderUrl:c,paramsType:h,queryType:m,bodyType:i,isMultipart:o})};if(B.forEach(e=>q(e,"rpc")),M.forEach(e=>q(e,"loader")),_.forEach(e=>q(e,"api")),O.length===0){if(N)try{await U(T),K.push(T)}catch{}return!1}let I=[];for(let[e,s]of y.entries())I.push(`import type { ${[...s].sort().join(", ")} } from "${e}";`);let Q=[];O.forEach(e=>{let s=G(e),t="";s.length>0&&(t=`args: { ${s.join("; ")} }`),t||(t="args: { signal?: AbortSignal }"),Q.push(`export declare const ${e.name}: (${t}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${e.returnType};`)});let W=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
`+(I.length>0?I.join(`
|
|
5
|
+
`)+`
|
|
6
|
+
|
|
7
|
+
`:"")+Q.join(`
|
|
8
|
+
|
|
9
|
+
`);try{let e=await ce(T)||{};W=await ae(W,{...e,parser:"typescript",filepath:T})}catch{}return await oe(T,W),L.push(T),!0}catch(b){return k.push(`Error processing ${l}: ${b instanceof Error?b.message:String(b)}`),!1}}let ee=await J(E,{absolute:!0});if(await Promise.all(ee.map(l=>Y(l))),N){let l=await J(p.join(x,"**/*.universal.d.ts"),{absolute:!0});for(let d of l){let V=d.replace(".universal.d.ts",".mts").replace(".universal.d.ts",".ts");if(!await ie(V).then(()=>!0).catch(()=>!1))try{await U(d),K.push(d)}catch{}}}}catch(P){k.push(`Fatal error: ${P instanceof Error?P.message:String(P)}`)}return{generated:L,cleaned:K,errors:k}}export{Fe as generateRpcTypes};
|
package/dist/vite-rpc-plugin.cjs
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var Pe=Object.create;var ie=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty;var Re=(u,d)=>{for(var A in d)ie(u,A,{get:d[A],enumerable:!0})},he=(u,d,A,j)=>{if(d&&typeof d=="object"||typeof d=="function")for(let $ of we(d))!Ee.call(u,$)&&$!==A&&ie(u,$,{get:()=>d[$],enumerable:!(j=Fe(d,$))||j.enumerable});return u};var oe=(u,d,A)=>(A=u!=null?Pe(Se(u)):{},he(d||!u||!u.__esModule?ie(A,"default",{value:u,enumerable:!0}):A,u)),Ae=u=>he(ie({},"__esModule",{value:!0}),u);var Oe={};Re(Oe,{generateRpcTypes:()=>Te,rpcGeneratorPlugin:()=>ve});module.exports=Ae(Oe);var be=oe(require("fast-glob"),1),X=require("fs/promises"),w=oe(require("path"),1),le=require("prettier"),f=require("ts-morph");var me=oe(require("fast-glob"),1),_=require("fs/promises"),v=oe(require("path"),1),ae=require("prettier"),g=require("ts-morph");function $e(u){let d=u.replace(/[^a-zA-Z0-9]+(.)?/g,(A,j)=>j?j.toUpperCase():"");return d.charAt(0).toLowerCase()+d.slice(1)}function fe(u,d,A){let j=v.default.basename(A,v.default.extname(A))||"Index",$=d.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),N=`${u} ${$} ${j}`;return $e(N)}async function Te(u={}){let{routerPattern:d="src-ts/routers/**/*.mts",tsConfigFilePath:A="tsconfig.json",routerBaseDir:j="src-ts/routers",clean:$=!1}=u,N=[],B=[],J=[];try{let ne=function(o){let s=[];return o.paramsType!=="unknown"&&s.push(`params: ${o.paramsType}`),o.queryType!=="unknown"&&s.push(`query: ${o.queryType}`),o.bodyType!=="unknown"&&s.push(`body: ${o.bodyType}`),s.push("signal?: AbortSignal"),s};var ee=ne;let I=new g.Project({tsConfigFilePath:A,skipAddingFilesFromTsConfig:!1}),ce=v.default.resolve(process.cwd(),j||".");async function pe(o){try{let K=function(t){return t.replace(/import\(['"](.*?)['"]\)/g,(T,y)=>{if(!v.default.isAbsolute(y))return T;let b=y;if(!v.default.extname(b)){let i=I.getSourceFile(r=>r.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===y);i&&(b=i.getFilePath())}let e=v.default.relative(v.default.dirname(M),b).replace(/\\/g,"/");return e.startsWith(".")||(e="./"+e),`import("${e}")`})},O=function(t,T){if(t.getSymbol()?.getName()==="Promise"){let l=t.getAwaitedType();if(l)return`Promise<${O(l,T)}>`}let y=t.getAliasSymbol()??t.getSymbol();if(y?.getName()==="__object")return K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation|g.ts.TypeFormatFlags.UseFullyQualifiedType));if(t.isObject()&&!y){let l=(c,x=0)=>{if(!(x>5)){if(c.isArray()){let P=c.getArrayElementType();P&&l(P,x);return}if(c.isObject()&&!c.getSymbol()&&!c.getAliasSymbol()){for(let P of c.getApparentProperties()){let h=P.getValueDeclaration();h&&l(P.getTypeAtLocation(h),x+1)}return}O(c,T)}};return l(t),K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation|g.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!y)return K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation));let b=y.getDeclarations()[0];if(!b)return y.getName();if(g.Node.isImportSpecifier(b)||g.Node.isImportClause(b)){let l=b.getFirstAncestorByKind(g.SyntaxKind.ImportDeclaration);if(l){let c=l.getModuleSpecifierValue(),x=y.getName();return E.has(c)||E.set(c,new Set),E.get(c)?.add(x),x}}let e=b.getSourceFile();if(e.getFilePath()===m.getFilePath())return y.getName();if(e.isInNodeModules())return K(t.getText(T,g.ts.TypeFormatFlags.NoTruncation));let i=v.default.relative(v.default.dirname(M),e.getFilePath()).replace(/\\/g,"/"),a=i.startsWith(".")?i:`./${i}`,p=y.getName();return E.has(a)||E.set(a,new Set),E.get(a)?.add(p),p},te=function(t){let T;if(g.Node.isFunctionLikeDeclaration(t)||g.Node.isArrowFunction(t)){let y=t.getDescendantsOfKind(g.SyntaxKind.ReturnStatement);for(let b of y){let e=b.getExpression();if(e?.isKind(g.SyntaxKind.SatisfiesExpression)){T=e.getTypeNode()?.getType();break}}}if(T)return O(T,t);{let y=t.getType().getCallSignatures();if(y.length>0){let b=y[0]?.getReturnType();return O(b,t)}}return"unknown"};var s=K,F=O,C=te;let m=I.addSourceFileAtPath(o);await m.refreshFromFileSystem(),I.resolveSourceFileDependencies();let k=m.getDescendantsOfKind(g.SyntaxKind.CallExpression),q=k.filter(t=>t.getExpression().getText().endsWith(".addRpcRoute")),L=k.filter(t=>t.getExpression().getText().endsWith(".addRenderRoute")),V=k.filter(t=>t.getExpression().getText().endsWith(".addLoaderRoute")),U=v.default.extname(o),M=o.substring(0,o.length-U.length)+".universal.d.ts";if(q.length===0&&L.length===0&&V.length===0){if($)try{await(0,_.unlink)(M),B.push(M)}catch{}return!1}let G=[],E=new Map;E.has("fastify")||E.set("fastify",new Set),E.get("fastify")?.add("FastifyRequest"),E.get("fastify")?.add("FastifyReply");let ue=t=>{let T="unknown",y="unknown",b="unknown",e=!1;if(!t||!g.Node.isObjectLiteralExpression(t))return{paramsType:T,queryType:y,bodyType:b,isMultipart:e};let i=t.getProperty("schema");if(i?.isKind(g.SyntaxKind.PropertyAssignment)){let r=i.getInitializer();if(r?.isKind(g.SyntaxKind.Identifier)){let p=r.getSymbol()?.getValueDeclaration();if(p){let l=p.getFirstDescendantByKind(g.SyntaxKind.ObjectLiteralExpression);l&&(r=l)}}if(r&&g.Node.isObjectLiteralExpression(r)){let a=r.getProperty("consumes");if(a?.isKind(g.SyntaxKind.PropertyAssignment)){let l=a.getInitializer();g.Node.isArrayLiteralExpression(l)&&(e=l.getElements().some(c=>c.isKind(g.SyntaxKind.StringLiteral)&&c.getLiteralValue()==="multipart/form-data"))}let p=l=>{let c=r.getProperty(l);if(c?.isKind(g.SyntaxKind.PropertyAssignment)){let x=c.getInitializer();if(x){let P=x.getType(),h=P.getProperty("_output");return O(h?h.getTypeAtLocation(x).getApparentType():P,x)}}return"unknown"};if(T=p("params"),y=p("querystring"),b=p("body"),e){let l="{ file: File }";b=b!=="unknown"&&b.trim().startsWith("{")?`(${b} & ${l})`:l}}}return{paramsType:T,queryType:y,bodyType:b,isMultipart:e}},W=v.default.relative(ce,v.default.dirname(o)).split(v.default.sep).join("/"),ge=W==="."||!W?"":W.startsWith("/")?W:"/"+W,Z=(t,T)=>{let[y,b]=t.getArguments();if(!y?.isKind(g.SyntaxKind.StringLiteral))return;let e=y.getLiteralValue(),i="unknown",r=ge,{paramsType:a,queryType:p,bodyType:l,isMultipart:c}=ue(b);if(b?.isKind(g.SyntaxKind.ObjectLiteralExpression)){let h=b.getProperty("prefix");if(h?.isKind(g.SyntaxKind.PropertyAssignment)){let S=h.getInitializer();S?.isKind(g.SyntaxKind.StringLiteral)&&(r=S.getLiteralValue())}let R=b.getProperty("handler");if(R?.isKind(g.SyntaxKind.PropertyAssignment)){let S=R.getInitializer();S&&(i=te(S),i.startsWith("Promise<")||(i=`Promise<${i}>`))}}let x="",P="";T==="rpc"?(x=v.default.join(r,"rpc",e).replace(/\\/g,"/"),P=fe("action",r,e)):T==="loader"?(x=v.default.join(r,"loader",e).replace(/\\/g,"/"),P=fe("loader",r,e)):T==="api"&&(x=v.default.join(r,"api",e).replace(/\\/g,"/"),P=fe("get",r,e)),P&&G.push({type:T,name:P,returnType:i,url:e,rpcUrl:x,loaderUrl:x,paramsType:a,queryType:p,bodyType:l,isMultipart:c})};if(q.forEach(t=>Z(t,"rpc")),L.forEach(t=>Z(t,"loader")),V.forEach(t=>Z(t,"api")),G.length===0){if($)try{await(0,_.unlink)(M),B.push(M)}catch{}return!1}let H=[];for(let[t,T]of E.entries())H.push(`import type { ${[...T].sort().join(", ")} } from "${t}";`);let re=[];G.forEach(t=>{let T=ne(t),y="";T.length>0&&(y=`args: { ${T.join("; ")} }`),y||(y="args: { signal?: AbortSignal }"),re.push(`export declare const ${t.name}: (${y}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${t.returnType};`)});let Q=`// 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
|
-
`:"")+
|
|
7
|
+
`:"")+re.join(`
|
|
8
8
|
|
|
9
|
-
`);try{let
|
|
9
|
+
`);try{let t=await(0,ae.resolveConfig)(M)||{};Q=await(0,ae.format)(Q,{...t,parser:"typescript",filepath:M})}catch{}return await(0,_.writeFile)(M,Q),N.push(M),!0}catch(m){return J.push(`Error processing ${o}: ${m instanceof Error?m.message:String(m)}`),!1}}let n=await(0,me.default)(d,{absolute:!0});if(await Promise.all(n.map(o=>pe(o))),$){let o=await(0,me.default)(v.default.join(j,"**/*.universal.d.ts"),{absolute:!0});for(let s of o){let F=s.replace(".universal.d.ts",".mts").replace(".universal.d.ts",".ts");if(!await(0,_.access)(F).then(()=>!0).catch(()=>!1))try{await(0,_.unlink)(s),B.push(s)}catch{}}}}catch(I){J.push(`Fatal error: ${I instanceof Error?I.message:String(I)}`)}return{generated:N,cleaned:B,errors:J}}var Y="virtual:b-ssr-rpc-universal:";function Ce(u){let d=u.replace(/[^a-zA-Z0-9]+(.)?/g,(A,j)=>j?j.toUpperCase():"");return d.charAt(0).toLowerCase()+d.slice(1)}function de(u,d,A){let j=w.default.basename(A,w.default.extname(A))||"Index",$=d.replace(/:[a-zA-Z0-9_]+/g,"").replace(/\//g," "),N=`${u} ${$} ${j}`;return Ce(N)}function ve(u={}){let{routerPattern:d="src-ts/routers/**/*.mts",tsConfigFilePath:A="tsconfig.json",routerBaseDir:j="src-ts/routers"}=u,$=new Map,N=new Set,B=new f.Project({tsConfigFilePath:A,skipAddingFilesFromTsConfig:!1}),J=w.default.resolve(process.cwd(),j||".");async function ee(n){try{let K=function(e){return e.replace(/import\(['"](.*?)['"]\)/g,(i,r)=>{if(!w.default.isAbsolute(r))return i;let a=r;if(!w.default.extname(a)){let l=B.getSourceFile(c=>c.getFilePath().replace(/\.(mts|ts|tsx)$/,"")===r);l&&(a=l.getFilePath())}let p=w.default.relative(w.default.dirname(U),a).replace(/\\/g,"/");return p.startsWith(".")||(p="./"+p),`import("${p}")`})},O=function(e,i){if(e.getSymbol()?.getName()==="Promise"){let h=e.getAwaitedType();if(h)return`Promise<${O(h,i)}>`}let r=e.getAliasSymbol()??e.getSymbol();if(r?.getName()==="__object")return K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation|f.ts.TypeFormatFlags.UseFullyQualifiedType));if(e.isObject()&&!r){let h=(R,S=0)=>{if(!(S>5)){if(R.isArray()){let D=R.getArrayElementType();D&&h(D,S);return}if(R.isObject()&&!R.getSymbol()&&!R.getAliasSymbol()){for(let D of R.getApparentProperties()){let z=D.getValueDeclaration();z&&h(D.getTypeAtLocation(z),S+1)}return}O(R,i)}};return h(e),K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation|f.ts.TypeFormatFlags.UseFullyQualifiedType))}if(!r)return K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation));let a=r.getDeclarations()[0];if(!a)return r.getName();if(f.Node.isImportSpecifier(a)||f.Node.isImportClause(a)){let h=a.getFirstAncestorByKind(f.SyntaxKind.ImportDeclaration);if(h){let R=h.getModuleSpecifierValue(),S=r.getName();return E.has(R)||E.set(R,new Set),E.get(R)?.add(S),S}}let p=a.getSourceFile();if(p.getFilePath()===C.getFilePath())return r.getName();if(p.isInNodeModules())return K(e.getText(i,f.ts.TypeFormatFlags.NoTruncation));let l=w.default.relative(w.default.dirname(U),p.getFilePath()).replace(/\\/g,"/"),x=l.startsWith(".")?l:`./${l}`,P=r.getName();return E.has(x)||E.set(x,new Set),E.get(x)?.add(P),P},te=function(e){let i;if(f.Node.isFunctionLikeDeclaration(e)||f.Node.isArrowFunction(e)){let r=e.getDescendantsOfKind(f.SyntaxKind.ReturnStatement);for(let a of r){let p=a.getExpression();if(p?.isKind(f.SyntaxKind.SatisfiesExpression)){i=p.getTypeNode()?.getType();break}}}if(i)return O(i,e);{let r=e.getType().getCallSignatures();if(r.length>0){let a=r[0]?.getReturnType();return O(a,e)}}return"unknown"};var o=K,s=O,F=te;let C=B.addSourceFileAtPath(n);await C.refreshFromFileSystem(),B.resolveSourceFileDependencies();let m=C.getDescendantsOfKind(f.SyntaxKind.CallExpression),k=m.filter(e=>e.getExpression().getText().endsWith(".addRpcRoute")),q=m.filter(e=>e.getExpression().getText().endsWith(".addRenderRoute")),L=m.filter(e=>e.getExpression().getText().endsWith(".addLoaderRoute")),V=w.default.extname(n),U=n.substring(0,n.length-V.length)+".universal.d.ts",M=w.default.resolve(n);if(k.length===0&&q.length===0&&L.length===0){$.delete(M),N.delete(M),U!==n&&await(0,X.unlink)(U).catch(()=>{});return}N.add(M);let G=[],E=new Map;E.has("fastify")||E.set("fastify",new Set),E.get("fastify")?.add("FastifyRequest"),E.get("fastify")?.add("FastifyReply");let ue=e=>{let i="unknown",r="unknown",a="unknown",p=!1;if(!e||!f.Node.isObjectLiteralExpression(e))return{paramsType:i,queryType:r,bodyType:a,isMultipart:p};let l=e.getProperty("schema");if(l?.isKind(f.SyntaxKind.PropertyAssignment)){let c=l.getInitializer();if(c?.isKind(f.SyntaxKind.Identifier)){let P=c.getSymbol()?.getValueDeclaration();if(P){let h=P.getFirstDescendantByKind(f.SyntaxKind.ObjectLiteralExpression);h&&(c=h)}}if(c&&f.Node.isObjectLiteralExpression(c)){let x=c.getProperty("consumes");if(x?.isKind(f.SyntaxKind.PropertyAssignment)){let h=x.getInitializer();f.Node.isArrayLiteralExpression(h)&&(p=h.getElements().some(R=>R.isKind(f.SyntaxKind.StringLiteral)&&R.getLiteralValue()==="multipart/form-data"))}let P=h=>{let R=c.getProperty(h);if(R?.isKind(f.SyntaxKind.PropertyAssignment)){let S=R.getInitializer();if(S){let D=S.getType(),z=D.getProperty("_output");return O(z?z.getTypeAtLocation(S).getApparentType():D,S)}}return"unknown"};if(i=P("params"),r=P("querystring"),a=P("body"),p){let h="{ file: File }";a=a!=="unknown"&&a.trim().startsWith("{")?`(${a} & ${h})`:h}}}return{paramsType:i,queryType:r,bodyType:a,isMultipart:p}},W=w.default.relative(J,w.default.dirname(n)).split(w.default.sep).join("/"),ge=W==="."||!W?"":W.startsWith("/")?W:"/"+W,Z=(e,i)=>{let[r,a]=e.getArguments();if(!r?.isKind(f.SyntaxKind.StringLiteral))return;let p=r.getLiteralValue(),l="unknown",c=ge,{paramsType:x,queryType:P,bodyType:h,isMultipart:R}=ue(a);if(a?.isKind(f.SyntaxKind.ObjectLiteralExpression)){let z=a.getProperty("prefix");if(z?.isKind(f.SyntaxKind.PropertyAssignment)){let se=z.getInitializer();se?.isKind(f.SyntaxKind.StringLiteral)&&(c=se.getLiteralValue())}let ye=a.getProperty("handler");if(ye?.isKind(f.SyntaxKind.PropertyAssignment)){let se=ye.getInitializer();se&&(l=te(se),l.startsWith("Promise<")||(l=`Promise<${l}>`))}}let S="",D="";i==="rpc"?(S=w.default.join(c,"rpc",p).replace(/\\/g,"/"),D=de("action",c,p)):i==="loader"?(S=w.default.join(c,"loader",p).replace(/\\/g,"/"),D=de("loader",c,p)):i==="api"&&(S=w.default.join(c,"api",p).replace(/\\/g,"/"),D=de("get",c,p)),D&&G.push({type:i,name:D,returnType:l,url:p,rpcUrl:S,loaderUrl:S,paramsType:x,queryType:P,bodyType:h,isMultipart:R})};k.forEach(e=>Z(e,"rpc")),q.forEach(e=>Z(e,"loader")),L.forEach(e=>Z(e,"api"));let H=[];for(let[e,i]of E.entries())H.push(`import type { ${[...i].sort().join(", ")} } from "${e}";`);let re=[];G.forEach(e=>{re.push(ce(e))});let Q=`// AUTO-GENERATED by @bobtail.software/b-ssr. DO NOT EDIT.
|
|
10
|
+
/* eslint-disable */
|
|
11
|
+
|
|
12
|
+
`+(H.length>0?H.join(`
|
|
13
|
+
`)+`
|
|
14
|
+
|
|
15
|
+
`:"")+re.join(`
|
|
16
|
+
|
|
17
|
+
`);try{let e=await(0,le.resolveConfig)(U)||{};Q=await(0,le.format)(Q,{...e,parser:"typescript",filepath:U})}catch{}await(0,X.writeFile)(U,Q);let t=[],T=[];G.forEach(e=>{let r=e.type==="rpc"?"POST":"GET",a=e.type==="loader"?e.loaderUrl:e.rpcUrl;T.push({name:e.name,rpcUrl:a,method:r,isMultipart:!!e.isMultipart}),t.push({name:e.name,url:e.url,type:e.type,requiresArgs:!0})});let y=`
|
|
10
18
|
import { createClientRpc } from '@bobtail.software/b-ssr/client';
|
|
11
19
|
|
|
12
20
|
if (import.meta.env.DEV) {
|
|
13
|
-
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: ${w.default.basename(n)}');
|
|
14
22
|
}
|
|
15
23
|
|
|
16
|
-
${
|
|
24
|
+
${T.map(e=>`
|
|
17
25
|
export const ${e.name} = createClientRpc({
|
|
18
26
|
url: '${e.rpcUrl}',
|
|
19
27
|
method: '${e.method}',
|
|
@@ -21,17 +29,17 @@
|
|
|
21
29
|
});
|
|
22
30
|
`).join(`
|
|
23
31
|
`)}
|
|
24
|
-
`,
|
|
32
|
+
`,b=pe(t,n);$.set(w.default.resolve(n),{client:y,server:b})}catch(C){console.error(`[rpc-generator] Error al procesar ${n}:`,{error:C})}}let I=(n,o,s)=>{if(o.includes("node_modules")||o.startsWith(Y))return null;if(s?.ssr===!0&&/\.[cm]?[jt]sx?$/.test(o)){let F=/\brequire\s*\(/.test(n),C=/\bmodule\.exports\b/.test(n),m=/\bexports\./.test(n);if(F||C||m)return"import { createRequire } from 'module';"+`
|
|
25
33
|
const require = createRequire(import.meta.url);
|
|
26
34
|
const module = { exports: {} };
|
|
27
35
|
const exports = module.exports;
|
|
28
|
-
`+
|
|
29
|
-
export default module.exports;`}return null};function
|
|
36
|
+
`+n+`
|
|
37
|
+
export default module.exports;`}return null};function ce(n){let o=je(n),s="";return o.length>0&&(s=`args: { ${o.join("; ")} }`),s||(s="args: { signal?: AbortSignal }"),`export declare const ${n.name}: (${s}, ssrContext?: { req?: FastifyRequest, reply?: FastifyReply }) => ${n.returnType};`}function pe(n,o){if(n.length===0)return"";let s=w.default.relative(process.cwd(),o).replace(/\\/g,"/");return`
|
|
30
38
|
import path from 'path';
|
|
31
39
|
import { pathToFileURL } from 'url';
|
|
32
40
|
|
|
33
41
|
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
34
|
-
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: ${`./${w.default.relative(process.cwd(),o).replace(/\\/g,"/")}`}');
|
|
35
43
|
}
|
|
36
44
|
|
|
37
45
|
let initPromise;
|
|
@@ -45,7 +53,7 @@ export default module.exports;`}return null};function ie(t){let m=we(t),r="";ret
|
|
|
45
53
|
renderOptionsMap = new Map();
|
|
46
54
|
loaderApiOptionsMap = new Map();
|
|
47
55
|
const projectRoot = process.cwd();
|
|
48
|
-
const absolutePath = path.resolve(projectRoot, '${
|
|
56
|
+
const absolutePath = path.resolve(projectRoot, '${s}');
|
|
49
57
|
const serverModuleUrl = pathToFileURL(absolutePath).href;
|
|
50
58
|
|
|
51
59
|
if (typeof globalThis.require === 'undefined') {
|
|
@@ -93,46 +101,46 @@ export default module.exports;`}return null};function ie(t){let m=we(t),r="";ret
|
|
|
93
101
|
return initPromise;
|
|
94
102
|
}
|
|
95
103
|
|
|
96
|
-
${
|
|
104
|
+
${n.map(m=>{let k=[];m.requiresArgs&&k.push("args"),k.push("ssrContext");let q=m.requiresArgs?"args":"{}",L="";return m.type==="rpc"?L=`
|
|
97
105
|
if (fn.isMultipart) throw new Error('RPC multipart no soportado en SSR.');
|
|
98
106
|
await getOptionsMaps();
|
|
99
|
-
const options = rpcOptionsMap.get('${
|
|
100
|
-
if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${
|
|
101
|
-
const augmentedReq = Object.assign(Object.create(ssrContext.req), ${
|
|
107
|
+
const options = rpcOptionsMap.get('${m.url}');
|
|
108
|
+
if (!options?.handler) throw new Error('Handler no encontrado para RPC: ${m.name}');
|
|
109
|
+
const augmentedReq = Object.assign(Object.create(ssrContext.req), ${q});
|
|
102
110
|
return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
|
|
103
|
-
`:
|
|
111
|
+
`:m.type==="api"?L=`
|
|
104
112
|
await getOptionsMaps();
|
|
105
|
-
const options = loaderApiOptionsMap.get('${
|
|
113
|
+
const options = loaderApiOptionsMap.get('${m.url}');
|
|
106
114
|
if (!options?.handler) {
|
|
107
|
-
console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${
|
|
115
|
+
console.error('\u26A0\uFE0F [B-SSR Warning] Handler API no encontrado:', '${m.name}', 'URL:', '${m.url}');
|
|
108
116
|
return null;
|
|
109
117
|
}
|
|
110
|
-
const augmentedReq = Object.assign(Object.create(ssrContext.req), ${
|
|
118
|
+
const augmentedReq = Object.assign(Object.create(ssrContext.req), ${q});
|
|
111
119
|
return await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply);
|
|
112
|
-
`:
|
|
120
|
+
`:L=`
|
|
113
121
|
await getOptionsMaps();
|
|
114
|
-
const options = renderOptionsMap.get('${
|
|
122
|
+
const options = renderOptionsMap.get('${m.url}');
|
|
115
123
|
if (!options) return {};
|
|
116
|
-
const augmentedReq = Object.assign(Object.create(ssrContext.req), ${
|
|
124
|
+
const augmentedReq = Object.assign(Object.create(ssrContext.req), ${q});
|
|
117
125
|
let customData = {};
|
|
118
126
|
try {
|
|
119
127
|
if (options.handler) {
|
|
120
128
|
customData = (await options.handler.call(ssrContext.req.server, augmentedReq, ssrContext.reply)) || {};
|
|
121
129
|
}
|
|
122
130
|
} catch (handlerErr) {
|
|
123
|
-
console.error('\u274C [B-SSR Handler Error] ${
|
|
131
|
+
console.error('\u274C [B-SSR Handler Error] ${m.name}:', handlerErr);
|
|
124
132
|
return {};
|
|
125
133
|
}
|
|
126
134
|
if (ssrContext.reply.sent) return;
|
|
127
135
|
return { ...customData };
|
|
128
|
-
`,`export const ${
|
|
136
|
+
`,`export const ${m.name} = async (${k.join(", ")}) => {
|
|
129
137
|
try {
|
|
130
|
-
if (!ssrContext?.req) throw new Error('ssrContext requerido en ${
|
|
131
|
-
${
|
|
138
|
+
if (!ssrContext?.req) throw new Error('ssrContext requerido en ${m.name} (SSR)');
|
|
139
|
+
${L}
|
|
132
140
|
} catch (error) {
|
|
133
|
-
console.error('\u274C [B-SSR Error] ${
|
|
141
|
+
console.error('\u274C [B-SSR Error] ${m.name}:', error);
|
|
134
142
|
throw error;
|
|
135
143
|
}
|
|
136
144
|
};`}).join(`
|
|
137
145
|
`)}
|
|
138
|
-
`}async function
|
|
146
|
+
`}async function ne(){let n=await(0,be.default)(d,{absolute:!0});await Promise.all(n.map(o=>ee(o)))}return{name:"b-ssr-vite-plugin-rpc-universal-generator",enforce:"pre",async buildStart(){await ne()},configureServer(n){let o=s=>s.endsWith(".mts")||s.endsWith(".ts");n.watcher.on("add",s=>o(s)&&ee(s)),n.watcher.on("change",s=>o(s)&&ee(s)),n.watcher.on("unlink",s=>{if(o(s)){let F=w.default.resolve(s);$.delete(F),N.delete(F);let C=w.default.extname(s),m=s.substring(0,s.length-C.length)+".universal.d.ts";(0,X.unlink)(m).catch(()=>{})}})},async resolveId(n,o,s){if(n.startsWith(Y))return null;if(n.includes(".universal")){let F=n.split("?")[0],C=F;if(F.endsWith(".universal"))C=F;else if(F.endsWith(".universal.ts"))C=F.slice(0,-3);else if(F.endsWith(".universal.mts"))C=F.slice(0,-4);else if(F.endsWith(".universal.js"))C=F.slice(0,-3);else return null;let m=[".mts",".ts"];for(let k of m){let q=C.slice(0,-10)+k,L=await this.resolve(q,o,{skipSelf:!0});if(L){let V=s?.ssr?"?mode=ssr":"?mode=client";return Y+L.id+V}try{await(0,X.access)(q);let V=s?.ssr?"?mode=ssr":"?mode=client";return Y+q+V}catch{}}}return null},async load(n,o){if(n.startsWith(Y)){let s=n.slice(Y.length).split("?")[0],F=$.get(s);return F||(await ee(s),F=$.get(s)),F?o?.ssr===!0?F.server:F.client:null}if(o?.ssr!==!0){let s=w.default.resolve(n);if(N.has(s))return`throw new Error("\u{1F6A8} [B-SSR FIREWALL] BLOCKED: Backend File imported in Client: ${w.default.basename(n)}");`}return null},transform:I}}function je(u){let d=[];return u.paramsType!=="unknown"&&d.push(`params: ${u.paramsType}`),u.queryType!=="unknown"&&d.push(`query: ${u.queryType}`),u.bodyType!=="unknown"&&d.push(`body: ${u.bodyType}`),d.push("signal?: AbortSignal"),d}0&&(module.exports={generateRpcTypes,rpcGeneratorPlugin});
|