@lpdjs/firestore-repo-service 2.2.6 → 2.2.7

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.
Files changed (37) hide show
  1. package/dist/{create-servers-DmggzSb3.d.cts → create-servers-B3Ls46bx.d.cts} +3 -3
  2. package/dist/{create-servers-D4-NGpKm.d.ts → create-servers-CvVZnihM.d.ts} +3 -3
  3. package/dist/history/index.cjs +2 -0
  4. package/dist/history/index.cjs.map +1 -0
  5. package/dist/history/index.d.cts +127 -0
  6. package/dist/history/index.d.ts +127 -0
  7. package/dist/history/index.js +2 -0
  8. package/dist/history/index.js.map +1 -0
  9. package/dist/{index-DpD4DEqH.d.cts → index-Cw9b1crP.d.cts} +1 -1
  10. package/dist/{index-Cvip2Sgt.d.ts → index-DGB3Oemk.d.ts} +1 -1
  11. package/dist/index.cjs +120 -102
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +19 -10
  14. package/dist/index.d.ts +19 -10
  15. package/dist/index.js +120 -102
  16. package/dist/index.js.map +1 -1
  17. package/dist/{openapi-B3P2F8op.d.ts → openapi-BEf4OuG9.d.ts} +1 -1
  18. package/dist/{openapi-UJJ1aCFk.d.cts → openapi-D8UTm0lu.d.cts} +1 -1
  19. package/dist/read-DMvxeFCg.d.cts +232 -0
  20. package/dist/read-DMvxeFCg.d.ts +232 -0
  21. package/dist/servers/admin/index.cjs +31 -13
  22. package/dist/servers/admin/index.cjs.map +1 -1
  23. package/dist/servers/admin/index.d.cts +4 -2
  24. package/dist/servers/admin/index.d.ts +4 -2
  25. package/dist/servers/admin/index.js +31 -13
  26. package/dist/servers/admin/index.js.map +1 -1
  27. package/dist/servers/crud/index.d.cts +6 -4
  28. package/dist/servers/crud/index.d.ts +6 -4
  29. package/dist/servers/index.cjs +33 -15
  30. package/dist/servers/index.cjs.map +1 -1
  31. package/dist/servers/index.d.cts +6 -5
  32. package/dist/servers/index.d.ts +6 -5
  33. package/dist/servers/index.js +33 -15
  34. package/dist/servers/index.js.map +1 -1
  35. package/dist/{types-Z9Qy8Xmx.d.ts → types-CE1dws32.d.cts} +20 -3
  36. package/dist/{types-Z9Qy8Xmx.d.cts → types-CjexXskS.d.ts} +20 -3
  37. package/package.json +14 -1
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {z as z$1}from'zod';import {renderToString}from'hono/jsx/dom/server';import {Timestamp}from'firebase-admin/firestore';var An=Object.defineProperty;var Me=(e,t)=>()=>(e&&(t=e(e=0)),t);var En=(e,t)=>{for(var n in t)An(e,n,{get:t[n],enumerable:true});};function q(e){let t=e,n=t._zod?.def?.type;if(n)return In[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function U(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function Ot(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Tt(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function Q(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function Ae(e){let t=e;return Array.isArray(t.options)?t.options:t._zod?.def?.entries?Object.values(t._zod.def.entries):Array.isArray(t._def?.values)?t._def.values:[]}function Ee(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function Ue(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function At(e){let t=e,n=[],r=t._zod?.def?.checks;if(Array.isArray(r)){for(let o of r)o.format&&n.push(o.format);if(n.length>0)return n}let s=t._def?.checks;if(Array.isArray(s))for(let o of s)o.kind&&n.push(o.kind);return n}var In,Pe=Me(()=>{In={string:"ZodString",number:"ZodNumber",bigint:"ZodBigInt",boolean:"ZodBoolean",date:"ZodDate",enum:"ZodEnum",nativeEnum:"ZodNativeEnum",literal:"ZodLiteral",object:"ZodObject",array:"ZodArray",optional:"ZodOptional",nullable:"ZodNullable",default:"ZodDefault",coerce:"ZodCoerce",union:"ZodUnion",undefined:"ZodUndefined",unknown:"ZodUnknown",any:"ZodAny",record:"ZodRecord"};});function Ut({val:e}){return jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function Un({message:e}){return jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function Se({val:e,mismatch:t}){let n=Ln(e);return t?jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsx(Un,{message:t})]}):n}function Ln(e){if(e==null)return jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsx(Ut,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsx(Ut,{val:e.toDate()});if(typeof e=="number")return jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxs("li",{class:"text-base-content/40 italic",children:["+",e.length-8," more\u2026"]})]});if(typeof e=="object"&&e!==null){let n=Object.entries(e);return n.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxs("dl",{class:"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-xs m-0",children:[n.slice(0,8).map(([r,s])=>jsxs(Fragment,{children:[jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsx("dd",{class:"break-all",children:String(s??"")})]})),n.length>8&&jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsx("span",{class:"text-sm break-all",children:t})}var Ke=Me(()=>{});function ke(e){if(!e)return "unknown";let t=Xe(e);switch(q(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function Xe(e){let t=q(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=U(e);return n?Xe(n):e}return e}function $e(e,t){if(!e)return;let n=t.split("."),r=e;for(let s of n){if(!r)return;let o=Xe(r);if(q(o)!=="ZodObject")return;r=Q(o)[s];}return r}function Gn(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function De(e,t){if(e==="unknown")return null;let n=Gn(t);return n==="null"?null:e==="enum"||e==="literal"?n==="string"||n==="number"?null:`Expected ${e} (string/number), got ${n}`:e===n||e==="number"&&n==="bigint"||e==="bigint"&&n==="number"?null:`Expected ${e}, got ${n}`}var Ye=Me(()=>{Pe();});var Kt={};En(Kt,{PanelMany:()=>Qn,PanelOne:()=>Jn,RightPanel:()=>et});function Jn({doc:e,repoName:t,basePath:n,schema:r,columns:s}){if(!e)return jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let o=String(e.docId??e.id??""),l=`${n}/${t}/${encodeURIComponent(o)}/edit`,p=Ht(r,s);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsx("span",{class:"font-mono break-all",children:o})]}),jsx("a",{href:l,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:s.map(u=>{let g=e[u],h=p[u],k=h?De(h,g):null;return jsxs(Fragment,{children:[jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:u}),jsx("dd",{class:"min-w-0",children:jsx(Se,{val:g,mismatch:k})})]})})})]})}function Qn({docs:e,repoName:t,basePath:n,fk:r,fv:s,columns:o,schema:l,pagination:p}){let u=`${n}/${t}?fv_${r}=${encodeURIComponent(s)}`,g=Ht(l,o);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" where "}),jsx("span",{class:"font-mono",children:r}),jsx("span",{class:"opacity-50",children:" = "}),jsx("span",{class:"font-mono break-all",children:s}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsx("a",{href:u,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxs("table",{class:"table table-xs w-full",children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[o.map((h,k)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:h},k)),jsx("th",{})]})}),jsx("tbody",{children:e.length===0?jsx("tr",{children:jsx("td",{colspan:o.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((h,k)=>{let w=String(h.docId??h.id??""),b=`${n}/${t}/${encodeURIComponent(w)}/edit`;return jsxs("tr",{class:"hover",children:[o.map((m,y)=>{let i=h[m],d=g[m],c=d?De(d,i):null;return jsx("td",{class:"align-top py-1.5",children:jsx(Se,{val:i,mismatch:c})},y)}),jsx("td",{class:"text-right py-1.5",children:jsx("a",{href:b,class:"btn btn-xs btn-ghost",children:"Edit"})})]},k)})})]})}),(p.hasPrev||p.hasNext)&&jsxs("div",{class:"flex justify-center items-center gap-2",children:[p.hasPrev?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":p.prevCursor,children:"\u2190 Previous"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),p.hasNext?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":p.nextCursor,children:"Next \u2192"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Ht(e,t){if(!e)return {};let n={};for(let r of t)n[r]=ke($e(e,r));return n}var et,tt=Me(()=>{Ke();Ye();et=()=>jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"aria-hidden":"true",children:[jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Pn(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,r=>r===":"?r:`\\${r}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(r,s)=>(t.push(s),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function Nn(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var Y=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,r)=>{console.error("[MiniRouter]",t),r.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,n){return this.addRoute("GET",t,n)}post(t,n){return this.addRoute("POST",t,n)}put(t,n){return this.addRoute("PUT",t,n)}patch(t,n){return this.addRoute("PATCH",t,n)}delete(t,n){return this.addRoute("DELETE",t,n)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,n,r){let{pattern:s,paramNames:o}=Pn(n);return this.routes.push({method:t.toUpperCase(),pattern:s,paramNames:o,handler:r}),this}async handle(t,n){let r=(t.method??"GET").toUpperCase(),s=Nn(t),o=null,l={};for(let g of this.routes){if(g.method!==r)continue;let h=s.match(g.pattern);if(h){o=g,l={},g.paramNames.forEach((k,w)=>{l[k]=decodeURIComponent(h[w+1]??"");});break}}let p=Object.assign(t,{params:l}),u=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(p,n,u);}catch(g){this.errorHandler(g,t,n);}}async runMiddlewareChain(t,n,r){let s=0,o=async()=>{if(s<this.middlewares.length){let l=this.middlewares[s++];await l(t,n,o);}else await r(t,n);};await o();}};Pe();var ae="__sync_version";var _n=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function Dn(e){let t=e,n=false;for(;;){let r=q(t);if(!_n.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let s=U(t);if(!s)break;t=s;}return {inner:t,nullable:n}}var jn={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Et(e,t,n,r,s,o,l,p){for(let[u,g]of Object.entries(e)){let h=n?`${n}__${u}`:u;if(s.has(u)||s.has(h))continue;let{inner:k,nullable:w}=Dn(g),b=q(k),m=r||w;if(b==="ZodObject"){let c=Q(k);Et(c,t,h,m,s,o,l,p);continue}let y=jn[b]??"json",i=h===l||u===l,d=o[h]??o[u]??h;p.push({name:d,sqlType:t.mapType(y),nullable:i?false:m,isPrimaryKey:i});}}function Le(e,t,n={}){let{primaryKey:r,exclude:s=[],columnMap:o={}}=n,l=new Set(s),p=Q(e),u=[];return Et(p,t,"",false,l,o,r,u),u.some(g=>g.name===ae)||u.push({name:ae,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),u}function Pt(e){if(e==null)return null;if(typeof e=="object"&&typeof e.toDate=="function")return e.toDate().toISOString();if(e instanceof Date)return e.toISOString();if(Buffer.isBuffer(e))return e.toString("base64");if(e instanceof Uint8Array)return Buffer.from(e).toString("base64");if(typeof e=="object"&&"latitude"in e&&"longitude"in e){let t=e;return JSON.stringify({lat:t.latitude,lng:t.longitude})}return Array.isArray(e)?JSON.stringify(e.map(Pt)):e}function Nt(e,t,n){for(let[r,s]of Object.entries(e)){let o=t?`${t}__${r}`:r;s!=null&&typeof s=="object"&&!Array.isArray(s)&&!(s instanceof Date)&&!Buffer.isBuffer(s)&&!(s instanceof Uint8Array)&&typeof s.toDate!="function"&&!("latitude"in s&&"longitude"in s)?Nt(s,o,n):n[o]=Pt(s);}}function Ne(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},s={};Nt(e,"",s);let o={};for(let[l,p]of Object.entries(s)){if(n.has(l))continue;let u=l.split("__")[0];if(u!==l&&n.has(u))continue;let g=r[l]??(l.includes("__")?r[l.split("__").pop()]:void 0)??l;o[g]=p;}return o}function ye(e,t){if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",o=process.env.FUNCTION_REGION??"us-central1",l=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${o}/${l}${t}`}let n=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return n&&r.includes("cloudfunctions.net")?`/${n.toLowerCase()}${t}`:t}function ee(e,t,n){return `<!DOCTYPE html>
1
+ import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {z as z$1}from'zod';import {renderToString}from'hono/jsx/dom/server';import {Timestamp}from'firebase-admin/firestore';var An=Object.defineProperty;var Me=(e,t)=>()=>(e&&(t=e(e=0)),t);var En=(e,t)=>{for(var n in t)An(e,n,{get:t[n],enumerable:true});};function q(e){let t=e,n=t._zod?.def?.type;if(n)return In[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function U(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function Ot(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Tt(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function Q(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function Ae(e){let t=e;return Array.isArray(t.options)?t.options:t._zod?.def?.entries?Object.values(t._zod.def.entries):Array.isArray(t._def?.values)?t._def.values:[]}function Ee(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function Ue(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function At(e){let t=e,n=[],r=t._zod?.def?.checks;if(Array.isArray(r)){for(let o of r)o.format&&n.push(o.format);if(n.length>0)return n}let s=t._def?.checks;if(Array.isArray(s))for(let o of s)o.kind&&n.push(o.kind);return n}var In,Pe=Me(()=>{In={string:"ZodString",number:"ZodNumber",bigint:"ZodBigInt",boolean:"ZodBoolean",date:"ZodDate",enum:"ZodEnum",nativeEnum:"ZodNativeEnum",literal:"ZodLiteral",object:"ZodObject",array:"ZodArray",optional:"ZodOptional",nullable:"ZodNullable",default:"ZodDefault",coerce:"ZodCoerce",union:"ZodUnion",undefined:"ZodUndefined",unknown:"ZodUnknown",any:"ZodAny",record:"ZodRecord"};});function Ut({val:e}){return jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function Un({message:e}){return jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function Se({val:e,mismatch:t}){let n=Ln(e);return t?jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsx(Un,{message:t})]}):n}function Ln(e){if(e==null)return jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsx(Ut,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsx(Ut,{val:e.toDate()});if(typeof e=="number")return jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxs("li",{class:"text-base-content/40 italic",children:["+",e.length-8," more\u2026"]})]});if(typeof e=="object"&&e!==null){let n=Object.entries(e);return n.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxs("dl",{class:"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-xs m-0",children:[n.slice(0,8).map(([r,s])=>jsxs(Fragment,{children:[jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsx("dd",{class:"break-all",children:String(s??"")})]})),n.length>8&&jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsx("span",{class:"text-sm break-all",children:t})}var Ke=Me(()=>{});function ke(e){if(!e)return "unknown";let t=Xe(e);switch(q(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function Xe(e){let t=q(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=U(e);return n?Xe(n):e}return e}function $e(e,t){if(!e)return;let n=t.split("."),r=e;for(let s of n){if(!r)return;let o=Xe(r);if(q(o)!=="ZodObject")return;r=Q(o)[s];}return r}function Gn(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function De(e,t){if(e==="unknown")return null;let n=Gn(t);return n==="null"?null:e==="enum"||e==="literal"?n==="string"||n==="number"?null:`Expected ${e} (string/number), got ${n}`:e===n||e==="number"&&n==="bigint"||e==="bigint"&&n==="number"?null:`Expected ${e}, got ${n}`}var Ye=Me(()=>{Pe();});var Kt={};En(Kt,{PanelMany:()=>Qn,PanelOne:()=>Jn,RightPanel:()=>et});function Jn({doc:e,repoName:t,basePath:n,schema:r,columns:s}){if(!e)return jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let o=String(e.docId??e.id??""),l=`${n}/${t}/${encodeURIComponent(o)}/edit`,p=Ht(r,s);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsx("span",{class:"font-mono break-all",children:o})]}),jsx("a",{href:l,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:s.map(u=>{let g=e[u],h=p[u],k=h?De(h,g):null;return jsxs(Fragment,{children:[jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:u}),jsx("dd",{class:"min-w-0",children:jsx(Se,{val:g,mismatch:k})})]})})})]})}function Qn({docs:e,repoName:t,basePath:n,fk:r,fv:s,columns:o,schema:l,pagination:p}){let u=`${n}/${t}?fv_${r}=${encodeURIComponent(s)}`,g=Ht(l,o);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" where "}),jsx("span",{class:"font-mono",children:r}),jsx("span",{class:"opacity-50",children:" = "}),jsx("span",{class:"font-mono break-all",children:s}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsx("a",{href:u,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxs("table",{class:"table table-xs w-full",children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[o.map((h,k)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:h},k)),jsx("th",{})]})}),jsx("tbody",{children:e.length===0?jsx("tr",{children:jsx("td",{colspan:o.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((h,k)=>{let w=String(h.docId??h.id??""),b=`${n}/${t}/${encodeURIComponent(w)}/edit`;return jsxs("tr",{class:"hover",children:[o.map((m,y)=>{let i=h[m],d=g[m],c=d?De(d,i):null;return jsx("td",{class:"align-top py-1.5",children:jsx(Se,{val:i,mismatch:c})},y)}),jsx("td",{class:"text-right py-1.5",children:jsx("a",{href:b,class:"btn btn-xs btn-ghost",children:"Edit"})})]},k)})})]})}),(p.hasPrev||p.hasNext)&&jsxs("div",{class:"flex justify-center items-center gap-2",children:[p.hasPrev?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":p.prevCursor,children:"\u2190 Previous"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),p.hasNext?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":p.nextCursor,children:"Next \u2192"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Ht(e,t){if(!e)return {};let n={};for(let r of t)n[r]=ke($e(e,r));return n}var et,tt=Me(()=>{Ke();Ye();et=({basePath:e=""})=>jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Pn(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,r=>r===":"?r:`\\${r}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(r,s)=>(t.push(s),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function Nn(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var Y=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,r)=>{console.error("[MiniRouter]",t),r.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,n){return this.addRoute("GET",t,n)}post(t,n){return this.addRoute("POST",t,n)}put(t,n){return this.addRoute("PUT",t,n)}patch(t,n){return this.addRoute("PATCH",t,n)}delete(t,n){return this.addRoute("DELETE",t,n)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,n,r){let{pattern:s,paramNames:o}=Pn(n);return this.routes.push({method:t.toUpperCase(),pattern:s,paramNames:o,handler:r}),this}async handle(t,n){let r=(t.method??"GET").toUpperCase(),s=Nn(t),o=null,l={};for(let g of this.routes){if(g.method!==r)continue;let h=s.match(g.pattern);if(h){o=g,l={},g.paramNames.forEach((k,w)=>{l[k]=decodeURIComponent(h[w+1]??"");});break}}let p=Object.assign(t,{params:l}),u=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(p,n,u);}catch(g){this.errorHandler(g,t,n);}}async runMiddlewareChain(t,n,r){let s=0,o=async()=>{if(s<this.middlewares.length){let l=this.middlewares[s++];await l(t,n,o);}else await r(t,n);};await o();}};Pe();var ae="__sync_version";var _n=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function Dn(e){let t=e,n=false;for(;;){let r=q(t);if(!_n.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let s=U(t);if(!s)break;t=s;}return {inner:t,nullable:n}}var jn={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Et(e,t,n,r,s,o,l,p){for(let[u,g]of Object.entries(e)){let h=n?`${n}__${u}`:u;if(s.has(u)||s.has(h))continue;let{inner:k,nullable:w}=Dn(g),b=q(k),m=r||w;if(b==="ZodObject"){let c=Q(k);Et(c,t,h,m,s,o,l,p);continue}let y=jn[b]??"json",i=h===l||u===l,d=o[h]??o[u]??h;p.push({name:d,sqlType:t.mapType(y),nullable:i?false:m,isPrimaryKey:i});}}function Le(e,t,n={}){let{primaryKey:r,exclude:s=[],columnMap:o={}}=n,l=new Set(s),p=Q(e),u=[];return Et(p,t,"",false,l,o,r,u),u.some(g=>g.name===ae)||u.push({name:ae,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),u}function Pt(e){if(e==null)return null;if(typeof e=="object"&&typeof e.toDate=="function")return e.toDate().toISOString();if(e instanceof Date)return e.toISOString();if(Buffer.isBuffer(e))return e.toString("base64");if(e instanceof Uint8Array)return Buffer.from(e).toString("base64");if(typeof e=="object"&&"latitude"in e&&"longitude"in e){let t=e;return JSON.stringify({lat:t.latitude,lng:t.longitude})}return Array.isArray(e)?JSON.stringify(e.map(Pt)):e}function Nt(e,t,n){for(let[r,s]of Object.entries(e)){let o=t?`${t}__${r}`:r;s!=null&&typeof s=="object"&&!Array.isArray(s)&&!(s instanceof Date)&&!Buffer.isBuffer(s)&&!(s instanceof Uint8Array)&&typeof s.toDate!="function"&&!("latitude"in s&&"longitude"in s)?Nt(s,o,n):n[o]=Pt(s);}}function Ne(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},s={};Nt(e,"",s);let o={};for(let[l,p]of Object.entries(s)){if(n.has(l))continue;let u=l.split("__")[0];if(u!==l&&n.has(u))continue;let g=r[l]??(l.includes("__")?r[l.split("__").pop()]:void 0)??l;o[g]=p;}return o}function ye(e,t){if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",o=process.env.FUNCTION_REGION??"us-central1",l=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${o}/${l}${t}`}let n=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return n&&r.includes("cloudfunctions.net")?`/${n.toLowerCase()}${t}`:t}function ee(e,t,n){return `<!DOCTYPE html>
2
2
  <html lang="en"><head>
3
3
  <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
4
4
  <title>${e} \u2014 Sync Admin</title>
@@ -88,7 +88,7 @@ ${n}
88
88
  ${v("BigQuery",f.bigquery)}
89
89
  ${v("Pub/Sub",f.pubsub)}
90
90
  ${v("Firestore",f.firestore)}
91
- </div>`);te(b,A);}),async(w,b)=>{await k.handle(w,b);}}var zn="firestore-sync";function Fn(e,t){let n=t.ref?.path??void 0;return n?`${n}/{docId}`:(console.warn(`[SyncTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function _t(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:s}=t.deps.firestoreTriggers,o=t.deps.pubsub,l=t?.topicPrefix??zn,p={},u=new Map;function g(k){let w=u.get(k);return w||(w=o.topic(k),u.set(k,w),w)}async function h(k,w){await g(k).publishMessage({json:w});}for(let[k,w]of Object.entries(e)){let b=t?.repos?.[k],m;if(w._isGroup){if(!b?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${k}". Provide a triggerPath in the sync repos config for group collections.`);continue}m=b.triggerPath;}else m=b?.triggerPath??Fn(k,w);if(!m)continue;let y=w._systemKeys?.[0]??"docId",i=`${l}-${k}`;p[`${k}_onCreate`]=n(m,async d=>{let c=d.data;if(!c)return;let a=c.data();if(!a)return;let f=String(a[y]??c.id),v=Ne(a,{exclude:b?.exclude,columnMap:b?.columnMap}),S={operation:"INSERT",repoName:k,docId:f,data:v,timestamp:new Date().toISOString(),version:Date.now()};await h(i,S);}),p[`${k}_onUpdate`]=r(m,async d=>{let c=d.data?.after;if(!c)return;let a=c.data();if(!a)return;let f=String(a[y]??c.id),v=Ne(a,{exclude:b?.exclude,columnMap:b?.columnMap}),S={operation:"UPSERT",repoName:k,docId:f,data:v,timestamp:new Date().toISOString(),version:Date.now()};await h(i,S);}),p[`${k}_onDelete`]=s(m,async d=>{let c=d.data;if(!c)return;let a=c.data(),f=String(a?.[y]??c.id),v={operation:"DELETE",repoName:k,docId:f,data:null,timestamp:new Date().toISOString(),version:Date.now()};await h(i,v);});}return p}var He=class{constructor(t){this.buffer=[];this.flushing=false;this.timer=null;this.adapter=t.adapter,this.tableName=t.tableName,this.primaryKey=t.primaryKey,this.batchSize=t.batchSize??100,this.onFlushError=t.onFlushError;let n=t.flushIntervalMs??5e3;n>0&&(this.timer=setInterval(()=>{this.flush();},n),typeof this.timer=="object"&&"unref"in this.timer&&this.timer.unref());}get size(){return this.buffer.length}enqueue(...t){this.buffer.push(...t),this.buffer.length>=this.batchSize&&this.flush();}async flush(){if(this.flushing||this.buffer.length===0)return;this.flushing=true;let t=this.buffer.splice(0,this.batchSize);try{let n=new Map,r=[];for(let o of t)if(o.operation==="DELETE")r.push(o.docId),n.delete(o.docId);else if(o.data){let l=n.get(o.docId);if(!l)n.set(o.docId,o.data);else {let p=Number(l[ae]??0);Number(o.data[ae]??0)>=p&&n.set(o.docId,o.data);}}let s=Array.from(n.values());s.length>0&&await this.adapter.upsertRows(this.tableName,s,this.primaryKey),r.length>0&&await this.adapter.deleteRows(this.tableName,this.primaryKey,r);}catch(n){this.onFlushError?await this.onFlushError(t,n).catch(r=>{console.error(`[SyncQueue] Flush error for ${this.tableName}:`,n),console.error("[SyncQueue] Error handler also failed:",r);}):(this.buffer.unshift(...t),console.error(`[SyncQueue] Flush failed for ${this.tableName}:`,n));}finally{this.flushing=false;}}async shutdown(){this.timer&&(clearInterval(this.timer),this.timer=null),await this.flush();}};var Dt=new Set;async function Zn(e,t,n,r,s,o,l){if(Dt.has(e))return;let p=Le(n,t.dialect,{primaryKey:s,exclude:o,columnMap:l});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:p});else {let g=new Set(await t.getTableColumns(r)),h=p.filter(k=>!g.has(k.name));h.length>0&&await t.addColumns(r,h);}Dt.add(e);}function jt(e,t){let{deps:n,adapter:r,batchSize:s=100,flushIntervalMs:o=5e3,autoMigrate:l=false,topicPrefix:p="firestore-sync",workerOptions:u,repos:g={}}=t,h=new Map;function k(m,y){let i=h.get(m);if(i)return i;let c=g[m]?.tableName??m,a=async(f,v)=>{console.error(`[SyncWorker] Flush failed for "${m}" (${f.length} events):`,v);try{let S=`${p}-${m}-dlq`,O=n.pubsub.topic(S),[A]=await O.exists();A||(await O.create(),console.info(`[SyncWorker] Created DLQ topic "${S}"`));for(let x of f)await O.publishMessage({json:x});}catch(S){console.error(`[SyncWorker] Dead-letter publish also failed for ${m}:`,S);}};return i=new He({adapter:r,tableName:c,primaryKey:y,batchSize:s,flushIntervalMs:o,onFlushError:a}),h.set(m,i),i}async function w(m){let{repoName:y}=m,i=e[y];if(!i){console.warn(`[SyncWorker] Unknown repo "${y}", skipping event`);return}let d=i._systemKeys?.[0]??i.documentKey??"docId",c=g[y],a=c?.columnMap,f=a?.[d]??d;if(l){let S=i.schema??void 0;if(S){let O=c?.tableName??y;await Zn(y,r,S,O,d,c?.exclude,a);}}let v=k(y,f);m.data&&(m.data[ae]=m.version??Date.now()),v.enqueue(m);}function b(m){let y=async i=>{let d=i.data?.message?.json??i.data?.json;if(!d){console.warn("[SyncWorker] Received empty PubSub message");return}await w(d);let c=h.get(d.repoName);c&&await c.flush();};return u?n.pubsubHandler.onMessagePublished({topic:m,...u},y):n.pubsubHandler.onMessagePublished(m,y)}return {handleMessage:w,createHandler:b,queues:h,async shutdown(){let m=[];for(let y of h.values())m.push(y.shutdown());await Promise.all(m);}}}var qn="firestore-sync";function zt(e){if(typeof e!="function")return e;let t=e,n;return new Proxy({},{get(r,s){return n||(n=t()),n[s]},has(r,s){return n||(n=t()),s in n}})}function Ft(e,t){let{deps:n,adapter:r,topicPrefix:s=qn,batchSize:o,flushIntervalMs:l,autoMigrate:p,admin:u,workerOptions:g,repos:h}=t,k=zt(n.pubsub),w=zt(r),b=_t(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:k},topicPrefix:s,repos:h}),m=jt(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:k},adapter:w,batchSize:o,flushIntervalMs:l,autoMigrate:p,topicPrefix:s,workerOptions:g,repos:h}),y={};for(let c of Object.keys(e))y[`sync_${c}`]=m.createHandler(`${s}-${c}`);let i=null;u&&(i=It(e,w,m.queues,m.handleMessage,u,h??{},k,s),y.adminsync=u.onRequest?u.httpsOptions?u.onRequest(u.httpsOptions,i):u.onRequest(i):i);let d={functions:{...b,...y},adminHandler:i,handleMessage:m.handleMessage,queues:m.queues,shutdown:m.shutdown};for(let c of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(d,c,{enumerable:false});return d}Pe();Pe();function Bn(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Zt(e){let t=e,n=true,r=false,s;for(;;){let o=q(t);if(o==="ZodOptional")n=false,t=U(t);else if(o==="ZodNullable")n=false,r=true,t=U(t);else if(o==="ZodDefault")n=false,s=Tt(t),t=U(t);else break}return {inner:t,required:n,nullable:r,defaultValue:s}}function ne(e,t=""){if(q(e)==="ZodObject"){let r=Q(e);return Object.entries(r).map(([s,o])=>qt(t?`${t}.${s}`:s,s,o))}return [qt(t||"value",t||"value",e)]}function qt(e,t,n){let{inner:r,required:s,nullable:o,defaultValue:l}=Zt(n),p=q(r),u=Bn(t.split(".").pop()??t);switch(p){case "ZodString":{let g=At(r),h=g.includes("email"),k=g.includes("url");return {name:e,label:u,type:"text",required:s,nullable:o,defaultValue:l,hint:h?"email":k?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:u,type:"number",required:s,nullable:o,defaultValue:l};case "ZodBoolean":return {name:e,label:u,type:"checkbox",required:s,nullable:o,defaultValue:l};case "ZodDate":case "ZodCoerce":return {name:e,label:u,type:"datetime-local",required:s,nullable:o,defaultValue:l};case "ZodEnum":{let g=Ae(r);return {name:e,label:u,type:"select",required:s,nullable:o,defaultValue:l,options:g}}case "ZodNativeEnum":{let g=Ee(r),h=Object.values(g).filter(k=>typeof k=="string");return {name:e,label:u,type:"select",required:s,nullable:o,defaultValue:l,options:h}}case "ZodLiteral":{let g=String(Ue(r)??"");return {name:e,label:u,type:"select",required:s,nullable:o,defaultValue:l,options:[g]}}case "ZodObject":{let g=ne(r,e);return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,nested:g,hint:"JSON object"}}case "ZodArray":{let g=Ot(r);if(!g)return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,hint:"JSON array"};let{inner:h}=Zt(g),k=q(h),w,b,m;switch(k){case "ZodString":w="text";break;case "ZodNumber":case "ZodBigInt":w="number";break;case "ZodBoolean":w="checkbox";break;case "ZodDate":w="datetime-local";break;case "ZodEnum":w="select",b=Ae(h);break;case "ZodNativeEnum":w="select",b=Object.values(Ee(h)).filter(y=>typeof y=="string");break;case "ZodObject":w="object",m=ne(h);break;default:return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,hint:"JSON array"}}return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,arrayElementType:w,arrayElementOptions:b,arrayElementFields:m}}default:return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,hint:"JSON"}}}function We(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,s=e.name,o=e.required?" required":"",l=e.defaultValue==="__null__",p=!l&&e.defaultValue!=null?String(e.defaultValue):"",u=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
91
+ </div>`);te(b,A);}),async(w,b)=>{await k.handle(w,b);}}var zn="firestore-sync";function Zn(e,t){let n=t.ref?.path??void 0;return n?`${n}/{docId}`:(console.warn(`[SyncTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function _t(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:s}=t.deps.firestoreTriggers,o=t.deps.pubsub,l=t?.topicPrefix??zn,p={},u=new Map;function g(k){let w=u.get(k);return w||(w=o.topic(k),u.set(k,w),w)}async function h(k,w){await g(k).publishMessage({json:w});}for(let[k,w]of Object.entries(e)){let b=t?.repos?.[k],m;if(w._isGroup){if(!b?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${k}". Provide a triggerPath in the sync repos config for group collections.`);continue}m=b.triggerPath;}else m=b?.triggerPath??Zn(k,w);if(!m)continue;let y=w._systemKeys?.[0]??"docId",i=`${l}-${k}`;p[`${k}_onCreate`]=n(m,async d=>{let c=d.data;if(!c)return;let a=c.data();if(!a)return;let f=String(a[y]??c.id),v=Ne(a,{exclude:b?.exclude,columnMap:b?.columnMap}),S={operation:"INSERT",repoName:k,docId:f,data:v,timestamp:new Date().toISOString(),version:Date.now()};await h(i,S);}),p[`${k}_onUpdate`]=r(m,async d=>{let c=d.data?.after;if(!c)return;let a=c.data();if(!a)return;let f=String(a[y]??c.id),v=Ne(a,{exclude:b?.exclude,columnMap:b?.columnMap}),S={operation:"UPSERT",repoName:k,docId:f,data:v,timestamp:new Date().toISOString(),version:Date.now()};await h(i,S);}),p[`${k}_onDelete`]=s(m,async d=>{let c=d.data;if(!c)return;let a=c.data(),f=String(a?.[y]??c.id),v={operation:"DELETE",repoName:k,docId:f,data:null,timestamp:new Date().toISOString(),version:Date.now()};await h(i,v);});}return p}var He=class{constructor(t){this.buffer=[];this.flushing=false;this.timer=null;this.adapter=t.adapter,this.tableName=t.tableName,this.primaryKey=t.primaryKey,this.batchSize=t.batchSize??100,this.onFlushError=t.onFlushError;let n=t.flushIntervalMs??5e3;n>0&&(this.timer=setInterval(()=>{this.flush();},n),typeof this.timer=="object"&&"unref"in this.timer&&this.timer.unref());}get size(){return this.buffer.length}enqueue(...t){this.buffer.push(...t),this.buffer.length>=this.batchSize&&this.flush();}async flush(){if(this.flushing||this.buffer.length===0)return;this.flushing=true;let t=this.buffer.splice(0,this.batchSize);try{let n=new Map,r=[];for(let o of t)if(o.operation==="DELETE")r.push(o.docId),n.delete(o.docId);else if(o.data){let l=n.get(o.docId);if(!l)n.set(o.docId,o.data);else {let p=Number(l[ae]??0);Number(o.data[ae]??0)>=p&&n.set(o.docId,o.data);}}let s=Array.from(n.values());s.length>0&&await this.adapter.upsertRows(this.tableName,s,this.primaryKey),r.length>0&&await this.adapter.deleteRows(this.tableName,this.primaryKey,r);}catch(n){this.onFlushError?await this.onFlushError(t,n).catch(r=>{console.error(`[SyncQueue] Flush error for ${this.tableName}:`,n),console.error("[SyncQueue] Error handler also failed:",r);}):(this.buffer.unshift(...t),console.error(`[SyncQueue] Flush failed for ${this.tableName}:`,n));}finally{this.flushing=false;}}async shutdown(){this.timer&&(clearInterval(this.timer),this.timer=null),await this.flush();}};var Dt=new Set;async function Fn(e,t,n,r,s,o,l){if(Dt.has(e))return;let p=Le(n,t.dialect,{primaryKey:s,exclude:o,columnMap:l});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:p});else {let g=new Set(await t.getTableColumns(r)),h=p.filter(k=>!g.has(k.name));h.length>0&&await t.addColumns(r,h);}Dt.add(e);}function jt(e,t){let{deps:n,adapter:r,batchSize:s=100,flushIntervalMs:o=5e3,autoMigrate:l=false,topicPrefix:p="firestore-sync",workerOptions:u,repos:g={}}=t,h=new Map;function k(m,y){let i=h.get(m);if(i)return i;let c=g[m]?.tableName??m,a=async(f,v)=>{console.error(`[SyncWorker] Flush failed for "${m}" (${f.length} events):`,v);try{let S=`${p}-${m}-dlq`,O=n.pubsub.topic(S),[A]=await O.exists();A||(await O.create(),console.info(`[SyncWorker] Created DLQ topic "${S}"`));for(let x of f)await O.publishMessage({json:x});}catch(S){console.error(`[SyncWorker] Dead-letter publish also failed for ${m}:`,S);}};return i=new He({adapter:r,tableName:c,primaryKey:y,batchSize:s,flushIntervalMs:o,onFlushError:a}),h.set(m,i),i}async function w(m){let{repoName:y}=m,i=e[y];if(!i){console.warn(`[SyncWorker] Unknown repo "${y}", skipping event`);return}let d=i._systemKeys?.[0]??i.documentKey??"docId",c=g[y],a=c?.columnMap,f=a?.[d]??d;if(l){let S=i.schema??void 0;if(S){let O=c?.tableName??y;await Fn(y,r,S,O,d,c?.exclude,a);}}let v=k(y,f);m.data&&(m.data[ae]=m.version??Date.now()),v.enqueue(m);}function b(m){let y=async i=>{let d=i.data?.message?.json??i.data?.json;if(!d){console.warn("[SyncWorker] Received empty PubSub message");return}await w(d);let c=h.get(d.repoName);c&&await c.flush();};return u?n.pubsubHandler.onMessagePublished({topic:m,...u},y):n.pubsubHandler.onMessagePublished(m,y)}return {handleMessage:w,createHandler:b,queues:h,async shutdown(){let m=[];for(let y of h.values())m.push(y.shutdown());await Promise.all(m);}}}var qn="firestore-sync";function zt(e){if(typeof e!="function")return e;let t=e,n;return new Proxy({},{get(r,s){return n||(n=t()),n[s]},has(r,s){return n||(n=t()),s in n}})}function Zt(e,t){let{deps:n,adapter:r,topicPrefix:s=qn,batchSize:o,flushIntervalMs:l,autoMigrate:p,admin:u,workerOptions:g,repos:h}=t,k=zt(n.pubsub),w=zt(r),b=_t(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:k},topicPrefix:s,repos:h}),m=jt(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:k},adapter:w,batchSize:o,flushIntervalMs:l,autoMigrate:p,topicPrefix:s,workerOptions:g,repos:h}),y={};for(let c of Object.keys(e))y[`sync_${c}`]=m.createHandler(`${s}-${c}`);let i=null;u&&(i=It(e,w,m.queues,m.handleMessage,u,h??{},k,s),y.adminsync=u.onRequest?u.httpsOptions?u.onRequest(u.httpsOptions,i):u.onRequest(i):i);let d={functions:{...b,...y},adminHandler:i,handleMessage:m.handleMessage,queues:m.queues,shutdown:m.shutdown};for(let c of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(d,c,{enumerable:false});return d}Pe();Pe();function Bn(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Ft(e){let t=e,n=true,r=false,s;for(;;){let o=q(t);if(o==="ZodOptional")n=false,t=U(t);else if(o==="ZodNullable")n=false,r=true,t=U(t);else if(o==="ZodDefault")n=false,s=Tt(t),t=U(t);else break}return {inner:t,required:n,nullable:r,defaultValue:s}}function ne(e,t=""){if(q(e)==="ZodObject"){let r=Q(e);return Object.entries(r).map(([s,o])=>qt(t?`${t}.${s}`:s,s,o))}return [qt(t||"value",t||"value",e)]}function qt(e,t,n){let{inner:r,required:s,nullable:o,defaultValue:l}=Ft(n),p=q(r),u=Bn(t.split(".").pop()??t);switch(p){case "ZodString":{let g=At(r),h=g.includes("email"),k=g.includes("url");return {name:e,label:u,type:"text",required:s,nullable:o,defaultValue:l,hint:h?"email":k?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:u,type:"number",required:s,nullable:o,defaultValue:l};case "ZodBoolean":return {name:e,label:u,type:"checkbox",required:s,nullable:o,defaultValue:l};case "ZodDate":case "ZodCoerce":return {name:e,label:u,type:"datetime-local",required:s,nullable:o,defaultValue:l};case "ZodEnum":{let g=Ae(r);return {name:e,label:u,type:"select",required:s,nullable:o,defaultValue:l,options:g}}case "ZodNativeEnum":{let g=Ee(r),h=Object.values(g).filter(k=>typeof k=="string");return {name:e,label:u,type:"select",required:s,nullable:o,defaultValue:l,options:h}}case "ZodLiteral":{let g=String(Ue(r)??"");return {name:e,label:u,type:"select",required:s,nullable:o,defaultValue:l,options:[g]}}case "ZodObject":{let g=ne(r,e);return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,nested:g,hint:"JSON object"}}case "ZodArray":{let g=Ot(r);if(!g)return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,hint:"JSON array"};let{inner:h}=Ft(g),k=q(h),w,b,m;switch(k){case "ZodString":w="text";break;case "ZodNumber":case "ZodBigInt":w="number";break;case "ZodBoolean":w="checkbox";break;case "ZodDate":w="datetime-local";break;case "ZodEnum":w="select",b=Ae(h);break;case "ZodNativeEnum":w="select",b=Object.values(Ee(h)).filter(y=>typeof y=="string");break;case "ZodObject":w="object",m=ne(h);break;default:return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,hint:"JSON array"}}return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,arrayElementType:w,arrayElementOptions:b,arrayElementFields:m}}default:return {name:e,label:u,type:"textarea",required:s,nullable:o,defaultValue:l,hint:"JSON"}}}function We(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,s=e.name,o=e.required?" required":"",l=e.defaultValue==="__null__",p=!l&&e.defaultValue!=null?String(e.defaultValue):"",u=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
92
92
  <input type="hidden" id="${r}__isnull" name="${s}__isnull" value="${l?"1":""}">
93
93
  <label class="flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/40 hover:text-base-content/70 border border-base-300 rounded px-2 py-1">
94
94
  <input type="checkbox" class="checkbox checkbox-xs" ${l?"checked":""}
@@ -223,7 +223,15 @@ ${n}
223
223
  <button type="submit" class="btn btn-primary btn-sm">${N(r)}</button>
224
224
  <button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
225
225
  </div>
226
- </form>`}Ke();var Lt=`// \u2500\u2500 Right panel (relations preview) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
226
+ </form>`}Ke();var Lt=`// \u2500\u2500 Shared helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
227
+ function frsGetBasePath() {
228
+ var root = document.querySelector("[data-frs-panel-root]");
229
+ var bp = root && root.getAttribute("data-frs-base-path");
230
+ if (typeof bp === "string") return bp.replace(/\\/$/, "");
231
+ return window.location.pathname.replace(/\\/[^/]*\\/?$/, "");
232
+ }
233
+
234
+ // \u2500\u2500 Right panel (relations preview) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
227
235
  (function () {
228
236
  function panelEls() {
229
237
  return {
@@ -241,7 +249,11 @@ ${n}
241
249
  els.root.setAttribute("aria-hidden", "false");
242
250
  requestAnimationFrame(function () {
243
251
  if (els.backdrop) els.backdrop.style.opacity = "1";
244
- if (els.panel) els.panel.style.transform = "translateX(0)";
252
+ if (els.panel) {
253
+ els.panel.classList.remove("translate-x-full");
254
+ els.panel.style.transform = "translateX(0)";
255
+ els.panel.style.translate = "0 0";
256
+ }
245
257
  });
246
258
  if (els.title) els.title.textContent = label || "Relation";
247
259
  if (els.body) {
@@ -253,17 +265,18 @@ ${n}
253
265
  var els = panelEls();
254
266
  if (!els.root || !els.panel) return;
255
267
  if (els.backdrop) els.backdrop.style.opacity = "0";
256
- if (els.panel) els.panel.style.transform = "translateX(100%)";
268
+ if (els.panel) {
269
+ els.panel.style.transform = "translateX(100%)";
270
+ els.panel.style.translate = "100% 0";
271
+ els.panel.classList.add("translate-x-full");
272
+ }
257
273
  setTimeout(function () {
258
274
  els.root.classList.add("hidden");
259
275
  els.root.setAttribute("aria-hidden", "true");
260
276
  }, 200);
261
277
  }
262
- function basePathFromLocation() {
263
- // The current list page is at <basePath>/<repoName>...; we strip everything after the basePath.
264
- // We can't know basePath without context, so we derive it from the current URL up to the repoName segment.
265
- // Caller passes the absolute fragment URL via data attribute; we just need the prefix here.
266
- return window.location.pathname.replace(/\\/[^/]*\\/?$/, "");
278
+ function getBasePath() {
279
+ return frsGetBasePath();
267
280
  }
268
281
  function fetchPanel(url, label) {
269
282
  openPanel(label);
@@ -294,7 +307,7 @@ ${n}
294
307
  var fk = trigger.getAttribute("data-frs-rel-fk");
295
308
  var val = trigger.getAttribute("data-frs-rel-val");
296
309
  var label = trigger.getAttribute("data-frs-rel-label") || "Relation";
297
- var bp = basePathFromLocation();
310
+ var bp = getBasePath();
298
311
  var url;
299
312
  if (type === "one") {
300
313
  url =
@@ -485,7 +498,7 @@ ${n}
485
498
  var b = bar();
486
499
  if (!b) return null;
487
500
  var repo = b.getAttribute("data-frs-repo");
488
- var bp = window.location.pathname.replace(/\\/[^/]*\\/?$/, "");
501
+ var bp = frsGetBasePath();
489
502
  return bp + "/" + encodeURIComponent(repo) + "/_bulk/" + action;
490
503
  }
491
504
 
@@ -925,7 +938,12 @@ function initColumnVisibility(table) {
925
938
  if (dataThs.length === 0) return;
926
939
 
927
940
  var wrap = table.closest("[data-frs-table-wrap]");
928
- var toolbar = wrap && wrap.previousElementSibling;
941
+ var toolbar =
942
+ (wrap &&
943
+ (wrap.parentElement
944
+ ? wrap.parentElement.querySelector("[data-frs-toolbar]")
945
+ : null)) ||
946
+ (wrap && wrap.previousElementSibling);
929
947
  if (!toolbar) return;
930
948
 
931
949
  var repo = table.getAttribute("data-frs-repo") || "default";
@@ -1114,7 +1132,7 @@ function initColumnReorder(table) {
1114
1132
  });
1115
1133
  });
1116
1134
  }
1117
- `;function _e(){return jsx("script",{dangerouslySetInnerHTML:{__html:Lt}})}tt();function le(e){return "<!DOCTYPE html>"+renderToString(e)}var Yn=["corporate","silk","dark"],er=()=>jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"size-4",children:[jsx("circle",{cx:"12",cy:"12",r:"4"}),jsx("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsx("ul",{tabIndex:0,class:"dropdown-content menu menu-sm bg-base-100 text-base-content rounded-box z-50 mt-2 w-40 p-1 shadow-lg border border-base-300",children:Yn.map(e=>jsx("li",{children:jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsx("span",{children:e}),jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),ce=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:s,basePath:o="/"}=e;return jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxs("head",{children:[jsx("meta",{charset:"UTF-8"}),jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsx("div",{class:"flex-1",children:jsx("a",{href:o,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsx("div",{class:"flex-none",children:jsx(er,{})})]}),jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:r.map((l,p)=>l.href?jsx("li",{children:jsx("a",{href:l.href,children:l.label})},p):jsx("li",{class:"text-base-content/60",children:l.label},p))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),s&&jsxs("div",{role:"alert",class:`alert ${s.type==="success"?"alert-success":s.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsx("span",{class:"flex-1",children:s.message}),s.action&&jsx("a",{href:s.action.href,...s.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:s.action.label})]}),t]}),jsx(et,{}),jsx(_e,{})]})]})};function nt(e,t){return le(jsx(ce,{opts:t,children:jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function rt(e,t){return le(jsx(ce,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:e.map(n=>jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxs("div",{class:"card-body p-5",children:[jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var Gt=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],tr=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"<",label:"<"},{value:"<=",label:"\u2264"},{value:">",label:">"},{value:">=",label:"\u2265"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],nr=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function rr(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return tr;case "ZodBoolean":return Gt;case "ZodArray":return nr;default:return Gt}}var de="__null__";function sr(e){return `(function(cb){var i=document.getElementById('${e}');if(!i)return;if(cb.checked){i.dataset._prev=i.value;if(i.tagName==='SELECT'){var o=i.querySelector('option[value="${de}"]');if(!o){o=document.createElement('option');o.value='${de}';o.textContent='\u2205 null';o.dataset._auto='1';i.appendChild(o);}o.selected=true;}else{if(i.type==='number'||i.type==='datetime-local'){i.dataset._type=i.type;i.type='text';}i.value='${de}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${de}"][data-_auto="1"]');if(o2)o2.remove();var prev=i.dataset._prev||'';for(var k=0;k<i.options.length;k++)i.options[k].selected=(i.options[k].value===prev);}else{if(i.dataset._type){i.type=i.dataset._type;delete i.dataset._type;}i.readOnly=false;i.value=(i.dataset._prev&&i.dataset._prev!=='${de}')?i.dataset._prev:'';}}})(this)`}function or(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function je({inputId:e,active:t}){return jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:sr(e)}),jsx("span",{children:"\u2205"})]})}function ar({col:e,active:t}){let n=t?.value??"",r=n===de,s=`fv_input_${e.name.replace(/\./g,"__")}`,o=t?.op,l=o==="in"||o==="not-in";if(e.enumValues&&e.enumValues.length>0){if(l){let p=new Set(n.split(",").map(g=>g.trim()).filter(Boolean)),u=`eg_${e.name.replace(/\./g,"__")}`;return jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsx("input",{type:"hidden",id:s,name:`fv_${e.name}`,value:n}),e.enumValues.map(g=>jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:g,checked:p.has(g),"data-enum-group":u,onchange:or(s,u)}),jsx("span",{children:g})]},g))]})}return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:s,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(p=>jsx("option",{value:p,selected:n===p,children:p},p)),e.nullable&&jsx("option",{value:de,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(je,{inputId:s,active:r})]})}if(e.zodType==="ZodBoolean")return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:s,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsx("option",{value:"true",selected:n==="true",children:"true"}),jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsx("option",{value:de,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(je,{inputId:s,active:r})]});if(e.zodType==="ZodArray"){let p=t?.op==="array-contains-any";return jsx("input",{id:s,type:"text",name:`fv_${e.name}`,value:n,placeholder:p?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:s,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsx(je,{inputId:s,active:r})]}):e.zodType==="ZodDate"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:s,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsx(je,{inputId:s,active:r})]}):jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:s,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0}),e.nullable&&jsx(je,{inputId:s,active:r})]})}function st({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let s=Object.fromEntries(n.map(u=>[u.field,u])),o=n.length>0,l=n.length>=2||r&&o,p=t.filter(u=>u.zodType!=="ZodObject"&&u.zodType!=="ZodRecord");return jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:o?true:void 0,children:[jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",o&&jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxs("form",{method:"get",action:e,children:[jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:p.map(u=>{let g=rr(u.zodType),h=s[u.name],k=h?.op??g[0].value;return jsxs("div",{class:"flex flex-col gap-1.5",children:[jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:u.name}),jsxs("div",{class:"flex gap-1.5",children:[g.length>1?jsx("select",{name:`fo_${u.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:g.map(w=>jsx("option",{value:w.value,selected:w.value===k,children:w.label},w.value))}):jsx("input",{type:"hidden",name:`fo_${u.name}`,value:g[0].value}),jsx(ar,{col:u,active:h})]})]},u.name)})}),jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),o&&jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),l&&jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function ot(e,t,n,r,s,o){let l=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,p=n==="create"?[{label:"Repositories",href:s},{label:e,href:`${s}/${e}`},{label:"New document"}]:[{label:"Repositories",href:s},{label:e,href:`${s}/${e}`},{label:`Edit ${r??""}`}];return le(jsx(ce,{opts:{title:l,breadcrumb:p,basePath:s,flash:o},children:jsx("div",{class:"card bg-base-100 border border-base-300",children:jsx("div",{class:"card-body p-6",children:jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}Ke();Ye();function at(e,t,n){let r=new URLSearchParams;for(let s of e)r.set(`fv_${s.field}`,s.value),r.set(`fo_${s.field}`,s.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function Jt(e,t,n,r,s){let o=at(e,r,s);return o.set("cursor",t),o.set("dir",n),`?${o.toString()}`}function ir(e,t,n,r){let s=at(n,void 0,r);return t?.field===e?t.dir==="asc"&&(s.set("ob",e),s.set("od","desc")):(s.set("ob",e),s.set("od","asc")),`?${s.toString()}`}function lr(e,t,n){return `?${at(t,n,e).toString()}`}function it(e,t,n,r,s,o,l=[],p=[],u=false,g=[],h,k,w,b,m,y,i){let d=`${r}/${e}`,c=`${d}/create`,a={};if(i)for(let x of n)a[x]=ke($e(i,x));let f=(y??[]).filter(x=>{let R=a[x]??ke($e(i,x));return R==="string"||R==="number"||R==="bigint"||R==="boolean"||R==="enum"||R==="literal"}),v=f.length>0,S=u,O=S||v,A=f.map(x=>{let R=$e(i,x),$=ke(R),T=l.find(P=>P.name===x);return {name:x,type:$,enumValues:T?.enumValues??null,nullable:T?.nullable??false}});return le(jsxs(ce,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:o},children:[l.length>0&&jsx(st,{action:d,columnMeta:l,activeFilters:p,isGroup:b}),w&&jsxs("div",{role:"alert",class:`alert ${w.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-6 w-6 shrink-0 stroke-current",fill:"none",viewBox:"0 0 24 24",children:w.type==="index"?jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}):jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})}),jsxs("div",{class:"flex-1",children:[jsx("h3",{class:"font-bold",children:w.type==="index"?"Composite index required":"Query failed"}),jsx("div",{class:"text-sm",children:w.message})]}),w.indexUrl&&jsx("a",{href:w.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3",children:[jsxs("div",{class:"flex items-center gap-3",children:[jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof m=="number"&&jsxs(Fragment,{children:[" ","of ",jsx("span",{class:"font-semibold text-base-content/80",children:m})]})," ","document",(typeof m=="number"?m:t.length)!==1&&"s"]}),jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsx("span",{children:"Rows"}),jsx("div",{class:"join",children:[10,25,50,100].map(x=>jsx("a",{href:lr(x,p,h),class:`join-item btn btn-xs ${k===x?"btn-active btn-primary":"btn-outline"}`,children:x},x))})]})]}),jsx("a",{href:c,class:"btn btn-primary btn-sm",children:"+ New"})]}),O&&jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof m=="number"?String(m):"","data-frs-page-size":String(k??t.length),"data-frs-allow-delete":S?"1":"0","data-frs-allow-update":v?"1":"0","data-frs-fields":JSON.stringify(A),"data-frs-filters":JSON.stringify(p),children:[jsxs("div",{class:"flex-1 text-sm",children:[jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof m=="number"&&m>t.length&&jsxs("button",{type:"button",class:"ml-3 link link-primary text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",m," matching documents"]}),jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",m??"?"," matching documents are selected."," ",jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxs("div",{class:"flex gap-2",children:[v&&jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),S&&jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[O&&jsx("th",{class:"w-8",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((x,R)=>{let $=h?.field===x,T=$?h.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:ir(x,h,p,k),class:`hover:text-base-content inline-flex items-center gap-0.5${$?" text-primary font-bold":""}`,children:[x,T]})},R)}),g.map((x,R)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:x.column},`rel-${R}`)),jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsx("tbody",{children:t.length===0?jsx("tr",{children:jsx("td",{colspan:n.length+g.length+1+(O?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((x,R)=>{let $=String(x.docId??x.id??""),T=`${r}/${e}/${encodeURIComponent($)}/edit`,P=`${r}/${e}/${encodeURIComponent($)}/delete`;return jsxs("tr",{class:"hover","data-frs-row-id":$,children:[O&&jsx("td",{class:"align-middle py-2",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:$,"aria-label":`Select ${$}`})}),n.map((C,B)=>{let I=x[C],D=a[C],se=D?De(D,I):null;return jsx("td",{class:"align-top py-2",children:jsx(Se,{val:I,mismatch:se})},B)}),g.map((C,B)=>{let I=x[C.key];if(I==null||I==="")return jsx("td",{class:"py-2"},`rel-${B}`);let D=C.type==="one"?`${r}/${C.targetRepo}/${encodeURIComponent(String(I))}/edit`:`${r}/${C.targetRepo}?fv_${C.targetKey}=${encodeURIComponent(String(I))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:D,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":C.type,"data-frs-rel-repo":C.targetRepo,"data-frs-rel-fk":C.targetKey,"data-frs-rel-val":String(I),"data-frs-rel-label":C.column,children:C.column})},`rel-${B}`)}),jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxs("div",{class:"flex gap-1 justify-end",children:[jsx("a",{href:T,class:"btn btn-xs btn-outline",children:"Edit"}),u&&jsx("form",{method:"post",action:P,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},R)})})]})}),(s.hasPrev||s.hasNext)&&jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxs("div",{class:"flex justify-center items-center gap-2",children:[s.hasPrev?jsx("a",{href:Jt(p,s.prevCursor,"prev",h,k),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),s.hasNext?jsx("a",{href:Jt(p,s.nextCursor,"next",h,k),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof m=="number"&&jsxs("div",{class:"text-xs text-base-content/50",children:[m," total document",m!==1?"s":"",p.length>0?" matching filters":""]})]}),O&&v&&jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxs("div",{class:"modal-box",children:[jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxs("label",{class:"form-control w-full mb-3",children:[jsx("div",{class:"label",children:jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),f.map(x=>jsx("option",{value:x,children:x},x))]})]}),jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxs("div",{class:"modal-action",children:[jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsx("form",{method:"dialog",class:"modal-backdrop",children:jsx("button",{children:"close"})})]})]}))}var dr="";function Ge(e,t){return nt(e,t)}function lt(e,t){return rt(e,t)}function ct(e,t,n,r,s,o,l,p,u,g,h,k,w,b,m,y,i){return it(e,t,n,r,s,o,l,p,u,g,h,k,w,b,m,y,i)}function ue(e,t,n,r,s,o){return ot(e,t,n,r,s,o)}var ur=new Set(["<","<=",">",">=","!="]),pr=new Set(["array-contains","array-contains-any"]);function dt(e){return e==="desc"?"DESCENDING":"ASCENDING"}function fr(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function mr(e,t,n,r,s){let o=[],l=new Set;for(let u of r)if(u.op==="=="||u.op==="in"||u.op==="not-in"){if(l.has(u.field))continue;l.add(u.field),o.push({fieldPath:u.field,order:"ASCENDING"});}for(let u of r)if(pr.has(u.op)){if(l.has(u.field))continue;l.add(u.field),o.push({fieldPath:u.field,arrayConfig:"CONTAINS"});}for(let u of r)if(ur.has(u.op)){if(l.has(u.field))continue;l.add(u.field);let g=s?.field===u.field?dt(s.dir):"ASCENDING";o.push({fieldPath:u.field,order:g});}if(s&&!l.has(s.field)&&o.push({fieldPath:s.field,order:dt(s.dir)}),o.length===1&&n)return br(e,t,o[0]);let p=s&&o.some(u=>u.fieldPath===s.field)?dt(s.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:p}),yr(e,t,n,o)}function yr(e,t,n,r,s="(default)"){let o=`projects/${e}/databases/${s}/collectionGroups/${t}/indexes/_`,l=[...ft(1,o),...Je(2,n?2:1)];for(let g of r)l.push(...Qt(3,Wt(g)));let p=s==="(default)"?"-default-":s,u=encodeURIComponent(Xt(l));return `https://console.firebase.google.com/project/${e}/firestore/databases/${p}/indexes?create_composite=${u}`}function gr(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function ut(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function pt(e,t){return e<<3|t}function ft(e,t){let n=Array.from(new TextEncoder().encode(t));return [pt(e,2),...ut(n.length),...n]}function Je(e,t){return [pt(e,0),...ut(t)]}function Qt(e,t){return [pt(e,2),...ut(t.length),...t]}function Wt(e){let t=[...ft(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...Je(3,1)):t.push(...Je(2,e.order==="DESCENDING"?2:1)),t}function Xt(e){let t=String.fromCharCode(...e),n;if(typeof Buffer<"u")n=Buffer.from(e).toString("base64");else if(typeof btoa<"u")n=btoa(t);else throw new Error("No base64 encoder available");return n.replace(/=+$/,"")}function br(e,t,n,r="(default)"){let s=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,o=[...ft(1,s),...Je(2,2),...Qt(3,Wt(n))],l=r==="(default)"?"-default-":r,p=encodeURIComponent(Xt(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${l}/indexes/automatic?create_exemption=${p}`}function hr(e){let t=e,n=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let s of n)if(typeof s=="string"&&s.length>0)return s;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function he(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function ze(e,t){let n=e??{},r=he(e),s;if(r&&(s=n.message?gr(n.message):void 0,!s)){let o=hr(t.ref);if(o){let l=fr(t.path);s=mr(o,l,t.isGroup,t.filters,t.sort);}}return {type:r?"index":"error",message:r?"This query requires a composite index that does not exist yet.":n.message??"Query failed",indexUrl:s}}var Yt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function xr(){let e="";for(let t=0;t<20;t++)e+=Yt.charAt(Math.floor(Math.random()*Yt.length));return e}function mt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),s=[];for(let o=1;o<r.length;o+=2)s.push(r[o]);return s.length>0?s:void 0}async function Fe(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let o=await e.repo.get[r](t);if(o)return o}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function yt(e,t,n){let r=e.documentKey??"docId",s=ze(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return s.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...s.indexUrl?{action:{href:s.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:s.message}}function z(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function gt(e,t){e.status(302).set("Location",t).send("");}function bt(e,t){let n=t.shape,r={};for(let[s,o]of Object.entries(n)){let l=vt(o);if(l==="ZodObject"){if(e[s+"__isnull"]==="1"){r[s]=null;continue}let g={},h=false;for(let[b,m]of Object.entries(e))b.startsWith(`${s}.`)&&(g[b.slice(s.length+1)]=m,h=true);if(h){let b=o;for(;;){let m=q(b);if(m==="ZodOptional"||m==="ZodNullable"||m==="ZodDefault")b=U(b);else break}r[s]=bt(g,b);continue}let k=e[s],w=Array.isArray(k)?k[k.length-1]:k;if(w)try{r[s]=JSON.parse(w);}catch{r[s]=w;}continue}let p=e[s],u=Array.isArray(p)?p[p.length-1]:p;if(e[s+"__isnull"]==="1"){r[s]=null;continue}if(u===void 0||u===""){l==="ZodBoolean"&&(r[s]=false);continue}switch(l){case "ZodBoolean":u==="__null__"?r[s]=null:r[s]=u==="true"||u==="on"||u==="1";break;case "ZodNumber":case "ZodBigInt":r[s]=Number(u);break;case "ZodDate":r[s]=new Date(u);break;case "ZodArray":try{r[s]=JSON.parse(u);}catch{r[s]=u;}break;default:if(u.startsWith("{")||u.startsWith("["))try{r[s]=JSON.parse(u);break}catch{}r[s]=u;}}return r}function en(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let r=new Date(e);isNaN(r.getTime())||(t=r);}if(!t||isNaN(t.getTime()))return null;let n=r=>String(r).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function vt(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=U(t);else return n}}function wr(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=U(t);else return t}}function nn(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=U(t);continue}return false}}function rn(e){let t=wr(e),n=q(t);if(n==="ZodEnum"){let r=Ae(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Ee(t),s=Object.values(r).filter(o=>typeof o=="string");return s.length>0?s:void 0}if(n==="ZodLiteral"){let r=Ue(t);return typeof r=="string"?[r]:void 0}}function sn(e,t,n=""){let r={};for(let s of Object.keys(t.shape)){let o=n?`${n}.${s}`:s,l=e[s];if(l===null){r[o]="__null__";continue}if(l===void 0)continue;let p=t.shape[s];for(;;){let g=q(p);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")p=U(p);else break}let u=q(p);if(u==="ZodObject"&&typeof l=="object"&&l!==null&&!Array.isArray(l)){let g=sn(l,p,o);Object.assign(r,g);}else if(u==="ZodDate"){let g=en(l);g!==null&&(r[o]=g);}else if(typeof l=="object"&&l!==null&&!Array.isArray(l)&&("_seconds"in l||typeof l.toDate=="function")){let g=en(l);r[o]=g??JSON.stringify(l,null,2);}else typeof l=="object"?r[o]=JSON.stringify(l,null,2):r[o]=String(l);}return r}function ht(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?ht(n.nested,t):void 0}))}function Rr(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[s,o]of Object.entries(e)){if(!s.startsWith("fv_"))continue;let l=s.slice(3);if(!t.has(l))continue;let p=(o??"").trim();if(!p)continue;let u=e[`fo_${l}`]??"==",g=n.has(u)?u:"==";r.push({field:l,op:g,value:p});}return r}function tn(e){let t="__null__",n=r=>r===t?null:r==="true"?true:r==="false"?false:r!==""&&!isNaN(Number(r))?Number(r):r;return e.map(r=>{if(r.op==="array-contains-any"||r.op==="in"||r.op==="not-in"){let s=r.value.split(",").map(o=>o.trim()).filter(o=>o!==""&&o!==t).map(o=>n(o));return [r.field,r.op,s]}return [r.field,r.op,n(r.value)]})}function on(e,t,n=""){let r=[];for(let s of e){let o=n?`${n}.${s}`:s,l=t.shape[s];if(!l){r.push({name:o,zodType:"ZodString"});continue}let p=vt(l);if(p==="ZodObject"){let u=l;for(;;){let h=q(u);if(h==="ZodOptional"||h==="ZodNullable"||h==="ZodDefault")u=U(u);else break}let g=Q(u);r.push(...on(Object.keys(g),u,o));}else r.push({name:o,zodType:p,nullable:nn(l),enumValues:rn(l)});}return r}function Sr(e,t){let n=t.split("."),r=e;for(let s of n){for(;;){let l=q(r);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")r=U(r);else break}let o=Q(r);if(!(s in o))return null;r=o[s];}return r}function ve(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let o of t){let l=o.indexOf(".");if(l===-1)n.push(o);else {let p=o.slice(0,l),u=o.slice(l+1);r.has(p)||r.set(p,[]),r.get(p).push(u);}}let s={};for(let o of n)o in e.shape&&(s[o]=e.shape[o]);for(let[o,l]of r){if(!(o in e.shape))continue;let p=e.shape[o];for(;;){let u=q(p);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")p=U(p);else break}if(q(p)!=="ZodObject"){s[o]=e.shape[o];continue}s[o]=ve(p,l);}return z$1.object(s)}function pe(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=process.env.FUNCTION_REGION??"us-central1",p=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${l}/${p}${n}`}let r=process.env.K_SERVICE,s=e.hostname??e.headers?.host??"";return r&&s.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function an(e,t){let n=(i,d)=>{let c=pe(i,t),a=Object.values(e).map(f=>({name:f.name,path:f.path}));z(d,lt(a,c));},r=async(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=a.pageSize??25,v=i.query??{},S=v.cursor,O=v.dir==="prev"?"prev":"next",A=v.ob??"",x=v.od==="desc"?"desc":"asc",R=A?{field:A,dir:x}:void 0,$=parseInt(v.ps??""),T=Number.isFinite($)&&$>0?Math.min($,200):f,P=a.listColumns??Object.keys(a.schema.shape),C=a.documentKey??"docId",B=[C,...P.filter(K=>K!==C)],I=a.filterableFields?(()=>{let K=[];for(let oe of a.filterableFields)(oe.includes(".")||P.includes(oe))&&K.push(oe);return K})():P,D=(()=>{let K=[];for(let oe of I)if(oe.includes(".")){let we=Sr(a.schema,oe);K.push({name:oe,zodType:we?vt(we):"ZodString",nullable:we?nn(we):false,enumValues:we?rn(we):void 0});}else K.push(...on([oe],a.schema));return K})(),se=new Set(D.map(K=>K.name)),Te=Rr(v,se),Be=tn(Te),Ct;if(S)try{let K=a.repo.ref;typeof K.doc=="function"&&(Ct=await K.doc(S).get());}catch{}let[me,Sn]=await Promise.all([a.repo.query.paginate({pageSize:T,cursor:Ct,direction:O,...Be.length>0?{where:Be}:{},...R?{orderBy:[{field:R.field,direction:R.dir}]}:{}}).catch(K=>({queryError:ze(K,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:Te,sort:R})})),a.repo.aggregate.count(Be.length>0?{where:Be}:{}).catch(()=>{})]),xe="queryError"in me,kn=xe?[]:me.data,$n=xe?"":me.nextCursor?.id??"",Cn=xe?"":me.prevCursor?.id??"",On=xe?me.queryError:void 0,Tn=pe(i,t);z(d,ct(a.name,kn,B,Tn,{hasPrev:xe?false:me.hasPrevPage,hasNext:xe?false:me.hasNextPage,prevCursor:Cn,nextCursor:$n},void 0,D,Te,a.allowDelete??false,a.relationalMeta,R,T,On,a.isGroup,Sn,a.mutableFields,a.schema));},s=(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=pe(i,t),v=ve(a.schema,a.createFields),S=ne(v),O=`${f}/${a.name}/create`,A=ie(S,O,"POST","Create document");z(d,ue(a.name,A,"create",null,f));},o=async(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=pe(i,t),v=i.body??{},S=bt(v,a.schema),O=ve(a.schema,a.createFields),A=O.safeParse(S);if(!A.success){let x=ne(O),R=`${f}/${a.name}/create`,$=ie(x,R,"POST","Create document"),T=A.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");z(d,ue(a.name,$,"create",null,f,{type:"error",message:`Validation error: ${T}`}),422);return}try{if(a.isGroup&&a.parentKeys&&a.parentKeys.length>0){let x={...A.data};a.createdKey&&(x[a.createdKey]=new Date);let R=a.parentKeys.filter(C=>!x[C]);if(R.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${R.join(", ")}`);let $=a.parentKeys.map(C=>x[C]),T=a.documentKey??"docId",P=x[T]||xr();await a.repo.set(...$,P,x);}else await a.repo.create(A.data);gt(d,`${f}/${a.name}?flash=created`);}catch(x){let R=ve(a.schema,a.createFields),$=ne(R),T=`${f}/${a.name}/create`,P=ie($,T,"POST","Create document");z(d,ue(a.name,P,"create",null,f,{type:"error",message:`Save error: ${x.message}`}),500);}},l=async(i,d)=>{let c=i.params.repoName,a=i.params.id;if(!c||!a){z(d,"Bad request",400);return}let f=e[c];if(!f){z(d,"Repository not found",404);return}let v=pe(i,t),S=null;try{S=await Fe(f,a);}catch(T){let P=yt(f,a,T),C=he(T)?424:500;z(d,Ge("",{title:`Edit ${f.name} / ${a}`,basePath:v,breadcrumb:[{label:"Repositories",href:v},{label:f.name,href:`${v}/${f.name}`},{label:`Edit ${a}`}],flash:P}),C);return}if(!S){z(d,"Document not found",404);return}let O=sn(S,f.schema),A=ve(f.schema,f.mutableFields),x=ht(ne(A),O),R=`${v}/${f.name}/${encodeURIComponent(a)}/edit`,$=ie(x,R,"POST","Save changes");z(d,ue(f.name,$,"edit",a,v));},p=async(i,d)=>{let c=i.params.repoName,a=i.params.id;if(!c||!a){z(d,"Bad request",400);return}let f=e[c];if(!f){z(d,"Repository not found",404);return}let v=pe(i,t),S=i.body??{},O=bt(S,f.schema),A=ve(f.schema,f.mutableFields),R=A.partial().safeParse(O);if(!R.success){let $=Object.fromEntries(Object.entries(S).map(([I,D])=>[I,Array.isArray(D)?D.join(","):D??""])),T=ht(ne(A),$),P=`${v}/${f.name}/${encodeURIComponent(a)}/edit`,C=ie(T,P,"POST","Save changes"),B=R.error.issues.map(I=>`${I.path.join(".")}: ${I.message}`).join(", ");z(d,ue(f.name,C,"edit",a,v,{type:"error",message:`Validation error: ${B}`}),422);return}try{let $=await Fe(f,a),T=($&&mt($,f.pathKey))??[a];await f.repo.update(...T,R.data),gt(d,`${v}/${f.name}?flash=updated`);}catch($){let T=ve(f.schema,f.mutableFields),P=ne(T),C=`${v}/${f.name}/${encodeURIComponent(a)}/edit`,B=ie(P,C,"POST","Save changes"),I=he($)?yt(f,a,$):{type:"error",message:`Save error: ${$.message}`},D=he($)?424:500;z(d,ue(f.name,B,"edit",a,v,I),D);}},u=async(i,d)=>{let c=i.params.repoName,a=i.params.id;if(!c||!a){z(d,"Bad request",400);return}let f=e[c];if(!f){z(d,"Repository not found",404);return}if(!f.allowDelete){z(d,"Delete is not allowed for this repository",403);return}let v=pe(i,t);try{let S=await Fe(f,a),O=(S&&mt(S,f.pathKey))??[a];await f.repo.delete(...O),gt(d,`${v}/${f.name}?flash=deleted`);}catch(S){let O=he(S)?yt(f,a,S):{type:"error",message:`Delete error: ${S.message}`},A=he(S)?424:500;z(d,Ge("",{title:`Delete ${f.name} / ${a}`,basePath:v,breadcrumb:[{label:"Repositories",href:v},{label:f.name,href:`${v}/${f.name}`},{label:`Delete ${a}`}],flash:O}),A);}},g=async(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=pe(i,t),v=i.query,S=v?.type==="many"?"many":"one",O=Math.max(1,Math.min(100,Number(v?.ps??25)||25)),A=a.listColumns??Object.keys(Q(a.schema)),{PanelOne:x,PanelMany:R}=await Promise.resolve().then(()=>(tt(),Kt)),{renderToString:$}=await import('hono/jsx/dom/server');if(S==="one"){let D=String(v?.id??"");if(!D){z(d,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let se=await Fe(a,D),Te=$(x({doc:se,repoName:a.name,basePath:f,schema:a.schema,columns:A}));z(d,Te);}catch(se){z(d,`<div class='p-6 text-error text-sm'>Error: ${se.message}</div>`,500);}return}let T=String(v?.fk??""),P=String(v?.fv??"");if(!T||!P){z(d,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let C=v?.cursor??"",B=v?.dir==="prev"?"prev":"next",I;if(C)try{let D=a.repo.ref;typeof D.doc=="function"&&(I=await D.doc(C).get());}catch{}try{let D=await a.repo.query.paginate({pageSize:O,cursor:I,direction:B,where:[[T,"==",kr(P)]]}),se=$(R({docs:D.data,repoName:a.name,basePath:f,fk:T,fv:P,columns:A,schema:a.schema,pagination:{hasPrev:D.hasPrevPage,hasNext:D.hasNextPage,prevCursor:D.prevCursor?.id??"",nextCursor:D.nextCursor?.id??"",pageSize:O}}));z(d,se);}catch(D){z(d,`<div class='p-6 text-error text-sm'>Error: ${D.message}</div>`,500);}},h=async(i,d)=>{let c=[];for(let a of d){let f;if(i.isGroup||i.parentKeys?.length){let v=await Fe(i,a);f=v?mt(v,i.pathKey):void 0;}f||(f=[a]);try{let v=i.repo.documentRef(...f);v&&c.push(v);}catch{}}return c},k=async(i,d)=>{let c=tn(d),a=i.documentKey??"docId",f=[],v;for(;;){let S=await i.repo.query.paginate({pageSize:500,cursor:v,direction:"next",...c.length>0?{where:c}:{}});for(let O of S.data){let A=String(O[a]??O.id??"");A&&f.push(A);}if(!S.hasNextPage||!S.nextCursor)break;v=S.nextCursor;}return f},w=async(i,d)=>{let c=i.params.repoName;if(!c){J(d,{error:"Bad request"},400);return}let a=e[c];if(!a){J(d,{error:"Repository not found"},404);return}if(!a.allowDelete){J(d,{error:"Delete is not allowed for this repository"},403);return}let f=i.body??{};try{let v=await m(a,f);if(v.length===0){J(d,{deleted:0});return}let S=await h(a,v);for(let O=0;O<S.length;O+=500)await a.repo.bulk.delete(S.slice(O,O+500));J(d,{deleted:S.length});}catch(v){J(d,{error:v.message},500);}},b=async(i,d)=>{let c=i.params.repoName;if(!c){J(d,{error:"Bad request"},400);return}let a=e[c];if(!a){J(d,{error:"Repository not found"},404);return}let f=i.body??{},v=String(f.field??"");if(!v){J(d,{error:"Missing 'field'"},400);return}if(!a.mutableFields||!a.mutableFields.includes(v)){J(d,{error:`Field '${v}' is not bulk-updatable`},403);return}let S=a.schema.shape?.[v],O=f.value;if(S){let A=S.safeParse(f.value);if(!A.success){J(d,{error:`Invalid value for '${v}': ${A.error.message}`},400);return}O=A.data;}try{let A=await m(a,f);if(A.length===0){J(d,{updated:0});return}let R=(await h(a,A)).map($=>({docRef:$,data:{[v]:O}}));for(let $=0;$<R.length;$+=500)await a.repo.bulk.update(R.slice($,$+500));J(d,{updated:R.length});}catch(A){J(d,{error:A.message},500);}};async function m(i,d){if(d.selectAll){let c=y(d.filters,i);return await k(i,c)}return Array.isArray(d.ids)?d.ids.filter(c=>typeof c=="string"&&!!c):[]}function y(i,d){if(!Array.isArray(i))return [];let c=new Set((d.filterableFields??Object.keys(Q(d.schema))).map(v=>String(v))),a=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),f=[];for(let v of i)v&&typeof v=="object"&&typeof v.field=="string"&&c.has(v.field)&&typeof v.value=="string"&&a.has(String(v.op))&&f.push({field:v.field,op:v.op,value:v.value});return f}return {handleDashboard:n,handleList:r,handleCreateForm:s,handleCreateSubmit:o,handleEditForm:l,handleEditSubmit:p,handleDelete:u,handlePanel:g,handleBulkDelete:w,handleBulkUpdate:b}}function J(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function kr(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}async function $r(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Cr(e){let t={};if(!e)return t;for(let n of e.split("&")){let r=n.indexOf("=");if(r===-1)continue;let s=decodeURIComponent(n.slice(0,r).replace(/\+/g," ")),o=decodeURIComponent(n.slice(r+1).replace(/\+/g," ")),l=t[s];l===void 0?t[s]=o:Array.isArray(l)?l.push(o):t[s]=[l,o];}return t}function ln(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:s,middleware:o=[],httpsOptions:l}=e,p=t==="/"?"":t.replace(/\/$/,""),u={};for(let[w,b]of Object.entries(n)){let m=b.schema??b.repo.schema??null;if(!m)throw new Error(`[createAdminServer] Repository "${w}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let y,i,d;if(b.fieldsConfig){let f=b.fieldsConfig;y=[],i=[],d=[];for(let[v,S]of Object.entries(f))for(let O of S)O==="filterable"?y.push(v):O==="mutable"?i.push(v):O==="create"&&d.push(v);y.length===0&&(y=void 0),i.length===0&&(i=void 0),d.length===0&&(d=void 0);}let c=(()=>{let f=b.repo._parentKeys;return f&&f.length>0?f:void 0})();if(c&&d)for(let f of c)d.includes(f)||d.push(f);let a={name:w,path:b.path,repo:b.repo,schema:m,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:c,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:y,mutableFields:i,createFields:d,allowDelete:b.allowDelete??false,relationalMeta:(()=>{if(!b.relationalFields||b.relationalFields.length===0)return;let f=b.repo.relationalKeys??{},v=[];for(let S of b.relationalFields){let O=f[S.key];O&&v.push({key:S.key,column:S.column,targetRepo:String(O.repo),targetKey:String(O.key),type:O.type});}return v.length>0?v:void 0})()};u[w]=a;}let g=an(u,p),h=new Y;if(r&&h.use(async(w,b,m)=>{let y=w,i=String(y.headers?.["content-type"]??"");if(i.includes("application/x-www-form-urlencoded")){let d=await $r(y);w.body=Cr(d);}else if(i.includes("application/json")&&typeof y.body=="string")try{w.body=JSON.parse(y.body);}catch{}await m();}),s)if(typeof s=="function")h.use(s);else {let w=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");h.use((m,y,i)=>{if((m.headers?.authorization??"")!==b){y.status(401).set("WWW-Authenticate",`Basic realm="${w}"`).set("Content-Type","text/plain").send("Unauthorized");return}i();});}for(let w of o)h.use(w);h.get(`${p}/`,g.handleDashboard),h.get(`${p}`,g.handleDashboard),h.get(`${p}/:repoName/_panel`,g.handlePanel),h.post(`${p}/:repoName/_bulk/delete`,g.handleBulkDelete),h.post(`${p}/:repoName/_bulk/update`,g.handleBulkUpdate),h.get(`${p}/:repoName`,g.handleList),h.get(`${p}/:repoName/create`,g.handleCreateForm),h.post(`${p}/:repoName/create`,g.handleCreateSubmit),h.get(`${p}/:repoName/:id/edit`,g.handleEditForm),h.post(`${p}/:repoName/:id/edit`,g.handleEditSubmit),h.post(`${p}/:repoName/:id/delete`,g.handleDelete);let k=async(w,b)=>{await h.handle(w,b);};return l&&(k.httpsOptions=l),k}var dn="preserve";function un(){return dn}function Or(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function pn(e){if(e==null)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(e instanceof Timestamp)return e.toDate();if(Or(e))return new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));if(typeof e=="string"){let t=new Date(e);return Number.isNaN(t.getTime())?null:t}if(typeof e=="number"){let t=new Date(e);return Number.isNaN(t.getTime())?null:t}return null}function fn(e){return e}function Rt(e,t,n=200){let r=fn(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Ce(e,t,n,r=200){Rt(e,{success:true,data:t,meta:n},r);}function H(e,t,n=400){Rt(e,{success:false,error:t},n);}function wt(e,t,n,r,s){let o=ze(t,n),l=o.type==="index",p=l?424:500,g={success:false,error:l?o.message:s&&t instanceof Error?t.message:r};l&&(g.errorType="index",o.indexUrl&&(g.indexUrl=o.indexUrl)),Rt(e,g,p);}var mn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Ar(){let e="";for(let t=0;t<20;t++)e+=mn.charAt(Math.floor(Math.random()*mn.length));return e}function Oe(e){let t=e._def??e.def;if(!t)return e;let n=t.typeName??t.type;if(n==="ZodDate"||n==="date")return z$1.preprocess(r=>pn(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,s={};for(let[o,l]of Object.entries(r))s[o]=Oe(l);return z$1.object(s)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return z$1.array(Oe(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Oe(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Oe(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,s=t.defaultValue;if(r){let o=Oe(r);return typeof s=="function"?o.default(s()):o.default(s)}}return e}function Er(e,t,n=[]){let r=e.shape,s={},o=t&&t.length>0?t:Object.keys(r);for(let l of o){if(n.includes(l))continue;let p=l.split(".")[0];p&&r[p]&&(s[p]=r[p]);}return z$1.object(s)}function yn(e,t,n,r=false,s=[]){try{let o=Er(e,n,s),l=r?o.partial():o;return {success:!0,data:(un()==="normalize"?Oe(l):l).parse(t)}}catch(o){return o instanceof z$1.ZodError?{success:false,error:`Validation failed: ${o.issues.map(p=>`${p.path.join(".")}: ${p.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function Pr(e,t){let n=[],r=t?new Set(t):null,s={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[o,l]of Object.entries(e)){if(l===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(o))continue;let p=Array.isArray(l)?l[0]:l;if(p===void 0||p==="")continue;let u=o.match(/^(\w+)__(\w+)$/),g,h="==";if(u&&u[1]&&u[2]){g=u[1];let w=u[2];if(s[w])h=s[w];else continue}else if(!u)g=o;else continue;if(r&&!r.has(g))continue;let k=p;h==="in"||h==="not-in"||h==="array-contains-any"?k=p.split(",").map(w=>gn(w.trim())):k=gn(p),n.push({field:g,op:h,value:k});}return n}function gn(e){if(e==="true")return true;if(e==="false")return false;if(e==="null")return null;let t=Number(e);return !isNaN(t)&&e!==""?t:e}function Qe(e){return e?{docId:e.id}:null}async function bn(e,t){if(!t||typeof t!="object")return;let n=t.docId;if(typeof n=="string")try{let r=e.repo.ref;if(typeof r.doc!="function")return;let s=await r.doc(n).get();return s.exists?s:void 0}catch{return}}function hn(e,t,n){function r(b,m){return !b||!e[b]?(H(m,`Repository "${b}" not found`,404),null):e[b]}function s(b,m){if(!m)return;let y=b[m];if(typeof y!="string"||!y)return;let i=y.split("/").filter(Boolean),d=[];for(let c=1;c<i.length;c+=2)d.push(i[c]);return d.length>0?d:void 0}async function o(b,m){let y=`by${b.documentKey.charAt(0).toUpperCase()}${b.documentKey.slice(1)}`,i=b.repo.get[y];if(typeof i=="function")try{let c=await i(m);if(c)return c}catch{}return (await b.repo.query.by({where:[[b.documentKey,"==",m]],limit:1}))[0]??null}async function l(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;let d=[],c;try{let a=b.query??{},f=Math.min(Number(a.pageSize)||i.pageSize,100),v=a.cursor,S=a.direction?.toLowerCase()==="prev"?"prev":"next",O=a.orderBy,A=a.orderDir?.toLowerCase()==="desc"?"desc":"asc",x=a.select,R=x?x.split(",").map(I=>I.trim()):void 0,$;i.allowedIncludes&&a.includes&&($=(typeof a.includes=="string"?a.includes.split(",").map(D=>D.trim()):Array.isArray(a.includes)?a.includes:[]).filter(D=>typeof D=="string"&&i.allowedIncludes.includes(D)),$?.length===0&&($=void 0));let T=Pr(a,i.filterableFields);d=T.map(I=>({field:I.field,op:I.op,value:String(I.value??"")})),O&&(c={field:O,dir:A});let P={pageSize:f,direction:S};if(v)try{let I=typeof v=="string"?JSON.parse(v):v;P.cursor=await bn(i,I);}catch{}O&&(P.orderBy=[{field:O,direction:A}]),T.length>0&&(P.where=T.map(I=>[I.field,I.op,I.value])),R&&(P.select=R),$&&(P.include=$);let C=await i.repo.query.paginate(P),B={items:C.data,hasNextPage:C.hasNextPage,hasPrevPage:C.hasPrevPage,nextCursor:Qe(C.nextCursor),prevCursor:Qe(C.prevCursor)};Ce(m,B,{pageSize:f,hasMore:C.hasNextPage});}catch(a){wt(m,a,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:d,sort:c},"Failed to fetch documents",n);}}async function p(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;let d=[],c;try{let a=b.body??{},f=Math.min(a.pageSize||i.pageSize,100),v=a.direction==="prev"?"prev":"next";a.where&&(d=a.where.map(x=>({field:String(x[0]),op:x[1],value:String(x[2]??"")}))),a.orderBy&&a.orderBy[0]&&(c={field:a.orderBy[0].field,dir:a.orderBy[0].direction==="desc"?"desc":"asc"});let S={pageSize:f,direction:v};if(a.cursor)try{let x=typeof a.cursor=="string"?JSON.parse(a.cursor):a.cursor;S.cursor=await bn(i,x);}catch{}if(i.allowedIncludes&&a.includes&&a.includes.length>0){let x=a.includes.filter(R=>typeof R=="string"?i.allowedIncludes.includes(R):typeof R=="object"&&R!==null&&"relation"in R&&typeof R.relation=="string"?i.allowedIncludes.includes(R.relation):!1);x.length>0&&(S.include=x);}if(a.where&&a.where.length>0){if(i.filterableFields){let x=new Set(i.filterableFields),R=a.where.filter($=>!x.has($[0]));if(R.length>0){H(m,`Fields not filterable: ${R.map($=>$[0]).join(", ")}`,400);return}}S.where=a.where;}if(a.orWhere&&a.orWhere.length>0){if(i.filterableFields){let x=new Set(i.filterableFields),R=a.orWhere.filter($=>!x.has($[0]));if(R.length>0){H(m,`Fields not filterable: ${R.map($=>$[0]).join(", ")}`,400);return}}S.orWhere=a.orWhere;}if(a.orWhereGroups&&a.orWhereGroups.length>0){if(i.filterableFields){let x=new Set(i.filterableFields);for(let R of a.orWhereGroups){let $=R.filter(T=>!x.has(T[0]));if($.length>0){H(m,`Fields not filterable: ${$.map(T=>T[0]).join(", ")}`,400);return}}}S.orWhereGroups=a.orWhereGroups;}a.orderBy&&a.orderBy.length>0&&(S.orderBy=a.orderBy),a.select&&a.select.length>0&&(S.select=a.select);let O=await i.repo.query.paginate(S),A={items:O.data,hasNextPage:O.hasNextPage,hasPrevPage:O.hasPrevPage,nextCursor:Qe(O.nextCursor),prevCursor:Qe(O.prevCursor)};Ce(m,A,{pageSize:f,hasMore:O.hasNextPage});}catch(a){wt(m,a,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:d,sort:c},"Failed to query documents",n);}}async function u(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;let d=y.id;if(!d){H(m,"Document ID required",400);return}try{let c=await o(i,d);if(!c){H(m,"Document not found",404);return}Ce(m,c);}catch(c){wt(m,c,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:[{field:i.documentKey,op:"==",value:d}]},"Failed to fetch document",n);}}async function g(b,m){let y=b.params||{},i=r(y.repoName,m);if(i)try{let d=b.body??{},c=yn(i.schema,d,i.createFields,!1,i.systemKeys);if(!c.success){H(m,c.error,400);return}if(i.validate){let f=await i.validate(c.data,"create");if(f){H(m,f,400);return}}let a;if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let f={...c.data};i.createdKey&&(f[i.createdKey]=new Date);let v=i.parentKeys.filter(A=>!f[A]);if(v.length>0){H(m,`Missing parent key(s) for subcollection create: ${v.join(", ")}`,400);return}let S=i.parentKeys.map(A=>f[A]),O=f[i.documentKey]||Ar();a=await i.repo.set(...S,O,f);}else a=await i.repo.create(c.data);Ce(m,a,void 0,201);}catch(d){let c=n&&d instanceof Error?d.message:"Failed to create document";H(m,c,500);}}async function h(b,m,y){let i=b.params||{},d=r(i.repoName,m);if(!d)return;let c=i.id;if(!c){H(m,"Document ID required",400);return}try{let a=b.body??{},f=yn(d.schema,a,d.mutableFields,y,d.systemKeys);if(!f.success){H(m,f.error,400);return}if(d.validate){let A=await d.validate(f.data,"update");if(A){H(m,A,400);return}}let v=await o(d,c),S=(v&&s(v,d.pathKey))??[c],O=await d.repo.update(...S,f.data);Ce(m,O);}catch(a){let f=n&&a instanceof Error?a.message:"Failed to update document";H(m,f,500);}}async function k(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;if(!i.allowDelete){H(m,"Delete not allowed for this repository",403);return}let d=y.id;if(!d){H(m,"Document ID required",400);return}try{let c=await o(i,d),a=(c&&s(c,i.pathKey))??[d];await i.repo.delete(...a),Ce(m,{deleted:!0});}catch(c){let a=n&&c instanceof Error?c.message:"Failed to delete document";H(m,a,500);}}function w(b,m){m.status(204).set("Access-Control-Allow-Methods","GET, POST, PUT, PATCH, DELETE, OPTIONS").set("Access-Control-Allow-Headers","Content-Type, Authorization").set("Access-Control-Max-Age","86400").send("");}return {handleList:l,handleQuery:p,handleGet:u,handleCreate:g,handleUpdate:h,handleDelete:k,handleOptions:w}}function St(e){try{return z$1.toJSONSchema(e,{target:"openapi-3.1",unrepresentable:"any",override:t=>{let n=t.zodSchema?._zod?.def;n&&(n.type==="date"?(t.jsonSchema.type="string",t.jsonSchema.format="date-time"):n.type==="bigint"&&(t.jsonSchema.type="string",t.jsonSchema.format="int64"));}})}catch(t){return typeof console<"u"&&console.warn&&console.warn("[generateOpenAPISpec] Failed to convert Zod schema to JSON Schema; falling back to {type:object}.",t),{type:"object"}}}function X(e){return {$ref:`#/components/schemas/${e}`}}function G(e){return {description:e,content:{"application/json":{schema:X("ErrorResponse")}}}}function qe(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function vn(e){return {description:"Paginated list of documents",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:{type:"object",properties:{items:{type:"array",items:e},nextCursor:{oneOf:[{type:"object"},{type:"null"}]},prevCursor:{oneOf:[{type:"object"},{type:"null"}]},hasNextPage:{type:"boolean"},hasPrevPage:{type:"boolean"}},required:["items","hasNextPage","hasPrevPage"]},meta:{type:"object",properties:{pageSize:{type:"integer"},hasMore:{type:"boolean"},cursor:{oneOf:[{type:"string"},{type:"null"}]}}}},required:["success","data"]}}}}}function Nr(e){return [{name:"pageSize",in:"query",schema:{type:"integer",default:e.pageSize,maximum:100},description:"Number of items per page"},{name:"cursor",in:"query",schema:{type:"string"},description:"Base64 pagination cursor"},{name:"orderBy",in:"query",schema:{type:"string"},description:"Field name to order by"},{name:"orderDir",in:"query",schema:{type:"string",enum:["asc","desc"]},description:"Order direction"},{name:"select",in:"query",schema:{type:"string"},description:"Comma-separated list of fields to return"}]}function Ir(e){let t=e.filterableFields??Object.keys(e.schema.shape),n=["eq","ne","lt","lte","gt","gte","in","nin","contains"],r=[];for(let s of t){r.push({name:s,in:"query",schema:{type:"string"},description:`Filter by ${s} (equality)`});for(let o of n)r.push({name:`${s}__${o}`,in:"query",schema:{type:"string"},description:`Filter ${s} with operator ${o}`});}return r}function _r(){return {type:"object",properties:{where:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3},description:"AND conditions: [field, operator, value][]"},orWhere:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3},description:"Simple OR conditions (each independently OR'd)"},orWhereGroups:{type:"array",items:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3}},description:"Advanced OR groups (AND within, OR across groups)"},orderBy:{type:"array",items:{type:"object",properties:{field:{type:"string"},direction:{type:"string",enum:["asc","desc"]}},required:["field"]}},select:{type:"array",items:{type:"string"},description:"Fields to select (projection)"},pageSize:{type:"integer",maximum:100,description:"Number of items per page"},cursor:{oneOf:[{type:"string"},{type:"object"}],description:"Pagination cursor"},direction:{type:"string",enum:["next","prev"],description:"Pagination direction"},includes:{type:"array",items:{oneOf:[{type:"string"},{type:"object",properties:{relation:{type:"string"},select:{type:"array",items:{type:"string"}}},required:["relation"]}]},description:"Relations to include (populate)"}}}}function Dr(e,t,n,r,s){let o={},l=e.name,p=`${t}/${e.name}`,u=`${p}/{${e.documentKey}}`,g={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};o[p]={get:{operationId:`list${fe(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[l],parameters:[...Nr(e),...Ir(e)],responses:{200:vn(X(n)),500:G("Internal server error")}},post:{operationId:`create${fe(e.name)}`,summary:`Create a ${re(e.name)}`,tags:[l],requestBody:{required:true,content:{"application/json":{schema:X(r??n)}}},responses:{201:qe("Document created",X(n)),400:G("Validation error"),500:G("Internal server error")}}},o[`${p}/query`]={post:{operationId:`query${fe(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[l],requestBody:{required:true,content:{"application/json":{schema:X("QueryRequestBody")}}},responses:{200:vn(X(n)),400:G("Invalid query"),500:G("Internal server error")}}};let h={};return h.get={operationId:`get${fe(re(e.name))}`,summary:`Get a single ${re(e.name)}`,tags:[l],parameters:[g],responses:{200:qe("Document found",X(n)),404:G("Document not found"),500:G("Internal server error")}},h.put={operationId:`update${fe(re(e.name))}`,summary:`Update a ${re(e.name)} (full replace)`,tags:[l],parameters:[g],requestBody:{required:true,content:{"application/json":{schema:X(s??n)}}},responses:{200:qe("Document updated",X(n)),400:G("Validation error"),404:G("Document not found"),500:G("Internal server error")}},h.patch={operationId:`patch${fe(re(e.name))}`,summary:`Partially update a ${re(e.name)}`,tags:[l],parameters:[g],requestBody:{required:true,content:{"application/json":{schema:{allOf:[X(s??n)],description:"All fields are optional for partial updates"}}}},responses:{200:qe("Document patched",X(n)),400:G("Validation error"),404:G("Document not found"),500:G("Internal server error")}},e.allowDelete&&(h.delete={operationId:`delete${fe(re(e.name))}`,summary:`Delete a ${re(e.name)}`,tags:[l],parameters:[g],responses:{200:qe("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:G("Document not found"),500:G("Internal server error")}}),o[u]=h,o}function $t(e,t,n={}){let{title:r="CRUD API",version:s="1.0.0",description:o,servers:l,auth:p=false}=n,u=t==="/"?"":t.replace(/\/$/,""),g={},h={},k=[];g.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},g.QueryRequestBody=_r();for(let[y,i]of Object.entries(e)){let d=fe(re(y)),c=`${d}Create`,a=`${d}Update`;g[d]=St(i.schema);let f=R=>{let $=R&&R.length>0?R:Object.keys(i.schema.shape),T={};for(let P of $){let C=P.split(".")[0];C&&i.schema.shape[C]&&!i.systemKeys.includes(C)&&(T[C]=i.schema.shape[C]);}return T},v=null,S=f(i.createFields);Object.keys(S).length>0&&(g[c]=St(z$1.object(S)),v=c);let O=null,A=f(i.mutableFields);Object.keys(A).length>0&&(g[a]=St(z$1.object(A)),O=a);let x=Dr(i,u,d,v,O);Object.assign(h,x),k.push({name:y,description:`Operations on ${y} (collection: ${i.path})`});}let w={},b;return p==="basic"?(w.basicAuth={type:"http",scheme:"basic"},b=[{basicAuth:[]}]):p==="bearer"&&(w.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},b=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:s,...o?{description:o}:{}},...l&&l.length>0?{servers:l}:{},paths:h,components:{schemas:g,...Object.keys(w).length>0?{securitySchemes:w}:{}},...b?{security:b}:{},tags:k}}function fe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function re(e){return e.endsWith("ies")?e.slice(0,-3)+"y":e.endsWith("ses")||e.endsWith("xes")||e.endsWith("zes")?e.slice(0,-2):e.endsWith("s")&&!e.endsWith("ss")?e.slice(0,-1):e}function jr(e,t){return `<!DOCTYPE html>
1135
+ `;function _e(){return jsx("script",{dangerouslySetInnerHTML:{__html:Lt}})}tt();function le(e){return "<!DOCTYPE html>"+renderToString(e)}var Yn=["corporate","silk","dark"],er=()=>jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"size-4",children:[jsx("circle",{cx:"12",cy:"12",r:"4"}),jsx("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsx("ul",{tabIndex:0,class:"dropdown-content menu menu-sm bg-base-100 text-base-content rounded-box z-50 mt-2 w-40 p-1 shadow-lg border border-base-300",children:Yn.map(e=>jsx("li",{children:jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsx("span",{children:e}),jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),ce=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:s,basePath:o="/"}=e;return jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxs("head",{children:[jsx("meta",{charset:"UTF-8"}),jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsx("div",{class:"flex-1",children:jsx("a",{href:o,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsx("div",{class:"flex-none",children:jsx(er,{})})]}),jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:r.map((l,p)=>l.href?jsx("li",{children:jsx("a",{href:l.href,children:l.label})},p):jsx("li",{class:"text-base-content/60",children:l.label},p))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),s&&jsxs("div",{role:"alert",class:`alert ${s.type==="success"?"alert-success":s.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsx("span",{class:"flex-1",children:s.message}),s.action&&jsx("a",{href:s.action.href,...s.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:s.action.label})]}),t]}),jsx(et,{basePath:o}),jsx(_e,{})]})]})};function nt(e,t){return le(jsx(ce,{opts:t,children:jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function rt(e,t){return le(jsx(ce,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:e.map(n=>jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxs("div",{class:"card-body p-5",children:[jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var Gt=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],tr=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"<",label:"<"},{value:"<=",label:"\u2264"},{value:">",label:">"},{value:">=",label:"\u2265"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],nr=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function rr(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return tr;case "ZodBoolean":return Gt;case "ZodArray":return nr;default:return Gt}}var de="__null__";function sr(e){return `(function(cb){var i=document.getElementById('${e}');if(!i)return;if(cb.checked){i.dataset._prev=i.value;if(i.tagName==='SELECT'){var o=i.querySelector('option[value="${de}"]');if(!o){o=document.createElement('option');o.value='${de}';o.textContent='\u2205 null';o.dataset._auto='1';i.appendChild(o);}o.selected=true;}else{if(i.type==='number'||i.type==='datetime-local'){i.dataset._type=i.type;i.type='text';}i.value='${de}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${de}"][data-_auto="1"]');if(o2)o2.remove();var prev=i.dataset._prev||'';for(var k=0;k<i.options.length;k++)i.options[k].selected=(i.options[k].value===prev);}else{if(i.dataset._type){i.type=i.dataset._type;delete i.dataset._type;}i.readOnly=false;i.value=(i.dataset._prev&&i.dataset._prev!=='${de}')?i.dataset._prev:'';}}})(this)`}function or(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function je({inputId:e,active:t}){return jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:sr(e)}),jsx("span",{children:"\u2205"})]})}function ar({col:e,active:t}){let n=t?.value??"",r=n===de,s=`fv_input_${e.name.replace(/\./g,"__")}`,o=t?.op,l=o==="in"||o==="not-in";if(e.enumValues&&e.enumValues.length>0){if(l){let p=new Set(n.split(",").map(g=>g.trim()).filter(Boolean)),u=`eg_${e.name.replace(/\./g,"__")}`;return jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsx("input",{type:"hidden",id:s,name:`fv_${e.name}`,value:n}),e.enumValues.map(g=>jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:g,checked:p.has(g),"data-enum-group":u,onchange:or(s,u)}),jsx("span",{children:g})]},g))]})}return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:s,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(p=>jsx("option",{value:p,selected:n===p,children:p},p)),e.nullable&&jsx("option",{value:de,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(je,{inputId:s,active:r})]})}if(e.zodType==="ZodBoolean")return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:s,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsx("option",{value:"true",selected:n==="true",children:"true"}),jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsx("option",{value:de,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(je,{inputId:s,active:r})]});if(e.zodType==="ZodArray"){let p=t?.op==="array-contains-any";return jsx("input",{id:s,type:"text",name:`fv_${e.name}`,value:n,placeholder:p?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:s,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsx(je,{inputId:s,active:r})]}):e.zodType==="ZodDate"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:s,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsx(je,{inputId:s,active:r})]}):jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:s,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0}),e.nullable&&jsx(je,{inputId:s,active:r})]})}function st({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let s=Object.fromEntries(n.map(u=>[u.field,u])),o=n.length>0,l=n.length>=2||r&&o,p=t.filter(u=>u.zodType!=="ZodObject"&&u.zodType!=="ZodRecord");return jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:o?true:void 0,children:[jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",o&&jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxs("form",{method:"get",action:e,children:[jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:p.map(u=>{let g=rr(u.zodType),h=s[u.name],k=h?.op??g[0].value;return jsxs("div",{class:"flex flex-col gap-1.5",children:[jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:u.name}),jsxs("div",{class:"flex gap-1.5",children:[g.length>1?jsx("select",{name:`fo_${u.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:g.map(w=>jsx("option",{value:w.value,selected:w.value===k,children:w.label},w.value))}):jsx("input",{type:"hidden",name:`fo_${u.name}`,value:g[0].value}),jsx(ar,{col:u,active:h})]})]},u.name)})}),jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),o&&jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),l&&jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function ot(e,t,n,r,s,o){let l=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,p=n==="create"?[{label:"Repositories",href:s},{label:e,href:`${s}/${e}`},{label:"New document"}]:[{label:"Repositories",href:s},{label:e,href:`${s}/${e}`},{label:`Edit ${r??""}`}];return le(jsx(ce,{opts:{title:l,breadcrumb:p,basePath:s,flash:o},children:jsx("div",{class:"card bg-base-100 border border-base-300",children:jsx("div",{class:"card-body p-6",children:jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}Ke();Ye();function at(e,t,n){let r=new URLSearchParams;for(let s of e)r.set(`fv_${s.field}`,s.value),r.set(`fo_${s.field}`,s.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function Jt(e,t,n,r,s){let o=at(e,r,s);return o.set("cursor",t),o.set("dir",n),`?${o.toString()}`}function ir(e,t,n,r){let s=at(n,void 0,r);return t?.field===e?t.dir==="asc"&&(s.set("ob",e),s.set("od","desc")):(s.set("ob",e),s.set("od","asc")),`?${s.toString()}`}function lr(e,t,n){return `?${at(t,n,e).toString()}`}function it(e,t,n,r,s,o,l=[],p=[],u=false,g=[],h,k,w,b,m,y,i){let d=`${r}/${e}`,c=`${d}/create`,a={};if(i)for(let x of n)a[x]=ke($e(i,x));let f=(y??[]).filter(x=>{let R=a[x]??ke($e(i,x));return R==="string"||R==="number"||R==="bigint"||R==="boolean"||R==="enum"||R==="literal"}),v=f.length>0,S=u,O=S||v,A=f.map(x=>{let R=$e(i,x),$=ke(R),T=l.find(P=>P.name===x);return {name:x,type:$,enumValues:T?.enumValues??null,nullable:T?.nullable??false}});return le(jsxs(ce,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:o},children:[l.length>0&&jsx(st,{action:d,columnMeta:l,activeFilters:p,isGroup:b}),w&&jsxs("div",{role:"alert",class:`alert ${w.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-6 w-6 shrink-0 stroke-current",fill:"none",viewBox:"0 0 24 24",children:w.type==="index"?jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}):jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})}),jsxs("div",{class:"flex-1",children:[jsx("h3",{class:"font-bold",children:w.type==="index"?"Composite index required":"Query failed"}),jsx("div",{class:"text-sm",children:w.message})]}),w.indexUrl&&jsx("a",{href:w.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxs("div",{class:"flex items-center gap-3",children:[jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof m=="number"&&jsxs(Fragment,{children:[" ","of ",jsx("span",{class:"font-semibold text-base-content/80",children:m})]})," ","document",(typeof m=="number"?m:t.length)!==1&&"s"]}),jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsx("span",{children:"Rows"}),jsx("div",{class:"join",children:[10,25,50,100].map(x=>jsx("a",{href:lr(x,p,h),class:`join-item btn btn-xs ${k===x?"btn-active btn-primary":"btn-outline"}`,children:x},x))})]})]}),jsx("a",{href:c,class:"btn btn-primary btn-sm",children:"+ New"})]}),O&&jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof m=="number"?String(m):"","data-frs-page-size":String(k??t.length),"data-frs-allow-delete":S?"1":"0","data-frs-allow-update":v?"1":"0","data-frs-fields":JSON.stringify(A),"data-frs-filters":JSON.stringify(p),children:[jsxs("div",{class:"flex-1 text-sm",children:[jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof m=="number"&&m>t.length&&jsxs("button",{type:"button",class:"ml-3 link link-primary text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",m," matching documents"]}),jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",m??"?"," matching documents are selected."," ",jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxs("div",{class:"flex gap-2",children:[v&&jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),S&&jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[O&&jsx("th",{class:"w-8",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((x,R)=>{let $=h?.field===x,T=$?h.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:ir(x,h,p,k),class:`hover:text-base-content inline-flex items-center gap-0.5${$?" text-primary font-bold":""}`,children:[x,T]})},R)}),g.map((x,R)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:x.column},`rel-${R}`)),jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsx("tbody",{children:t.length===0?jsx("tr",{children:jsx("td",{colspan:n.length+g.length+1+(O?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((x,R)=>{let $=String(x.docId??x.id??""),T=`${r}/${e}/${encodeURIComponent($)}/edit`,P=`${r}/${e}/${encodeURIComponent($)}/delete`;return jsxs("tr",{class:"hover","data-frs-row-id":$,children:[O&&jsx("td",{class:"align-middle py-2",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:$,"aria-label":`Select ${$}`})}),n.map((C,B)=>{let I=x[C],D=a[C],se=D?De(D,I):null;return jsx("td",{class:"align-top py-2",children:jsx(Se,{val:I,mismatch:se})},B)}),g.map((C,B)=>{let I=x[C.key];if(I==null||I==="")return jsx("td",{class:"py-2"},`rel-${B}`);let D=C.type==="one"?`${r}/${C.targetRepo}/${encodeURIComponent(String(I))}/edit`:`${r}/${C.targetRepo}?fv_${C.targetKey}=${encodeURIComponent(String(I))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:D,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":C.type,"data-frs-rel-repo":C.targetRepo,"data-frs-rel-fk":C.targetKey,"data-frs-rel-val":String(I),"data-frs-rel-label":C.column,children:C.column})},`rel-${B}`)}),jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxs("div",{class:"flex gap-1 justify-end",children:[jsx("a",{href:T,class:"btn btn-xs btn-outline",children:"Edit"}),u&&jsx("form",{method:"post",action:P,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},R)})})]})}),(s.hasPrev||s.hasNext)&&jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxs("div",{class:"flex justify-center items-center gap-2",children:[s.hasPrev?jsx("a",{href:Jt(p,s.prevCursor,"prev",h,k),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),s.hasNext?jsx("a",{href:Jt(p,s.nextCursor,"next",h,k),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof m=="number"&&jsxs("div",{class:"text-xs text-base-content/50",children:[m," total document",m!==1?"s":"",p.length>0?" matching filters":""]})]}),O&&v&&jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxs("div",{class:"modal-box",children:[jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxs("label",{class:"form-control w-full mb-3",children:[jsx("div",{class:"label",children:jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),f.map(x=>jsx("option",{value:x,children:x},x))]})]}),jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxs("div",{class:"modal-action",children:[jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsx("form",{method:"dialog",class:"modal-backdrop",children:jsx("button",{children:"close"})})]})]}))}var dr="";function Ge(e,t){return nt(e,t)}function lt(e,t){return rt(e,t)}function ct(e,t,n,r,s,o,l,p,u,g,h,k,w,b,m,y,i){return it(e,t,n,r,s,o,l,p,u,g,h,k,w,b,m,y,i)}function ue(e,t,n,r,s,o){return ot(e,t,n,r,s,o)}var ur=new Set(["<","<=",">",">=","!="]),pr=new Set(["array-contains","array-contains-any"]);function dt(e){return e==="desc"?"DESCENDING":"ASCENDING"}function fr(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function mr(e,t,n,r,s){let o=[],l=new Set;for(let u of r)if(u.op==="=="||u.op==="in"||u.op==="not-in"){if(l.has(u.field))continue;l.add(u.field),o.push({fieldPath:u.field,order:"ASCENDING"});}for(let u of r)if(pr.has(u.op)){if(l.has(u.field))continue;l.add(u.field),o.push({fieldPath:u.field,arrayConfig:"CONTAINS"});}for(let u of r)if(ur.has(u.op)){if(l.has(u.field))continue;l.add(u.field);let g=s?.field===u.field?dt(s.dir):"ASCENDING";o.push({fieldPath:u.field,order:g});}if(s&&!l.has(s.field)&&o.push({fieldPath:s.field,order:dt(s.dir)}),o.length===1&&n)return br(e,t,o[0]);let p=s&&o.some(u=>u.fieldPath===s.field)?dt(s.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:p}),yr(e,t,n,o)}function yr(e,t,n,r,s="(default)"){let o=`projects/${e}/databases/${s}/collectionGroups/${t}/indexes/_`,l=[...ft(1,o),...Je(2,n?2:1)];for(let g of r)l.push(...Qt(3,Wt(g)));let p=s==="(default)"?"-default-":s,u=encodeURIComponent(Xt(l));return `https://console.firebase.google.com/project/${e}/firestore/databases/${p}/indexes?create_composite=${u}`}function gr(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function ut(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function pt(e,t){return e<<3|t}function ft(e,t){let n=Array.from(new TextEncoder().encode(t));return [pt(e,2),...ut(n.length),...n]}function Je(e,t){return [pt(e,0),...ut(t)]}function Qt(e,t){return [pt(e,2),...ut(t.length),...t]}function Wt(e){let t=[...ft(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...Je(3,1)):t.push(...Je(2,e.order==="DESCENDING"?2:1)),t}function Xt(e){let t=String.fromCharCode(...e),n;if(typeof Buffer<"u")n=Buffer.from(e).toString("base64");else if(typeof btoa<"u")n=btoa(t);else throw new Error("No base64 encoder available");return n.replace(/=+$/,"")}function br(e,t,n,r="(default)"){let s=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,o=[...ft(1,s),...Je(2,2),...Qt(3,Wt(n))],l=r==="(default)"?"-default-":r,p=encodeURIComponent(Xt(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${l}/indexes/automatic?create_exemption=${p}`}function hr(e){let t=e,n=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let s of n)if(typeof s=="string"&&s.length>0)return s;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function he(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function ze(e,t){let n=e??{},r=he(e),s;if(r&&(s=n.message?gr(n.message):void 0,!s)){let o=hr(t.ref);if(o){let l=fr(t.path);s=mr(o,l,t.isGroup,t.filters,t.sort);}}return {type:r?"index":"error",message:r?"This query requires a composite index that does not exist yet.":n.message??"Query failed",indexUrl:s}}var Yt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function xr(){let e="";for(let t=0;t<20;t++)e+=Yt.charAt(Math.floor(Math.random()*Yt.length));return e}function mt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),s=[];for(let o=1;o<r.length;o+=2)s.push(r[o]);return s.length>0?s:void 0}async function Ze(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let o=await e.repo.get[r](t);if(o)return o}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function yt(e,t,n){let r=e.documentKey??"docId",s=ze(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return s.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...s.indexUrl?{action:{href:s.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:s.message}}function z(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function gt(e,t){e.status(302).set("Location",t).send("");}function bt(e,t){let n=t.shape,r={};for(let[s,o]of Object.entries(n)){let l=vt(o);if(l==="ZodObject"){if(e[s+"__isnull"]==="1"){r[s]=null;continue}let g={},h=false;for(let[b,m]of Object.entries(e))b.startsWith(`${s}.`)&&(g[b.slice(s.length+1)]=m,h=true);if(h){let b=o;for(;;){let m=q(b);if(m==="ZodOptional"||m==="ZodNullable"||m==="ZodDefault")b=U(b);else break}r[s]=bt(g,b);continue}let k=e[s],w=Array.isArray(k)?k[k.length-1]:k;if(w)try{r[s]=JSON.parse(w);}catch{r[s]=w;}continue}let p=e[s],u=Array.isArray(p)?p[p.length-1]:p;if(e[s+"__isnull"]==="1"){r[s]=null;continue}if(u===void 0||u===""){l==="ZodBoolean"&&(r[s]=false);continue}switch(l){case "ZodBoolean":u==="__null__"?r[s]=null:r[s]=u==="true"||u==="on"||u==="1";break;case "ZodNumber":case "ZodBigInt":r[s]=Number(u);break;case "ZodDate":r[s]=new Date(u);break;case "ZodArray":try{r[s]=JSON.parse(u);}catch{r[s]=u;}break;default:if(u.startsWith("{")||u.startsWith("["))try{r[s]=JSON.parse(u);break}catch{}r[s]=u;}}return r}function en(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let r=new Date(e);isNaN(r.getTime())||(t=r);}if(!t||isNaN(t.getTime()))return null;let n=r=>String(r).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function vt(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=U(t);else return n}}function wr(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=U(t);else return t}}function nn(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=U(t);continue}return false}}function rn(e){let t=wr(e),n=q(t);if(n==="ZodEnum"){let r=Ae(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Ee(t),s=Object.values(r).filter(o=>typeof o=="string");return s.length>0?s:void 0}if(n==="ZodLiteral"){let r=Ue(t);return typeof r=="string"?[r]:void 0}}function sn(e,t,n=""){let r={};for(let s of Object.keys(t.shape)){let o=n?`${n}.${s}`:s,l=e[s];if(l===null){r[o]="__null__";continue}if(l===void 0)continue;let p=t.shape[s];for(;;){let g=q(p);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")p=U(p);else break}let u=q(p);if(u==="ZodObject"&&typeof l=="object"&&l!==null&&!Array.isArray(l)){let g=sn(l,p,o);Object.assign(r,g);}else if(u==="ZodDate"){let g=en(l);g!==null&&(r[o]=g);}else if(typeof l=="object"&&l!==null&&!Array.isArray(l)&&("_seconds"in l||typeof l.toDate=="function")){let g=en(l);r[o]=g??JSON.stringify(l,null,2);}else typeof l=="object"?r[o]=JSON.stringify(l,null,2):r[o]=String(l);}return r}function ht(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?ht(n.nested,t):void 0}))}function Rr(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[s,o]of Object.entries(e)){if(!s.startsWith("fv_"))continue;let l=s.slice(3);if(!t.has(l))continue;let p=(o??"").trim();if(!p)continue;let u=e[`fo_${l}`]??"==",g=n.has(u)?u:"==";r.push({field:l,op:g,value:p});}return r}function tn(e){let t="__null__",n=r=>r===t?null:r==="true"?true:r==="false"?false:r!==""&&!isNaN(Number(r))?Number(r):r;return e.map(r=>{if(r.op==="array-contains-any"||r.op==="in"||r.op==="not-in"){let s=r.value.split(",").map(o=>o.trim()).filter(o=>o!==""&&o!==t).map(o=>n(o));return [r.field,r.op,s]}return [r.field,r.op,n(r.value)]})}function on(e,t,n=""){let r=[];for(let s of e){let o=n?`${n}.${s}`:s,l=t.shape[s];if(!l){r.push({name:o,zodType:"ZodString"});continue}let p=vt(l);if(p==="ZodObject"){let u=l;for(;;){let h=q(u);if(h==="ZodOptional"||h==="ZodNullable"||h==="ZodDefault")u=U(u);else break}let g=Q(u);r.push(...on(Object.keys(g),u,o));}else r.push({name:o,zodType:p,nullable:nn(l),enumValues:rn(l)});}return r}function Sr(e,t){let n=t.split("."),r=e;for(let s of n){for(;;){let l=q(r);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")r=U(r);else break}let o=Q(r);if(!(s in o))return null;r=o[s];}return r}function ve(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let o of t){let l=o.indexOf(".");if(l===-1)n.push(o);else {let p=o.slice(0,l),u=o.slice(l+1);r.has(p)||r.set(p,[]),r.get(p).push(u);}}let s={};for(let o of n)o in e.shape&&(s[o]=e.shape[o]);for(let[o,l]of r){if(!(o in e.shape))continue;let p=e.shape[o];for(;;){let u=q(p);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")p=U(p);else break}if(q(p)!=="ZodObject"){s[o]=e.shape[o];continue}s[o]=ve(p,l);}return z$1.object(s)}function pe(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=process.env.FUNCTION_REGION??"us-central1",p=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${l}/${p}${n}`}let r=process.env.K_SERVICE,s=e.hostname??e.headers?.host??"";return r&&s.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function an(e,t){let n=(i,d)=>{let c=pe(i,t),a=Object.values(e).map(f=>({name:f.name,path:f.path}));z(d,lt(a,c));},r=async(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=a.pageSize??25,v=i.query??{},S=v.cursor,O=v.dir==="prev"?"prev":"next",A=v.ob??"",x=v.od==="desc"?"desc":"asc",R=A?{field:A,dir:x}:void 0,$=parseInt(v.ps??""),T=Number.isFinite($)&&$>0?Math.min($,200):f,P=a.listColumns??Object.keys(a.schema.shape),C=a.documentKey??"docId",B=[C,...P.filter(K=>K!==C)],I=a.filterableFields?(()=>{let K=[];for(let oe of a.filterableFields)(oe.includes(".")||P.includes(oe))&&K.push(oe);return K})():P,D=(()=>{let K=[];for(let oe of I)if(oe.includes(".")){let we=Sr(a.schema,oe);K.push({name:oe,zodType:we?vt(we):"ZodString",nullable:we?nn(we):false,enumValues:we?rn(we):void 0});}else K.push(...on([oe],a.schema));return K})(),se=new Set(D.map(K=>K.name)),Te=Rr(v,se),Be=tn(Te),Ct;if(S)try{let K=a.repo.ref;typeof K.doc=="function"&&(Ct=await K.doc(S).get());}catch{}let[me,Sn]=await Promise.all([a.repo.query.paginate({pageSize:T,cursor:Ct,direction:O,...Be.length>0?{where:Be}:{},...R?{orderBy:[{field:R.field,direction:R.dir}]}:{}}).catch(K=>({queryError:ze(K,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:Te,sort:R})})),a.repo.aggregate.count(Be.length>0?{where:Be}:{}).catch(()=>{})]),xe="queryError"in me,kn=xe?[]:me.data,$n=xe?"":me.nextCursor?.id??"",Cn=xe?"":me.prevCursor?.id??"",On=xe?me.queryError:void 0,Tn=pe(i,t);z(d,ct(a.name,kn,B,Tn,{hasPrev:xe?false:me.hasPrevPage,hasNext:xe?false:me.hasNextPage,prevCursor:Cn,nextCursor:$n},void 0,D,Te,a.allowDelete??false,a.relationalMeta,R,T,On,a.isGroup,Sn,a.mutableFields,a.schema));},s=(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=pe(i,t),v=ve(a.schema,a.createFields),S=ne(v),O=`${f}/${a.name}/create`,A=ie(S,O,"POST","Create document");z(d,ue(a.name,A,"create",null,f));},o=async(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=pe(i,t),v=i.body??{},S=bt(v,a.schema),O=ve(a.schema,a.createFields),A=O.safeParse(S);if(!A.success){let x=ne(O),R=`${f}/${a.name}/create`,$=ie(x,R,"POST","Create document"),T=A.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");z(d,ue(a.name,$,"create",null,f,{type:"error",message:`Validation error: ${T}`}),422);return}try{if(a.isGroup&&a.parentKeys&&a.parentKeys.length>0){let x={...A.data};a.createdKey&&(x[a.createdKey]=new Date);let R=a.parentKeys.filter(C=>!x[C]);if(R.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${R.join(", ")}`);let $=a.parentKeys.map(C=>x[C]),T=a.documentKey??"docId",P=x[T]||xr();await a.repo.set(...$,P,x);}else await a.repo.create(A.data);gt(d,`${f}/${a.name}?flash=created`);}catch(x){let R=ve(a.schema,a.createFields),$=ne(R),T=`${f}/${a.name}/create`,P=ie($,T,"POST","Create document");z(d,ue(a.name,P,"create",null,f,{type:"error",message:`Save error: ${x.message}`}),500);}},l=async(i,d)=>{let c=i.params.repoName,a=i.params.id;if(!c||!a){z(d,"Bad request",400);return}let f=e[c];if(!f){z(d,"Repository not found",404);return}let v=pe(i,t),S=null;try{S=await Ze(f,a);}catch(T){let P=yt(f,a,T),C=he(T)?424:500;z(d,Ge("",{title:`Edit ${f.name} / ${a}`,basePath:v,breadcrumb:[{label:"Repositories",href:v},{label:f.name,href:`${v}/${f.name}`},{label:`Edit ${a}`}],flash:P}),C);return}if(!S){z(d,"Document not found",404);return}let O=sn(S,f.schema),A=ve(f.schema,f.mutableFields),x=ht(ne(A),O),R=`${v}/${f.name}/${encodeURIComponent(a)}/edit`,$=ie(x,R,"POST","Save changes");z(d,ue(f.name,$,"edit",a,v));},p=async(i,d)=>{let c=i.params.repoName,a=i.params.id;if(!c||!a){z(d,"Bad request",400);return}let f=e[c];if(!f){z(d,"Repository not found",404);return}let v=pe(i,t),S=i.body??{},O=bt(S,f.schema),A=ve(f.schema,f.mutableFields),R=A.partial().safeParse(O);if(!R.success){let $=Object.fromEntries(Object.entries(S).map(([I,D])=>[I,Array.isArray(D)?D.join(","):D??""])),T=ht(ne(A),$),P=`${v}/${f.name}/${encodeURIComponent(a)}/edit`,C=ie(T,P,"POST","Save changes"),B=R.error.issues.map(I=>`${I.path.join(".")}: ${I.message}`).join(", ");z(d,ue(f.name,C,"edit",a,v,{type:"error",message:`Validation error: ${B}`}),422);return}try{let $=await Ze(f,a),T=($&&mt($,f.pathKey))??[a];await f.repo.update(...T,R.data),gt(d,`${v}/${f.name}?flash=updated`);}catch($){let T=ve(f.schema,f.mutableFields),P=ne(T),C=`${v}/${f.name}/${encodeURIComponent(a)}/edit`,B=ie(P,C,"POST","Save changes"),I=he($)?yt(f,a,$):{type:"error",message:`Save error: ${$.message}`},D=he($)?424:500;z(d,ue(f.name,B,"edit",a,v,I),D);}},u=async(i,d)=>{let c=i.params.repoName,a=i.params.id;if(!c||!a){z(d,"Bad request",400);return}let f=e[c];if(!f){z(d,"Repository not found",404);return}if(!f.allowDelete){z(d,"Delete is not allowed for this repository",403);return}let v=pe(i,t);try{let S=await Ze(f,a),O=(S&&mt(S,f.pathKey))??[a];await f.repo.delete(...O),gt(d,`${v}/${f.name}?flash=deleted`);}catch(S){let O=he(S)?yt(f,a,S):{type:"error",message:`Delete error: ${S.message}`},A=he(S)?424:500;z(d,Ge("",{title:`Delete ${f.name} / ${a}`,basePath:v,breadcrumb:[{label:"Repositories",href:v},{label:f.name,href:`${v}/${f.name}`},{label:`Delete ${a}`}],flash:O}),A);}},g=async(i,d)=>{let c=i.params.repoName;if(!c){z(d,"Bad request",400);return}let a=e[c];if(!a){z(d,"Repository not found",404);return}let f=pe(i,t),v=i.query,S=v?.type==="many"?"many":"one",O=Math.max(1,Math.min(100,Number(v?.ps??25)||25)),A=a.listColumns??Object.keys(Q(a.schema)),{PanelOne:x,PanelMany:R}=await Promise.resolve().then(()=>(tt(),Kt)),{renderToString:$}=await import('hono/jsx/dom/server');if(S==="one"){let D=String(v?.id??"");if(!D){z(d,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let se=await Ze(a,D),Te=$(x({doc:se,repoName:a.name,basePath:f,schema:a.schema,columns:A}));z(d,Te);}catch(se){z(d,`<div class='p-6 text-error text-sm'>Error: ${se.message}</div>`,500);}return}let T=String(v?.fk??""),P=String(v?.fv??"");if(!T||!P){z(d,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let C=v?.cursor??"",B=v?.dir==="prev"?"prev":"next",I;if(C)try{let D=a.repo.ref;typeof D.doc=="function"&&(I=await D.doc(C).get());}catch{}try{let D=await a.repo.query.paginate({pageSize:O,cursor:I,direction:B,where:[[T,"==",kr(P)]]}),se=$(R({docs:D.data,repoName:a.name,basePath:f,fk:T,fv:P,columns:A,schema:a.schema,pagination:{hasPrev:D.hasPrevPage,hasNext:D.hasNextPage,prevCursor:D.prevCursor?.id??"",nextCursor:D.nextCursor?.id??"",pageSize:O}}));z(d,se);}catch(D){z(d,`<div class='p-6 text-error text-sm'>Error: ${D.message}</div>`,500);}},h=async(i,d)=>{let c=[];for(let a of d){let f;if(i.isGroup||i.parentKeys?.length){let v=await Ze(i,a);f=v?mt(v,i.pathKey):void 0;}f||(f=[a]);try{let v=i.repo.documentRef(...f);v&&c.push(v);}catch{}}return c},k=async(i,d)=>{let c=tn(d),a=i.documentKey??"docId",f=[],v;for(;;){let S=await i.repo.query.paginate({pageSize:500,cursor:v,direction:"next",...c.length>0?{where:c}:{}});for(let O of S.data){let A=String(O[a]??O.id??"");A&&f.push(A);}if(!S.hasNextPage||!S.nextCursor)break;v=S.nextCursor;}return f},w=async(i,d)=>{let c=i.params.repoName;if(!c){J(d,{error:"Bad request"},400);return}let a=e[c];if(!a){J(d,{error:"Repository not found"},404);return}if(!a.allowDelete){J(d,{error:"Delete is not allowed for this repository"},403);return}let f=i.body??{};try{let v=await m(a,f);if(v.length===0){J(d,{deleted:0});return}let S=await h(a,v);for(let O=0;O<S.length;O+=500)await a.repo.bulk.delete(S.slice(O,O+500));J(d,{deleted:S.length});}catch(v){J(d,{error:v.message},500);}},b=async(i,d)=>{let c=i.params.repoName;if(!c){J(d,{error:"Bad request"},400);return}let a=e[c];if(!a){J(d,{error:"Repository not found"},404);return}let f=i.body??{},v=String(f.field??"");if(!v){J(d,{error:"Missing 'field'"},400);return}if(!a.mutableFields||!a.mutableFields.includes(v)){J(d,{error:`Field '${v}' is not bulk-updatable`},403);return}let S=a.schema.shape?.[v],O=f.value;if(S){let A=S.safeParse(f.value);if(!A.success){J(d,{error:`Invalid value for '${v}': ${A.error.message}`},400);return}O=A.data;}try{let A=await m(a,f);if(A.length===0){J(d,{updated:0});return}let R=(await h(a,A)).map($=>({docRef:$,data:{[v]:O}}));for(let $=0;$<R.length;$+=500)await a.repo.bulk.update(R.slice($,$+500));J(d,{updated:R.length});}catch(A){J(d,{error:A.message},500);}};async function m(i,d){if(d.selectAll){let c=y(d.filters,i);return await k(i,c)}return Array.isArray(d.ids)?d.ids.filter(c=>typeof c=="string"&&!!c):[]}function y(i,d){if(!Array.isArray(i))return [];let c=new Set((d.filterableFields??Object.keys(Q(d.schema))).map(v=>String(v))),a=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),f=[];for(let v of i)v&&typeof v=="object"&&typeof v.field=="string"&&c.has(v.field)&&typeof v.value=="string"&&a.has(String(v.op))&&f.push({field:v.field,op:v.op,value:v.value});return f}return {handleDashboard:n,handleList:r,handleCreateForm:s,handleCreateSubmit:o,handleEditForm:l,handleEditSubmit:p,handleDelete:u,handlePanel:g,handleBulkDelete:w,handleBulkUpdate:b}}function J(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function kr(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}async function $r(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Cr(e){let t={};if(!e)return t;for(let n of e.split("&")){let r=n.indexOf("=");if(r===-1)continue;let s=decodeURIComponent(n.slice(0,r).replace(/\+/g," ")),o=decodeURIComponent(n.slice(r+1).replace(/\+/g," ")),l=t[s];l===void 0?t[s]=o:Array.isArray(l)?l.push(o):t[s]=[l,o];}return t}function ln(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:s,middleware:o=[],httpsOptions:l}=e,p=t==="/"?"":t.replace(/\/$/,""),u={};for(let[w,b]of Object.entries(n)){let m=b.schema??b.repo.schema??null;if(!m)throw new Error(`[createAdminServer] Repository "${w}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let y,i,d;if(b.fieldsConfig){let f=b.fieldsConfig;y=[],i=[],d=[];for(let[v,S]of Object.entries(f))for(let O of S)O==="filterable"?y.push(v):O==="mutable"?i.push(v):O==="create"&&d.push(v);y.length===0&&(y=void 0),i.length===0&&(i=void 0),d.length===0&&(d=void 0);}let c=(()=>{let f=b.repo._parentKeys;return f&&f.length>0?f:void 0})();if(c&&d)for(let f of c)d.includes(f)||d.push(f);let a={name:w,path:b.path,repo:b.repo,schema:m,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:c,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:y,mutableFields:i,createFields:d,allowDelete:b.allowDelete??false,relationalMeta:(()=>{if(!b.relationalFields||b.relationalFields.length===0)return;let f=b.repo.relationalKeys??{},v=[];for(let S of b.relationalFields){let O=f[S.key];O&&v.push({key:S.key,column:S.column,targetRepo:String(O.repo),targetKey:String(O.key),type:O.type});}return v.length>0?v:void 0})()};u[w]=a;}let g=an(u,p),h=new Y;if(r&&h.use(async(w,b,m)=>{let y=w,i=String(y.headers?.["content-type"]??"");if(i.includes("application/x-www-form-urlencoded")){let d=await $r(y);w.body=Cr(d);}else if(i.includes("application/json")&&typeof y.body=="string")try{w.body=JSON.parse(y.body);}catch{}await m();}),s)if(typeof s=="function")h.use(s);else {let w=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");h.use((m,y,i)=>{if((m.headers?.authorization??"")!==b){y.status(401).set("WWW-Authenticate",`Basic realm="${w}"`).set("Content-Type","text/plain").send("Unauthorized");return}i();});}for(let w of o)h.use(w);h.get(`${p}/`,g.handleDashboard),h.get(`${p}`,g.handleDashboard),h.get(`${p}/:repoName/_panel`,g.handlePanel),h.post(`${p}/:repoName/_bulk/delete`,g.handleBulkDelete),h.post(`${p}/:repoName/_bulk/update`,g.handleBulkUpdate),h.get(`${p}/:repoName`,g.handleList),h.get(`${p}/:repoName/create`,g.handleCreateForm),h.post(`${p}/:repoName/create`,g.handleCreateSubmit),h.get(`${p}/:repoName/:id/edit`,g.handleEditForm),h.post(`${p}/:repoName/:id/edit`,g.handleEditSubmit),h.post(`${p}/:repoName/:id/delete`,g.handleDelete);let k=async(w,b)=>{await h.handle(w,b);};return l&&(k.httpsOptions=l),k}var dn="preserve";function un(){return dn}function Or(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function pn(e){if(e==null)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(e instanceof Timestamp)return e.toDate();if(Or(e))return new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));if(typeof e=="string"){let t=new Date(e);return Number.isNaN(t.getTime())?null:t}if(typeof e=="number"){let t=new Date(e);return Number.isNaN(t.getTime())?null:t}return null}function fn(e){return e}function Rt(e,t,n=200){let r=fn(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Ce(e,t,n,r=200){Rt(e,{success:true,data:t,meta:n},r);}function H(e,t,n=400){Rt(e,{success:false,error:t},n);}function wt(e,t,n,r,s){let o=ze(t,n),l=o.type==="index",p=l?424:500,g={success:false,error:l?o.message:s&&t instanceof Error?t.message:r};l&&(g.errorType="index",o.indexUrl&&(g.indexUrl=o.indexUrl)),Rt(e,g,p);}var mn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Ar(){let e="";for(let t=0;t<20;t++)e+=mn.charAt(Math.floor(Math.random()*mn.length));return e}function Oe(e){let t=e._def??e.def;if(!t)return e;let n=t.typeName??t.type;if(n==="ZodDate"||n==="date")return z$1.preprocess(r=>pn(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,s={};for(let[o,l]of Object.entries(r))s[o]=Oe(l);return z$1.object(s)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return z$1.array(Oe(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Oe(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Oe(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,s=t.defaultValue;if(r){let o=Oe(r);return typeof s=="function"?o.default(s()):o.default(s)}}return e}function Er(e,t,n=[]){let r=e.shape,s={},o=t&&t.length>0?t:Object.keys(r);for(let l of o){if(n.includes(l))continue;let p=l.split(".")[0];p&&r[p]&&(s[p]=r[p]);}return z$1.object(s)}function yn(e,t,n,r=false,s=[]){try{let o=Er(e,n,s),l=r?o.partial():o;return {success:!0,data:(un()==="normalize"?Oe(l):l).parse(t)}}catch(o){return o instanceof z$1.ZodError?{success:false,error:`Validation failed: ${o.issues.map(p=>`${p.path.join(".")}: ${p.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function Pr(e,t){let n=[],r=t?new Set(t):null,s={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[o,l]of Object.entries(e)){if(l===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(o))continue;let p=Array.isArray(l)?l[0]:l;if(p===void 0||p==="")continue;let u=o.match(/^(\w+)__(\w+)$/),g,h="==";if(u&&u[1]&&u[2]){g=u[1];let w=u[2];if(s[w])h=s[w];else continue}else if(!u)g=o;else continue;if(r&&!r.has(g))continue;let k=p;h==="in"||h==="not-in"||h==="array-contains-any"?k=p.split(",").map(w=>gn(w.trim())):k=gn(p),n.push({field:g,op:h,value:k});}return n}function gn(e){if(e==="true")return true;if(e==="false")return false;if(e==="null")return null;let t=Number(e);return !isNaN(t)&&e!==""?t:e}function Qe(e){return e?{docId:e.id}:null}async function bn(e,t){if(!t||typeof t!="object")return;let n=t.docId;if(typeof n=="string")try{let r=e.repo.ref;if(typeof r.doc!="function")return;let s=await r.doc(n).get();return s.exists?s:void 0}catch{return}}function hn(e,t,n){function r(b,m){return !b||!e[b]?(H(m,`Repository "${b}" not found`,404),null):e[b]}function s(b,m){if(!m)return;let y=b[m];if(typeof y!="string"||!y)return;let i=y.split("/").filter(Boolean),d=[];for(let c=1;c<i.length;c+=2)d.push(i[c]);return d.length>0?d:void 0}async function o(b,m){let y=`by${b.documentKey.charAt(0).toUpperCase()}${b.documentKey.slice(1)}`,i=b.repo.get[y];if(typeof i=="function")try{let c=await i(m);if(c)return c}catch{}return (await b.repo.query.by({where:[[b.documentKey,"==",m]],limit:1}))[0]??null}async function l(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;let d=[],c;try{let a=b.query??{},f=Math.min(Number(a.pageSize)||i.pageSize,100),v=a.cursor,S=a.direction?.toLowerCase()==="prev"?"prev":"next",O=a.orderBy,A=a.orderDir?.toLowerCase()==="desc"?"desc":"asc",x=a.select,R=x?x.split(",").map(I=>I.trim()):void 0,$;i.allowedIncludes&&a.includes&&($=(typeof a.includes=="string"?a.includes.split(",").map(D=>D.trim()):Array.isArray(a.includes)?a.includes:[]).filter(D=>typeof D=="string"&&i.allowedIncludes.includes(D)),$?.length===0&&($=void 0));let T=Pr(a,i.filterableFields);d=T.map(I=>({field:I.field,op:I.op,value:String(I.value??"")})),O&&(c={field:O,dir:A});let P={pageSize:f,direction:S};if(v)try{let I=typeof v=="string"?JSON.parse(v):v;P.cursor=await bn(i,I);}catch{}O&&(P.orderBy=[{field:O,direction:A}]),T.length>0&&(P.where=T.map(I=>[I.field,I.op,I.value])),R&&(P.select=R),$&&(P.include=$);let C=await i.repo.query.paginate(P),B={items:C.data,hasNextPage:C.hasNextPage,hasPrevPage:C.hasPrevPage,nextCursor:Qe(C.nextCursor),prevCursor:Qe(C.prevCursor)};Ce(m,B,{pageSize:f,hasMore:C.hasNextPage});}catch(a){wt(m,a,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:d,sort:c},"Failed to fetch documents",n);}}async function p(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;let d=[],c;try{let a=b.body??{},f=Math.min(a.pageSize||i.pageSize,100),v=a.direction==="prev"?"prev":"next";a.where&&(d=a.where.map(x=>({field:String(x[0]),op:x[1],value:String(x[2]??"")}))),a.orderBy&&a.orderBy[0]&&(c={field:a.orderBy[0].field,dir:a.orderBy[0].direction==="desc"?"desc":"asc"});let S={pageSize:f,direction:v};if(a.cursor)try{let x=typeof a.cursor=="string"?JSON.parse(a.cursor):a.cursor;S.cursor=await bn(i,x);}catch{}if(i.allowedIncludes&&a.includes&&a.includes.length>0){let x=a.includes.filter(R=>typeof R=="string"?i.allowedIncludes.includes(R):typeof R=="object"&&R!==null&&"relation"in R&&typeof R.relation=="string"?i.allowedIncludes.includes(R.relation):!1);x.length>0&&(S.include=x);}if(a.where&&a.where.length>0){if(i.filterableFields){let x=new Set(i.filterableFields),R=a.where.filter($=>!x.has($[0]));if(R.length>0){H(m,`Fields not filterable: ${R.map($=>$[0]).join(", ")}`,400);return}}S.where=a.where;}if(a.orWhere&&a.orWhere.length>0){if(i.filterableFields){let x=new Set(i.filterableFields),R=a.orWhere.filter($=>!x.has($[0]));if(R.length>0){H(m,`Fields not filterable: ${R.map($=>$[0]).join(", ")}`,400);return}}S.orWhere=a.orWhere;}if(a.orWhereGroups&&a.orWhereGroups.length>0){if(i.filterableFields){let x=new Set(i.filterableFields);for(let R of a.orWhereGroups){let $=R.filter(T=>!x.has(T[0]));if($.length>0){H(m,`Fields not filterable: ${$.map(T=>T[0]).join(", ")}`,400);return}}}S.orWhereGroups=a.orWhereGroups;}a.orderBy&&a.orderBy.length>0&&(S.orderBy=a.orderBy),a.select&&a.select.length>0&&(S.select=a.select);let O=await i.repo.query.paginate(S),A={items:O.data,hasNextPage:O.hasNextPage,hasPrevPage:O.hasPrevPage,nextCursor:Qe(O.nextCursor),prevCursor:Qe(O.prevCursor)};Ce(m,A,{pageSize:f,hasMore:O.hasNextPage});}catch(a){wt(m,a,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:d,sort:c},"Failed to query documents",n);}}async function u(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;let d=y.id;if(!d){H(m,"Document ID required",400);return}try{let c=await o(i,d);if(!c){H(m,"Document not found",404);return}Ce(m,c);}catch(c){wt(m,c,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:[{field:i.documentKey,op:"==",value:d}]},"Failed to fetch document",n);}}async function g(b,m){let y=b.params||{},i=r(y.repoName,m);if(i)try{let d=b.body??{},c=yn(i.schema,d,i.createFields,!1,i.systemKeys);if(!c.success){H(m,c.error,400);return}if(i.validate){let f=await i.validate(c.data,"create");if(f){H(m,f,400);return}}let a;if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let f={...c.data};i.createdKey&&(f[i.createdKey]=new Date);let v=i.parentKeys.filter(A=>!f[A]);if(v.length>0){H(m,`Missing parent key(s) for subcollection create: ${v.join(", ")}`,400);return}let S=i.parentKeys.map(A=>f[A]),O=f[i.documentKey]||Ar();a=await i.repo.set(...S,O,f);}else a=await i.repo.create(c.data);Ce(m,a,void 0,201);}catch(d){let c=n&&d instanceof Error?d.message:"Failed to create document";H(m,c,500);}}async function h(b,m,y){let i=b.params||{},d=r(i.repoName,m);if(!d)return;let c=i.id;if(!c){H(m,"Document ID required",400);return}try{let a=b.body??{},f=yn(d.schema,a,d.mutableFields,y,d.systemKeys);if(!f.success){H(m,f.error,400);return}if(d.validate){let A=await d.validate(f.data,"update");if(A){H(m,A,400);return}}let v=await o(d,c),S=(v&&s(v,d.pathKey))??[c],O=await d.repo.update(...S,f.data);Ce(m,O);}catch(a){let f=n&&a instanceof Error?a.message:"Failed to update document";H(m,f,500);}}async function k(b,m){let y=b.params||{},i=r(y.repoName,m);if(!i)return;if(!i.allowDelete){H(m,"Delete not allowed for this repository",403);return}let d=y.id;if(!d){H(m,"Document ID required",400);return}try{let c=await o(i,d),a=(c&&s(c,i.pathKey))??[d];await i.repo.delete(...a),Ce(m,{deleted:!0});}catch(c){let a=n&&c instanceof Error?c.message:"Failed to delete document";H(m,a,500);}}function w(b,m){m.status(204).set("Access-Control-Allow-Methods","GET, POST, PUT, PATCH, DELETE, OPTIONS").set("Access-Control-Allow-Headers","Content-Type, Authorization").set("Access-Control-Max-Age","86400").send("");}return {handleList:l,handleQuery:p,handleGet:u,handleCreate:g,handleUpdate:h,handleDelete:k,handleOptions:w}}function St(e){try{return z$1.toJSONSchema(e,{target:"openapi-3.1",unrepresentable:"any",override:t=>{let n=t.zodSchema?._zod?.def;n&&(n.type==="date"?(t.jsonSchema.type="string",t.jsonSchema.format="date-time"):n.type==="bigint"&&(t.jsonSchema.type="string",t.jsonSchema.format="int64"));}})}catch(t){return typeof console<"u"&&console.warn&&console.warn("[generateOpenAPISpec] Failed to convert Zod schema to JSON Schema; falling back to {type:object}.",t),{type:"object"}}}function X(e){return {$ref:`#/components/schemas/${e}`}}function G(e){return {description:e,content:{"application/json":{schema:X("ErrorResponse")}}}}function qe(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function vn(e){return {description:"Paginated list of documents",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:{type:"object",properties:{items:{type:"array",items:e},nextCursor:{oneOf:[{type:"object"},{type:"null"}]},prevCursor:{oneOf:[{type:"object"},{type:"null"}]},hasNextPage:{type:"boolean"},hasPrevPage:{type:"boolean"}},required:["items","hasNextPage","hasPrevPage"]},meta:{type:"object",properties:{pageSize:{type:"integer"},hasMore:{type:"boolean"},cursor:{oneOf:[{type:"string"},{type:"null"}]}}}},required:["success","data"]}}}}}function Nr(e){return [{name:"pageSize",in:"query",schema:{type:"integer",default:e.pageSize,maximum:100},description:"Number of items per page"},{name:"cursor",in:"query",schema:{type:"string"},description:"Base64 pagination cursor"},{name:"orderBy",in:"query",schema:{type:"string"},description:"Field name to order by"},{name:"orderDir",in:"query",schema:{type:"string",enum:["asc","desc"]},description:"Order direction"},{name:"select",in:"query",schema:{type:"string"},description:"Comma-separated list of fields to return"}]}function Ir(e){let t=e.filterableFields??Object.keys(e.schema.shape),n=["eq","ne","lt","lte","gt","gte","in","nin","contains"],r=[];for(let s of t){r.push({name:s,in:"query",schema:{type:"string"},description:`Filter by ${s} (equality)`});for(let o of n)r.push({name:`${s}__${o}`,in:"query",schema:{type:"string"},description:`Filter ${s} with operator ${o}`});}return r}function _r(){return {type:"object",properties:{where:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3},description:"AND conditions: [field, operator, value][]"},orWhere:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3},description:"Simple OR conditions (each independently OR'd)"},orWhereGroups:{type:"array",items:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3}},description:"Advanced OR groups (AND within, OR across groups)"},orderBy:{type:"array",items:{type:"object",properties:{field:{type:"string"},direction:{type:"string",enum:["asc","desc"]}},required:["field"]}},select:{type:"array",items:{type:"string"},description:"Fields to select (projection)"},pageSize:{type:"integer",maximum:100,description:"Number of items per page"},cursor:{oneOf:[{type:"string"},{type:"object"}],description:"Pagination cursor"},direction:{type:"string",enum:["next","prev"],description:"Pagination direction"},includes:{type:"array",items:{oneOf:[{type:"string"},{type:"object",properties:{relation:{type:"string"},select:{type:"array",items:{type:"string"}}},required:["relation"]}]},description:"Relations to include (populate)"}}}}function Dr(e,t,n,r,s){let o={},l=e.name,p=`${t}/${e.name}`,u=`${p}/{${e.documentKey}}`,g={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};o[p]={get:{operationId:`list${fe(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[l],parameters:[...Nr(e),...Ir(e)],responses:{200:vn(X(n)),500:G("Internal server error")}},post:{operationId:`create${fe(e.name)}`,summary:`Create a ${re(e.name)}`,tags:[l],requestBody:{required:true,content:{"application/json":{schema:X(r??n)}}},responses:{201:qe("Document created",X(n)),400:G("Validation error"),500:G("Internal server error")}}},o[`${p}/query`]={post:{operationId:`query${fe(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[l],requestBody:{required:true,content:{"application/json":{schema:X("QueryRequestBody")}}},responses:{200:vn(X(n)),400:G("Invalid query"),500:G("Internal server error")}}};let h={};return h.get={operationId:`get${fe(re(e.name))}`,summary:`Get a single ${re(e.name)}`,tags:[l],parameters:[g],responses:{200:qe("Document found",X(n)),404:G("Document not found"),500:G("Internal server error")}},h.put={operationId:`update${fe(re(e.name))}`,summary:`Update a ${re(e.name)} (full replace)`,tags:[l],parameters:[g],requestBody:{required:true,content:{"application/json":{schema:X(s??n)}}},responses:{200:qe("Document updated",X(n)),400:G("Validation error"),404:G("Document not found"),500:G("Internal server error")}},h.patch={operationId:`patch${fe(re(e.name))}`,summary:`Partially update a ${re(e.name)}`,tags:[l],parameters:[g],requestBody:{required:true,content:{"application/json":{schema:{allOf:[X(s??n)],description:"All fields are optional for partial updates"}}}},responses:{200:qe("Document patched",X(n)),400:G("Validation error"),404:G("Document not found"),500:G("Internal server error")}},e.allowDelete&&(h.delete={operationId:`delete${fe(re(e.name))}`,summary:`Delete a ${re(e.name)}`,tags:[l],parameters:[g],responses:{200:qe("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:G("Document not found"),500:G("Internal server error")}}),o[u]=h,o}function $t(e,t,n={}){let{title:r="CRUD API",version:s="1.0.0",description:o,servers:l,auth:p=false}=n,u=t==="/"?"":t.replace(/\/$/,""),g={},h={},k=[];g.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},g.QueryRequestBody=_r();for(let[y,i]of Object.entries(e)){let d=fe(re(y)),c=`${d}Create`,a=`${d}Update`;g[d]=St(i.schema);let f=R=>{let $=R&&R.length>0?R:Object.keys(i.schema.shape),T={};for(let P of $){let C=P.split(".")[0];C&&i.schema.shape[C]&&!i.systemKeys.includes(C)&&(T[C]=i.schema.shape[C]);}return T},v=null,S=f(i.createFields);Object.keys(S).length>0&&(g[c]=St(z$1.object(S)),v=c);let O=null,A=f(i.mutableFields);Object.keys(A).length>0&&(g[a]=St(z$1.object(A)),O=a);let x=Dr(i,u,d,v,O);Object.assign(h,x),k.push({name:y,description:`Operations on ${y} (collection: ${i.path})`});}let w={},b;return p==="basic"?(w.basicAuth={type:"http",scheme:"basic"},b=[{basicAuth:[]}]):p==="bearer"&&(w.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},b=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:s,...o?{description:o}:{}},...l&&l.length>0?{servers:l}:{},paths:h,components:{schemas:g,...Object.keys(w).length>0?{securitySchemes:w}:{}},...b?{security:b}:{},tags:k}}function fe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function re(e){return e.endsWith("ies")?e.slice(0,-3)+"y":e.endsWith("ses")||e.endsWith("xes")||e.endsWith("zes")?e.slice(0,-2):e.endsWith("s")&&!e.endsWith("ss")?e.slice(0,-1):e}function jr(e,t){return `<!DOCTYPE html>
1118
1136
  <html lang="en">
1119
1137
  <head>
1120
1138
  <meta charset="utf-8" />
@@ -1125,5 +1143,5 @@ function initColumnReorder(table) {
1125
1143
  <script id="api-reference" data-url="${t}"></script>
1126
1144
  <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
1127
1145
  </body>
1128
- </html>`}function zr(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=process.env.FUNCTION_REGION??"us-central1",p=process.env.FUNCTION_TARGET??"";return `/${o}/${l}/${p}${n}`}let r=process.env.K_SERVICE,s=e?.hostname??e?.headers?.host??"";return r&&s.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}async function Fr(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function xn(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:s,middleware:o=[],verbose:l=false,httpsOptions:p}=e,u=t==="/"?"":t.replace(/\/$/,""),g={};for(let[d,c]of Object.entries(n)){let a=c.schema??c.repo.schema??null;if(!a)throw new Error(`[createCrudServer] Repository "${d}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let f,v,S;if(c.fieldsConfig){let x=c.fieldsConfig;f=[],v=[],S=[];for(let[R,$]of Object.entries(x))for(let T of $)T==="filterable"?f.push(R):T==="mutable"?v.push(R):T==="create"&&S.push(R);f.length===0&&(f=void 0),v.length===0&&(v=void 0),S.length===0&&(S=void 0);}let O=(()=>{let x=c.repo._parentKeys;return x&&x.length>0?x:void 0})();if(O&&S)for(let x of O)S.includes(x)||S.push(x);let A={name:d,path:c.path,repo:c.repo,schema:a,systemKeys:c.repo._systemKeys??[c.documentKey??"docId"],documentKey:c.documentKey??"docId",pathKey:c.repo._pathKey??void 0,isGroup:!!c.repo._isGroup,parentKeys:O,createdKey:c.repo._createdKey??void 0,pageSize:c.pageSize??25,filterableFields:f,mutableFields:v,createFields:S,allowDelete:c.allowDelete??false,allowedIncludes:c.allowedIncludes,validate:c.validate};g[d]=A;}let h=hn(g,u,l),k=e.openapi,w=k&&typeof k=="object"?k:{},b=null;function m(){if(!b){let d=s&&typeof s!="function"?"basic":s?"bearer":false;b=$t(g,u,{...w,auth:w.auth??d});}return b}let y=new Y;if(y.use((d,c,a)=>{c.set("Access-Control-Allow-Origin","*"),c.set("Access-Control-Allow-Credentials","true"),a();}),r&&y.use(async(d,c,a)=>{let f=d;if(String(f.headers?.["content-type"]??"").includes("application/json")){if(typeof f.body=="string")try{d.body=JSON.parse(f.body);}catch{}else if(Buffer.isBuffer(d.rawBody))try{let S=await Fr(f);d.body=JSON.parse(S);}catch{}}await a();}),s)if(typeof s=="function")y.use(s);else {let d=s.realm??"API",c="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");y.use((a,f,v)=>{if((a.headers?.authorization??"")!==c){f.status(401).set("WWW-Authenticate",`Basic realm="${d}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}v();});}for(let d of o)y.use(d);if(k!==false){let d=`${u}/__spec.json`,c=`${u}/__docs`;y.get(d,(a,f)=>{let v=m();f.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(v,null,2));}),y.get(c,(a,f)=>{let v=zr(a,u)+"/__spec.json",S=jr(w.title??"CRUD API",v);f.status(200).set("Content-Type","text/html; charset=utf-8").send(S);});}y.use((d,c,a)=>{if(d.method==="OPTIONS"){h.handleOptions(d,c);return}a();}),y.get(`${u}/:repoName`,h.handleList),y.post(`${u}/:repoName/query`,h.handleQuery),y.get(`${u}/:repoName/:id`,h.handleGet),y.post(`${u}/:repoName`,h.handleCreate),y.put(`${u}/:repoName/:id`,(d,c)=>h.handleUpdate(d,c,false)),y.patch(`${u}/:repoName/:id`,(d,c)=>h.handleUpdate(d,c,true)),y.delete(`${u}/:repoName/:id`,h.handleDelete);let i=async(d,c)=>{await y.handle(d,c);};return i.spec=m,p&&(i.httpsOptions=p),i}function wn(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function Rn(e,t,n){let r={};for(let[s,o]of Object.entries(t)){if(!o)continue;let l=e[s];if(!l)throw new Error(`[createServers.${n}] Unknown repo "${s}" \u2014 not present in the registry passed to createServers().`);r[s]={...o,repo:l};}return r}function Zr(e,t={}){return {admin(n){let r=Rn(e,n.repos,"admin"),s=ln({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return wn(s,t)},crud(n){let r=Rn(e,n.repos,"crud"),s=xn({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return wn(s,t)},sync(n){let r={...n};return t.onRequest&&r.admin&&!r.admin.onRequest&&(r.admin={...r.admin,onRequest:t.onRequest,httpsOptions:r.admin.httpsOptions??t.httpsOptions}),Ft(e,r)}}}export{dr as CSS,_e as ClientScript,Y as MiniRouter,Zr as createServers,lt as renderDashboard,We as renderField,ie as renderForm,ue as renderFormPage,ct as renderList,Ge as renderPage,ne as zodToFields};//# sourceMappingURL=index.js.map
1146
+ </html>`}function zr(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=process.env.FUNCTION_REGION??"us-central1",p=process.env.FUNCTION_TARGET??"";return `/${o}/${l}/${p}${n}`}let r=process.env.K_SERVICE,s=e?.hostname??e?.headers?.host??"";return r&&s.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}async function Zr(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function xn(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:s,middleware:o=[],verbose:l=false,httpsOptions:p}=e,u=t==="/"?"":t.replace(/\/$/,""),g={};for(let[d,c]of Object.entries(n)){let a=c.schema??c.repo.schema??null;if(!a)throw new Error(`[createCrudServer] Repository "${d}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let f,v,S;if(c.fieldsConfig){let x=c.fieldsConfig;f=[],v=[],S=[];for(let[R,$]of Object.entries(x))for(let T of $)T==="filterable"?f.push(R):T==="mutable"?v.push(R):T==="create"&&S.push(R);f.length===0&&(f=void 0),v.length===0&&(v=void 0),S.length===0&&(S=void 0);}let O=(()=>{let x=c.repo._parentKeys;return x&&x.length>0?x:void 0})();if(O&&S)for(let x of O)S.includes(x)||S.push(x);let A={name:d,path:c.path,repo:c.repo,schema:a,systemKeys:c.repo._systemKeys??[c.documentKey??"docId"],documentKey:c.documentKey??"docId",pathKey:c.repo._pathKey??void 0,isGroup:!!c.repo._isGroup,parentKeys:O,createdKey:c.repo._createdKey??void 0,pageSize:c.pageSize??25,filterableFields:f,mutableFields:v,createFields:S,allowDelete:c.allowDelete??false,allowedIncludes:c.allowedIncludes,validate:c.validate};g[d]=A;}let h=hn(g,u,l),k=e.openapi,w=k&&typeof k=="object"?k:{},b=null;function m(){if(!b){let d=s&&typeof s!="function"?"basic":s?"bearer":false;b=$t(g,u,{...w,auth:w.auth??d});}return b}let y=new Y;if(y.use((d,c,a)=>{c.set("Access-Control-Allow-Origin","*"),c.set("Access-Control-Allow-Credentials","true"),a();}),r&&y.use(async(d,c,a)=>{let f=d;if(String(f.headers?.["content-type"]??"").includes("application/json")){if(typeof f.body=="string")try{d.body=JSON.parse(f.body);}catch{}else if(Buffer.isBuffer(d.rawBody))try{let S=await Zr(f);d.body=JSON.parse(S);}catch{}}await a();}),s)if(typeof s=="function")y.use(s);else {let d=s.realm??"API",c="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");y.use((a,f,v)=>{if((a.headers?.authorization??"")!==c){f.status(401).set("WWW-Authenticate",`Basic realm="${d}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}v();});}for(let d of o)y.use(d);if(k!==false){let d=`${u}/__spec.json`,c=`${u}/__docs`;y.get(d,(a,f)=>{let v=m();f.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(v,null,2));}),y.get(c,(a,f)=>{let v=zr(a,u)+"/__spec.json",S=jr(w.title??"CRUD API",v);f.status(200).set("Content-Type","text/html; charset=utf-8").send(S);});}y.use((d,c,a)=>{if(d.method==="OPTIONS"){h.handleOptions(d,c);return}a();}),y.get(`${u}/:repoName`,h.handleList),y.post(`${u}/:repoName/query`,h.handleQuery),y.get(`${u}/:repoName/:id`,h.handleGet),y.post(`${u}/:repoName`,h.handleCreate),y.put(`${u}/:repoName/:id`,(d,c)=>h.handleUpdate(d,c,false)),y.patch(`${u}/:repoName/:id`,(d,c)=>h.handleUpdate(d,c,true)),y.delete(`${u}/:repoName/:id`,h.handleDelete);let i=async(d,c)=>{await y.handle(d,c);};return i.spec=m,p&&(i.httpsOptions=p),i}function wn(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function Rn(e,t,n){let r={};for(let[s,o]of Object.entries(t)){if(!o)continue;let l=e[s];if(!l)throw new Error(`[createServers.${n}] Unknown repo "${s}" \u2014 not present in the registry passed to createServers().`);r[s]={...o,repo:l};}return r}function Fr(e,t={}){return {admin(n){let r=Rn(e,n.repos,"admin"),s=ln({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return wn(s,t)},crud(n){let r=Rn(e,n.repos,"crud"),s=xn({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return wn(s,t)},sync(n){let r={...n};return t.onRequest&&r.admin&&!r.admin.onRequest&&(r.admin={...r.admin,onRequest:t.onRequest,httpsOptions:r.admin.httpsOptions??t.httpsOptions}),Zt(e,r)}}}export{dr as CSS,_e as ClientScript,Y as MiniRouter,Fr as createServers,lt as renderDashboard,We as renderField,ie as renderForm,ue as renderFormPage,ct as renderList,Ge as renderPage,ne as zodToFields};//# sourceMappingURL=index.js.map
1129
1147
  //# sourceMappingURL=index.js.map