@lpdjs/firestore-repo-service 2.6.11 → 2.6.13
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/servers/hono/cli.cjs +258 -66
- package/dist/servers/hono/cli.cjs.map +1 -1
- package/dist/servers/hono/cli.js +258 -66
- package/dist/servers/hono/cli.js.map +1 -1
- package/dist/servers/hono/index.cjs +1 -1
- package/dist/servers/hono/index.cjs.map +1 -1
- package/dist/servers/hono/index.js +1 -1
- package/dist/servers/hono/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -239,7 +239,7 @@ import {Hono}from'hono';import {getRequestListener}from'@hono/node-server';impor
|
|
|
239
239
|
}
|
|
240
240
|
</script>
|
|
241
241
|
</body>
|
|
242
|
-
</html>`}function $(t){let e={};if(!t)return e;for(let n of t.split(";")){let r=n.indexOf("=");if(r===-1)continue;let s=n.slice(0,r).trim();if(!s)continue;let o=n.slice(r+1).trim();o.startsWith('"')&&o.endsWith('"')&&(o=o.slice(1,-1));try{e[s]=decodeURIComponent(o);}catch{e[s]=o;}}return e}function ke(t){let{getAuth:e,allow:n,checkRevoked:r=false,contextKey:s="docsUser"}=t;return async(o,a)=>{let c=(o.req.header("authorization")??o.req.header("Authorization"))?.match(/^Bearer\s+(.+)$/i);if(!c)return o.json({error:"Unauthorized"},401,{"WWW-Authenticate":"Bearer"});let u;try{u=await e().verifyIdToken(c[1],r);}catch{return o.json({error:"Unauthorized"},401,{"WWW-Authenticate":"Bearer"})}if(n){let p=false;try{p=await n(u);}catch{p=false;}if(!p)return o.json({error:"Forbidden"},403)}return o.set(s,u),a()}}function Oe(t){let{username:e,password:n,realm:r="Docs"}=t,s=`Basic ${btoa(`${e}:${n}`)}`;return async(o,a)=>{let i=o.req.header("authorization")??o.req.header("Authorization")??"";return Ce(i,s)?a():o.text("Unauthorized",401,{"WWW-Authenticate":`Basic realm="${r}"`})}}function Ce(t,e){if(t.length!==e.length)return false;let n=0;for(let r=0;r<t.length;r++)n|=t.charCodeAt(r)^e.charCodeAt(r);return n===0}function U(t){return typeof t=="object"&&t!==null&&t.__docsAuthExtension===true}var B="__login",oe="__session",Pe="__logout";function Ie(t){let e=t.split("?")[0].split("/").filter(Boolean);return e[e.length-1]??""}function se(t,e,n){let r=[`${t}=${e}`,"Path=/",`Max-Age=${n.maxAgeSeconds}`,"HttpOnly",`SameSite=${n.sameSite}`];return n.secure&&r.push("Secure"),r.join("; ")}function He(t,e){return !t||t.startsWith("/")||t.includes("://")||t.includes("\\")?e:t}function De(t){let{getAuth:e,apiKey:n,authDomain:r,mode:s="cookie",allow:o,providers:a=["password","google"],title:i="Docs sign-in",cookieName:c="__docs_session",sessionTtlDays:u=5,secureCookie:p=true,sameSite:l="Lax",contextKey:m="docsUser",onUnauthenticated:v="redirect",authEmulatorHost:x=process.env.FIREBASE_AUTH_EMULATOR_HOST}=t;if(!n||!r)throw new Error("[firebaseDocsAuth] `apiKey` and `authDomain` are required for the login page. Find both in the Firebase Console \u2192 Project Settings \u2192 General \u2192 Web app config.");async function f(d){if(!o)return true;try{return !!await o(d)}catch{return false}}return {__docsAuthExtension:true,middleware:async(d,y)=>{let T=e();if(s==="both"){let D=(d.req.header("authorization")??d.req.header("Authorization"))?.match(/^Bearer\s+(.+)$/i);if(D)try{let Y=await T.verifyIdToken(D[1],!1);if(await f(Y))return d.set(m,Y),y()}catch{}}let w=$(d.req.header("cookie")??"")[c];if(w)try{let A=await T.verifySessionCookie(w,!1);if(await f(A))return d.set(m,A),y()}catch{}let H=d.req.header("accept")??"",j=d.req.method==="GET"&&H.includes("text/html");if(v==="redirect"&&j){let A=encodeURIComponent(Ie(d.req.path)||"docs");return d.redirect(`${B}?next=${A}`,302)}return d.json({error:"Unauthorized"},401)},loginName:B,routes:[{method:"GET",name:B,handler:async d=>{let y=He(d.req.query("next"),"docs"),T=d.req.query("error")??null,h=re({title:i,providers:a,apiKey:n,authDomain:r,sessionPath:oe,next:y,error:T,authEmulatorHost:x});return d.html(h,200,{"Cache-Control":"no-store"})}},{method:"POST",name:oe,handler:async d=>{let y="";try{let h=await d.req.json();y=typeof h.idToken=="string"?h.idToken:"";}catch{y="";}if(!y)return d.json({success:false,error:"Missing idToken"},400);let T=u*24*60*60*1e3;try{let h=e(),w=await h.verifyIdToken(y,!0);if(!await f(w))return d.json({success:!1,error:"Forbidden"},403);let H=w.auth_time,j=typeof H=="number"?H*1e3:Date.now();if(Date.now()-j>300*1e3)return d.json({success:!1,error:"Recent sign-in required"},401);let A=await h.createSessionCookie(y,{expiresIn:T}),D=se(c,encodeURIComponent(A),{maxAgeSeconds:Math.floor(T/1e3),secure:p,sameSite:l});return d.header("Set-Cookie",D),d.json({success:!0})}catch(h){let w=h instanceof Error?h.message:"Invalid idToken";return d.json({success:false,error:w},401)}}},{method:"POST",name:Pe,handler:async d=>{let T=$(d.req.header("cookie")??"")[c];if(T)try{let h=e(),w=await h.verifySessionCookie(T,!1);await h.revokeRefreshTokens(w.uid);}catch{}return d.header("Set-Cookie",se(c,"",{maxAgeSeconds:0,secure:p,sameSite:l})),d.json({success:true})}}]}}var M=new AsyncLocalStorage,ze=Object.freeze({get c(){let t=M.getStore();if(!t)throw new Error("[services] requestContext.c was accessed outside of a request. Wrap non-HTTP code paths (cron, triggers, scripts, tests) in `withRequestContext({ c }, () => ...)` to supply a Hono Context.");return t.c},get maybeC(){return M.getStore()?.c}});function N(){return async(t,e)=>{await M.run({c:t},async()=>{await e();});}}function je(t,e){return M.run({c:t.c},async()=>e())}var I="ctx";function Fe(t){let e=new Map,n=[],r=new Proxy({},{get(s,o){if(typeof o!="string")return;if(o===I)return ze;if(e.has(o))return e.get(o);let a=t[o];if(typeof a!="function")throw new Error(`[services] unknown service "${o}". Registered: ${[I,...Object.keys(t)].join(", ")}`);if(n.includes(o))throw new Error(`[services] circular dependency detected: ${[...n,o].join(" \u2192 ")}`);n.push(o);try{let i=Le(a)?new a(r):a(r);return e.set(o,i),i}finally{n.pop();}},has(s,o){return typeof o!="string"?false:o===I||o in t},ownKeys(){return [I,...Object.keys(t)]},getOwnPropertyDescriptor(s,o){if(typeof o=="string"&&(o===I||o in t))return {enumerable:true,configurable:true}}});return r}function Le(t){return /^class[\s{]/.test(Function.prototype.toString.call(t))}var $e=Object.freeze({}),C=class{constructor(e){this.cachedSpec=null;this.options=e,this.app=new Hono,this.mountedRoutes=Ne(e.routes,e.api),e.services&&this.app.use("*",N());let n=[...e.middlewares??[],...e.globalMiddlewares??[]];for(let r of n)this.app.use("*",r);this.mountRoutes(),this.mountOpenApi(),e.notFound&&this.app.notFound(e.notFound),e.onError&&this.app.onError(e.onError);}get hono(){return this.app}get nodeHandler(){return getRequestListener(this.app.fetch,{overrideGlobalObjects:false})}toFunction(e,n){let r=this.nodeHandler;return n?e(n,r):e(r)}buildOpenApiSpec(){if(this.cachedSpec)return this.cachedSpec;if(!this.options.openapi)throw new Error("[HonoServer] openapi config not set");return this.cachedSpec=F(this.mountedRoutes,this.options.basePath??"",this.options.openapi,Ue(this.options.interceptor)),this.cachedSpec}mountRoutes(){let e=this.options.basePath??"",n=this.options.validateOutput??false,r=this.options.verbose??false;for(let s of this.mountedRoutes){if(!s.path)throw new Error(`[HonoServer] route "${s.method.toUpperCase()} (no path)" \u2014 missing \`path\`. Run the codegen so the path is derived from the file location, or set it explicitly.`);let o=z(e,s.path),a=s.middlewares??[],i=s.source??(s.method==="get"?"query":"json"),c=Ke(s,i,n,Be(this.options.interceptor),this.options.services,this.options.errorHandler,this.options.logger),u=s.method.toUpperCase();this.app.on(u,[o],...a,c),r&&console.log(`[HonoServer] ${s.method.toUpperCase().padEnd(6)} ${o}`);}}mountOpenApi(){let e=this.options.openapi;if(!e)return;let n=e.path??"/openapi.json",r=e.docsPath===void 0?"/docs":e.docsPath,s=z(this.options.basePath??"",n),o=r===false?null:z(this.options.basePath??"",r),a;if(U(e.docsAuth)){let i=e.docsAuth;a=[i.middleware];let c=Ze(o??s);for(let u of i.routes)this.app.on(u.method,[z(c,u.name)],u.handler);}else a=e.docsAuth?Array.isArray(e.docsAuth)?e.docsAuth:[e.docsAuth]:[];if(this.app.on("GET",[s],...a,i=>i.json(this.buildOpenApiSpec())),o){let i=Ge(o,s);this.app.on("GET",[o],...a,c=>c.html(L(i,e.info.title)));}}};function ie(t){return typeof t=="object"&&t!==null&&typeof t.handler=="function"}function Be(t){if(t)return ie(t)?t.handler:t}function Ue(t){return ie(t)?t:void 0}function Ne(t,e){return e?t.filter(n=>Array.isArray(n.api)?n.api.includes(e):n.api===e):t.slice()}function z(t,e){let n=t.endsWith("/")?t.slice(0,-1):t,r=e.startsWith("/")?e:`/${e}`,s=`${n}${r}`;return s===""?"/":s}function Ze(t){let e=t.lastIndexOf("/");return e<=0?"":t.slice(0,e)}function Ge(t,e){let n=t.split("/").filter(Boolean),r=e.split("/").filter(Boolean);n.pop();let s=0;for(;s<n.length&&s<r.length&&n[s]===r[s];)s++;let o=n.length-s;return [...Array(o).fill(".."),...r.slice(s)].join("/")||"./"}function Ke(t,e,n,r,s,o,a){let i=t.input,c=t.output,u=t.status??200,p=s??$e;return async l=>{let m=async f=>{if(o){let g=await o.handle({error:f,c:l,route:t,services:p,logger:a});if(g)return g}return P(l,f)},v=async()=>{let f;if(i){let S;try{S=await We(l,e,t.method);}catch(b){throw new k(b instanceof Error?b.message:String(b))}let R=i.safeParse(S);if(!R.success)throw new E(R.error,e);f=R.data;}let g=await t.handler({input:f,c:l,services:p,errorHandler:o,logger:a});if(n&&c&&!(g instanceof Response)){let S=c.safeParse(g);if(!S.success)throw new O(S.error);return S.data}return g},x;if(r)try{x=await r({next:v,route:t,c:l,services:p,errorHandler:o,logger:a});}catch(f){let g=await m(f);if(g)return g;throw f}else try{x=await v();}catch(f){let g=await m(f);if(g)return g;throw f}return x instanceof Response?x:l.json(x,u)}}async function We(t,e,n){switch(e){case "json":{if(n==="get")return t.req.query();let r=await t.req.text();if(!r)return {};try{return JSON.parse(r)}catch(s){throw new Error(`Invalid JSON body: ${s instanceof Error?s.message:String(s)}`)}}case "query":return t.req.query();case "form":return await t.req.parseBody();case "param":return t.req.param();default:return {}}}var Z=class{constructor(e){this.services=e;}};function G(t,e){return {...e,input:t.input,output:t.output,handler:({input:n,services:r})=>new t(r).execute(n)}}function Je(t,e){let n=e?.services,r=e?.errorHandler,s=e?.logger;return {configs:t,defineRoute(o){return o},useCaseRoute(o,a){return G(o,a)},serverFor(o,a){let i=t[o];if(!i)throw new Error(`[ApiRegistry] unknown api "${o}". Registered: ${Object.keys(t).join(", ")}`);return new C({...i,api:o,routes:a,services:n,errorHandler:i.errorHandler??r,logger:i.logger??s})},toFunctions(o,a,i){let c={};for(let u of Object.keys(t)){let p={...i?.defaults??{},...i?.per?.[u]??{}},l=new C({...t[u],api:u,routes:o,services:n,errorHandler:t[u].errorHandler??r,logger:t[u].logger??s});c[u]=Object.keys(p).length?l.toFunction(a,p):l.toFunction(a);}return c}}}function ae(t){return t||process.env.GOOGLE_CLOUD_PROJECT||process.env.GCLOUD_PROJECT||process.env.GCP_PROJECT||void 0}function K(t,e={}){if(!e.enabled||!t)return;let n=ae(e.projectId);if(!n)return;let s=`jsonPayload.${e.field??"errorId"}="${t}"`,o=[`query=${encodeURIComponent(s)}`];return e.duration&&o.push(`duration=${encodeURIComponent(e.duration)}`),`https://console.cloud.google.com/logs/query;${o.join(";")}?project=${encodeURIComponent(n)}`}var W=class{constructor(e={}){this.options=e;}gcpLogsUrl(e){return K(e,this.options.gcpLogs)}async handle(e){let n=await this.mapError(e);return n?(this.logError(e,n),n):this.handleBuiltin(e)}mapError(e){return null}logError(e,n){}handleBuiltin(e){return P(e.c,e.error)}};var J=class t{info(e,n){this.write("INFO",this.payload(e,n));}warn(e,n){this.write("WARNING",this.payload(e,n));}debug(e,n){this.write("DEBUG",this.payload(e,n));}error(e,n){let r=t.errorId(e);return this.write("ERROR",{errorId:r,message:e instanceof Error?e.message:String(e),...e instanceof Error&&e.stack?{stack:e.stack}:{},...n!==void 0?{meta:n}:{}}),r}payload(e,n){return n!==void 0?{message:e,meta:n}:{message:e}}write(e,n){let r={severity:e,...n};e==="ERROR"?console.error(r):e==="WARNING"?console.warn(r):console.log(r);}static errorId(e){return e&&typeof e=="object"&&"errorId"in e&&typeof e.errorId=="string"?e.errorId:Math.random().toString(36).slice(2,12)}};var ue={skipSegments:["useCases","useCase","use-cases","use-case"],casing:"preserve"};function V(t,e=ue){let n=new Set(e.skipSegments.map(s=>s.toLowerCase()));return "/"+t.split("/").filter(Boolean).filter(s=>!n.has(s.toLowerCase())).map(s=>e.casing==="kebab"?Ve(s):s).join("/")}function Ve(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase()}function X(t,e,n){let r=ce(t),s=ce(e),o=0;for(;o<r.length&&o<s.length&&r[o]===s[o];)o++;let a=r.length-o,i=s.slice(o),u=(i[i.length-1]??"").replace(/\.[mc]?[tj]sx?$/i,""),p=n===""?u:`${u}${n}`;return i[i.length-1]=p,(a===0?"./":"../".repeat(a))+i.join("/")}function ce(t){return t.replace(/\\/g,"/").replace(/\/+$/,"").split("/").filter((n,r)=>!(r===0&&n===""))}var de={routesFile:"routes.ts",excludeSegments:["node_modules","__generated__","tests","__tests__",".turbo","dist","build",".next"]};function nt(t,e=de){let n=[];return pe(t,t,e,n),n.sort((r,s)=>r.relPath.localeCompare(s.relPath)),n}function pe(t,e,n,r){let s;try{s=readdirSync(e);}catch{return}for(let o of s){if(n.excludeSegments.includes(o))continue;let a=join(e,o),i;try{i=statSync(a);}catch{continue}if(i.isDirectory())pe(t,a,n,r);else if(i.isFile()&&o===n.routesFile){let c=relative(t,a).split(sep).join("/"),u=c.replace(/\/?[^/]+$/,"");r.push({absPath:a,relPath:c,relDir:u});}}}var le="/**\n * AUTO-GENERATED by `@lpdjs/firestore-repo-service` Hono codegen.\n * Do not edit by hand \u2014 re-run `hono:gen` after adding / removing route files.\n */\n";function fe(t,e){let n=dirname(e.outFile);mkdirSync(n,{recursive:true});let r=e.banner??le,s=(e.now??new Date).toISOString(),o=e.importExtension,a=[],i=[],c=[];t.forEach((p,l)=>{let m=X(n,p.absPath,o),v=V(p.relDir,e.derive);a.push(`import mod${l} from ${JSON.stringify(m)};`),i.push(` { __derivedPath: ${JSON.stringify(v)}, mod: mod${l} },`),c.push({source:p.relPath,url:v});});let u=`${r}// Generated at ${s} \u2014 ${t.length} route file${t.length===1?"":"s"}.
|
|
242
|
+
</html>`}function $(t){let e={};if(!t)return e;for(let n of t.split(";")){let r=n.indexOf("=");if(r===-1)continue;let s=n.slice(0,r).trim();if(!s)continue;let o=n.slice(r+1).trim();o.startsWith('"')&&o.endsWith('"')&&(o=o.slice(1,-1));try{e[s]=decodeURIComponent(o);}catch{e[s]=o;}}return e}function ke(t){let{getAuth:e,allow:n,checkRevoked:r=false,contextKey:s="docsUser"}=t;return async(o,a)=>{let c=(o.req.header("authorization")??o.req.header("Authorization"))?.match(/^Bearer\s+(.+)$/i);if(!c)return o.json({error:"Unauthorized"},401,{"WWW-Authenticate":"Bearer"});let u;try{u=await e().verifyIdToken(c[1],r);}catch{return o.json({error:"Unauthorized"},401,{"WWW-Authenticate":"Bearer"})}if(n){let p=false;try{p=await n(u);}catch{p=false;}if(!p)return o.json({error:"Forbidden"},403)}return o.set(s,u),a()}}function Oe(t){let{username:e,password:n,realm:r="Docs"}=t,s=`Basic ${btoa(`${e}:${n}`)}`;return async(o,a)=>{let i=o.req.header("authorization")??o.req.header("Authorization")??"";return Ce(i,s)?a():o.text("Unauthorized",401,{"WWW-Authenticate":`Basic realm="${r}"`})}}function Ce(t,e){if(t.length!==e.length)return false;let n=0;for(let r=0;r<t.length;r++)n|=t.charCodeAt(r)^e.charCodeAt(r);return n===0}function U(t){return typeof t=="object"&&t!==null&&t.__docsAuthExtension===true}var B="__login",oe="__session",Pe="__logout";function Ie(t){let e=t.split("?")[0].split("/").filter(Boolean);return e[e.length-1]??""}function se(t,e,n){let r=[`${t}=${e}`,"Path=/",`Max-Age=${n.maxAgeSeconds}`,"HttpOnly",`SameSite=${n.sameSite}`];return n.secure&&r.push("Secure"),r.join("; ")}function He(t,e){return !t||t.startsWith("/")||t.includes("://")||t.includes("\\")?e:t}function De(t){let{getAuth:e,apiKey:n,authDomain:r,mode:s="cookie",allow:o,providers:a=["password","google"],title:i="Docs sign-in",cookieName:c="__docs_session",sessionTtlDays:u=5,secureCookie:p=true,sameSite:l="Lax",contextKey:m="docsUser",onUnauthenticated:v="redirect",authEmulatorHost:x=process.env.FIREBASE_AUTH_EMULATOR_HOST}=t;async function f(d){if(!o)return true;try{return !!await o(d)}catch{return false}}return {__docsAuthExtension:true,middleware:async(d,y)=>{let T=e();if(s==="both"){let D=(d.req.header("authorization")??d.req.header("Authorization"))?.match(/^Bearer\s+(.+)$/i);if(D)try{let Y=await T.verifyIdToken(D[1],!1);if(await f(Y))return d.set(m,Y),y()}catch{}}let w=$(d.req.header("cookie")??"")[c];if(w)try{let A=await T.verifySessionCookie(w,!1);if(await f(A))return d.set(m,A),y()}catch{}let H=d.req.header("accept")??"",j=d.req.method==="GET"&&H.includes("text/html");if(v==="redirect"&&j){let A=encodeURIComponent(Ie(d.req.path)||"docs");return d.redirect(`${B}?next=${A}`,302)}return d.json({error:"Unauthorized"},401)},loginName:B,routes:[{method:"GET",name:B,handler:async d=>{if(!n||!r)throw new Error("[firebaseDocsAuth] `apiKey` and `authDomain` are required for the login page. Find both in the Firebase Console \u2192 Project Settings \u2192 General \u2192 Web app config.");let y=He(d.req.query("next"),"docs"),T=d.req.query("error")??null,h=re({title:i,providers:a,apiKey:n,authDomain:r,sessionPath:oe,next:y,error:T,authEmulatorHost:x});return d.html(h,200,{"Cache-Control":"no-store"})}},{method:"POST",name:oe,handler:async d=>{let y="";try{let h=await d.req.json();y=typeof h.idToken=="string"?h.idToken:"";}catch{y="";}if(!y)return d.json({success:false,error:"Missing idToken"},400);let T=u*24*60*60*1e3;try{let h=e(),w=await h.verifyIdToken(y,!0);if(!await f(w))return d.json({success:!1,error:"Forbidden"},403);let H=w.auth_time,j=typeof H=="number"?H*1e3:Date.now();if(Date.now()-j>300*1e3)return d.json({success:!1,error:"Recent sign-in required"},401);let A=await h.createSessionCookie(y,{expiresIn:T}),D=se(c,encodeURIComponent(A),{maxAgeSeconds:Math.floor(T/1e3),secure:p,sameSite:l});return d.header("Set-Cookie",D),d.json({success:!0})}catch(h){let w=h instanceof Error?h.message:"Invalid idToken";return d.json({success:false,error:w},401)}}},{method:"POST",name:Pe,handler:async d=>{let T=$(d.req.header("cookie")??"")[c];if(T)try{let h=e(),w=await h.verifySessionCookie(T,!1);await h.revokeRefreshTokens(w.uid);}catch{}return d.header("Set-Cookie",se(c,"",{maxAgeSeconds:0,secure:p,sameSite:l})),d.json({success:true})}}]}}var M=new AsyncLocalStorage,ze=Object.freeze({get c(){let t=M.getStore();if(!t)throw new Error("[services] requestContext.c was accessed outside of a request. Wrap non-HTTP code paths (cron, triggers, scripts, tests) in `withRequestContext({ c }, () => ...)` to supply a Hono Context.");return t.c},get maybeC(){return M.getStore()?.c}});function N(){return async(t,e)=>{await M.run({c:t},async()=>{await e();});}}function je(t,e){return M.run({c:t.c},async()=>e())}var I="ctx";function Fe(t){let e=new Map,n=[],r=new Proxy({},{get(s,o){if(typeof o!="string")return;if(o===I)return ze;if(e.has(o))return e.get(o);let a=t[o];if(typeof a!="function")throw new Error(`[services] unknown service "${o}". Registered: ${[I,...Object.keys(t)].join(", ")}`);if(n.includes(o))throw new Error(`[services] circular dependency detected: ${[...n,o].join(" \u2192 ")}`);n.push(o);try{let i=Le(a)?new a(r):a(r);return e.set(o,i),i}finally{n.pop();}},has(s,o){return typeof o!="string"?false:o===I||o in t},ownKeys(){return [I,...Object.keys(t)]},getOwnPropertyDescriptor(s,o){if(typeof o=="string"&&(o===I||o in t))return {enumerable:true,configurable:true}}});return r}function Le(t){return /^class[\s{]/.test(Function.prototype.toString.call(t))}var $e=Object.freeze({}),C=class{constructor(e){this.cachedSpec=null;this.options=e,this.app=new Hono,this.mountedRoutes=Ne(e.routes,e.api),e.services&&this.app.use("*",N());let n=[...e.middlewares??[],...e.globalMiddlewares??[]];for(let r of n)this.app.use("*",r);this.mountRoutes(),this.mountOpenApi(),e.notFound&&this.app.notFound(e.notFound),e.onError&&this.app.onError(e.onError);}get hono(){return this.app}get nodeHandler(){return getRequestListener(this.app.fetch,{overrideGlobalObjects:false})}toFunction(e,n){let r=this.nodeHandler;return n?e(n,r):e(r)}buildOpenApiSpec(){if(this.cachedSpec)return this.cachedSpec;if(!this.options.openapi)throw new Error("[HonoServer] openapi config not set");return this.cachedSpec=F(this.mountedRoutes,this.options.basePath??"",this.options.openapi,Ue(this.options.interceptor)),this.cachedSpec}mountRoutes(){let e=this.options.basePath??"",n=this.options.validateOutput??false,r=this.options.verbose??false;for(let s of this.mountedRoutes){if(!s.path)throw new Error(`[HonoServer] route "${s.method.toUpperCase()} (no path)" \u2014 missing \`path\`. Run the codegen so the path is derived from the file location, or set it explicitly.`);let o=z(e,s.path),a=s.middlewares??[],i=s.source??(s.method==="get"?"query":"json"),c=Ke(s,i,n,Be(this.options.interceptor),this.options.services,this.options.errorHandler,this.options.logger),u=s.method.toUpperCase();this.app.on(u,[o],...a,c),r&&console.log(`[HonoServer] ${s.method.toUpperCase().padEnd(6)} ${o}`);}}mountOpenApi(){let e=this.options.openapi;if(!e)return;let n=e.path??"/openapi.json",r=e.docsPath===void 0?"/docs":e.docsPath,s=z(this.options.basePath??"",n),o=r===false?null:z(this.options.basePath??"",r),a;if(U(e.docsAuth)){let i=e.docsAuth;a=[i.middleware];let c=Ze(o??s);for(let u of i.routes)this.app.on(u.method,[z(c,u.name)],u.handler);}else a=e.docsAuth?Array.isArray(e.docsAuth)?e.docsAuth:[e.docsAuth]:[];if(this.app.on("GET",[s],...a,i=>i.json(this.buildOpenApiSpec())),o){let i=Ge(o,s);this.app.on("GET",[o],...a,c=>c.html(L(i,e.info.title)));}}};function ie(t){return typeof t=="object"&&t!==null&&typeof t.handler=="function"}function Be(t){if(t)return ie(t)?t.handler:t}function Ue(t){return ie(t)?t:void 0}function Ne(t,e){return e?t.filter(n=>Array.isArray(n.api)?n.api.includes(e):n.api===e):t.slice()}function z(t,e){let n=t.endsWith("/")?t.slice(0,-1):t,r=e.startsWith("/")?e:`/${e}`,s=`${n}${r}`;return s===""?"/":s}function Ze(t){let e=t.lastIndexOf("/");return e<=0?"":t.slice(0,e)}function Ge(t,e){let n=t.split("/").filter(Boolean),r=e.split("/").filter(Boolean);n.pop();let s=0;for(;s<n.length&&s<r.length&&n[s]===r[s];)s++;let o=n.length-s;return [...Array(o).fill(".."),...r.slice(s)].join("/")||"./"}function Ke(t,e,n,r,s,o,a){let i=t.input,c=t.output,u=t.status??200,p=s??$e;return async l=>{let m=async f=>{if(o){let g=await o.handle({error:f,c:l,route:t,services:p,logger:a});if(g)return g}return P(l,f)},v=async()=>{let f;if(i){let S;try{S=await We(l,e,t.method);}catch(b){throw new k(b instanceof Error?b.message:String(b))}let R=i.safeParse(S);if(!R.success)throw new E(R.error,e);f=R.data;}let g=await t.handler({input:f,c:l,services:p,errorHandler:o,logger:a});if(n&&c&&!(g instanceof Response)){let S=c.safeParse(g);if(!S.success)throw new O(S.error);return S.data}return g},x;if(r)try{x=await r({next:v,route:t,c:l,services:p,errorHandler:o,logger:a});}catch(f){let g=await m(f);if(g)return g;throw f}else try{x=await v();}catch(f){let g=await m(f);if(g)return g;throw f}return x instanceof Response?x:l.json(x,u)}}async function We(t,e,n){switch(e){case "json":{if(n==="get")return t.req.query();let r=await t.req.text();if(!r)return {};try{return JSON.parse(r)}catch(s){throw new Error(`Invalid JSON body: ${s instanceof Error?s.message:String(s)}`)}}case "query":return t.req.query();case "form":return await t.req.parseBody();case "param":return t.req.param();default:return {}}}var Z=class{constructor(e){this.services=e;}};function G(t,e){return {...e,input:t.input,output:t.output,handler:({input:n,services:r})=>new t(r).execute(n)}}function Je(t,e){let n=e?.services,r=e?.errorHandler,s=e?.logger;return {configs:t,defineRoute(o){return o},useCaseRoute(o,a){return G(o,a)},serverFor(o,a){let i=t[o];if(!i)throw new Error(`[ApiRegistry] unknown api "${o}". Registered: ${Object.keys(t).join(", ")}`);return new C({...i,api:o,routes:a,services:n,errorHandler:i.errorHandler??r,logger:i.logger??s})},toFunctions(o,a,i){let c={};for(let u of Object.keys(t)){let p={...i?.defaults??{},...i?.per?.[u]??{}},l=new C({...t[u],api:u,routes:o,services:n,errorHandler:t[u].errorHandler??r,logger:t[u].logger??s});c[u]=Object.keys(p).length?l.toFunction(a,p):l.toFunction(a);}return c}}}function ae(t){return t||process.env.GOOGLE_CLOUD_PROJECT||process.env.GCLOUD_PROJECT||process.env.GCP_PROJECT||void 0}function K(t,e={}){if(!e.enabled||!t)return;let n=ae(e.projectId);if(!n)return;let s=`jsonPayload.${e.field??"errorId"}="${t}"`,o=[`query=${encodeURIComponent(s)}`];return e.duration&&o.push(`duration=${encodeURIComponent(e.duration)}`),`https://console.cloud.google.com/logs/query;${o.join(";")}?project=${encodeURIComponent(n)}`}var W=class{constructor(e={}){this.options=e;}gcpLogsUrl(e){return K(e,this.options.gcpLogs)}async handle(e){let n=await this.mapError(e);return n?(this.logError(e,n),n):this.handleBuiltin(e)}mapError(e){return null}logError(e,n){}handleBuiltin(e){return P(e.c,e.error)}};var J=class t{info(e,n){this.write("INFO",this.payload(e,n));}warn(e,n){this.write("WARNING",this.payload(e,n));}debug(e,n){this.write("DEBUG",this.payload(e,n));}error(e,n){let r=t.errorId(e);return this.write("ERROR",{errorId:r,message:e instanceof Error?e.message:String(e),...e instanceof Error&&e.stack?{stack:e.stack}:{},...n!==void 0?{meta:n}:{}}),r}payload(e,n){return n!==void 0?{message:e,meta:n}:{message:e}}write(e,n){let r={severity:e,...n};e==="ERROR"?console.error(r):e==="WARNING"?console.warn(r):console.log(r);}static errorId(e){return e&&typeof e=="object"&&"errorId"in e&&typeof e.errorId=="string"?e.errorId:Math.random().toString(36).slice(2,12)}};var ue={skipSegments:["useCases","useCase","use-cases","use-case"],casing:"preserve"};function V(t,e=ue){let n=new Set(e.skipSegments.map(s=>s.toLowerCase()));return "/"+t.split("/").filter(Boolean).filter(s=>!n.has(s.toLowerCase())).map(s=>e.casing==="kebab"?Ve(s):s).join("/")}function Ve(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase()}function X(t,e,n){let r=ce(t),s=ce(e),o=0;for(;o<r.length&&o<s.length&&r[o]===s[o];)o++;let a=r.length-o,i=s.slice(o),u=(i[i.length-1]??"").replace(/\.[mc]?[tj]sx?$/i,""),p=n===""?u:`${u}${n}`;return i[i.length-1]=p,(a===0?"./":"../".repeat(a))+i.join("/")}function ce(t){return t.replace(/\\/g,"/").replace(/\/+$/,"").split("/").filter((n,r)=>!(r===0&&n===""))}var de={routesFile:"routes.ts",excludeSegments:["node_modules","__generated__","tests","__tests__",".turbo","dist","build",".next"]};function nt(t,e=de){let n=[];return pe(t,t,e,n),n.sort((r,s)=>r.relPath.localeCompare(s.relPath)),n}function pe(t,e,n,r){let s;try{s=readdirSync(e);}catch{return}for(let o of s){if(n.excludeSegments.includes(o))continue;let a=join(e,o),i;try{i=statSync(a);}catch{continue}if(i.isDirectory())pe(t,a,n,r);else if(i.isFile()&&o===n.routesFile){let c=relative(t,a).split(sep).join("/"),u=c.replace(/\/?[^/]+$/,"");r.push({absPath:a,relPath:c,relDir:u});}}}var le="/**\n * AUTO-GENERATED by `@lpdjs/firestore-repo-service` Hono codegen.\n * Do not edit by hand \u2014 re-run `hono:gen` after adding / removing route files.\n */\n";function fe(t,e){let n=dirname(e.outFile);mkdirSync(n,{recursive:true});let r=e.banner??le,s=(e.now??new Date).toISOString(),o=e.importExtension,a=[],i=[],c=[];t.forEach((p,l)=>{let m=X(n,p.absPath,o),v=V(p.relDir,e.derive);a.push(`import mod${l} from ${JSON.stringify(m)};`),i.push(` { __derivedPath: ${JSON.stringify(v)}, mod: mod${l} },`),c.push({source:p.relPath,url:v});});let u=`${r}// Generated at ${s} \u2014 ${t.length} route file${t.length===1?"":"s"}.
|
|
243
243
|
|
|
244
244
|
import type { AnyRouteDef, RouteModuleDefault } from "@lpdjs/firestore-repo-service/servers/hono";
|
|
245
245
|
|