@lpdjs/firestore-repo-service 2.6.2-beta.0 → 2.6.2

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 (45) hide show
  1. package/dist/{create-servers-CVudVM8e.d.ts → create-servers-BlxW-09M.d.ts} +5 -5
  2. package/dist/{create-servers-B4GrBqdA.d.cts → create-servers-DoOU7VMv.d.cts} +5 -5
  3. package/dist/{firebase-auth-Dpvrd8MP.d.cts → firebase-auth-BTclYg-c.d.cts} +8 -4
  4. package/dist/{firebase-auth-Dpvrd8MP.d.ts → firebase-auth-BTclYg-c.d.ts} +8 -4
  5. package/dist/{index-oFhGCBrY.d.ts → index-BM1mgnpJ.d.ts} +2 -2
  6. package/dist/{index-DzO9MfNI.d.cts → index-BuxFmMV8.d.cts} +2 -2
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +8 -8
  9. package/dist/index.d.ts +8 -8
  10. package/dist/index.js.map +1 -1
  11. package/dist/{openapi-DB8bXZB-.d.ts → openapi-ChZojCEO.d.ts} +1 -1
  12. package/dist/{openapi-B2w5tVRR.d.cts → openapi-DpMtzJGo.d.cts} +1 -1
  13. package/dist/{queue-DYmbVDu5.d.ts → queue-B7uCIF1O.d.ts} +1 -1
  14. package/dist/{queue-B8YUTnBT.d.cts → queue-QISiqmAy.d.cts} +1 -1
  15. package/dist/servers/admin/index.cjs.map +1 -1
  16. package/dist/servers/admin/index.d.cts +3 -3
  17. package/dist/servers/admin/index.d.ts +3 -3
  18. package/dist/servers/admin/index.js.map +1 -1
  19. package/dist/servers/auth/index.cjs +2 -2
  20. package/dist/servers/auth/index.cjs.map +1 -1
  21. package/dist/servers/auth/index.d.cts +1 -1
  22. package/dist/servers/auth/index.d.ts +1 -1
  23. package/dist/servers/auth/index.js +2 -2
  24. package/dist/servers/auth/index.js.map +1 -1
  25. package/dist/servers/crud/index.cjs.map +1 -1
  26. package/dist/servers/crud/index.d.cts +5 -5
  27. package/dist/servers/crud/index.d.ts +5 -5
  28. package/dist/servers/crud/index.js.map +1 -1
  29. package/dist/servers/index.cjs +34 -34
  30. package/dist/servers/index.cjs.map +1 -1
  31. package/dist/servers/index.d.cts +8 -8
  32. package/dist/servers/index.d.ts +8 -8
  33. package/dist/servers/index.js +34 -34
  34. package/dist/servers/index.js.map +1 -1
  35. package/dist/sync/bigquery.d.cts +2 -2
  36. package/dist/sync/bigquery.d.ts +2 -2
  37. package/dist/sync/index.cjs.map +1 -1
  38. package/dist/sync/index.d.cts +5 -5
  39. package/dist/sync/index.d.ts +5 -5
  40. package/dist/sync/index.js.map +1 -1
  41. package/dist/{types-wcX7xfdo.d.cts → types-CCREogoy.d.cts} +1 -1
  42. package/dist/{types-FLGn8CAI.d.ts → types-CMrrjq1V.d.ts} +1 -1
  43. package/dist/{types-BHZ-Gk-s.d.ts → types-CeyFvYXO.d.ts} +1 -1
  44. package/dist/{types-GvexCqrq.d.cts → types-KYdNUffK.d.cts} +1 -1
  45. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- 'use strict';var jsxRuntime=require('hono/jsx/jsx-runtime'),firestore=require('firebase-admin/firestore'),crypto=require('crypto'),zod=require('zod'),server=require('hono/jsx/dom/server');var Wn=Object.defineProperty;var We=(e,t)=>()=>(e&&(t=e(e=0)),t);var Gn=(e,t)=>{for(var n in t)Wn(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return or[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function G(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function Lt(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Ut(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 te(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 De(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 je(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 Ge(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function Kt(e){let t=e,n=[],r=t._zod?.def?.checks;if(Array.isArray(r)){for(let s of r)s.format&&n.push(s.format);if(n.length>0)return n}let o=t._def?.checks;if(Array.isArray(o))for(let s of o)s.kind&&n.push(s.kind);return n}var or,Fe=We(()=>{or={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 pn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function Rr({message:e}){return jsxRuntime.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:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function Te({val:e,mismatch:t}){let n=Cr(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(Rr,{message:t})]}):n}function Cr(e){if(e==null)return jsxRuntime.jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsxRuntime.jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsxRuntime.jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsxRuntime.jsx(pn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(pn,{val:e.toDate()});if(typeof e=="number")return jsxRuntime.jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxRuntime.jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsxRuntime.jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxRuntime.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?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxRuntime.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,o])=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsxRuntime.jsx("dd",{class:"break-all",children:String(o??"")})]})),n.length>8&&jsxRuntime.jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsxRuntime.jsx("span",{class:"text-sm break-all",children:t})}var et=We(()=>{});function Oe(e){if(!e)return "unknown";let t=pt(e);switch(L(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 pt(e){let t=L(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?pt(n):e}return e}function Ee(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=pt(r);if(L(s)!=="ZodObject")return;r=te(s)[o];}return r}function Or(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 Me(e,t){if(e==="unknown")return null;let n=Or(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 ft=We(()=>{Fe();});var yn={};Gn(yn,{PanelMany:()=>Pr,PanelOne:()=>Er,RightPanel:()=>mt});function Er({doc:e,repoName:t,basePath:n,schema:r,columns:o}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let s=String(e.docId??e.id??""),i=`${n}/${t}/${encodeURIComponent(s)}/edit`,p=mn(r,o);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:s})]}),jsxRuntime.jsx("a",{href:i,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsxRuntime.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:o.map(d=>{let y=e[d],g=p[d],b=g?Me(g,y):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:d}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(Te,{val:y,mismatch:b})})]})})})]})}function Pr({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:i,pagination:p}){let d=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,y=mn(i,s);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" where "}),jsxRuntime.jsx("span",{class:"font-mono",children:r}),jsxRuntime.jsx("span",{class:"opacity-50",children:" = "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:o}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsxRuntime.jsx("a",{href:d,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxRuntime.jsxs("table",{class:"table table-xs w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[s.map((g,b)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:g},b)),jsxRuntime.jsx("th",{})]})}),jsxRuntime.jsx("tbody",{children:e.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:s.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((g,b)=>{let w=String(g.docId??g.id??""),$=`${n}/${t}/${encodeURIComponent(w)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((x,v)=>{let A=g[x],c=y[x],l=c?Me(c,A):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(Te,{val:A,mismatch:l})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:$,class:"btn btn-xs btn-ghost",children:"Edit"})})]},b)})})]})}),(p.hasPrev||p.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[p.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":p.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),p.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":p.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function mn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Oe(Ee(e,r));return n}var mt,yt=We(()=>{et();ft();mt=({basePath:e=""})=>jsxRuntime.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:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.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:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Ft(e){if(e===null)return "null";if(e===void 0)return "undefined";if(e instanceof firestore.Timestamp)return "timestamp";if(e instanceof Date)return "date";if(Array.isArray(e))return "array";let t=typeof e;return t==="string"||t==="number"||t==="boolean"?t:"object"}function ot(e,t,n=new WeakMap){if(e===t)return true;if(e===null||t===null||e===void 0||t===void 0)return e===t;if(e instanceof firestore.Timestamp&&t instanceof firestore.Timestamp)return e.isEqual(t);if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t)){if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length)return false;if(n.get(e)===t)return true;n.set(e,t);for(let r=0;r<e.length;r++)if(!ot(e[r],t[r],n))return false;return true}if(typeof e=="object"&&typeof t=="object"){if(e instanceof Date||t instanceof Date||e instanceof firestore.Timestamp||t instanceof firestore.Timestamp)return false;if(n.get(e)===t)return true;n.set(e,t);let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return false;for(let s of r)if(!Object.prototype.hasOwnProperty.call(t,s)||!ot(e[s],t[s],n))return false;return true}return false}function zt(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},i=t??{},p=new Set([...Object.keys(s),...Object.keys(i)]),d={};for(let y of p){if(r.has(y)||o&&!o.has(y))continue;let g=s[y],b=i[y];ot(g,b)||(d[y]={oldValue:g===void 0?null:g,newValue:b===void 0?null:b,type:{old:Ft(g),new:Ft(b)}});}return d}var Qn=7e5;function Bt(e){let t=e.ttlOverride??e.config.ttl,r={schemaVersion:2,historyDocId:crypto.randomUUID(),historyToObjectId:e.entityId,historySetAt:firestore.Timestamp.now(),operation:e.operation,meta:e.meta,changes:e.changes};t&&(r.expiresAt=firestore.Timestamp.fromMillis(Date.now()+t.days*24*60*60*1e3));let o=s=>{try{return Buffer.byteLength(JSON.stringify(s,(i,p)=>p instanceof firestore.Timestamp?p.toMillis():p),"utf8")}catch{return 0}};if(o(r.changes)>Qn){let s={};for(let[i,p]of Object.entries(r.changes)){let d=o(p.oldValue),y=o(p.newValue);s[i]={oldValue:d>5e4?"[truncated]":p.oldValue,newValue:y>5e4?"[truncated]":p.newValue,type:p.type};}r.changes=s,r._truncated=true;}return r}async function Zt(e,t,n,r){let o=t;return n.onBeforeWrite&&(o=await n.onBeforeWrite(t,r)),o?(await e.doc(o.historyDocId).set(o),{written:true,entry:o}):{written:false,reason:"dropped-by-onBeforeWrite"}}function Mt(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=g=>{if(!g)return;let b=n[g];return b===void 0||b===null?null:String(b)},i=s(o.userId);i!==void 0&&(r.userId=i);let p=s(o.userEmail);p!==void 0&&(r.userEmail=p);let d=s(o.reason);d!==void 0&&(r.reason=d);let y=s(o.comment);if(y!==void 0&&(r.comment=y),o.extras&&o.extras.length>0){let g={},b=false;for(let w of o.extras)w in n&&(g[w]=n[w],b=true);b&&(r.extras=g);}return r}function Ht(e){let t=e.meta;if(!t)return [];let n=[];return t.userId&&n.push(t.userId),t.userEmail&&n.push(t.userEmail),t.reason&&n.push(t.reason),t.comment&&n.push(t.comment),t.extras&&n.push(...t.extras),n}var Xn="history";function Yn(e,t){let n=t.ref?.path??void 0;return n?`${n}/{docId}`:(console.warn(`[HistoryTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function qt(e,t){let{onDocumentWritten:n}=t.deps,r={};for(let[o,s]of Object.entries(e)){let i=s._historyConfig??(typeof s.history=="object"&&s.history!==null&&"enabled"in s.history?s.history:void 0);if(!i?.enabled)continue;let p=i.subcollection??Xn,d=i.ttl??t.defaults?.ttl,y=t.repos?.[o],g;if(s._isGroup){if(!y?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}g=y.triggerPath;}else g=y?.triggerPath??Yn(o,s);if(!g)continue;let b=s._systemKeys??[],w=b[0]??"docId",$=Ht(i);r[`${o}_onHistory`]=n(g,async x=>{try{let v=x.data?.before?.data(),A=x.data?.after?.data(),c;if(!v&&A)c="create";else if(v&&!A)c="delete";else if(v&&A)c="update";else return;let l=String(A?.[w]??v?.[w]??x.params?.docId??x.data?.after?.id??x.data?.before?.id??"");if(!l)return;let m=zt(v??{},A??{},{include:i.include,exclude:i.exclude,metaFields:$,systemKeys:b});if(c==="update"&&Object.keys(m).length===0)return;let a=Mt(A??v??null,i),u=Bt({entityId:l,operation:c,changes:m,meta:a,config:i,ttlOverride:d}),f=x.data?.after?.ref??x.data?.before?.ref;if(!f)return;let k=f.collection(p);await Zt(k,u,i,{repoName:o,docId:l,before:v??null,after:A??null});}catch(v){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,v);}});}return r}function er(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,r=>r===":"?r:`\\${r}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(r,o)=>(t.push(o),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function tr(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var se=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:o,paramNames:s}=er(n);return this.routes.push({method:t.toUpperCase(),pattern:o,paramNames:s,handler:r}),this}async handle(t,n){let r=(t.method??"GET").toUpperCase(),o=tr(t),s=null,i={};for(let y of this.routes){if(y.method!==r)continue;let g=o.match(y.pattern);if(g){s=y,i={},y.paramNames.forEach((b,w)=>{i[b]=decodeURIComponent(g[w+1]??"");});break}}let p=Object.assign(t,{params:i}),d=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(p,n,d);}catch(y){this.errorHandler(y,t,n);}}async runMiddlewareChain(t,n,r){let o=0,s=async()=>{if(o<this.middlewares.length){let i=this.middlewares[o++];await i(t,n,s);}else await r(t,n);};await s();}};function ee(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",i=process.env.FUNCTION_REGION??"us-central1",p=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${i}/${p}${n}`}let r=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return r&&typeof o=="string"&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function fe(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Fe();var me="__sync_version";var sr=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function ar(e){let t=e,n=false;for(;;){let r=L(t);if(!sr.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var ir={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Vt(e,t,n,r,o,s,i,p){for(let[d,y]of Object.entries(e)){let g=n?`${n}__${d}`:d;if(o.has(d)||o.has(g))continue;let{inner:b,nullable:w}=ar(y),$=L(b),x=r||w;if($==="ZodObject"){let l=te(b);Vt(l,t,g,x,o,s,i,p);continue}let v=ir[$]??"json",A=g===i||d===i,c=s[g]??s[d]??g;p.push({name:c,sqlType:t.mapType(v),nullable:A?false:x,isPrimaryKey:A});}}function Je(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,i=new Set(o),p=te(e),d=[];return Vt(p,t,"",false,i,s,r,d),d.some(y=>y.name===me)||d.push({name:me,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),d}function Wt(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(Wt)):e}var lr=32,cr=5e3;function Gt(e,t,n,r=new WeakSet,o=0){if(o>lr){n[t||"_truncated"]=JSON.stringify({__truncated:true});return}if(r.has(e)){n[t||"_cycle"]=JSON.stringify({__cycle:true});return}r.add(e);for(let[s,i]of Object.entries(e)){if(Object.keys(n).length>=cr)break;let p=t?`${t}__${s}`:s;i!=null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)&&!Buffer.isBuffer(i)&&!(i instanceof Uint8Array)&&typeof i.toDate!="function"&&!("latitude"in i&&"longitude"in i)?Gt(i,p,n,r,o+1):n[p]=Wt(i);}r.delete(e);}function ze(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};Gt(e,"",o);let s={};for(let[i,p]of Object.entries(o)){if(n.has(i))continue;let d=i.split("__")[0];if(d!==i&&n.has(d))continue;let y=r[i]??(i.includes("__")?r[i.split("__").pop()]:void 0)??i;s[y]=p;}return s}function ce(e,t,n){return `<!DOCTYPE html>
1
+ 'use strict';var jsxRuntime=require('hono/jsx/jsx-runtime'),firestore=require('firebase-admin/firestore'),crypto=require('crypto'),zod=require('zod'),server=require('hono/jsx/dom/server');var Wn=Object.defineProperty;var We=(e,t)=>()=>(e&&(t=e(e=0)),t);var Gn=(e,t)=>{for(var n in t)Wn(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return or[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function G(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function Lt(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Ut(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 te(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 De(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 Fe(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 Ge(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function Kt(e){let t=e,n=[],r=t._zod?.def?.checks;if(Array.isArray(r)){for(let s of r)s.format&&n.push(s.format);if(n.length>0)return n}let o=t._def?.checks;if(Array.isArray(o))for(let s of o)s.kind&&n.push(s.kind);return n}var or,je=We(()=>{or={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 pn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function Rr({message:e}){return jsxRuntime.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:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function Te({val:e,mismatch:t}){let n=Cr(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(Rr,{message:t})]}):n}function Cr(e){if(e==null)return jsxRuntime.jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsxRuntime.jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsxRuntime.jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsxRuntime.jsx(pn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(pn,{val:e.toDate()});if(typeof e=="number")return jsxRuntime.jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxRuntime.jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsxRuntime.jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxRuntime.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?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxRuntime.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,o])=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsxRuntime.jsx("dd",{class:"break-all",children:String(o??"")})]})),n.length>8&&jsxRuntime.jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsxRuntime.jsx("span",{class:"text-sm break-all",children:t})}var et=We(()=>{});function Oe(e){if(!e)return "unknown";let t=pt(e);switch(L(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 pt(e){let t=L(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?pt(n):e}return e}function Ee(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=pt(r);if(L(s)!=="ZodObject")return;r=te(s)[o];}return r}function Or(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 Me(e,t){if(e==="unknown")return null;let n=Or(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 ft=We(()=>{je();});var yn={};Gn(yn,{PanelMany:()=>Pr,PanelOne:()=>Er,RightPanel:()=>mt});function Er({doc:e,repoName:t,basePath:n,schema:r,columns:o}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let s=String(e.docId??e.id??""),i=`${n}/${t}/${encodeURIComponent(s)}/edit`,p=mn(r,o);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:s})]}),jsxRuntime.jsx("a",{href:i,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsxRuntime.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:o.map(d=>{let y=e[d],g=p[d],b=g?Me(g,y):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:d}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(Te,{val:y,mismatch:b})})]})})})]})}function Pr({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:i,pagination:p}){let d=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,y=mn(i,s);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" where "}),jsxRuntime.jsx("span",{class:"font-mono",children:r}),jsxRuntime.jsx("span",{class:"opacity-50",children:" = "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:o}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsxRuntime.jsx("a",{href:d,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxRuntime.jsxs("table",{class:"table table-xs w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[s.map((g,b)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:g},b)),jsxRuntime.jsx("th",{})]})}),jsxRuntime.jsx("tbody",{children:e.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:s.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((g,b)=>{let w=String(g.docId??g.id??""),$=`${n}/${t}/${encodeURIComponent(w)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((x,v)=>{let A=g[x],c=y[x],l=c?Me(c,A):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(Te,{val:A,mismatch:l})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:$,class:"btn btn-xs btn-ghost",children:"Edit"})})]},b)})})]})}),(p.hasPrev||p.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[p.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":p.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),p.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":p.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function mn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Oe(Ee(e,r));return n}var mt,yt=We(()=>{et();ft();mt=({basePath:e=""})=>jsxRuntime.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:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.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:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function jt(e){if(e===null)return "null";if(e===void 0)return "undefined";if(e instanceof firestore.Timestamp)return "timestamp";if(e instanceof Date)return "date";if(Array.isArray(e))return "array";let t=typeof e;return t==="string"||t==="number"||t==="boolean"?t:"object"}function ot(e,t,n=new WeakMap){if(e===t)return true;if(e===null||t===null||e===void 0||t===void 0)return e===t;if(e instanceof firestore.Timestamp&&t instanceof firestore.Timestamp)return e.isEqual(t);if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t)){if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length)return false;if(n.get(e)===t)return true;n.set(e,t);for(let r=0;r<e.length;r++)if(!ot(e[r],t[r],n))return false;return true}if(typeof e=="object"&&typeof t=="object"){if(e instanceof Date||t instanceof Date||e instanceof firestore.Timestamp||t instanceof firestore.Timestamp)return false;if(n.get(e)===t)return true;n.set(e,t);let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return false;for(let s of r)if(!Object.prototype.hasOwnProperty.call(t,s)||!ot(e[s],t[s],n))return false;return true}return false}function zt(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},i=t??{},p=new Set([...Object.keys(s),...Object.keys(i)]),d={};for(let y of p){if(r.has(y)||o&&!o.has(y))continue;let g=s[y],b=i[y];ot(g,b)||(d[y]={oldValue:g===void 0?null:g,newValue:b===void 0?null:b,type:{old:jt(g),new:jt(b)}});}return d}var Qn=7e5;function Bt(e){let t=e.ttlOverride??e.config.ttl,r={schemaVersion:2,historyDocId:crypto.randomUUID(),historyToObjectId:e.entityId,historySetAt:firestore.Timestamp.now(),operation:e.operation,meta:e.meta,changes:e.changes};t&&(r.expiresAt=firestore.Timestamp.fromMillis(Date.now()+t.days*24*60*60*1e3));let o=s=>{try{return Buffer.byteLength(JSON.stringify(s,(i,p)=>p instanceof firestore.Timestamp?p.toMillis():p),"utf8")}catch{return 0}};if(o(r.changes)>Qn){let s={};for(let[i,p]of Object.entries(r.changes)){let d=o(p.oldValue),y=o(p.newValue);s[i]={oldValue:d>5e4?"[truncated]":p.oldValue,newValue:y>5e4?"[truncated]":p.newValue,type:p.type};}r.changes=s,r._truncated=true;}return r}async function Zt(e,t,n,r){let o=t;return n.onBeforeWrite&&(o=await n.onBeforeWrite(t,r)),o?(await e.doc(o.historyDocId).set(o),{written:true,entry:o}):{written:false,reason:"dropped-by-onBeforeWrite"}}function Mt(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=g=>{if(!g)return;let b=n[g];return b===void 0||b===null?null:String(b)},i=s(o.userId);i!==void 0&&(r.userId=i);let p=s(o.userEmail);p!==void 0&&(r.userEmail=p);let d=s(o.reason);d!==void 0&&(r.reason=d);let y=s(o.comment);if(y!==void 0&&(r.comment=y),o.extras&&o.extras.length>0){let g={},b=false;for(let w of o.extras)w in n&&(g[w]=n[w],b=true);b&&(r.extras=g);}return r}function Ht(e){let t=e.meta;if(!t)return [];let n=[];return t.userId&&n.push(t.userId),t.userEmail&&n.push(t.userEmail),t.reason&&n.push(t.reason),t.comment&&n.push(t.comment),t.extras&&n.push(...t.extras),n}var Xn="history";function Yn(e,t){let n=t.ref?.path??void 0;return n?`${n}/{docId}`:(console.warn(`[HistoryTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function qt(e,t){let{onDocumentWritten:n}=t.deps,r={};for(let[o,s]of Object.entries(e)){let i=s._historyConfig??(typeof s.history=="object"&&s.history!==null&&"enabled"in s.history?s.history:void 0);if(!i?.enabled)continue;let p=i.subcollection??Xn,d=i.ttl??t.defaults?.ttl,y=t.repos?.[o],g;if(s._isGroup){if(!y?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}g=y.triggerPath;}else g=y?.triggerPath??Yn(o,s);if(!g)continue;let b=s._systemKeys??[],w=b[0]??"docId",$=Ht(i);r[`${o}_onHistory`]=n(g,async x=>{try{let v=x.data?.before?.data(),A=x.data?.after?.data(),c;if(!v&&A)c="create";else if(v&&!A)c="delete";else if(v&&A)c="update";else return;let l=String(A?.[w]??v?.[w]??x.params?.docId??x.data?.after?.id??x.data?.before?.id??"");if(!l)return;let m=zt(v??{},A??{},{include:i.include,exclude:i.exclude,metaFields:$,systemKeys:b});if(c==="update"&&Object.keys(m).length===0)return;let a=Mt(A??v??null,i),u=Bt({entityId:l,operation:c,changes:m,meta:a,config:i,ttlOverride:d}),f=x.data?.after?.ref??x.data?.before?.ref;if(!f)return;let k=f.collection(p);await Zt(k,u,i,{repoName:o,docId:l,before:v??null,after:A??null});}catch(v){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,v);}});}return r}function er(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,r=>r===":"?r:`\\${r}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(r,o)=>(t.push(o),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function tr(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var se=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:o,paramNames:s}=er(n);return this.routes.push({method:t.toUpperCase(),pattern:o,paramNames:s,handler:r}),this}async handle(t,n){let r=(t.method??"GET").toUpperCase(),o=tr(t),s=null,i={};for(let y of this.routes){if(y.method!==r)continue;let g=o.match(y.pattern);if(g){s=y,i={},y.paramNames.forEach((b,w)=>{i[b]=decodeURIComponent(g[w+1]??"");});break}}let p=Object.assign(t,{params:i}),d=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(p,n,d);}catch(y){this.errorHandler(y,t,n);}}async runMiddlewareChain(t,n,r){let o=0,s=async()=>{if(o<this.middlewares.length){let i=this.middlewares[o++];await i(t,n,s);}else await r(t,n);};await s();}};function ee(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",i=process.env.FUNCTION_REGION??"us-central1",p=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${i}/${p}${n}`}let r=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return r&&typeof o=="string"&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function fe(e){return !!e&&typeof e=="object"&&e.__authExtension===true}je();var me="__sync_version";var sr=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function ar(e){let t=e,n=false;for(;;){let r=L(t);if(!sr.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var ir={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Vt(e,t,n,r,o,s,i,p){for(let[d,y]of Object.entries(e)){let g=n?`${n}__${d}`:d;if(o.has(d)||o.has(g))continue;let{inner:b,nullable:w}=ar(y),$=L(b),x=r||w;if($==="ZodObject"){let l=te(b);Vt(l,t,g,x,o,s,i,p);continue}let v=ir[$]??"json",A=g===i||d===i,c=s[g]??s[d]??g;p.push({name:c,sqlType:t.mapType(v),nullable:A?false:x,isPrimaryKey:A});}}function Je(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,i=new Set(o),p=te(e),d=[];return Vt(p,t,"",false,i,s,r,d),d.some(y=>y.name===me)||d.push({name:me,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),d}function Wt(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(Wt)):e}var lr=32,cr=5e3;function Gt(e,t,n,r=new WeakSet,o=0){if(o>lr){n[t||"_truncated"]=JSON.stringify({__truncated:true});return}if(r.has(e)){n[t||"_cycle"]=JSON.stringify({__cycle:true});return}r.add(e);for(let[s,i]of Object.entries(e)){if(Object.keys(n).length>=cr)break;let p=t?`${t}__${s}`:s;i!=null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)&&!Buffer.isBuffer(i)&&!(i instanceof Uint8Array)&&typeof i.toDate!="function"&&!("latitude"in i&&"longitude"in i)?Gt(i,p,n,r,o+1):n[p]=Wt(i);}r.delete(e);}function ze(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};Gt(e,"",o);let s={};for(let[i,p]of Object.entries(o)){if(n.has(i))continue;let d=i.split("__")[0];if(d!==i&&n.has(d))continue;let y=r[i]??(i.includes("__")?r[i.split("__").pop()]:void 0)??i;s[y]=p;}return s}function ce(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>
@@ -81,7 +81,7 @@ ${n}
81
81
  ${u("BigQuery",a.bigquery)}
82
82
  ${u("Pub/Sub",a.pubsub)}
83
83
  ${u("Firestore",a.firestore)}
84
- </div>`);de($,h);}),async(w,$)=>{await b.handle(w,$);}}var dr="firestore-sync";function ur(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 Qt(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,i=t?.topicPrefix??dr,p={},d=new Map;function y(b){let w=d.get(b);return w||(w=s.topic(b),d.set(b,w),w)}async function g(b,w){await y(b).publishMessage({json:w});}for(let[b,w]of Object.entries(e)){let $=t?.repos?.[b],x;if(w._isGroup){if(!$?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${b}". Provide a triggerPath in the sync repos config for group collections.`);continue}x=$.triggerPath;}else x=$?.triggerPath??ur(b,w);if(!x)continue;let v=w._systemKeys?.[0]??"docId",A=`${i}-${b}`;p[`${b}_onCreate`]=n(x,async c=>{let l=c.data;if(!l)return;let m=l.data();if(!m)return;let a=String(m[v]??l.id),u=ze(m,{exclude:$?.exclude,columnMap:$?.columnMap}),f={operation:"INSERT",repoName:b,docId:a,data:u,timestamp:new Date().toISOString(),version:Date.now()};await g(A,f);}),p[`${b}_onUpdate`]=r(x,async c=>{let l=c.data?.after;if(!l)return;let m=l.data();if(!m)return;let a=String(m[v]??l.id),u=ze(m,{exclude:$?.exclude,columnMap:$?.columnMap}),f={operation:"UPSERT",repoName:b,docId:a,data:u,timestamp:new Date().toISOString(),version:Date.now()};await g(A,f);}),p[`${b}_onDelete`]=o(x,async c=>{let l=c.data;if(!l)return;let m=l.data(),a=String(m?.[v]??l.id),u={operation:"DELETE",repoName:b,docId:a,data:null,timestamp:new Date().toISOString(),version:Date.now()};await g(A,u);});}return p}function Xt(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function Yt(e,t){let n=Xt(e),r=Xt(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var Xe=class{constructor(t){this.buffer=[];this.flushing=false;this.flushPromise=null;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(){for(;this.flushPromise;)await this.flushPromise;this.buffer.length!==0&&(this.flushing=true,this.flushPromise=this._drain().finally(()=>{this.flushing=false,this.flushPromise=null;}),await this.flushPromise);}async _drain(){for(;this.buffer.length>0&&await this._doFlush(););}async _doFlush(){let t=this.buffer.splice(0,this.batchSize);try{let n=new Map,r=[];for(let s of t)if(s.operation==="DELETE")r.push(s.docId),n.delete(s.docId);else if(s.data){let i=n.get(s.docId);if(!i)n.set(s.docId,s.data);else {let p=Number(i[me]??0);Number(s.data[me]??0)>=p&&n.set(s.docId,s.data);}}let o=Array.from(n.values());o.length>0&&await this.adapter.upsertRows(this.tableName,o,this.primaryKey),r.length>0&&await this.adapter.deleteRows(this.tableName,this.primaryKey,r);}catch(n){if(this.onFlushError)await this.onFlushError(t,n);else return this.buffer.unshift(...t),console.error(`[SyncQueue] Flush failed for ${this.tableName}:`,n),false}return true}async shutdown(){this.timer&&(clearInterval(this.timer),this.timer=null),await this.flush();}};var en=new Set,at=class extends Error{constructor(n,r,o,s){super(`Schema drift detected on \`${n}\`: column \`${r}\` has type ${o} in BigQuery but the current Zod schema maps it to ${s}. BigQuery cannot safely convert between these types \u2014 to resolve, either (a) keep the BigQuery type and add a transform in your repo to coerce values, (b) rename the field in your Zod schema (creates a new column), or (c) drop & recreate the table.`);this.tableName=n;this.column=r;this.existingType=o;this.desiredType=s;this.name="SchemaTypeMismatchError";}};async function pr(e,t,n,r,o,s,i){if(en.has(e))return;let p=Je(n,t.dialect,{primaryKey:o,exclude:s,columnMap:i});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:p});else if(t.getTableColumnsWithTypes){let y=await t.getTableColumnsWithTypes(r),g=[];for(let b of p){let w=y.get(b.name);if(w===void 0){g.push(b);continue}if(t.dialect.name==="bigquery"&&!Yt(w,b.sqlType))throw new at(r,b.name,w,b.sqlType)}g.length>0&&(await t.addColumns(r,g),await t.onSchemaChange?.(r));}else {let y=new Set(await t.getTableColumns(r)),g=p.filter(b=>!y.has(b.name));g.length>0&&(await t.addColumns(r,g),await t.onSchemaChange?.(r));}en.add(e);}function tn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:i=false,topicPrefix:p="firestore-sync",maxDlqAttempts:d=5,workerOptions:y,repos:g={}}=t,b=new Map;function w(v,A){let c=b.get(v);if(c)return c;let m=g[v]?.tableName??v,a=`${p}-${v}-dlq`,u=n.pubsub.topic(a),f=false,k=async()=>{if(!f){try{await u.create(),console.info(`[SyncWorker] Created DLQ topic "${a}"`);}catch(S){if(S?.code!==6)throw S}f=true;}},h=async(S,R)=>{console.error(`[SyncWorker] Flush failed for "${v}" (${S.length} events):`,R),await k(),await Promise.all(S.map(T=>{let C=(T.attempts??0)+1;if(d>0&&C>d)return console.error(`[SyncWorker] Dropping event for "${v}" after ${C-1} DLQ attempts:`,{docId:T.docId,operation:T.operation}),Promise.resolve();let E={...T,attempts:C,firstFailedAt:T.firstFailedAt??Date.now()};return u.publishMessage({json:E})}));};return c=new Xe({adapter:r,tableName:m,primaryKey:A,batchSize:o,flushIntervalMs:s,onFlushError:h}),b.set(v,c),c}async function $(v){let{repoName:A}=v,c=e[A];if(!c){console.warn(`[SyncWorker] Unknown repo "${A}", skipping event`);return}let l=c._systemKeys?.[0]??c.documentKey??"docId",m=g[A],a=m?.columnMap,u=a?.[l]??l;if(i){let k=c.schema??void 0;if(k){let h=m?.tableName??A;await pr(A,r,k,h,l,m?.exclude,a);}}let f=w(A,u);v.data&&(v.data[me]=v.version??Date.now()),f.enqueue(v);}function x(v){let A=async c=>{let l=c.data?.message?.json??c.data?.json;if(!l){console.warn("[SyncWorker] Received empty PubSub message");return}await $(l);let m=b.get(l.repoName);m&&await m.flush();};return y?n.pubsubHandler.onMessagePublished({topic:v,...y},A):n.pubsubHandler.onMessagePublished(v,A)}return {handleMessage:$,createHandler:x,queues:b,async shutdown(){let v=[];for(let A of b.values())v.push(A.shutdown());await Promise.all(v);}}}var fr="firestore-sync";function nn(e){if(typeof e!="function")return e;let t=e,n;return new Proxy({},{get(r,o){return n||(n=t()),n[o]},has(r,o){return n||(n=t()),o in n}})}function rn(e,t){let{deps:n,adapter:r,topicPrefix:o=fr,batchSize:s,flushIntervalMs:i,autoMigrate:p,admin:d,workerOptions:y,repos:g}=t,b=nn(n.pubsub),w=nn(r),$=Qt(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:b},topicPrefix:o,repos:g}),x=tn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:b},adapter:w,batchSize:s,flushIntervalMs:i,autoMigrate:p,topicPrefix:o,workerOptions:y,repos:g}),v={};for(let l of Object.keys(e))v[`sync_${l}`]=x.createHandler(`${o}-${l}`);let A=null;d&&(A=Jt(e,w,x.queues,x.handleMessage,d,g??{},b,o),v.adminsync=d.onRequest?d.httpsOptions?d.onRequest(d.httpsOptions,A):d.onRequest(A):A);let c={functions:{...$,...v},adminHandler:A,handleMessage:x.handleMessage,queues:x.queues,shutdown:x.shutdown};for(let l of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(c,l,{enumerable:false});return c}Fe();Fe();function mr(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function on(e){let t=e,n=true,r=false,o;for(;;){let s=L(t);if(s==="ZodOptional")n=false,t=G(t);else if(s==="ZodNullable")n=false,r=true,t=G(t);else if(s==="ZodDefault")n=false,o=Ut(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function ae(e,t=""){if(L(e)==="ZodObject"){let r=te(e);return Object.entries(r).map(([o,s])=>sn(t?`${t}.${o}`:o,o,s))}return [sn(t||"value",t||"value",e)]}function sn(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:i}=on(n),p=L(r),d=mr(t.split(".").pop()??t);switch(p){case "ZodString":{let y=Kt(r),g=y.includes("email"),b=y.includes("url");return {name:e,label:d,type:"text",required:o,nullable:s,defaultValue:i,hint:g?"email":b?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:d,type:"number",required:o,nullable:s,defaultValue:i};case "ZodBoolean":return {name:e,label:d,type:"checkbox",required:o,nullable:s,defaultValue:i};case "ZodDate":case "ZodCoerce":return {name:e,label:d,type:"datetime-local",required:o,nullable:s,defaultValue:i};case "ZodEnum":{let y=De(r);return {name:e,label:d,type:"select",required:o,nullable:s,defaultValue:i,options:y}}case "ZodNativeEnum":{let y=je(r),g=Object.values(y).filter(b=>typeof b=="string");return {name:e,label:d,type:"select",required:o,nullable:s,defaultValue:i,options:g}}case "ZodLiteral":{let y=String(Ge(r)??"");return {name:e,label:d,type:"select",required:o,nullable:s,defaultValue:i,options:[y]}}case "ZodObject":{let y=ae(r,e);return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,nested:y,hint:"JSON object"}}case "ZodArray":{let y=Lt(r);if(!y)return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,hint:"JSON array"};let{inner:g}=on(y),b=L(g),w,$,x;switch(b){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",$=De(g);break;case "ZodNativeEnum":w="select",$=Object.values(je(g)).filter(v=>typeof v=="string");break;case "ZodObject":w="object",x=ae(g);break;default:return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,hint:"JSON array"}}return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,arrayElementType:w,arrayElementOptions:$,arrayElementFields:x}}default:return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,hint:"JSON"}}}function it(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",i=e.defaultValue==="__null__",p=!i&&e.defaultValue!=null?String(e.defaultValue):"",d=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
84
+ </div>`);de($,h);}),async(w,$)=>{await b.handle(w,$);}}var dr="firestore-sync";function ur(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 Qt(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,i=t?.topicPrefix??dr,p={},d=new Map;function y(b){let w=d.get(b);return w||(w=s.topic(b),d.set(b,w),w)}async function g(b,w){await y(b).publishMessage({json:w});}for(let[b,w]of Object.entries(e)){let $=t?.repos?.[b],x;if(w._isGroup){if(!$?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${b}". Provide a triggerPath in the sync repos config for group collections.`);continue}x=$.triggerPath;}else x=$?.triggerPath??ur(b,w);if(!x)continue;let v=w._systemKeys?.[0]??"docId",A=`${i}-${b}`;p[`${b}_onCreate`]=n(x,async c=>{let l=c.data;if(!l)return;let m=l.data();if(!m)return;let a=String(m[v]??l.id),u=ze(m,{exclude:$?.exclude,columnMap:$?.columnMap}),f={operation:"INSERT",repoName:b,docId:a,data:u,timestamp:new Date().toISOString(),version:Date.now()};await g(A,f);}),p[`${b}_onUpdate`]=r(x,async c=>{let l=c.data?.after;if(!l)return;let m=l.data();if(!m)return;let a=String(m[v]??l.id),u=ze(m,{exclude:$?.exclude,columnMap:$?.columnMap}),f={operation:"UPSERT",repoName:b,docId:a,data:u,timestamp:new Date().toISOString(),version:Date.now()};await g(A,f);}),p[`${b}_onDelete`]=o(x,async c=>{let l=c.data;if(!l)return;let m=l.data(),a=String(m?.[v]??l.id),u={operation:"DELETE",repoName:b,docId:a,data:null,timestamp:new Date().toISOString(),version:Date.now()};await g(A,u);});}return p}function Xt(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function Yt(e,t){let n=Xt(e),r=Xt(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var Xe=class{constructor(t){this.buffer=[];this.flushing=false;this.flushPromise=null;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(){for(;this.flushPromise;)await this.flushPromise;this.buffer.length!==0&&(this.flushing=true,this.flushPromise=this._drain().finally(()=>{this.flushing=false,this.flushPromise=null;}),await this.flushPromise);}async _drain(){for(;this.buffer.length>0&&await this._doFlush(););}async _doFlush(){let t=this.buffer.splice(0,this.batchSize);try{let n=new Map,r=[];for(let s of t)if(s.operation==="DELETE")r.push(s.docId),n.delete(s.docId);else if(s.data){let i=n.get(s.docId);if(!i)n.set(s.docId,s.data);else {let p=Number(i[me]??0);Number(s.data[me]??0)>=p&&n.set(s.docId,s.data);}}let o=Array.from(n.values());o.length>0&&await this.adapter.upsertRows(this.tableName,o,this.primaryKey),r.length>0&&await this.adapter.deleteRows(this.tableName,this.primaryKey,r);}catch(n){if(this.onFlushError)await this.onFlushError(t,n);else return this.buffer.unshift(...t),console.error(`[SyncQueue] Flush failed for ${this.tableName}:`,n),false}return true}async shutdown(){this.timer&&(clearInterval(this.timer),this.timer=null),await this.flush();}};var en=new Set,at=class extends Error{constructor(n,r,o,s){super(`Schema drift detected on \`${n}\`: column \`${r}\` has type ${o} in BigQuery but the current Zod schema maps it to ${s}. BigQuery cannot safely convert between these types \u2014 to resolve, either (a) keep the BigQuery type and add a transform in your repo to coerce values, (b) rename the field in your Zod schema (creates a new column), or (c) drop & recreate the table.`);this.tableName=n;this.column=r;this.existingType=o;this.desiredType=s;this.name="SchemaTypeMismatchError";}};async function pr(e,t,n,r,o,s,i){if(en.has(e))return;let p=Je(n,t.dialect,{primaryKey:o,exclude:s,columnMap:i});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:p});else if(t.getTableColumnsWithTypes){let y=await t.getTableColumnsWithTypes(r),g=[];for(let b of p){let w=y.get(b.name);if(w===void 0){g.push(b);continue}if(t.dialect.name==="bigquery"&&!Yt(w,b.sqlType))throw new at(r,b.name,w,b.sqlType)}g.length>0&&(await t.addColumns(r,g),await t.onSchemaChange?.(r));}else {let y=new Set(await t.getTableColumns(r)),g=p.filter(b=>!y.has(b.name));g.length>0&&(await t.addColumns(r,g),await t.onSchemaChange?.(r));}en.add(e);}function tn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:i=false,topicPrefix:p="firestore-sync",maxDlqAttempts:d=5,workerOptions:y,repos:g={}}=t,b=new Map;function w(v,A){let c=b.get(v);if(c)return c;let m=g[v]?.tableName??v,a=`${p}-${v}-dlq`,u=n.pubsub.topic(a),f=false,k=async()=>{if(!f){try{await u.create(),console.info(`[SyncWorker] Created DLQ topic "${a}"`);}catch(S){if(S?.code!==6)throw S}f=true;}},h=async(S,R)=>{console.error(`[SyncWorker] Flush failed for "${v}" (${S.length} events):`,R),await k(),await Promise.all(S.map(T=>{let C=(T.attempts??0)+1;if(d>0&&C>d)return console.error(`[SyncWorker] Dropping event for "${v}" after ${C-1} DLQ attempts:`,{docId:T.docId,operation:T.operation}),Promise.resolve();let E={...T,attempts:C,firstFailedAt:T.firstFailedAt??Date.now()};return u.publishMessage({json:E})}));};return c=new Xe({adapter:r,tableName:m,primaryKey:A,batchSize:o,flushIntervalMs:s,onFlushError:h}),b.set(v,c),c}async function $(v){let{repoName:A}=v,c=e[A];if(!c){console.warn(`[SyncWorker] Unknown repo "${A}", skipping event`);return}let l=c._systemKeys?.[0]??c.documentKey??"docId",m=g[A],a=m?.columnMap,u=a?.[l]??l;if(i){let k=c.schema??void 0;if(k){let h=m?.tableName??A;await pr(A,r,k,h,l,m?.exclude,a);}}let f=w(A,u);v.data&&(v.data[me]=v.version??Date.now()),f.enqueue(v);}function x(v){let A=async c=>{let l=c.data?.message?.json??c.data?.json;if(!l){console.warn("[SyncWorker] Received empty PubSub message");return}await $(l);let m=b.get(l.repoName);m&&await m.flush();};return y?n.pubsubHandler.onMessagePublished({topic:v,...y},A):n.pubsubHandler.onMessagePublished(v,A)}return {handleMessage:$,createHandler:x,queues:b,async shutdown(){let v=[];for(let A of b.values())v.push(A.shutdown());await Promise.all(v);}}}var fr="firestore-sync";function nn(e){if(typeof e!="function")return e;let t=e,n;return new Proxy({},{get(r,o){return n||(n=t()),n[o]},has(r,o){return n||(n=t()),o in n}})}function rn(e,t){let{deps:n,adapter:r,topicPrefix:o=fr,batchSize:s,flushIntervalMs:i,autoMigrate:p,admin:d,workerOptions:y,repos:g}=t,b=nn(n.pubsub),w=nn(r),$=Qt(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:b},topicPrefix:o,repos:g}),x=tn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:b},adapter:w,batchSize:s,flushIntervalMs:i,autoMigrate:p,topicPrefix:o,workerOptions:y,repos:g}),v={};for(let l of Object.keys(e))v[`sync_${l}`]=x.createHandler(`${o}-${l}`);let A=null;d&&(A=Jt(e,w,x.queues,x.handleMessage,d,g??{},b,o),v.adminsync=d.onRequest?d.httpsOptions?d.onRequest(d.httpsOptions,A):d.onRequest(A):A);let c={functions:{...$,...v},adminHandler:A,handleMessage:x.handleMessage,queues:x.queues,shutdown:x.shutdown};for(let l of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(c,l,{enumerable:false});return c}je();je();function mr(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function on(e){let t=e,n=true,r=false,o;for(;;){let s=L(t);if(s==="ZodOptional")n=false,t=G(t);else if(s==="ZodNullable")n=false,r=true,t=G(t);else if(s==="ZodDefault")n=false,o=Ut(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function ae(e,t=""){if(L(e)==="ZodObject"){let r=te(e);return Object.entries(r).map(([o,s])=>sn(t?`${t}.${o}`:o,o,s))}return [sn(t||"value",t||"value",e)]}function sn(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:i}=on(n),p=L(r),d=mr(t.split(".").pop()??t);switch(p){case "ZodString":{let y=Kt(r),g=y.includes("email"),b=y.includes("url");return {name:e,label:d,type:"text",required:o,nullable:s,defaultValue:i,hint:g?"email":b?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:d,type:"number",required:o,nullable:s,defaultValue:i};case "ZodBoolean":return {name:e,label:d,type:"checkbox",required:o,nullable:s,defaultValue:i};case "ZodDate":case "ZodCoerce":return {name:e,label:d,type:"datetime-local",required:o,nullable:s,defaultValue:i};case "ZodEnum":{let y=De(r);return {name:e,label:d,type:"select",required:o,nullable:s,defaultValue:i,options:y}}case "ZodNativeEnum":{let y=Fe(r),g=Object.values(y).filter(b=>typeof b=="string");return {name:e,label:d,type:"select",required:o,nullable:s,defaultValue:i,options:g}}case "ZodLiteral":{let y=String(Ge(r)??"");return {name:e,label:d,type:"select",required:o,nullable:s,defaultValue:i,options:[y]}}case "ZodObject":{let y=ae(r,e);return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,nested:y,hint:"JSON object"}}case "ZodArray":{let y=Lt(r);if(!y)return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,hint:"JSON array"};let{inner:g}=on(y),b=L(g),w,$,x;switch(b){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",$=De(g);break;case "ZodNativeEnum":w="select",$=Object.values(Fe(g)).filter(v=>typeof v=="string");break;case "ZodObject":w="object",x=ae(g);break;default:return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,hint:"JSON array"}}return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,arrayElementType:w,arrayElementOptions:$,arrayElementFields:x}}default:return {name:e,label:d,type:"textarea",required:o,nullable:s,defaultValue:i,hint:"JSON"}}}function it(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",i=e.defaultValue==="__null__",p=!i&&e.defaultValue!=null?String(e.defaultValue):"",d=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
85
85
  <input type="hidden" id="${r}__isnull" name="${o}__isnull" value="${i?"1":""}">
86
86
  <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">
87
87
  <input type="checkbox" class="checkbox checkbox-xs" ${i?"checked":""}
@@ -97,7 +97,7 @@ ${n}
97
97
  <div class="form-control mb-3 ${n}">
98
98
  <label for="${r}" class="label pb-1">
99
99
  <span class="label-text font-medium">
100
- ${j(e.label)}
100
+ ${F(e.label)}
101
101
  <span class="text-base-content/40 text-xs ml-1">(nullable)</span>
102
102
  </span>
103
103
  </label>
@@ -111,41 +111,41 @@ ${n}
111
111
  <label class="label cursor-pointer justify-start gap-3">
112
112
  <input type="checkbox" id="${r}" name="${o}" value="true"${p==="true"?" checked":""} class="checkbox checkbox-primary checkbox-sm">
113
113
  <span class="label-text font-medium">
114
- ${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
114
+ ${F(e.label)}${e.required?' <span class="text-error">*</span>':""}
115
115
  </span>
116
116
  </label>
117
117
  </div>`;case "select":y=`<select id="${r}" name="${o}"${s}${i?' disabled style="opacity:0.35"':""} class="select select-bordered select-sm w-full">
118
118
  ${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
119
- ${(e.options??[]).map(g=>`<option value="${j(g)}"${p===g?" selected":""}>${j(g)}</option>`).join(`
119
+ ${(e.options??[]).map(g=>`<option value="${F(g)}"${p===g?" selected":""}>${F(g)}</option>`).join(`
120
120
  `)}
121
121
  </select>`;break;case "textarea":if(e.arrayElementType)return yr(e,t);if(e.nested&&e.nested.length>0){let g=e.nested.map(b=>it(b,t+1)).join(`
122
122
  `);return `
123
123
  <fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}">
124
124
  <legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
125
- ${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
125
+ ${F(e.label)}${e.required?' <span class="text-error">*</span>':""}
126
126
  </legend>
127
127
  ${g}
128
128
  </fieldset>`}y=`<textarea id="${r}" name="${o}"${s} rows="3"${i?' disabled style="opacity:0.35"':""}
129
129
  data-json
130
130
  class="textarea textarea-bordered textarea-sm w-full font-mono text-xs"
131
- placeholder="${j(e.hint??"JSON")}">${j(p)}</textarea>`;break;default:y=`<input type="${e.type}" id="${r}" name="${o}"${s}${i?' disabled style="opacity:0.35"':""}
132
- value="${j(p)}"
131
+ placeholder="${F(e.hint??"JSON")}">${F(p)}</textarea>`;break;default:y=`<input type="${e.type}" id="${r}" name="${o}"${s}${i?' disabled style="opacity:0.35"':""}
132
+ value="${F(p)}"
133
133
  class="input input-bordered input-sm w-full"${e.hint==="email"?' autocomplete="email"':e.hint==="url"?' autocomplete="url"':""}>`;}return `
134
134
  <div class="form-control mb-3 ${n}">
135
135
  <label for="${r}" class="label pb-1">
136
136
  <span class="label-text font-medium">
137
- ${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
138
- ${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${j(e.hint)})</span>`:""}
137
+ ${F(e.label)}${e.required?' <span class="text-error">*</span>':""}
138
+ ${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${F(e.hint)})</span>`:""}
139
139
  </span>
140
140
  </label>
141
141
  <div class="flex items-center gap-2">
142
142
  <div class="flex-1 min-w-0">${y}</div>
143
143
  ${d}
144
144
  </div>
145
- </div>`}function j(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function yr(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.defaultValue==="__null__",s=e.arrayElementType==="object",i=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{i=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(i)||(i=[]);let p=s?i.map(g=>ln(e,g??{})).join(`
145
+ </div>`}function F(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function yr(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.defaultValue==="__null__",s=e.arrayElementType==="object",i=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{i=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(i)||(i=[]);let p=s?i.map(g=>ln(e,g??{})).join(`
146
146
  `):i.map(g=>an(e,g)).join(`
147
147
  `),d=s?ln(e,{}):an(e,""),y=e.nullable?`<span class="flex items-center gap-1 mt-2">
148
- <input type="hidden" id="${r}__isnull" name="${j(e.name)}__isnull" value="${o?"1":""}">
148
+ <input type="hidden" id="${r}__isnull" name="${F(e.name)}__isnull" value="${o?"1":""}">
149
149
  <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">
150
150
  <input type="checkbox" class="checkbox checkbox-xs" ${o?"checked":""}
151
151
  onchange="(function(cb){
@@ -159,11 +159,11 @@ ${n}
159
159
  </label>
160
160
  </span>`:"";return `
161
161
  <fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}"
162
- data-frs-array="${j(e.name)}" data-frs-array-type="${j(e.arrayElementType??"text")}">
162
+ data-frs-array="${F(e.name)}" data-frs-array-type="${F(e.arrayElementType??"text")}">
163
163
  <legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
164
- ${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
164
+ ${F(e.label)}${e.required?' <span class="text-error">*</span>':""}
165
165
  </legend>
166
- <input type="hidden" id="${r}" name="${j(e.name)}" value="${j(JSON.stringify(i))}"${o?" disabled":""}>
166
+ <input type="hidden" id="${r}" name="${F(e.name)}" value="${F(JSON.stringify(i))}"${o?" disabled":""}>
167
167
  <div data-frs-array-items${o?' style="opacity:0.35"':""}>
168
168
  ${p}
169
169
  </div>
@@ -172,11 +172,11 @@ ${n}
172
172
  ${y}
173
173
  </fieldset>`}function an(e,t){let n=t!=null?String(t):"",r;switch(e.arrayElementType){case "select":r=`<select data-frs-val class="select select-bordered select-sm flex-1">
174
174
  <option value="">\u2014</option>
175
- ${(e.arrayElementOptions??[]).map(o=>`<option value="${j(o)}"${n===o?" selected":""}>${j(o)}</option>`).join("")}
175
+ ${(e.arrayElementOptions??[]).map(o=>`<option value="${F(o)}"${n===o?" selected":""}>${F(o)}</option>`).join("")}
176
176
  </select>`;break;case "checkbox":r=`<label class="flex items-center gap-2 flex-1 cursor-pointer">
177
177
  <input type="checkbox" data-frs-val class="checkbox checkbox-sm checkbox-primary"${n==="true"?" checked":""}>
178
178
  <span class="text-sm">true</span>
179
- </label>`;break;case "number":r=`<input type="number" data-frs-val value="${j(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${j(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${j(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
179
+ </label>`;break;case "number":r=`<input type="number" data-frs-val value="${F(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${F(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${F(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
180
180
  ${r}
181
181
  <button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>&times;</button>
182
182
  </div>`}function ln(e,t){return `<div class="border border-base-200 rounded p-3 mb-2" data-frs-array-item>
@@ -185,35 +185,35 @@ ${n}
185
185
  </div>
186
186
  ${(e.arrayElementFields??[]).map(o=>{let s=t[o.name],i=s==null?"":typeof s=="object"?JSON.stringify(s):String(s);switch(o.type){case "checkbox":return `<div class="form-control mb-2">
187
187
  <label class="label cursor-pointer justify-start gap-3">
188
- <input type="checkbox" data-frs-key="${j(o.name)}" class="checkbox checkbox-sm checkbox-primary"${i==="true"?" checked":""}>
189
- <span class="label-text text-sm">${j(o.label)}</span>
188
+ <input type="checkbox" data-frs-key="${F(o.name)}" class="checkbox checkbox-sm checkbox-primary"${i==="true"?" checked":""}>
189
+ <span class="label-text text-sm">${F(o.label)}</span>
190
190
  </label>
191
191
  </div>`;case "select":return `<div class="form-control mb-2">
192
- <label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
193
- <select data-frs-key="${j(o.name)}" class="select select-bordered select-sm w-full">
192
+ <label class="label pb-1"><span class="label-text text-sm">${F(o.label)}</span></label>
193
+ <select data-frs-key="${F(o.name)}" class="select select-bordered select-sm w-full">
194
194
  ${o.required?"":'<option value="">\u2014</option>'}
195
- ${(o.options??[]).map(p=>`<option value="${j(p)}"${i===p?" selected":""}>${j(p)}</option>`).join("")}
195
+ ${(o.options??[]).map(p=>`<option value="${F(p)}"${i===p?" selected":""}>${F(p)}</option>`).join("")}
196
196
  </select>
197
197
  </div>`;case "number":return `<div class="form-control mb-2">
198
- <label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
199
- <input type="number" data-frs-key="${j(o.name)}" value="${j(i)}" class="input input-bordered input-sm w-full">
198
+ <label class="label pb-1"><span class="label-text text-sm">${F(o.label)}</span></label>
199
+ <input type="number" data-frs-key="${F(o.name)}" value="${F(i)}" class="input input-bordered input-sm w-full">
200
200
  </div>`;case "datetime-local":return `<div class="form-control mb-2">
201
- <label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
202
- <input type="datetime-local" data-frs-key="${j(o.name)}" value="${j(i)}" class="input input-bordered input-sm w-full">
201
+ <label class="label pb-1"><span class="label-text text-sm">${F(o.label)}</span></label>
202
+ <input type="datetime-local" data-frs-key="${F(o.name)}" value="${F(i)}" class="input input-bordered input-sm w-full">
203
203
  </div>`;case "textarea":return `<div class="form-control mb-2">
204
- <label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
205
- <textarea data-frs-key="${j(o.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${j(i)}</textarea>
204
+ <label class="label pb-1"><span class="label-text text-sm">${F(o.label)}</span></label>
205
+ <textarea data-frs-key="${F(o.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${F(i)}</textarea>
206
206
  </div>`;default:return `<div class="form-control mb-2">
207
- <label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
208
- <input type="text" data-frs-key="${j(o.name)}" value="${j(i)}" class="input input-bordered input-sm w-full">
207
+ <label class="label pb-1"><span class="label-text text-sm">${F(o.label)}</span></label>
208
+ <input type="text" data-frs-key="${F(o.name)}" value="${F(i)}" class="input input-bordered input-sm w-full">
209
209
  </div>`}}).join(`
210
210
  `)}
211
211
  </div>`}function ye(e,t,n,r="Save"){let o=e.map(s=>it(s)).join(`
212
212
  `);return `
213
- <form action="${j(t)}" method="${n}" novalidate data-frs-form>
213
+ <form action="${F(t)}" method="${n}" novalidate data-frs-form>
214
214
  ${o}
215
215
  <div class="flex gap-2 mt-4 pt-4 border-t border-base-200">
216
- <button type="submit" class="btn btn-primary btn-sm">${j(r)}</button>
216
+ <button type="submit" class="btn btn-primary btn-sm">${F(r)}</button>
217
217
  <button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
218
218
  </div>
219
219
  </form>`}var gr=new Set(["<","<=",">",">=","!="]),hr=new Set(["array-contains","array-contains-any"]);function lt(e){return e==="desc"?"DESCENDING":"ASCENDING"}function br(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function vr(e,t,n,r,o){let s=[],i=new Set;for(let d of r)if(d.op==="=="||d.op==="in"||d.op==="not-in"){if(i.has(d.field))continue;i.add(d.field),s.push({fieldPath:d.field,order:"ASCENDING"});}for(let d of r)if(hr.has(d.op)){if(i.has(d.field))continue;i.add(d.field),s.push({fieldPath:d.field,arrayConfig:"CONTAINS"});}for(let d of r)if(gr.has(d.op)){if(i.has(d.field))continue;i.add(d.field);let y=o?.field===d.field?lt(o.dir):"ASCENDING";s.push({fieldPath:d.field,order:y});}if(o&&!i.has(o.field)&&s.push({fieldPath:o.field,order:lt(o.dir)}),s.length===1&&n)return Sr(e,t,s[0]);let p=o&&s.some(d=>d.fieldPath===o.field)?lt(o.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:p}),xr(e,t,n,s)}function xr(e,t,n,r,o="(default)"){let s=`projects/${e}/databases/${o}/collectionGroups/${t}/indexes/_`,i=[...ut(1,s),...Ye(2,n?2:1)];for(let y of r)i.push(...cn(3,dn(y)));let p=o==="(default)"?"-default-":o,d=encodeURIComponent(un(i));return `https://console.firebase.google.com/project/${e}/firestore/databases/${p}/indexes?create_composite=${d}`}function wr(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function ct(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function dt(e,t){return e<<3|t}function ut(e,t){let n=Array.from(new TextEncoder().encode(t));return [dt(e,2),...ct(n.length),...n]}function Ye(e,t){return [dt(e,0),...ct(t)]}function cn(e,t){return [dt(e,2),...ct(t.length),...t]}function dn(e){let t=[...ut(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...Ye(3,1)):t.push(...Ye(2,e.order==="DESCENDING"?2:1)),t}function un(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 Sr(e,t,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...ut(1,o),...Ye(2,2),...cn(3,dn(n))],i=r==="(default)"?"-default-":r,p=encodeURIComponent(un(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${i}/indexes/automatic?create_exemption=${p}`}function kr(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 o of n)if(typeof o=="string"&&o.length>0)return o;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function we(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Be(e,t){let n=e??{},r=we(e),o;if(r&&(o=n.message?wr(n.message):void 0,!o)){let s=kr(t.ref);if(s){let i=br(t.path);o=vr(s,i,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:o}}et();var fn=`// \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
@@ -1143,7 +1143,7 @@ function initColumnReorder(table) {
1143
1143
  });
1144
1144
  });
1145
1145
  }
1146
- `;function Ze(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:fn}})}yt();function ge(e){return "<!DOCTYPE html>"+server.renderToString(e)}var Nr=["corporate","silk","dark"],Dr=()=>jsxRuntime.jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxRuntime.jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxRuntime.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:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"}),jsxRuntime.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"})]}),jsxRuntime.jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsxRuntime.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:Nr.map(e=>jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsxRuntime.jsx("span",{children:e}),jsxRuntime.jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),he=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:o,basePath:s="/"}=e;return jsxRuntime.jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxRuntime.jsxs("head",{children:[jsxRuntime.jsx("meta",{charset:"UTF-8"}),jsxRuntime.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxRuntime.jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxRuntime.jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxRuntime.jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsxRuntime.jsx("div",{class:"flex-1",children:jsxRuntime.jsx("a",{href:s,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsxRuntime.jsx("div",{class:"flex-none",children:jsxRuntime.jsx(Dr,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((i,p)=>i.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:i.href,children:i.label})},p):jsxRuntime.jsx("li",{class:"text-base-content/60",children:i.label},p))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(mt,{basePath:s}),jsxRuntime.jsx(Ze,{})]})]})};function gt(e,t){return ge(jsxRuntime.jsx(he,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function ht(e,t){return ge(jsxRuntime.jsx(he,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxRuntime.jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsxRuntime.jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsxRuntime.jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsxRuntime.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=>jsxRuntime.jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxRuntime.jsxs("div",{class:"card-body p-5",children:[jsxRuntime.jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsxRuntime.jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var hn=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],jr=[{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"}],Fr=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function zr(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return jr;case "ZodBoolean":return hn;case "ZodArray":return Fr;default:return hn}}var be="__null__";function Br(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="${be}"]');if(!o){o=document.createElement('option');o.value='${be}';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='${be}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${be}"][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!=='${be}')?i.dataset._prev:'';}}})(this)`}function Zr(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 He({inputId:e,active:t}){return jsxRuntime.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:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:Br(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Mr({col:e,active:t}){let n=t?.value??"",r=n===be,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,i=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(i){let p=new Set(n.split(",").map(y=>y.trim()).filter(Boolean)),d=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:o,name:`fv_${e.name}`,value:n}),e.enumValues.map(y=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:y,checked:p.has(y),"data-enum-group":d,onchange:Zr(o,d)}),jsxRuntime.jsx("span",{children:y})]},y))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(p=>jsxRuntime.jsx("option",{value:p,selected:n===p,children:p},p)),e.nullable&&jsxRuntime.jsx("option",{value:be,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:be,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let p=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,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"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]})}function bt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(d=>[d.field,d])),s=n.length>0,i=n.length>=2||r&&s,p=t.filter(d=>d.zodType!=="ZodObject"&&d.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:p.map(d=>{let y=zr(d.zodType),g=o[d.name],b=g?.op??y[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:d.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[y.length>1?jsxRuntime.jsx("select",{name:`fo_${d.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:y.map(w=>jsxRuntime.jsx("option",{value:w.value,selected:w.value===b,children:w.label},w.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${d.name}`,value:y[0].value}),jsxRuntime.jsx(Mr,{col:d,active:g})]})]},d.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),s&&jsxRuntime.jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),i&&jsxRuntime.jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.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 vt(e,t,n,r,o,s){let i=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,p=n==="create"?[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:"New document"}]:[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:`Edit ${r??""}`}];return ge(jsxRuntime.jsx(he,{opts:{title:i,breadcrumb:p,basePath:o,flash:s},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}et();ft();function xt(e,t,n){let r=new URLSearchParams;for(let o of e)r.set(`fv_${o.field}`,o.value),r.set(`fo_${o.field}`,o.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function bn(e,t,n,r,o){let s=xt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Hr(e,t,n,r){let o=xt(n,void 0,r);return t?.field===e?t.dir==="asc"&&(o.set("ob",e),o.set("od","desc")):(o.set("ob",e),o.set("od","asc")),`?${o.toString()}`}function qr(e,t,n){return `?${xt(t,n,e).toString()}`}function wt(e,t,n,r,o,s,i=[],p=[],d=false,y=[],g,b,w,$,x,v,A,c=false){let l=`${r}/${e}`,m=`${l}/create`,a={};if(A)for(let R of n)a[R]=Oe(Ee(A,R));let u=(v??[]).filter(R=>{let T=a[R]??Oe(Ee(A,R));return T==="string"||T==="number"||T==="bigint"||T==="boolean"||T==="enum"||T==="literal"}),f=u.length>0,k=d,h=k||f,S=u.map(R=>{let T=Ee(A,R),C=Oe(T),E=i.find(O=>O.name===R);return {name:R,type:C,enumValues:E?.enumValues??null,nullable:E?.nullable??false}});return ge(jsxRuntime.jsxs(he,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[i.length>0&&jsxRuntime.jsx(bt,{action:l,columnMeta:i,activeFilters:p,isGroup:$}),w&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${w.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsxRuntime.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"?jsxRuntime.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"}):jsxRuntime.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"})}),jsxRuntime.jsxs("div",{class:"flex-1",children:[jsxRuntime.jsx("h3",{class:"font-bold",children:w.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:w.message})]}),w.indexUrl&&jsxRuntime.jsx("a",{href:w.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof x=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:x})]})," ","document",(typeof x=="number"?x:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(R=>jsxRuntime.jsx("a",{href:qr(R,p,g),class:`join-item btn btn-xs ${b===R?"btn-active btn-primary":"btn-outline"}`,children:R},R))})]})]}),jsxRuntime.jsx("a",{href:m,class:"btn btn-primary btn-sm",children:"+ New"})]}),h&&jsxRuntime.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 x=="number"?String(x):"","data-frs-page-size":String(b??t.length),"data-frs-allow-delete":k?"1":"0","data-frs-allow-update":f?"1":"0","data-frs-fields":JSON.stringify(S),"data-frs-filters":JSON.stringify(p),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof x=="number"&&x>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link link-primary text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",x," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",x??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[f&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),k&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[h&&jsxRuntime.jsx("th",{class:"w-8",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((R,T)=>{let C=g?.field===R,E=C?g.dir==="asc"?" \u25B2":" \u25BC":"";return jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxRuntime.jsxs("a",{href:Hr(R,g,p,b),class:`hover:text-base-content inline-flex items-center gap-0.5${C?" text-primary font-bold":""}`,children:[R,E]})},T)}),y.map((R,T)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:R.column},`rel-${T}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+y.length+1+(h?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((R,T)=>{let C=String(R.docId??R.id??""),E=`${r}/${e}/${encodeURIComponent(C)}/edit`,O=`${r}/${e}/${encodeURIComponent(C)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":C,children:[h&&jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:C,"aria-label":`Select ${C}`})}),n.map((I,D)=>{let _=R[I],P=a[I],H=P?Me(P,_):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Te,{val:_,mismatch:H})},D)}),y.map((I,D)=>{let _=R[I.key];if(_==null||_==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${D}`);let P=I.type==="one"?`${r}/${I.targetRepo}/${encodeURIComponent(String(_))}/edit`:`${r}/${I.targetRepo}?fv_${I.targetKey}=${encodeURIComponent(String(_))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:P,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":I.type,"data-frs-rel-repo":I.targetRepo,"data-frs-rel-fk":I.targetKey,"data-frs-rel-val":String(_),"data-frs-rel-label":I.column,children:I.column})},`rel-${D}`)}),jsxRuntime.jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxRuntime.jsxs("div",{class:"flex gap-1 justify-end",children:[jsxRuntime.jsx("a",{href:E,class:"btn btn-xs btn-outline",children:"Edit"}),c&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(C)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),d&&jsxRuntime.jsx("form",{method:"post",action:O,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},T)})})]})}),(o.hasPrev||o.hasNext)&&jsxRuntime.jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[o.hasPrev?jsxRuntime.jsx("a",{href:bn(p,o.prevCursor,"prev",g,b),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),o.hasNext?jsxRuntime.jsx("a",{href:bn(p,o.nextCursor,"next",g,b),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof x=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[x," total document",x!==1?"s":"",p.length>0?" matching filters":""]})]}),h&&f&&jsxRuntime.jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxRuntime.jsxs("div",{class:"modal-box",children:[jsxRuntime.jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsxRuntime.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."}),jsxRuntime.jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxRuntime.jsxs("label",{class:"form-control w-full mb-3",children:[jsxRuntime.jsx("div",{class:"label",children:jsxRuntime.jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxRuntime.jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsxRuntime.jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),u.map(R=>jsxRuntime.jsx("option",{value:R,children:R},R))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}var Ur="";function qe(e,t){return gt(e,t)}function St(e,t){return ht(e,t)}function kt(e,t,n,r,o,s,i,p,d,y,g,b,w,$,x,v,A,c){return wt(e,t,n,r,o,s,i,p,d,y,g,b,w,$,x,v,A,c)}function ve(e,t,n,r,o,s){return vt(e,t,n,r,o,s)}var Rt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Wr(){let e="";for(;e.length<20;){let t=crypto.randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=Rt.length*4||(e+=Rt.charAt(r%Rt.length));}}return e}function nt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),o=[];for(let s=1;s<r.length;s+=2)o.push(r[s]);return o.length>0?o:void 0}async function Pe(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 s=await e.repo.get[r](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Ct(e,t,n){let r=e.documentKey??"docId",o=Be(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return o.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...o.indexUrl?{action:{href:o.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:o.message}}function z(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function $t(e,t){e.status(302).set("Location",t).send("");}function At(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let i=Ot(s);if(i==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let y={},g=false;for(let[$,x]of Object.entries(e))$.startsWith(`${o}.`)&&(y[$.slice(o.length+1)]=x,g=true);if(g){let $=s;for(;;){let x=L($);if(x==="ZodOptional"||x==="ZodNullable"||x==="ZodDefault")$=G($);else break}r[o]=At(y,$);continue}let b=e[o],w=Array.isArray(b)?b[b.length-1]:b;if(w)try{r[o]=JSON.parse(w);}catch{r[o]=w;}continue}let p=e[o],d=Array.isArray(p)?p[p.length-1]:p;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(d===void 0||d===""){i==="ZodBoolean"&&(r[o]=false);continue}switch(i){case "ZodBoolean":d==="__null__"?r[o]=null:r[o]=d==="true"||d==="on"||d==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(d);break;case "ZodDate":r[o]=new Date(d);break;case "ZodArray":try{r[o]=JSON.parse(d);}catch{r[o]=d;}break;default:if(d.startsWith("{")||d.startsWith("["))try{r[o]=JSON.parse(d);break}catch{}r[o]=d;}}return r}function vn(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 Ot(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Gr(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function wn(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=G(t);continue}return false}}function Sn(e){let t=Gr(e),n=L(t);if(n==="ZodEnum"){let r=De(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=je(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=Ge(t);return typeof r=="string"?[r]:void 0}}function kn(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,i=e[o];if(i===null){r[s]="__null__";continue}if(i===void 0)continue;let p=t.shape[o];for(;;){let y=L(p);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")p=G(p);else break}let d=L(p);if(d==="ZodObject"&&typeof i=="object"&&i!==null&&!Array.isArray(i)){let y=kn(i,p,s);Object.assign(r,y);}else if(d==="ZodDate"){let y=vn(i);y!==null&&(r[s]=y);}else if(typeof i=="object"&&i!==null&&!Array.isArray(i)&&("_seconds"in i||typeof i.toDate=="function")){let y=vn(i);r[s]=y??JSON.stringify(i,null,2);}else typeof i=="object"?r[s]=JSON.stringify(i,null,2):r[s]=String(i);}return r}function Tt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Tt(n.nested,t):void 0}))}function Jr(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[o,s]of Object.entries(e)){if(!o.startsWith("fv_"))continue;let i=o.slice(3);if(!t.has(i))continue;let p=(s??"").trim();if(!p)continue;let d=e[`fo_${i}`]??"==",y=n.has(d)?d:"==";r.push({field:i,op:y,value:p});}return r}function xn(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 o=r.value.split(",").map(s=>s.trim()).filter(s=>s!==""&&s!==t).map(s=>n(s));return [r.field,r.op,o]}return [r.field,r.op,n(r.value)]})}function Rn(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,i=t.shape[o];if(!i){r.push({name:s,zodType:"ZodString"});continue}let p=Ot(i);if(p==="ZodObject"){let d=i;for(;;){let g=L(d);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")d=G(d);else break}let y=te(d);r.push(...Rn(Object.keys(y),d,s));}else r.push({name:s,zodType:p,nullable:wn(i),enumValues:Sn(i)});}return r}function Qr(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let i=L(r);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")r=G(r);else break}let s=te(r);if(!(o in s))return null;r=s[o];}return r}function ke(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let i=s.indexOf(".");if(i===-1)n.push(s);else {let p=s.slice(0,i),d=s.slice(i+1);r.has(p)||r.set(p,[]),r.get(p).push(d);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,i]of r){if(!(s in e.shape))continue;let p=e.shape[s];for(;;){let d=L(p);if(d==="ZodOptional"||d==="ZodNullable"||d==="ZodDefault")p=G(p);else break}if(L(p)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=ke(p,i);}return zod.z.object(o)}function ue(e,t){return ee(e,t)}function Cn(e,t){let n=(c,l)=>{let m=ue(c,t),a=Object.values(e).map(u=>({name:u.name,path:u.path}));z(l,St(a,m));},r=async(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=a.pageSize??25,f=c.query??{},k=f.cursor,h=f.dir==="prev"?"prev":"next",S=f.ob??"",R=f.od==="desc"?"desc":"asc",T=S?{field:S,dir:R}:void 0,C=parseInt(f.ps??""),E=Number.isFinite(C)&&C>0?Math.min(C,200):u,O=a.listColumns??Object.keys(a.schema.shape),I=a.documentKey??"docId",D=[I,...O.filter(W=>W!==I)];T&&(new Set([I,...O]).has(T.field)||(T=void 0));let _=a.filterableFields?(()=>{let W=[];for(let le of a.filterableFields)(le.includes(".")||O.includes(le))&&W.push(le);return W})():O,P=(()=>{let W=[];for(let le of _)if(le.includes(".")){let Ce=Qr(a.schema,le);W.push({name:le,zodType:Ce?Ot(Ce):"ZodString",nullable:Ce?wn(Ce):false,enumValues:Ce?Sn(Ce):void 0});}else W.push(...Rn([le],a.schema));return W})(),H=new Set(P.map(W=>W.name)),pe=Jr(f,H),oe=xn(pe),K;if(k)try{let W=a.repo.ref;typeof W.doc=="function"&&(K=await W.doc(k).get());}catch{}let[U,Ve]=await Promise.all([a.repo.query.paginate({pageSize:E,cursor:K,direction:h,...oe.length>0?{where:oe}:{},...T?{orderBy:[{field:T.field,direction:T.dir}]}:{}}).catch(W=>({queryError:Be(W,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:pe,sort:T})})),a.repo.aggregate.count(oe.length>0?{where:oe}:{}).catch(()=>{})]),Re="queryError"in U,qn=Re?[]:U.data,Ln=Re?"":U.nextCursor?.id??"",Un=Re?"":U.prevCursor?.id??"",Kn=Re?U.queryError:void 0,Vn=ue(c,t);z(l,kt(a.name,qn,D,Vn,{hasPrev:Re?false:U.hasPrevPage,hasNext:Re?false:U.hasNextPage,prevCursor:Un,nextCursor:Ln},void 0,P,pe,a.allowDelete??false,a.relationalMeta,T,E,Kn,a.isGroup,Ve,a.mutableFields,a.schema,a.historyEnabled));},o=(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=ue(c,t),f=ke(a.schema,a.createFields),k=ae(f),h=`${u}/${a.name}/create`,S=ye(k,h,"POST","Create document");z(l,ve(a.name,S,"create",null,u));},s=async(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=ue(c,t),f=c.body??{},k=At(f,a.schema),h=ke(a.schema,a.createFields),S=h.safeParse(k);if(!S.success){let R=ae(h),T=`${u}/${a.name}/create`,C=ye(R,T,"POST","Create document"),E=S.error.issues.map(O=>`${O.path.join(".")}: ${O.message}`).join(", ");z(l,ve(a.name,C,"create",null,u,{type:"error",message:`Validation error: ${E}`}),422);return}try{if(a.isGroup&&a.parentKeys&&a.parentKeys.length>0){let R={...S.data};a.createdKey&&(R[a.createdKey]=new Date);let T=a.parentKeys.filter(I=>!R[I]);if(T.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${T.join(", ")}`);let C=a.parentKeys.map(I=>R[I]),E=a.documentKey??"docId",O=R[E]||Wr();await a.repo.set(...C,O,R);}else await a.repo.create(S.data);$t(l,`${u}/${a.name}?flash=created`);}catch(R){let T=ke(a.schema,a.createFields),C=ae(T),E=`${u}/${a.name}/create`,O=ye(C,E,"POST","Create document");z(l,ve(a.name,O,"create",null,u,{type:"error",message:`Save error: ${R.message}`}),500);}},i=async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}let f=ue(c,t),k=null;try{k=await Pe(u,a);}catch(E){let O=Ct(u,a,E),I=we(E)?424:500;z(l,qe("",{title:`Edit ${u.name} / ${a}`,basePath:f,breadcrumb:[{label:"Repositories",href:f},{label:u.name,href:`${f}/${u.name}`},{label:`Edit ${a}`}],flash:O}),I);return}if(!k){z(l,"Document not found",404);return}let h=kn(k,u.schema),S=ke(u.schema,u.mutableFields),R=Tt(ae(S),h),T=`${f}/${u.name}/${encodeURIComponent(a)}/edit`,C=ye(R,T,"POST","Save changes");z(l,ve(u.name,C,"edit",a,f));},p=async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}let f=ue(c,t),k=c.body??{},h=At(k,u.schema),S=ke(u.schema,u.mutableFields),T=S.partial().safeParse(h);if(!T.success){let C=Object.fromEntries(Object.entries(k).map(([_,P])=>[_,Array.isArray(P)?P.join(","):P??""])),E=Tt(ae(S),C),O=`${f}/${u.name}/${encodeURIComponent(a)}/edit`,I=ye(E,O,"POST","Save changes"),D=T.error.issues.map(_=>`${_.path.join(".")}: ${_.message}`).join(", ");z(l,ve(u.name,I,"edit",a,f,{type:"error",message:`Validation error: ${D}`}),422);return}try{let C=await Pe(u,a),E=(C&&nt(C,u.pathKey))??[a];await u.repo.update(...E,T.data),$t(l,`${f}/${u.name}?flash=updated`);}catch(C){let E=ke(u.schema,u.mutableFields),O=ae(E),I=`${f}/${u.name}/${encodeURIComponent(a)}/edit`,D=ye(O,I,"POST","Save changes"),_=we(C)?Ct(u,a,C):{type:"error",message:`Save error: ${C.message}`},P=we(C)?424:500;z(l,ve(u.name,D,"edit",a,f,_),P);}},d=async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}if(!u.allowDelete){z(l,"Delete is not allowed for this repository",403);return}let f=ue(c,t);try{let k=await Pe(u,a),h=(k&&nt(k,u.pathKey))??[a];await u.repo.delete(...h),$t(l,`${f}/${u.name}?flash=deleted`);}catch(k){let h=we(k)?Ct(u,a,k):{type:"error",message:`Delete error: ${k.message}`},S=we(k)?424:500;z(l,qe("",{title:`Delete ${u.name} / ${a}`,basePath:f,breadcrumb:[{label:"Repositories",href:f},{label:u.name,href:`${f}/${u.name}`},{label:`Delete ${a}`}],flash:h}),S);}},y=async(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=ue(c,t),f=c.query,k=f?.type==="many"?"many":"one",h=Math.max(1,Math.min(100,Number(f?.ps??25)||25)),S=a.listColumns??Object.keys(te(a.schema)),{PanelOne:R,PanelMany:T}=await Promise.resolve().then(()=>(yt(),yn)),{renderToString:C}=await import('hono/jsx/dom/server');if(k==="one"){let P=String(f?.id??"");if(!P){z(l,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let H=await Pe(a,P),pe=C(R({doc:H,repoName:a.name,basePath:u,schema:a.schema,columns:S}));z(l,pe);}catch(H){z(l,`<div class='p-6 text-error text-sm'>Error: ${H.message}</div>`,500);}return}let E=String(f?.fk??""),O=String(f?.fv??"");if(!E||!O){z(l,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let I=f?.cursor??"",D=f?.dir==="prev"?"prev":"next",_;if(I)try{let P=a.repo.ref;typeof P.doc=="function"&&(_=await P.doc(I).get());}catch{}try{let P=await a.repo.query.paginate({pageSize:h,cursor:_,direction:D,where:[[E,"==",Xr(O)]]}),H=C(T({docs:P.data,repoName:a.name,basePath:u,fk:E,fv:O,columns:S,schema:a.schema,pagination:{hasPrev:P.hasPrevPage,hasNext:P.hasNextPage,prevCursor:P.prevCursor?.id??"",nextCursor:P.nextCursor?.id??"",pageSize:h}}));z(l,H);}catch(P){z(l,`<div class='p-6 text-error text-sm'>Error: ${P.message}</div>`,500);}},g=async(c,l)=>{let m=[];for(let a of l){let u;if(c.isGroup||c.parentKeys?.length){let f=await Pe(c,a);u=f?nt(f,c.pathKey):void 0;}u||(u=[a]);try{let f=c.repo.documentRef(...u);f&&m.push(f);}catch{}}return m},b=async(c,l)=>{let m=xn(l),a=c.documentKey??"docId",u=[],f;for(;;){let k=await c.repo.query.paginate({pageSize:500,cursor:f,direction:"next",...m.length>0?{where:m}:{}});for(let h of k.data){let S=String(h[a]??h.id??"");S&&u.push(S);}if(!k.hasNextPage||!k.nextCursor)break;f=k.nextCursor;}return u},w=async(c,l)=>{let m=c.params.repoName;if(!m){Y(l,{error:"Bad request"},400);return}let a=e[m];if(!a){Y(l,{error:"Repository not found"},404);return}if(!a.allowDelete){Y(l,{error:"Delete is not allowed for this repository"},403);return}let u=c.body??{};try{let f=await x(a,u);if(f.length===0){Y(l,{deleted:0});return}let k=await g(a,f);for(let h=0;h<k.length;h+=500)await a.repo.bulk.delete(k.slice(h,h+500));Y(l,{deleted:k.length});}catch(f){Y(l,{error:f.message},500);}},$=async(c,l)=>{let m=c.params.repoName;if(!m){Y(l,{error:"Bad request"},400);return}let a=e[m];if(!a){Y(l,{error:"Repository not found"},404);return}let u=c.body??{},f=String(u.field??"");if(!f){Y(l,{error:"Missing 'field'"},400);return}if(!a.mutableFields||!a.mutableFields.includes(f)){Y(l,{error:`Field '${f}' is not bulk-updatable`},403);return}let k=a.schema.shape?.[f],h=u.value;if(k){let S=k.safeParse(u.value);if(!S.success){Y(l,{error:`Invalid value for '${f}': ${S.error.message}`},400);return}h=S.data;}try{let S=await x(a,u);if(S.length===0){Y(l,{updated:0});return}let T=(await g(a,S)).map(C=>({docRef:C,data:{[f]:h}}));for(let C=0;C<T.length;C+=500)await a.repo.bulk.update(T.slice(C,C+500));Y(l,{updated:T.length});}catch(S){Y(l,{error:S.message},500);}};async function x(c,l){if(l.selectAll){let m=v(l.filters,c);return await b(c,m)}return Array.isArray(l.ids)?l.ids.filter(m=>typeof m=="string"&&!!m):[]}function v(c,l){if(!Array.isArray(c))return [];let m=new Set((l.filterableFields??Object.keys(te(l.schema))).map(f=>String(f))),a=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),u=[];for(let f of c)f&&typeof f=="object"&&typeof f.field=="string"&&m.has(f.field)&&typeof f.value=="string"&&a.has(String(f.op))&&u.push({field:f.field,op:f.op,value:f.value});return u}return {handleDashboard:n,handleList:r,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:i,handleEditSubmit:p,handleDelete:d,handlePanel:y,handleBulkDelete:w,handleBulkUpdate:$,handleHistory:async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}if(!u.historyEnabled||!u.repo.history){z(l,"History not enabled for this repository",404);return}let f=ue(c,t),k=u.historySubcollection??"history",h=[a];try{let P=await Pe(u,a),H=P?nt(P,u.pathKey):void 0;H&&H.length>0&&(h=H);}catch{}let S=parseInt(String(c.query?.limit??"")),R=Number.isFinite(S)&&S>0?Math.min(S,500):100,T=[],C;try{T=await u.repo.history.list(...h,{limit:R});}catch(P){C=P.message;}let E=P=>String(P??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),O=P=>{if(P===void 0)return '<span class="opacity-40">undefined</span>';if(P===null)return '<span class="opacity-40">null</span>';if(typeof P=="object")try{return `<code class="text-xs">${E(JSON.stringify(P))}</code>`}catch{return E(String(P))}return E(String(P))},I=P=>P?typeof P.toDate=="function"?P.toDate().toISOString():P instanceof Date?P.toISOString():E(String(P)):"",D=P=>`<span class="badge badge-sm ${P==="create"?"badge-success":P==="delete"?"badge-error":"badge-info"}">${E(P)}</span>`,_="";if(_+='<div class="flex items-center justify-between mb-4">',_+=`<a href="${f}/${u.name}/${encodeURIComponent(a)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,_+=`<a href="${f}/${u.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,_+="</div>",_+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${E(k)}</code> \xB7 Showing up to ${R} entries.</p>`,C)_+=`<div class="alert alert-error mb-4">${E(C)}</div>`;else if(T.length===0)_+='<div class="alert">No history entries found.</div>';else {_+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',_+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let P of T){let H=P.meta??{},pe=[H.reason,H.comment].filter(U=>U!=null&&U!=="").map(U=>E(String(U))).join(" \u2014 "),oe="",K=Object.keys(P.changes??{});K.length===0?oe='<span class="opacity-40">\u2014</span>':oe='<ul class="space-y-1">'+K.map(U=>{let Ve=P.changes[U];return `<li><strong>${E(U)}</strong>: ${O(Ve.oldValue)} \u2192 ${O(Ve.newValue)}</li>`}).join("")+"</ul>",_+="<tr>",_+=`<td class="whitespace-nowrap text-xs font-mono">${E(I(P.historySetAt))}</td>`,_+=`<td>${D(P.operation??"update")}</td>`,_+=`<td class="text-xs">${E(H.userEmail??H.userId??"")}</td>`,_+=`<td class="text-xs">${pe}</td>`,_+=`<td>${oe}</td>`,_+="</tr>";}_+="</tbody></table></div>";}z(l,qe(_,{title:`History \u2014 ${u.name} / ${a}`,basePath:f,breadcrumb:[{label:"Repositories",href:f},{label:u.name,href:`${f}/${u.name}`},{label:`History ${a}`}]}));}}}function Y(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Xr(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var $n="https://cdn.jsdelivr.net",An="https://www.gstatic.com",Tn=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${$n} ${An}`,`style-src 'self' 'unsafe-inline' ${$n}`,`connect-src 'self' ${An} https://*.googleapis.com https://*.firebaseio.com https://identitytoolkit.googleapis.com`,"img-src 'self' data:","font-src 'self' data:","frame-ancestors 'none'","base-uri 'self'","form-action 'self'"].join("; ");function Le(e={}){let t=e.csp===void 0?Tn:e.csp,n=e.frameOptions===void 0?"DENY":e.frameOptions,r=e.referrerPolicy===void 0?"no-referrer":e.referrerPolicy,o=e.cacheControl===void 0?"private, no-store":e.cacheControl;return async(s,i,p)=>{typeof i?.setHeader=="function"&&(i.setHeader("X-Content-Type-Options","nosniff"),n&&i.setHeader("X-Frame-Options",n),r&&i.setHeader("Referrer-Policy",r),o&&i.setHeader("Cache-Control",o),t&&i.setHeader("Content-Security-Policy",t)),await p();}}async function Yr(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function eo(e){let t={};if(!e)return t;for(let n of e.split("&")){let r=n.indexOf("=");if(r===-1)continue;let o=decodeURIComponent(n.slice(0,r).replace(/\+/g," ")),s=decodeURIComponent(n.slice(r+1).replace(/\+/g," ")),i=t[o];i===void 0?t[o]=s:Array.isArray(i)?i.push(s):t[o]=[i,s];}return t}function On(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:i=[],httpsOptions:p}=e,d=t==="/"?"":t.replace(/\/$/,""),y={};for(let[$,x]of Object.entries(n)){let v=x.schema??x.repo.schema??null;if(!v)throw new Error(`[createAdminServer] Repository "${$}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let A,c,l;if(x.fieldsConfig){let u=x.fieldsConfig;A=[],c=[],l=[];for(let[f,k]of Object.entries(u))for(let h of k)h==="filterable"?A.push(f):h==="mutable"?c.push(f):h==="create"&&l.push(f);A.length===0&&(A=void 0),c.length===0&&(c=void 0),l.length===0&&(l=void 0);}let m=(()=>{let u=x.repo._parentKeys;return u&&u.length>0?u:void 0})();if(m&&l)for(let u of m)l.includes(u)||l.push(u);let a={name:$,path:x.path,repo:x.repo,schema:v,documentKey:x.documentKey??"docId",pathKey:x.repo._pathKey??void 0,isGroup:!!x.repo._isGroup,parentKeys:m,createdKey:x.repo._createdKey??void 0,listColumns:x.listColumns,pageSize:x.pageSize,filterableFields:A,mutableFields:c,createFields:l,allowDelete:x.allowDelete??false,historyEnabled:!!x.repo.history,historySubcollection:(x.repo.history&&x.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!x.relationalFields||x.relationalFields.length===0)return;let u=x.repo.relationalKeys??{},f=[];for(let k of x.relationalFields){let h=u[k.key];h&&f.push({key:k.key,column:k.column,targetRepo:String(h.repo),targetKey:String(h.key),type:h.type});}return f.length>0?f:void 0})()};y[$]=a;}let g=Cn(y,d),b=new se;if(o!==false&&b.use(Le(o===void 0?{}:o)),r&&b.use(async($,x,v)=>{let A=$,c=String(A.headers?.["content-type"]??"");if(c.includes("application/x-www-form-urlencoded")){let l=await Yr(A);$.body=eo(l);}else if(c.includes("application/json")&&typeof A.body=="string")try{$.body=JSON.parse(A.body);}catch{}await v();}),s)if(fe(s)){for(let $ of s.routes){let x=`${d}${$.path}`;$.method==="GET"?b.get(x,$.handler):b.post(x,$.handler);}b.use(s.middleware);}else if(typeof s=="function")b.use(s);else {let $=s.realm??"Admin",x="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");b.use((v,A,c)=>{if((v.headers?.authorization??"")!==x){A.status(401).set("WWW-Authenticate",`Basic realm="${$}"`).set("Content-Type","text/plain").send("Unauthorized");return}c();});}for(let $ of i)b.use($);b.get(`${d}/`,g.handleDashboard),b.get(`${d}`,g.handleDashboard),b.get(`${d}/:repoName/_panel`,g.handlePanel),b.post(`${d}/:repoName/_bulk/delete`,g.handleBulkDelete),b.post(`${d}/:repoName/_bulk/update`,g.handleBulkUpdate),b.get(`${d}/:repoName`,g.handleList),b.get(`${d}/:repoName/create`,g.handleCreateForm),b.post(`${d}/:repoName/create`,g.handleCreateSubmit),b.get(`${d}/:repoName/:id/edit`,g.handleEditForm),b.post(`${d}/:repoName/:id/edit`,g.handleEditSubmit),b.get(`${d}/:repoName/:id/history`,g.handleHistory),b.post(`${d}/:repoName/:id/delete`,g.handleDelete);let w=async($,x)=>{await b.handle($,x);};return p&&(w.httpsOptions=p),w}var Pn="preserve";function In(){return Pn}function to(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function _n(e){if(e==null)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(e instanceof firestore.Timestamp)return e.toDate();if(to(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 Nn(e){return e}function _t(e,t,n=200){let r=Nn(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Ie(e,t,n,r=200){_t(e,{success:true,data:t,meta:n},r);}function q(e,t,n=400){_t(e,{success:false,error:t},n);}function Pt(e,t,n,r,o){let s=Be(t,n),i=s.type==="index",p=i?424:500,y={success:false,error:i?s.message:o&&t instanceof Error?t.message:r};i&&(y.errorType="index",s.indexUrl&&(y.indexUrl=s.indexUrl)),_t(e,y,p);}var It="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function oo(){let e="";for(;e.length<20;){let t=crypto.randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=It.length*4||(e+=It.charAt(r%It.length));}}return e}function _e(e){let t=e._def??e.def;if(!t)return e;let n=t.typeName??t.type;if(n==="ZodDate"||n==="date")return zod.z.preprocess(r=>_n(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,i]of Object.entries(r))o[s]=_e(i);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(_e(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return _e(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return _e(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=_e(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function so(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let i of s){if(n.includes(i))continue;let p=i.split(".")[0];p&&r[p]&&(o[p]=r[p]);}return zod.z.object(o)}function Dn(e,t,n,r=false,o=[]){try{let s=so(e,n,o),i=r?s.partial():s;return {success:!0,data:(In()==="normalize"?_e(i):i).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(p=>`${p.path.join(".")}: ${p.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function ao(e,t){let n=[],r=t?new Set(t):null,o={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[s,i]of Object.entries(e)){if(i===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let p=Array.isArray(i)?i[0]:i;if(p===void 0||p==="")continue;let d=s.match(/^(\w+)__(\w+)$/),y,g="==";if(d&&d[1]&&d[2]){y=d[1];let w=d[2];if(o[w])g=o[w];else continue}else if(!d)y=s;else continue;if(r&&!r.has(y))continue;let b=p;g==="in"||g==="not-in"||g==="array-contains-any"?b=p.split(",").map(w=>jn(w.trim())):b=jn(p),n.push({field:y,op:g,value:b});}return n}function jn(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 rt(e){return e?{docId:e.id}:null}async function Fn(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 o=await r.doc(n).get();return o.exists?o:void 0}catch{return}}function zn(e,t,n,r=false){async function o(c,l,m,a){if(!r)return true;let u=l.rules?.[m];if(!u)return q(c,`Operation "${m}" is not allowed for this repository`,403),false;try{return await u(a)?!0:(q(c,"Forbidden",403),!1)}catch(f){let k=n&&f instanceof Error?f.message:"Forbidden";return q(c,k,403),false}}async function s(c,l,m,a){if(!r)return a;let u=c.rules?.filter;if(!u)return a;let f=[];for(let k of a)try{await u({user:l,doc:k,params:m})&&f.push(k);}catch{}return f}function i(c){return c?.user??null}function p(c,l){return !c||!e[c]?(q(l,`Repository "${c}" not found`,404),null):e[c]}function d(c,l){if(!l)return;let m=c[l];if(typeof m!="string"||!m)return;let a=m.split("/").filter(Boolean),u=[];for(let f=1;f<a.length;f+=2)u.push(a[f]);return u.length>0?u:void 0}async function y(c,l){let m=`by${c.documentKey.charAt(0).toUpperCase()}${c.documentKey.slice(1)}`,a=c.repo.get[m];if(typeof a=="function")try{let f=await a(l);if(f)return f}catch{}return (await c.repo.query.by({where:[[c.documentKey,"==",l]],limit:1}))[0]??null}async function g(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;let u=i(c);if(!await o(l,a,"list",{user:u,query:c.query??{},params:m}))return;let f=[],k;try{let h=c.query??{},S=Math.min(Number(h.pageSize)||a.pageSize,100),R=h.cursor,T=h.direction?.toLowerCase()==="prev"?"prev":"next",C=h.orderBy,E=h.orderDir?.toLowerCase()==="desc"?"desc":"asc",O=h.select,I=O?O.split(",").map(K=>K.trim()):void 0,D;a.allowedIncludes&&h.includes&&(D=(typeof h.includes=="string"?h.includes.split(",").map(U=>U.trim()):Array.isArray(h.includes)?h.includes:[]).filter(U=>typeof U=="string"&&a.allowedIncludes.includes(U)),D?.length===0&&(D=void 0));let _=ao(h,a.filterableFields);f=_.map(K=>({field:K.field,op:K.op,value:String(K.value??"")})),C&&(k={field:C,dir:E});let P={pageSize:S,direction:T};if(R)try{let K=typeof R=="string"?JSON.parse(R):R;P.cursor=await Fn(a,K);}catch{}if(C){if(a.orderableFields&&!a.orderableFields.includes(C)){q(l,`Field not orderable: ${C}`,400);return}P.orderBy=[{field:C,direction:E}];}_.length>0&&(P.where=_.map(K=>[K.field,K.op,K.value])),I&&(P.select=I),D&&(P.include=D);let H=await a.repo.query.paginate(P),oe={items:await s(a,i(c),m,H.data),hasNextPage:H.hasNextPage,hasPrevPage:H.hasPrevPage,nextCursor:rt(H.nextCursor),prevCursor:rt(H.prevCursor)};Ie(l,oe,{pageSize:S,hasMore:H.hasNextPage});}catch(h){Pt(l,h,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:f,sort:k},"Failed to fetch documents",n);}}async function b(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;let u=i(c);if(!await o(l,a,"list",{user:u,query:c.body??{},params:m}))return;let f=[],k;try{let h=c.body??{},S=Math.min(h.pageSize||a.pageSize,100),R=h.direction==="prev"?"prev":"next";h.where&&(f=h.where.map(I=>({field:String(I[0]),op:I[1],value:String(I[2]??"")}))),h.orderBy&&h.orderBy[0]&&(k={field:h.orderBy[0].field,dir:h.orderBy[0].direction==="desc"?"desc":"asc"});let T={pageSize:S,direction:R};if(h.cursor)try{let I=typeof h.cursor=="string"?JSON.parse(h.cursor):h.cursor;T.cursor=await Fn(a,I);}catch{}if(a.allowedIncludes&&h.includes&&h.includes.length>0){let I=h.includes.filter(D=>typeof D=="string"?a.allowedIncludes.includes(D):typeof D=="object"&&D!==null&&"relation"in D&&typeof D.relation=="string"?a.allowedIncludes.includes(D.relation):!1);I.length>0&&(T.include=I);}if(h.where&&h.where.length>0){if(a.filterableFields){let I=new Set(a.filterableFields),D=h.where.filter(_=>!I.has(_[0]));if(D.length>0){q(l,`Fields not filterable: ${D.map(_=>_[0]).join(", ")}`,400);return}}T.where=h.where;}if(h.orWhere&&h.orWhere.length>0){if(a.filterableFields){let I=new Set(a.filterableFields),D=h.orWhere.filter(_=>!I.has(_[0]));if(D.length>0){q(l,`Fields not filterable: ${D.map(_=>_[0]).join(", ")}`,400);return}}T.orWhere=h.orWhere;}if(h.orWhereGroups&&h.orWhereGroups.length>0){if(a.filterableFields){let I=new Set(a.filterableFields);for(let D of h.orWhereGroups){let _=D.filter(P=>!I.has(P[0]));if(_.length>0){q(l,`Fields not filterable: ${_.map(P=>P[0]).join(", ")}`,400);return}}}T.orWhereGroups=h.orWhereGroups;}if(h.orderBy&&h.orderBy.length>0){if(a.orderableFields){let I=new Set(a.orderableFields),D=h.orderBy.filter(_=>!I.has(_.field));if(D.length>0){q(l,`Fields not orderable: ${D.map(_=>_.field).join(", ")}`,400);return}}T.orderBy=h.orderBy;}h.select&&h.select.length>0&&(T.select=h.select);let C=await a.repo.query.paginate(T),O={items:await s(a,i(c),m,C.data),hasNextPage:C.hasNextPage,hasPrevPage:C.hasPrevPage,nextCursor:rt(C.nextCursor),prevCursor:rt(C.prevCursor)};Ie(l,O,{pageSize:S,hasMore:C.hasNextPage});}catch(h){Pt(l,h,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:f,sort:k},"Failed to query documents",n);}}async function w(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;let u=m.id;if(!u){q(l,"Document ID required",400);return}try{let f=await y(a,u);if(!f){q(l,"Document not found",404);return}let k=i(c);if(!await o(l,a,"get",{user:k,doc:f,params:m}))return;if(r&&a.rules?.filter)try{if(!await a.rules.filter({user:k,doc:f,params:m})){q(l,"Document not found",404);return}}catch{q(l,"Document not found",404);return}Ie(l,f);}catch(f){Pt(l,f,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:[{field:a.documentKey,op:"==",value:u}]},"Failed to fetch document",n);}}async function $(c,l){let m=c.params||{},a=p(m.repoName,l);if(a)try{let u=c.body??{},f=i(c);if(!await o(l,a,"create",{user:f,body:u,params:m}))return;let k=Dn(a.schema,u,a.createFields,!1,a.systemKeys);if(!k.success){q(l,k.error,400);return}if(a.validate){let S=await a.validate(k.data,"create");if(S){q(l,S,400);return}}let h;if(a.isGroup&&a.parentKeys&&a.parentKeys.length>0){let S={...k.data};a.createdKey&&(S[a.createdKey]=new Date);let R=a.parentKeys.filter(E=>!S[E]);if(R.length>0){q(l,`Missing parent key(s) for subcollection create: ${R.join(", ")}`,400);return}let T=a.parentKeys.map(E=>S[E]),C=S[a.documentKey]||oo();h=await a.repo.set(...T,C,S);}else h=await a.repo.create(k.data);Ie(l,h,void 0,201);}catch(u){let f=n&&u instanceof Error?u.message:"Failed to create document";q(l,f,500);}}async function x(c,l,m){let a=c.params||{},u=p(a.repoName,l);if(!u)return;let f=a.id;if(!f){q(l,"Document ID required",400);return}try{let k=c.body??{},h=await y(u,f);if(!h){q(l,"Document not found",404);return}let S=i(c);if(!await o(l,u,"update",{user:S,doc:h,body:k,params:a}))return;let R=Dn(u.schema,k,u.mutableFields,m,u.systemKeys);if(!R.success){q(l,R.error,400);return}if(u.validate){let E=await u.validate(R.data,"update");if(E){q(l,E,400);return}}let T=d(h,u.pathKey)??[f],C=await u.repo.update(...T,R.data);Ie(l,C);}catch(k){let h=n&&k instanceof Error?k.message:"Failed to update document";q(l,h,500);}}async function v(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;if(!a.allowDelete){q(l,"Delete not allowed for this repository",403);return}let u=m.id;if(!u){q(l,"Document ID required",400);return}try{let f=await y(a,u);if(!f){q(l,"Document not found",404);return}let k=i(c);if(!await o(l,a,"delete",{user:k,doc:f,params:m}))return;let h=d(f,a.pathKey)??[u];await a.repo.delete(...h),Ie(l,{deleted:!0});}catch(f){let k=n&&f instanceof Error?f.message:"Failed to delete document";q(l,k,500);}}function A(c,l){l.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:g,handleQuery:b,handleGet:w,handleCreate:$,handleUpdate:x,handleDelete:v,handleOptions:A}}function Nt(e){try{return zod.z.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 re(e){return {$ref:`#/components/schemas/${e}`}}function X(e){return {description:e,content:{"application/json":{schema:re("ErrorResponse")}}}}function Ke(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function Bn(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 io(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 lo(e){let t=e.filterableFields??Object.keys(e.schema.shape),n=["eq","ne","lt","lte","gt","gte","in","nin","contains"],r=[];for(let o of t){r.push({name:o,in:"query",schema:{type:"string"},description:`Filter by ${o} (equality)`});for(let s of n)r.push({name:`${o}__${s}`,in:"query",schema:{type:"string"},description:`Filter ${o} with operator ${s}`});}return r}function co(){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 uo(e,t,n,r,o){let s={},i=e.name,p=`${t}/${e.name}`,d=`${p}/{${e.documentKey}}`,y={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[p]={get:{operationId:`list${xe(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[i],parameters:[...io(e),...lo(e)],responses:{200:Bn(re(n)),500:X("Internal server error")}},post:{operationId:`create${xe(e.name)}`,summary:`Create a ${ie(e.name)}`,tags:[i],requestBody:{required:true,content:{"application/json":{schema:re(r??n)}}},responses:{201:Ke("Document created",re(n)),400:X("Validation error"),500:X("Internal server error")}}},s[`${p}/query`]={post:{operationId:`query${xe(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[i],requestBody:{required:true,content:{"application/json":{schema:re("QueryRequestBody")}}},responses:{200:Bn(re(n)),400:X("Invalid query"),500:X("Internal server error")}}};let g={};return g.get={operationId:`get${xe(ie(e.name))}`,summary:`Get a single ${ie(e.name)}`,tags:[i],parameters:[y],responses:{200:Ke("Document found",re(n)),404:X("Document not found"),500:X("Internal server error")}},g.put={operationId:`update${xe(ie(e.name))}`,summary:`Update a ${ie(e.name)} (full replace)`,tags:[i],parameters:[y],requestBody:{required:true,content:{"application/json":{schema:re(o??n)}}},responses:{200:Ke("Document updated",re(n)),400:X("Validation error"),404:X("Document not found"),500:X("Internal server error")}},g.patch={operationId:`patch${xe(ie(e.name))}`,summary:`Partially update a ${ie(e.name)}`,tags:[i],parameters:[y],requestBody:{required:true,content:{"application/json":{schema:{allOf:[re(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Ke("Document patched",re(n)),400:X("Validation error"),404:X("Document not found"),500:X("Internal server error")}},e.allowDelete&&(g.delete={operationId:`delete${xe(ie(e.name))}`,summary:`Delete a ${ie(e.name)}`,tags:[i],parameters:[y],responses:{200:Ke("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:X("Document not found"),500:X("Internal server error")}}),s[d]=g,s}function jt(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:i,auth:p=false}=n,d=t==="/"?"":t.replace(/\/$/,""),y={},g={},b=[];y.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},y.QueryRequestBody=co();for(let[v,A]of Object.entries(e)){let c=xe(ie(v)),l=`${c}Create`,m=`${c}Update`;y[c]=Nt(A.schema);let a=R=>{let T=R&&R.length>0?R:Object.keys(A.schema.shape),C={};for(let E of T){let O=E.split(".")[0];O&&A.schema.shape[O]&&!A.systemKeys.includes(O)&&(C[O]=A.schema.shape[O]);}return C},u=null,f=a(A.createFields);Object.keys(f).length>0&&(y[l]=Nt(zod.z.object(f)),u=l);let k=null,h=a(A.mutableFields);Object.keys(h).length>0&&(y[m]=Nt(zod.z.object(h)),k=m);let S=uo(A,d,c,u,k);Object.assign(g,S),b.push({name:v,description:`Operations on ${v} (collection: ${A.path})`});}let w={},$;return p==="basic"?(w.basicAuth={type:"http",scheme:"basic"},$=[{basicAuth:[]}]):p==="bearer"&&(w.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},$=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...i&&i.length>0?{servers:i}:{},paths:g,components:{schemas:y,...Object.keys(w).length>0?{securitySchemes:w}:{}},...$?{security:$}:{},tags:b}}function xe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ie(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 po(e,t){return `<!DOCTYPE html>
1146
+ `;function Ze(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:fn}})}yt();function ge(e){return "<!DOCTYPE html>"+server.renderToString(e)}var Nr=["corporate","silk","dark"],Dr=()=>jsxRuntime.jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxRuntime.jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxRuntime.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:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"}),jsxRuntime.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"})]}),jsxRuntime.jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsxRuntime.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:Nr.map(e=>jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsxRuntime.jsx("span",{children:e}),jsxRuntime.jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),he=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:o,basePath:s="/"}=e;return jsxRuntime.jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxRuntime.jsxs("head",{children:[jsxRuntime.jsx("meta",{charset:"UTF-8"}),jsxRuntime.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxRuntime.jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxRuntime.jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxRuntime.jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsxRuntime.jsx("div",{class:"flex-1",children:jsxRuntime.jsx("a",{href:s,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsxRuntime.jsx("div",{class:"flex-none",children:jsxRuntime.jsx(Dr,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((i,p)=>i.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:i.href,children:i.label})},p):jsxRuntime.jsx("li",{class:"text-base-content/60",children:i.label},p))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(mt,{basePath:s}),jsxRuntime.jsx(Ze,{})]})]})};function gt(e,t){return ge(jsxRuntime.jsx(he,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function ht(e,t){return ge(jsxRuntime.jsx(he,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxRuntime.jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsxRuntime.jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsxRuntime.jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsxRuntime.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=>jsxRuntime.jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxRuntime.jsxs("div",{class:"card-body p-5",children:[jsxRuntime.jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsxRuntime.jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var hn=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],Fr=[{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"}],jr=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function zr(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return Fr;case "ZodBoolean":return hn;case "ZodArray":return jr;default:return hn}}var be="__null__";function Br(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="${be}"]');if(!o){o=document.createElement('option');o.value='${be}';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='${be}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${be}"][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!=='${be}')?i.dataset._prev:'';}}})(this)`}function Zr(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 He({inputId:e,active:t}){return jsxRuntime.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:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:Br(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Mr({col:e,active:t}){let n=t?.value??"",r=n===be,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,i=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(i){let p=new Set(n.split(",").map(y=>y.trim()).filter(Boolean)),d=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:o,name:`fv_${e.name}`,value:n}),e.enumValues.map(y=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:y,checked:p.has(y),"data-enum-group":d,onchange:Zr(o,d)}),jsxRuntime.jsx("span",{children:y})]},y))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(p=>jsxRuntime.jsx("option",{value:p,selected:n===p,children:p},p)),e.nullable&&jsxRuntime.jsx("option",{value:be,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:be,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let p=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,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"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]})}function bt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(d=>[d.field,d])),s=n.length>0,i=n.length>=2||r&&s,p=t.filter(d=>d.zodType!=="ZodObject"&&d.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:p.map(d=>{let y=zr(d.zodType),g=o[d.name],b=g?.op??y[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:d.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[y.length>1?jsxRuntime.jsx("select",{name:`fo_${d.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:y.map(w=>jsxRuntime.jsx("option",{value:w.value,selected:w.value===b,children:w.label},w.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${d.name}`,value:y[0].value}),jsxRuntime.jsx(Mr,{col:d,active:g})]})]},d.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),s&&jsxRuntime.jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),i&&jsxRuntime.jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.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 vt(e,t,n,r,o,s){let i=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,p=n==="create"?[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:"New document"}]:[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:`Edit ${r??""}`}];return ge(jsxRuntime.jsx(he,{opts:{title:i,breadcrumb:p,basePath:o,flash:s},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}et();ft();function xt(e,t,n){let r=new URLSearchParams;for(let o of e)r.set(`fv_${o.field}`,o.value),r.set(`fo_${o.field}`,o.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function bn(e,t,n,r,o){let s=xt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Hr(e,t,n,r){let o=xt(n,void 0,r);return t?.field===e?t.dir==="asc"&&(o.set("ob",e),o.set("od","desc")):(o.set("ob",e),o.set("od","asc")),`?${o.toString()}`}function qr(e,t,n){return `?${xt(t,n,e).toString()}`}function wt(e,t,n,r,o,s,i=[],p=[],d=false,y=[],g,b,w,$,x,v,A,c=false){let l=`${r}/${e}`,m=`${l}/create`,a={};if(A)for(let R of n)a[R]=Oe(Ee(A,R));let u=(v??[]).filter(R=>{let T=a[R]??Oe(Ee(A,R));return T==="string"||T==="number"||T==="bigint"||T==="boolean"||T==="enum"||T==="literal"}),f=u.length>0,k=d,h=k||f,S=u.map(R=>{let T=Ee(A,R),C=Oe(T),E=i.find(O=>O.name===R);return {name:R,type:C,enumValues:E?.enumValues??null,nullable:E?.nullable??false}});return ge(jsxRuntime.jsxs(he,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[i.length>0&&jsxRuntime.jsx(bt,{action:l,columnMeta:i,activeFilters:p,isGroup:$}),w&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${w.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsxRuntime.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"?jsxRuntime.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"}):jsxRuntime.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"})}),jsxRuntime.jsxs("div",{class:"flex-1",children:[jsxRuntime.jsx("h3",{class:"font-bold",children:w.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:w.message})]}),w.indexUrl&&jsxRuntime.jsx("a",{href:w.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof x=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:x})]})," ","document",(typeof x=="number"?x:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(R=>jsxRuntime.jsx("a",{href:qr(R,p,g),class:`join-item btn btn-xs ${b===R?"btn-active btn-primary":"btn-outline"}`,children:R},R))})]})]}),jsxRuntime.jsx("a",{href:m,class:"btn btn-primary btn-sm",children:"+ New"})]}),h&&jsxRuntime.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 x=="number"?String(x):"","data-frs-page-size":String(b??t.length),"data-frs-allow-delete":k?"1":"0","data-frs-allow-update":f?"1":"0","data-frs-fields":JSON.stringify(S),"data-frs-filters":JSON.stringify(p),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof x=="number"&&x>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link link-primary text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",x," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",x??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[f&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),k&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[h&&jsxRuntime.jsx("th",{class:"w-8",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((R,T)=>{let C=g?.field===R,E=C?g.dir==="asc"?" \u25B2":" \u25BC":"";return jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxRuntime.jsxs("a",{href:Hr(R,g,p,b),class:`hover:text-base-content inline-flex items-center gap-0.5${C?" text-primary font-bold":""}`,children:[R,E]})},T)}),y.map((R,T)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:R.column},`rel-${T}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+y.length+1+(h?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((R,T)=>{let C=String(R.docId??R.id??""),E=`${r}/${e}/${encodeURIComponent(C)}/edit`,O=`${r}/${e}/${encodeURIComponent(C)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":C,children:[h&&jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:C,"aria-label":`Select ${C}`})}),n.map((I,D)=>{let _=R[I],P=a[I],H=P?Me(P,_):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Te,{val:_,mismatch:H})},D)}),y.map((I,D)=>{let _=R[I.key];if(_==null||_==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${D}`);let P=I.type==="one"?`${r}/${I.targetRepo}/${encodeURIComponent(String(_))}/edit`:`${r}/${I.targetRepo}?fv_${I.targetKey}=${encodeURIComponent(String(_))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:P,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":I.type,"data-frs-rel-repo":I.targetRepo,"data-frs-rel-fk":I.targetKey,"data-frs-rel-val":String(_),"data-frs-rel-label":I.column,children:I.column})},`rel-${D}`)}),jsxRuntime.jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxRuntime.jsxs("div",{class:"flex gap-1 justify-end",children:[jsxRuntime.jsx("a",{href:E,class:"btn btn-xs btn-outline",children:"Edit"}),c&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(C)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),d&&jsxRuntime.jsx("form",{method:"post",action:O,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},T)})})]})}),(o.hasPrev||o.hasNext)&&jsxRuntime.jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[o.hasPrev?jsxRuntime.jsx("a",{href:bn(p,o.prevCursor,"prev",g,b),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),o.hasNext?jsxRuntime.jsx("a",{href:bn(p,o.nextCursor,"next",g,b),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof x=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[x," total document",x!==1?"s":"",p.length>0?" matching filters":""]})]}),h&&f&&jsxRuntime.jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxRuntime.jsxs("div",{class:"modal-box",children:[jsxRuntime.jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsxRuntime.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."}),jsxRuntime.jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxRuntime.jsxs("label",{class:"form-control w-full mb-3",children:[jsxRuntime.jsx("div",{class:"label",children:jsxRuntime.jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxRuntime.jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsxRuntime.jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),u.map(R=>jsxRuntime.jsx("option",{value:R,children:R},R))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}var Ur="";function qe(e,t){return gt(e,t)}function St(e,t){return ht(e,t)}function kt(e,t,n,r,o,s,i,p,d,y,g,b,w,$,x,v,A,c){return wt(e,t,n,r,o,s,i,p,d,y,g,b,w,$,x,v,A,c)}function ve(e,t,n,r,o,s){return vt(e,t,n,r,o,s)}var Rt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Wr(){let e="";for(;e.length<20;){let t=crypto.randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=Rt.length*4||(e+=Rt.charAt(r%Rt.length));}}return e}function nt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),o=[];for(let s=1;s<r.length;s+=2)o.push(r[s]);return o.length>0?o:void 0}async function Pe(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 s=await e.repo.get[r](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Ct(e,t,n){let r=e.documentKey??"docId",o=Be(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return o.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...o.indexUrl?{action:{href:o.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:o.message}}function z(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function $t(e,t){e.status(302).set("Location",t).send("");}function At(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let i=Ot(s);if(i==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let y={},g=false;for(let[$,x]of Object.entries(e))$.startsWith(`${o}.`)&&(y[$.slice(o.length+1)]=x,g=true);if(g){let $=s;for(;;){let x=L($);if(x==="ZodOptional"||x==="ZodNullable"||x==="ZodDefault")$=G($);else break}r[o]=At(y,$);continue}let b=e[o],w=Array.isArray(b)?b[b.length-1]:b;if(w)try{r[o]=JSON.parse(w);}catch{r[o]=w;}continue}let p=e[o],d=Array.isArray(p)?p[p.length-1]:p;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(d===void 0||d===""){i==="ZodBoolean"&&(r[o]=false);continue}switch(i){case "ZodBoolean":d==="__null__"?r[o]=null:r[o]=d==="true"||d==="on"||d==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(d);break;case "ZodDate":r[o]=new Date(d);break;case "ZodArray":try{r[o]=JSON.parse(d);}catch{r[o]=d;}break;default:if(d.startsWith("{")||d.startsWith("["))try{r[o]=JSON.parse(d);break}catch{}r[o]=d;}}return r}function vn(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 Ot(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Gr(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function wn(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=G(t);continue}return false}}function Sn(e){let t=Gr(e),n=L(t);if(n==="ZodEnum"){let r=De(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Fe(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=Ge(t);return typeof r=="string"?[r]:void 0}}function kn(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,i=e[o];if(i===null){r[s]="__null__";continue}if(i===void 0)continue;let p=t.shape[o];for(;;){let y=L(p);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")p=G(p);else break}let d=L(p);if(d==="ZodObject"&&typeof i=="object"&&i!==null&&!Array.isArray(i)){let y=kn(i,p,s);Object.assign(r,y);}else if(d==="ZodDate"){let y=vn(i);y!==null&&(r[s]=y);}else if(typeof i=="object"&&i!==null&&!Array.isArray(i)&&("_seconds"in i||typeof i.toDate=="function")){let y=vn(i);r[s]=y??JSON.stringify(i,null,2);}else typeof i=="object"?r[s]=JSON.stringify(i,null,2):r[s]=String(i);}return r}function Tt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Tt(n.nested,t):void 0}))}function Jr(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[o,s]of Object.entries(e)){if(!o.startsWith("fv_"))continue;let i=o.slice(3);if(!t.has(i))continue;let p=(s??"").trim();if(!p)continue;let d=e[`fo_${i}`]??"==",y=n.has(d)?d:"==";r.push({field:i,op:y,value:p});}return r}function xn(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 o=r.value.split(",").map(s=>s.trim()).filter(s=>s!==""&&s!==t).map(s=>n(s));return [r.field,r.op,o]}return [r.field,r.op,n(r.value)]})}function Rn(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,i=t.shape[o];if(!i){r.push({name:s,zodType:"ZodString"});continue}let p=Ot(i);if(p==="ZodObject"){let d=i;for(;;){let g=L(d);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")d=G(d);else break}let y=te(d);r.push(...Rn(Object.keys(y),d,s));}else r.push({name:s,zodType:p,nullable:wn(i),enumValues:Sn(i)});}return r}function Qr(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let i=L(r);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")r=G(r);else break}let s=te(r);if(!(o in s))return null;r=s[o];}return r}function ke(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let i=s.indexOf(".");if(i===-1)n.push(s);else {let p=s.slice(0,i),d=s.slice(i+1);r.has(p)||r.set(p,[]),r.get(p).push(d);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,i]of r){if(!(s in e.shape))continue;let p=e.shape[s];for(;;){let d=L(p);if(d==="ZodOptional"||d==="ZodNullable"||d==="ZodDefault")p=G(p);else break}if(L(p)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=ke(p,i);}return zod.z.object(o)}function ue(e,t){return ee(e,t)}function Cn(e,t){let n=(c,l)=>{let m=ue(c,t),a=Object.values(e).map(u=>({name:u.name,path:u.path}));z(l,St(a,m));},r=async(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=a.pageSize??25,f=c.query??{},k=f.cursor,h=f.dir==="prev"?"prev":"next",S=f.ob??"",R=f.od==="desc"?"desc":"asc",T=S?{field:S,dir:R}:void 0,C=parseInt(f.ps??""),E=Number.isFinite(C)&&C>0?Math.min(C,200):u,O=a.listColumns??Object.keys(a.schema.shape),I=a.documentKey??"docId",D=[I,...O.filter(W=>W!==I)];T&&(new Set([I,...O]).has(T.field)||(T=void 0));let _=a.filterableFields?(()=>{let W=[];for(let le of a.filterableFields)(le.includes(".")||O.includes(le))&&W.push(le);return W})():O,P=(()=>{let W=[];for(let le of _)if(le.includes(".")){let Ce=Qr(a.schema,le);W.push({name:le,zodType:Ce?Ot(Ce):"ZodString",nullable:Ce?wn(Ce):false,enumValues:Ce?Sn(Ce):void 0});}else W.push(...Rn([le],a.schema));return W})(),H=new Set(P.map(W=>W.name)),pe=Jr(f,H),oe=xn(pe),K;if(k)try{let W=a.repo.ref;typeof W.doc=="function"&&(K=await W.doc(k).get());}catch{}let[U,Ve]=await Promise.all([a.repo.query.paginate({pageSize:E,cursor:K,direction:h,...oe.length>0?{where:oe}:{},...T?{orderBy:[{field:T.field,direction:T.dir}]}:{}}).catch(W=>({queryError:Be(W,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:pe,sort:T})})),a.repo.aggregate.count(oe.length>0?{where:oe}:{}).catch(()=>{})]),Re="queryError"in U,qn=Re?[]:U.data,Ln=Re?"":U.nextCursor?.id??"",Un=Re?"":U.prevCursor?.id??"",Kn=Re?U.queryError:void 0,Vn=ue(c,t);z(l,kt(a.name,qn,D,Vn,{hasPrev:Re?false:U.hasPrevPage,hasNext:Re?false:U.hasNextPage,prevCursor:Un,nextCursor:Ln},void 0,P,pe,a.allowDelete??false,a.relationalMeta,T,E,Kn,a.isGroup,Ve,a.mutableFields,a.schema,a.historyEnabled));},o=(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=ue(c,t),f=ke(a.schema,a.createFields),k=ae(f),h=`${u}/${a.name}/create`,S=ye(k,h,"POST","Create document");z(l,ve(a.name,S,"create",null,u));},s=async(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=ue(c,t),f=c.body??{},k=At(f,a.schema),h=ke(a.schema,a.createFields),S=h.safeParse(k);if(!S.success){let R=ae(h),T=`${u}/${a.name}/create`,C=ye(R,T,"POST","Create document"),E=S.error.issues.map(O=>`${O.path.join(".")}: ${O.message}`).join(", ");z(l,ve(a.name,C,"create",null,u,{type:"error",message:`Validation error: ${E}`}),422);return}try{if(a.isGroup&&a.parentKeys&&a.parentKeys.length>0){let R={...S.data};a.createdKey&&(R[a.createdKey]=new Date);let T=a.parentKeys.filter(I=>!R[I]);if(T.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${T.join(", ")}`);let C=a.parentKeys.map(I=>R[I]),E=a.documentKey??"docId",O=R[E]||Wr();await a.repo.set(...C,O,R);}else await a.repo.create(S.data);$t(l,`${u}/${a.name}?flash=created`);}catch(R){let T=ke(a.schema,a.createFields),C=ae(T),E=`${u}/${a.name}/create`,O=ye(C,E,"POST","Create document");z(l,ve(a.name,O,"create",null,u,{type:"error",message:`Save error: ${R.message}`}),500);}},i=async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}let f=ue(c,t),k=null;try{k=await Pe(u,a);}catch(E){let O=Ct(u,a,E),I=we(E)?424:500;z(l,qe("",{title:`Edit ${u.name} / ${a}`,basePath:f,breadcrumb:[{label:"Repositories",href:f},{label:u.name,href:`${f}/${u.name}`},{label:`Edit ${a}`}],flash:O}),I);return}if(!k){z(l,"Document not found",404);return}let h=kn(k,u.schema),S=ke(u.schema,u.mutableFields),R=Tt(ae(S),h),T=`${f}/${u.name}/${encodeURIComponent(a)}/edit`,C=ye(R,T,"POST","Save changes");z(l,ve(u.name,C,"edit",a,f));},p=async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}let f=ue(c,t),k=c.body??{},h=At(k,u.schema),S=ke(u.schema,u.mutableFields),T=S.partial().safeParse(h);if(!T.success){let C=Object.fromEntries(Object.entries(k).map(([_,P])=>[_,Array.isArray(P)?P.join(","):P??""])),E=Tt(ae(S),C),O=`${f}/${u.name}/${encodeURIComponent(a)}/edit`,I=ye(E,O,"POST","Save changes"),D=T.error.issues.map(_=>`${_.path.join(".")}: ${_.message}`).join(", ");z(l,ve(u.name,I,"edit",a,f,{type:"error",message:`Validation error: ${D}`}),422);return}try{let C=await Pe(u,a),E=(C&&nt(C,u.pathKey))??[a];await u.repo.update(...E,T.data),$t(l,`${f}/${u.name}?flash=updated`);}catch(C){let E=ke(u.schema,u.mutableFields),O=ae(E),I=`${f}/${u.name}/${encodeURIComponent(a)}/edit`,D=ye(O,I,"POST","Save changes"),_=we(C)?Ct(u,a,C):{type:"error",message:`Save error: ${C.message}`},P=we(C)?424:500;z(l,ve(u.name,D,"edit",a,f,_),P);}},d=async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}if(!u.allowDelete){z(l,"Delete is not allowed for this repository",403);return}let f=ue(c,t);try{let k=await Pe(u,a),h=(k&&nt(k,u.pathKey))??[a];await u.repo.delete(...h),$t(l,`${f}/${u.name}?flash=deleted`);}catch(k){let h=we(k)?Ct(u,a,k):{type:"error",message:`Delete error: ${k.message}`},S=we(k)?424:500;z(l,qe("",{title:`Delete ${u.name} / ${a}`,basePath:f,breadcrumb:[{label:"Repositories",href:f},{label:u.name,href:`${f}/${u.name}`},{label:`Delete ${a}`}],flash:h}),S);}},y=async(c,l)=>{let m=c.params.repoName;if(!m){z(l,"Bad request",400);return}let a=e[m];if(!a){z(l,"Repository not found",404);return}let u=ue(c,t),f=c.query,k=f?.type==="many"?"many":"one",h=Math.max(1,Math.min(100,Number(f?.ps??25)||25)),S=a.listColumns??Object.keys(te(a.schema)),{PanelOne:R,PanelMany:T}=await Promise.resolve().then(()=>(yt(),yn)),{renderToString:C}=await import('hono/jsx/dom/server');if(k==="one"){let P=String(f?.id??"");if(!P){z(l,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let H=await Pe(a,P),pe=C(R({doc:H,repoName:a.name,basePath:u,schema:a.schema,columns:S}));z(l,pe);}catch(H){z(l,`<div class='p-6 text-error text-sm'>Error: ${H.message}</div>`,500);}return}let E=String(f?.fk??""),O=String(f?.fv??"");if(!E||!O){z(l,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let I=f?.cursor??"",D=f?.dir==="prev"?"prev":"next",_;if(I)try{let P=a.repo.ref;typeof P.doc=="function"&&(_=await P.doc(I).get());}catch{}try{let P=await a.repo.query.paginate({pageSize:h,cursor:_,direction:D,where:[[E,"==",Xr(O)]]}),H=C(T({docs:P.data,repoName:a.name,basePath:u,fk:E,fv:O,columns:S,schema:a.schema,pagination:{hasPrev:P.hasPrevPage,hasNext:P.hasNextPage,prevCursor:P.prevCursor?.id??"",nextCursor:P.nextCursor?.id??"",pageSize:h}}));z(l,H);}catch(P){z(l,`<div class='p-6 text-error text-sm'>Error: ${P.message}</div>`,500);}},g=async(c,l)=>{let m=[];for(let a of l){let u;if(c.isGroup||c.parentKeys?.length){let f=await Pe(c,a);u=f?nt(f,c.pathKey):void 0;}u||(u=[a]);try{let f=c.repo.documentRef(...u);f&&m.push(f);}catch{}}return m},b=async(c,l)=>{let m=xn(l),a=c.documentKey??"docId",u=[],f;for(;;){let k=await c.repo.query.paginate({pageSize:500,cursor:f,direction:"next",...m.length>0?{where:m}:{}});for(let h of k.data){let S=String(h[a]??h.id??"");S&&u.push(S);}if(!k.hasNextPage||!k.nextCursor)break;f=k.nextCursor;}return u},w=async(c,l)=>{let m=c.params.repoName;if(!m){Y(l,{error:"Bad request"},400);return}let a=e[m];if(!a){Y(l,{error:"Repository not found"},404);return}if(!a.allowDelete){Y(l,{error:"Delete is not allowed for this repository"},403);return}let u=c.body??{};try{let f=await x(a,u);if(f.length===0){Y(l,{deleted:0});return}let k=await g(a,f);for(let h=0;h<k.length;h+=500)await a.repo.bulk.delete(k.slice(h,h+500));Y(l,{deleted:k.length});}catch(f){Y(l,{error:f.message},500);}},$=async(c,l)=>{let m=c.params.repoName;if(!m){Y(l,{error:"Bad request"},400);return}let a=e[m];if(!a){Y(l,{error:"Repository not found"},404);return}let u=c.body??{},f=String(u.field??"");if(!f){Y(l,{error:"Missing 'field'"},400);return}if(!a.mutableFields||!a.mutableFields.includes(f)){Y(l,{error:`Field '${f}' is not bulk-updatable`},403);return}let k=a.schema.shape?.[f],h=u.value;if(k){let S=k.safeParse(u.value);if(!S.success){Y(l,{error:`Invalid value for '${f}': ${S.error.message}`},400);return}h=S.data;}try{let S=await x(a,u);if(S.length===0){Y(l,{updated:0});return}let T=(await g(a,S)).map(C=>({docRef:C,data:{[f]:h}}));for(let C=0;C<T.length;C+=500)await a.repo.bulk.update(T.slice(C,C+500));Y(l,{updated:T.length});}catch(S){Y(l,{error:S.message},500);}};async function x(c,l){if(l.selectAll){let m=v(l.filters,c);return await b(c,m)}return Array.isArray(l.ids)?l.ids.filter(m=>typeof m=="string"&&!!m):[]}function v(c,l){if(!Array.isArray(c))return [];let m=new Set((l.filterableFields??Object.keys(te(l.schema))).map(f=>String(f))),a=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),u=[];for(let f of c)f&&typeof f=="object"&&typeof f.field=="string"&&m.has(f.field)&&typeof f.value=="string"&&a.has(String(f.op))&&u.push({field:f.field,op:f.op,value:f.value});return u}return {handleDashboard:n,handleList:r,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:i,handleEditSubmit:p,handleDelete:d,handlePanel:y,handleBulkDelete:w,handleBulkUpdate:$,handleHistory:async(c,l)=>{let m=c.params.repoName,a=c.params.id;if(!m||!a){z(l,"Bad request",400);return}let u=e[m];if(!u){z(l,"Repository not found",404);return}if(!u.historyEnabled||!u.repo.history){z(l,"History not enabled for this repository",404);return}let f=ue(c,t),k=u.historySubcollection??"history",h=[a];try{let P=await Pe(u,a),H=P?nt(P,u.pathKey):void 0;H&&H.length>0&&(h=H);}catch{}let S=parseInt(String(c.query?.limit??"")),R=Number.isFinite(S)&&S>0?Math.min(S,500):100,T=[],C;try{T=await u.repo.history.list(...h,{limit:R});}catch(P){C=P.message;}let E=P=>String(P??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),O=P=>{if(P===void 0)return '<span class="opacity-40">undefined</span>';if(P===null)return '<span class="opacity-40">null</span>';if(typeof P=="object")try{return `<code class="text-xs">${E(JSON.stringify(P))}</code>`}catch{return E(String(P))}return E(String(P))},I=P=>P?typeof P.toDate=="function"?P.toDate().toISOString():P instanceof Date?P.toISOString():E(String(P)):"",D=P=>`<span class="badge badge-sm ${P==="create"?"badge-success":P==="delete"?"badge-error":"badge-info"}">${E(P)}</span>`,_="";if(_+='<div class="flex items-center justify-between mb-4">',_+=`<a href="${f}/${u.name}/${encodeURIComponent(a)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,_+=`<a href="${f}/${u.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,_+="</div>",_+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${E(k)}</code> \xB7 Showing up to ${R} entries.</p>`,C)_+=`<div class="alert alert-error mb-4">${E(C)}</div>`;else if(T.length===0)_+='<div class="alert">No history entries found.</div>';else {_+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',_+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let P of T){let H=P.meta??{},pe=[H.reason,H.comment].filter(U=>U!=null&&U!=="").map(U=>E(String(U))).join(" \u2014 "),oe="",K=Object.keys(P.changes??{});K.length===0?oe='<span class="opacity-40">\u2014</span>':oe='<ul class="space-y-1">'+K.map(U=>{let Ve=P.changes[U];return `<li><strong>${E(U)}</strong>: ${O(Ve.oldValue)} \u2192 ${O(Ve.newValue)}</li>`}).join("")+"</ul>",_+="<tr>",_+=`<td class="whitespace-nowrap text-xs font-mono">${E(I(P.historySetAt))}</td>`,_+=`<td>${D(P.operation??"update")}</td>`,_+=`<td class="text-xs">${E(H.userEmail??H.userId??"")}</td>`,_+=`<td class="text-xs">${pe}</td>`,_+=`<td>${oe}</td>`,_+="</tr>";}_+="</tbody></table></div>";}z(l,qe(_,{title:`History \u2014 ${u.name} / ${a}`,basePath:f,breadcrumb:[{label:"Repositories",href:f},{label:u.name,href:`${f}/${u.name}`},{label:`History ${a}`}]}));}}}function Y(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Xr(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var $n="https://cdn.jsdelivr.net",An="https://www.gstatic.com",Tn=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${$n} ${An}`,`style-src 'self' 'unsafe-inline' ${$n}`,`connect-src 'self' ${An} https://*.googleapis.com https://*.firebaseio.com https://identitytoolkit.googleapis.com`,"img-src 'self' data:","font-src 'self' data:","frame-ancestors 'none'","base-uri 'self'","form-action 'self'"].join("; ");function Le(e={}){let t=e.csp===void 0?Tn:e.csp,n=e.frameOptions===void 0?"DENY":e.frameOptions,r=e.referrerPolicy===void 0?"no-referrer":e.referrerPolicy,o=e.cacheControl===void 0?"private, no-store":e.cacheControl;return async(s,i,p)=>{typeof i?.setHeader=="function"&&(i.setHeader("X-Content-Type-Options","nosniff"),n&&i.setHeader("X-Frame-Options",n),r&&i.setHeader("Referrer-Policy",r),o&&i.setHeader("Cache-Control",o),t&&i.setHeader("Content-Security-Policy",t)),await p();}}async function Yr(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function eo(e){let t={};if(!e)return t;for(let n of e.split("&")){let r=n.indexOf("=");if(r===-1)continue;let o=decodeURIComponent(n.slice(0,r).replace(/\+/g," ")),s=decodeURIComponent(n.slice(r+1).replace(/\+/g," ")),i=t[o];i===void 0?t[o]=s:Array.isArray(i)?i.push(s):t[o]=[i,s];}return t}function On(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:i=[],httpsOptions:p}=e,d=t==="/"?"":t.replace(/\/$/,""),y={};for(let[$,x]of Object.entries(n)){let v=x.schema??x.repo.schema??null;if(!v)throw new Error(`[createAdminServer] Repository "${$}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let A,c,l;if(x.fieldsConfig){let u=x.fieldsConfig;A=[],c=[],l=[];for(let[f,k]of Object.entries(u))for(let h of k)h==="filterable"?A.push(f):h==="mutable"?c.push(f):h==="create"&&l.push(f);A.length===0&&(A=void 0),c.length===0&&(c=void 0),l.length===0&&(l=void 0);}let m=(()=>{let u=x.repo._parentKeys;return u&&u.length>0?u:void 0})();if(m&&l)for(let u of m)l.includes(u)||l.push(u);let a={name:$,path:x.path,repo:x.repo,schema:v,documentKey:x.documentKey??"docId",pathKey:x.repo._pathKey??void 0,isGroup:!!x.repo._isGroup,parentKeys:m,createdKey:x.repo._createdKey??void 0,listColumns:x.listColumns,pageSize:x.pageSize,filterableFields:A,mutableFields:c,createFields:l,allowDelete:x.allowDelete??false,historyEnabled:!!x.repo.history,historySubcollection:(x.repo.history&&x.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!x.relationalFields||x.relationalFields.length===0)return;let u=x.repo.relationalKeys??{},f=[];for(let k of x.relationalFields){let h=u[k.key];h&&f.push({key:k.key,column:k.column,targetRepo:String(h.repo),targetKey:String(h.key),type:h.type});}return f.length>0?f:void 0})()};y[$]=a;}let g=Cn(y,d),b=new se;if(o!==false&&b.use(Le(o===void 0?{}:o)),r&&b.use(async($,x,v)=>{let A=$,c=String(A.headers?.["content-type"]??"");if(c.includes("application/x-www-form-urlencoded")){let l=await Yr(A);$.body=eo(l);}else if(c.includes("application/json")&&typeof A.body=="string")try{$.body=JSON.parse(A.body);}catch{}await v();}),s)if(fe(s)){for(let $ of s.routes){let x=`${d}${$.path}`;$.method==="GET"?b.get(x,$.handler):b.post(x,$.handler);}b.use(s.middleware);}else if(typeof s=="function")b.use(s);else {let $=s.realm??"Admin",x="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");b.use((v,A,c)=>{if((v.headers?.authorization??"")!==x){A.status(401).set("WWW-Authenticate",`Basic realm="${$}"`).set("Content-Type","text/plain").send("Unauthorized");return}c();});}for(let $ of i)b.use($);b.get(`${d}/`,g.handleDashboard),b.get(`${d}`,g.handleDashboard),b.get(`${d}/:repoName/_panel`,g.handlePanel),b.post(`${d}/:repoName/_bulk/delete`,g.handleBulkDelete),b.post(`${d}/:repoName/_bulk/update`,g.handleBulkUpdate),b.get(`${d}/:repoName`,g.handleList),b.get(`${d}/:repoName/create`,g.handleCreateForm),b.post(`${d}/:repoName/create`,g.handleCreateSubmit),b.get(`${d}/:repoName/:id/edit`,g.handleEditForm),b.post(`${d}/:repoName/:id/edit`,g.handleEditSubmit),b.get(`${d}/:repoName/:id/history`,g.handleHistory),b.post(`${d}/:repoName/:id/delete`,g.handleDelete);let w=async($,x)=>{await b.handle($,x);};return p&&(w.httpsOptions=p),w}var Pn="preserve";function In(){return Pn}function to(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function _n(e){if(e==null)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(e instanceof firestore.Timestamp)return e.toDate();if(to(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 Nn(e){return e}function _t(e,t,n=200){let r=Nn(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Ie(e,t,n,r=200){_t(e,{success:true,data:t,meta:n},r);}function q(e,t,n=400){_t(e,{success:false,error:t},n);}function Pt(e,t,n,r,o){let s=Be(t,n),i=s.type==="index",p=i?424:500,y={success:false,error:i?s.message:o&&t instanceof Error?t.message:r};i&&(y.errorType="index",s.indexUrl&&(y.indexUrl=s.indexUrl)),_t(e,y,p);}var It="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function oo(){let e="";for(;e.length<20;){let t=crypto.randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=It.length*4||(e+=It.charAt(r%It.length));}}return e}function _e(e){let t=e._def??e.def;if(!t)return e;let n=t.typeName??t.type;if(n==="ZodDate"||n==="date")return zod.z.preprocess(r=>_n(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,i]of Object.entries(r))o[s]=_e(i);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(_e(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return _e(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return _e(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=_e(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function so(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let i of s){if(n.includes(i))continue;let p=i.split(".")[0];p&&r[p]&&(o[p]=r[p]);}return zod.z.object(o)}function Dn(e,t,n,r=false,o=[]){try{let s=so(e,n,o),i=r?s.partial():s;return {success:!0,data:(In()==="normalize"?_e(i):i).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(p=>`${p.path.join(".")}: ${p.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function ao(e,t){let n=[],r=t?new Set(t):null,o={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[s,i]of Object.entries(e)){if(i===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let p=Array.isArray(i)?i[0]:i;if(p===void 0||p==="")continue;let d=s.match(/^(\w+)__(\w+)$/),y,g="==";if(d&&d[1]&&d[2]){y=d[1];let w=d[2];if(o[w])g=o[w];else continue}else if(!d)y=s;else continue;if(r&&!r.has(y))continue;let b=p;g==="in"||g==="not-in"||g==="array-contains-any"?b=p.split(",").map(w=>Fn(w.trim())):b=Fn(p),n.push({field:y,op:g,value:b});}return n}function Fn(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 rt(e){return e?{docId:e.id}:null}async function jn(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 o=await r.doc(n).get();return o.exists?o:void 0}catch{return}}function zn(e,t,n,r=false){async function o(c,l,m,a){if(!r)return true;let u=l.rules?.[m];if(!u)return q(c,`Operation "${m}" is not allowed for this repository`,403),false;try{return await u(a)?!0:(q(c,"Forbidden",403),!1)}catch(f){let k=n&&f instanceof Error?f.message:"Forbidden";return q(c,k,403),false}}async function s(c,l,m,a){if(!r)return a;let u=c.rules?.filter;if(!u)return a;let f=[];for(let k of a)try{await u({user:l,doc:k,params:m})&&f.push(k);}catch{}return f}function i(c){return c?.user??null}function p(c,l){return !c||!e[c]?(q(l,`Repository "${c}" not found`,404),null):e[c]}function d(c,l){if(!l)return;let m=c[l];if(typeof m!="string"||!m)return;let a=m.split("/").filter(Boolean),u=[];for(let f=1;f<a.length;f+=2)u.push(a[f]);return u.length>0?u:void 0}async function y(c,l){let m=`by${c.documentKey.charAt(0).toUpperCase()}${c.documentKey.slice(1)}`,a=c.repo.get[m];if(typeof a=="function")try{let f=await a(l);if(f)return f}catch{}return (await c.repo.query.by({where:[[c.documentKey,"==",l]],limit:1}))[0]??null}async function g(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;let u=i(c);if(!await o(l,a,"list",{user:u,query:c.query??{},params:m}))return;let f=[],k;try{let h=c.query??{},S=Math.min(Number(h.pageSize)||a.pageSize,100),R=h.cursor,T=h.direction?.toLowerCase()==="prev"?"prev":"next",C=h.orderBy,E=h.orderDir?.toLowerCase()==="desc"?"desc":"asc",O=h.select,I=O?O.split(",").map(K=>K.trim()):void 0,D;a.allowedIncludes&&h.includes&&(D=(typeof h.includes=="string"?h.includes.split(",").map(U=>U.trim()):Array.isArray(h.includes)?h.includes:[]).filter(U=>typeof U=="string"&&a.allowedIncludes.includes(U)),D?.length===0&&(D=void 0));let _=ao(h,a.filterableFields);f=_.map(K=>({field:K.field,op:K.op,value:String(K.value??"")})),C&&(k={field:C,dir:E});let P={pageSize:S,direction:T};if(R)try{let K=typeof R=="string"?JSON.parse(R):R;P.cursor=await jn(a,K);}catch{}if(C){if(a.orderableFields&&!a.orderableFields.includes(C)){q(l,`Field not orderable: ${C}`,400);return}P.orderBy=[{field:C,direction:E}];}_.length>0&&(P.where=_.map(K=>[K.field,K.op,K.value])),I&&(P.select=I),D&&(P.include=D);let H=await a.repo.query.paginate(P),oe={items:await s(a,i(c),m,H.data),hasNextPage:H.hasNextPage,hasPrevPage:H.hasPrevPage,nextCursor:rt(H.nextCursor),prevCursor:rt(H.prevCursor)};Ie(l,oe,{pageSize:S,hasMore:H.hasNextPage});}catch(h){Pt(l,h,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:f,sort:k},"Failed to fetch documents",n);}}async function b(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;let u=i(c);if(!await o(l,a,"list",{user:u,query:c.body??{},params:m}))return;let f=[],k;try{let h=c.body??{},S=Math.min(h.pageSize||a.pageSize,100),R=h.direction==="prev"?"prev":"next";h.where&&(f=h.where.map(I=>({field:String(I[0]),op:I[1],value:String(I[2]??"")}))),h.orderBy&&h.orderBy[0]&&(k={field:h.orderBy[0].field,dir:h.orderBy[0].direction==="desc"?"desc":"asc"});let T={pageSize:S,direction:R};if(h.cursor)try{let I=typeof h.cursor=="string"?JSON.parse(h.cursor):h.cursor;T.cursor=await jn(a,I);}catch{}if(a.allowedIncludes&&h.includes&&h.includes.length>0){let I=h.includes.filter(D=>typeof D=="string"?a.allowedIncludes.includes(D):typeof D=="object"&&D!==null&&"relation"in D&&typeof D.relation=="string"?a.allowedIncludes.includes(D.relation):!1);I.length>0&&(T.include=I);}if(h.where&&h.where.length>0){if(a.filterableFields){let I=new Set(a.filterableFields),D=h.where.filter(_=>!I.has(_[0]));if(D.length>0){q(l,`Fields not filterable: ${D.map(_=>_[0]).join(", ")}`,400);return}}T.where=h.where;}if(h.orWhere&&h.orWhere.length>0){if(a.filterableFields){let I=new Set(a.filterableFields),D=h.orWhere.filter(_=>!I.has(_[0]));if(D.length>0){q(l,`Fields not filterable: ${D.map(_=>_[0]).join(", ")}`,400);return}}T.orWhere=h.orWhere;}if(h.orWhereGroups&&h.orWhereGroups.length>0){if(a.filterableFields){let I=new Set(a.filterableFields);for(let D of h.orWhereGroups){let _=D.filter(P=>!I.has(P[0]));if(_.length>0){q(l,`Fields not filterable: ${_.map(P=>P[0]).join(", ")}`,400);return}}}T.orWhereGroups=h.orWhereGroups;}if(h.orderBy&&h.orderBy.length>0){if(a.orderableFields){let I=new Set(a.orderableFields),D=h.orderBy.filter(_=>!I.has(_.field));if(D.length>0){q(l,`Fields not orderable: ${D.map(_=>_.field).join(", ")}`,400);return}}T.orderBy=h.orderBy;}h.select&&h.select.length>0&&(T.select=h.select);let C=await a.repo.query.paginate(T),O={items:await s(a,i(c),m,C.data),hasNextPage:C.hasNextPage,hasPrevPage:C.hasPrevPage,nextCursor:rt(C.nextCursor),prevCursor:rt(C.prevCursor)};Ie(l,O,{pageSize:S,hasMore:C.hasNextPage});}catch(h){Pt(l,h,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:f,sort:k},"Failed to query documents",n);}}async function w(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;let u=m.id;if(!u){q(l,"Document ID required",400);return}try{let f=await y(a,u);if(!f){q(l,"Document not found",404);return}let k=i(c);if(!await o(l,a,"get",{user:k,doc:f,params:m}))return;if(r&&a.rules?.filter)try{if(!await a.rules.filter({user:k,doc:f,params:m})){q(l,"Document not found",404);return}}catch{q(l,"Document not found",404);return}Ie(l,f);}catch(f){Pt(l,f,{ref:a.repo.ref,path:a.path,isGroup:!!a.isGroup,filters:[{field:a.documentKey,op:"==",value:u}]},"Failed to fetch document",n);}}async function $(c,l){let m=c.params||{},a=p(m.repoName,l);if(a)try{let u=c.body??{},f=i(c);if(!await o(l,a,"create",{user:f,body:u,params:m}))return;let k=Dn(a.schema,u,a.createFields,!1,a.systemKeys);if(!k.success){q(l,k.error,400);return}if(a.validate){let S=await a.validate(k.data,"create");if(S){q(l,S,400);return}}let h;if(a.isGroup&&a.parentKeys&&a.parentKeys.length>0){let S={...k.data};a.createdKey&&(S[a.createdKey]=new Date);let R=a.parentKeys.filter(E=>!S[E]);if(R.length>0){q(l,`Missing parent key(s) for subcollection create: ${R.join(", ")}`,400);return}let T=a.parentKeys.map(E=>S[E]),C=S[a.documentKey]||oo();h=await a.repo.set(...T,C,S);}else h=await a.repo.create(k.data);Ie(l,h,void 0,201);}catch(u){let f=n&&u instanceof Error?u.message:"Failed to create document";q(l,f,500);}}async function x(c,l,m){let a=c.params||{},u=p(a.repoName,l);if(!u)return;let f=a.id;if(!f){q(l,"Document ID required",400);return}try{let k=c.body??{},h=await y(u,f);if(!h){q(l,"Document not found",404);return}let S=i(c);if(!await o(l,u,"update",{user:S,doc:h,body:k,params:a}))return;let R=Dn(u.schema,k,u.mutableFields,m,u.systemKeys);if(!R.success){q(l,R.error,400);return}if(u.validate){let E=await u.validate(R.data,"update");if(E){q(l,E,400);return}}let T=d(h,u.pathKey)??[f],C=await u.repo.update(...T,R.data);Ie(l,C);}catch(k){let h=n&&k instanceof Error?k.message:"Failed to update document";q(l,h,500);}}async function v(c,l){let m=c.params||{},a=p(m.repoName,l);if(!a)return;if(!a.allowDelete){q(l,"Delete not allowed for this repository",403);return}let u=m.id;if(!u){q(l,"Document ID required",400);return}try{let f=await y(a,u);if(!f){q(l,"Document not found",404);return}let k=i(c);if(!await o(l,a,"delete",{user:k,doc:f,params:m}))return;let h=d(f,a.pathKey)??[u];await a.repo.delete(...h),Ie(l,{deleted:!0});}catch(f){let k=n&&f instanceof Error?f.message:"Failed to delete document";q(l,k,500);}}function A(c,l){l.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:g,handleQuery:b,handleGet:w,handleCreate:$,handleUpdate:x,handleDelete:v,handleOptions:A}}function Nt(e){try{return zod.z.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 re(e){return {$ref:`#/components/schemas/${e}`}}function X(e){return {description:e,content:{"application/json":{schema:re("ErrorResponse")}}}}function Ke(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function Bn(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 io(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 lo(e){let t=e.filterableFields??Object.keys(e.schema.shape),n=["eq","ne","lt","lte","gt","gte","in","nin","contains"],r=[];for(let o of t){r.push({name:o,in:"query",schema:{type:"string"},description:`Filter by ${o} (equality)`});for(let s of n)r.push({name:`${o}__${s}`,in:"query",schema:{type:"string"},description:`Filter ${o} with operator ${s}`});}return r}function co(){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 uo(e,t,n,r,o){let s={},i=e.name,p=`${t}/${e.name}`,d=`${p}/{${e.documentKey}}`,y={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[p]={get:{operationId:`list${xe(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[i],parameters:[...io(e),...lo(e)],responses:{200:Bn(re(n)),500:X("Internal server error")}},post:{operationId:`create${xe(e.name)}`,summary:`Create a ${ie(e.name)}`,tags:[i],requestBody:{required:true,content:{"application/json":{schema:re(r??n)}}},responses:{201:Ke("Document created",re(n)),400:X("Validation error"),500:X("Internal server error")}}},s[`${p}/query`]={post:{operationId:`query${xe(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[i],requestBody:{required:true,content:{"application/json":{schema:re("QueryRequestBody")}}},responses:{200:Bn(re(n)),400:X("Invalid query"),500:X("Internal server error")}}};let g={};return g.get={operationId:`get${xe(ie(e.name))}`,summary:`Get a single ${ie(e.name)}`,tags:[i],parameters:[y],responses:{200:Ke("Document found",re(n)),404:X("Document not found"),500:X("Internal server error")}},g.put={operationId:`update${xe(ie(e.name))}`,summary:`Update a ${ie(e.name)} (full replace)`,tags:[i],parameters:[y],requestBody:{required:true,content:{"application/json":{schema:re(o??n)}}},responses:{200:Ke("Document updated",re(n)),400:X("Validation error"),404:X("Document not found"),500:X("Internal server error")}},g.patch={operationId:`patch${xe(ie(e.name))}`,summary:`Partially update a ${ie(e.name)}`,tags:[i],parameters:[y],requestBody:{required:true,content:{"application/json":{schema:{allOf:[re(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Ke("Document patched",re(n)),400:X("Validation error"),404:X("Document not found"),500:X("Internal server error")}},e.allowDelete&&(g.delete={operationId:`delete${xe(ie(e.name))}`,summary:`Delete a ${ie(e.name)}`,tags:[i],parameters:[y],responses:{200:Ke("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:X("Document not found"),500:X("Internal server error")}}),s[d]=g,s}function Ft(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:i,auth:p=false}=n,d=t==="/"?"":t.replace(/\/$/,""),y={},g={},b=[];y.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},y.QueryRequestBody=co();for(let[v,A]of Object.entries(e)){let c=xe(ie(v)),l=`${c}Create`,m=`${c}Update`;y[c]=Nt(A.schema);let a=R=>{let T=R&&R.length>0?R:Object.keys(A.schema.shape),C={};for(let E of T){let O=E.split(".")[0];O&&A.schema.shape[O]&&!A.systemKeys.includes(O)&&(C[O]=A.schema.shape[O]);}return C},u=null,f=a(A.createFields);Object.keys(f).length>0&&(y[l]=Nt(zod.z.object(f)),u=l);let k=null,h=a(A.mutableFields);Object.keys(h).length>0&&(y[m]=Nt(zod.z.object(h)),k=m);let S=uo(A,d,c,u,k);Object.assign(g,S),b.push({name:v,description:`Operations on ${v} (collection: ${A.path})`});}let w={},$;return p==="basic"?(w.basicAuth={type:"http",scheme:"basic"},$=[{basicAuth:[]}]):p==="bearer"&&(w.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},$=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...i&&i.length>0?{servers:i}:{},paths:g,components:{schemas:y,...Object.keys(w).length>0?{securitySchemes:w}:{}},...$?{security:$}:{},tags:b}}function xe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ie(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 po(e,t){return `<!DOCTYPE html>
1147
1147
  <html lang="en">
1148
1148
  <head>
1149
1149
  <meta charset="utf-8" />
@@ -1154,5 +1154,5 @@ function initColumnReorder(table) {
1154
1154
  <script id="api-reference" data-url="${t}"></script>
1155
1155
  <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
1156
1156
  </body>
1157
- </html>`}async function fo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Zn(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:i=[],verbose:p=false,httpsOptions:d}=e,y=t==="/"?"":t.replace(/\/$/,""),g={};for(let[m,a]of Object.entries(n)){let u=a.schema??a.repo.schema??null;if(!u)throw new Error(`[createCrudServer] Repository "${m}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let f,k,h,S;if(a.fieldsConfig){let C=a.fieldsConfig;f=[],k=[],h=[],S=[];for(let[E,O]of Object.entries(C))for(let I of O)I==="filterable"?f.push(E):I==="orderable"?k.push(E):I==="mutable"?h.push(E):I==="create"&&S.push(E);k.length===0&&(k=f),f.length===0&&(f=void 0),k&&k.length===0&&(k=void 0),h.length===0&&(h=void 0),S.length===0&&(S=void 0);}let R=(()=>{let C=a.repo._parentKeys;return C&&C.length>0?C:void 0})();if(R&&S)for(let C of R)S.includes(C)||S.push(C);let T={name:m,path:a.path,repo:a.repo,schema:u,systemKeys:a.repo._systemKeys??[a.documentKey??"docId"],documentKey:a.documentKey??"docId",pathKey:a.repo._pathKey??void 0,isGroup:!!a.repo._isGroup,parentKeys:R,createdKey:a.repo._createdKey??void 0,pageSize:a.pageSize??25,filterableFields:f,orderableFields:k,mutableFields:h,createFields:S,allowDelete:a.allowDelete??false,allowedIncludes:a.allowedIncludes,validate:a.validate,rules:a.rules};g[m]=T;}let w=zn(g,y,p,!!s),$=e.openapi,x=$&&typeof $=="object"?$:{},v=null;function A(){if(!v){let m=s?fe(s)||typeof s=="function"?"bearer":"basic":false;v=jt(g,y,{...x,auth:x.auth??m});}return v}let c=new se;if(o!==false){let m=o===void 0?{csp:false}:o;c.use(Le(m));}if(c.use((m,a,u)=>{a.set("Access-Control-Allow-Origin","*"),a.set("Access-Control-Allow-Credentials","true"),u();}),r&&c.use(async(m,a,u)=>{let f=m;if(String(f.headers?.["content-type"]??"").includes("application/json")){if(typeof f.body=="string")try{m.body=JSON.parse(f.body);}catch{}else if(Buffer.isBuffer(m.rawBody))try{let h=await fo(f);m.body=JSON.parse(h);}catch{}}await u();}),s)if(fe(s)){for(let m of s.routes){let a=`${y}${m.path}`;m.method==="GET"?c.get(a,m.handler):c.post(a,m.handler);}c.use(s.middleware);}else if(typeof s=="function")c.use(s);else {let m=s.realm??"API",a="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");c.use((u,f,k)=>{if((u.headers?.authorization??"")!==a){f.status(401).set("WWW-Authenticate",`Basic realm="${m}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}k();});}for(let m of i)c.use(m);if($!==false){let m=`${y}/__spec.json`,a=`${y}/__docs`;c.get(m,(u,f)=>{let k=A();f.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(k,null,2));}),c.get(a,(u,f)=>{let k=ee(u,y)+"/__spec.json",h=po(x.title??"CRUD API",k);f.status(200).set("Content-Type","text/html; charset=utf-8").send(h);});}c.use((m,a,u)=>{if(m.method==="OPTIONS"){w.handleOptions(m,a);return}u();}),c.get(`${y}/:repoName`,w.handleList),c.post(`${y}/:repoName/query`,w.handleQuery),c.get(`${y}/:repoName/:id`,w.handleGet),c.post(`${y}/:repoName`,w.handleCreate),c.put(`${y}/:repoName/:id`,(m,a)=>w.handleUpdate(m,a,false)),c.patch(`${y}/:repoName/:id`,(m,a)=>w.handleUpdate(m,a,true)),c.delete(`${y}/:repoName/:id`,w.handleDelete);let l=async(m,a)=>{await c.handle(m,a);};return l.spec=A,d&&(l.httpsOptions=d),l}function Mn(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function Hn(e,t,n){let r={};for(let[o,s]of Object.entries(t)){if(!s)continue;let i=e[o];if(!i)throw new Error(`[createServers.${n}] Unknown repo "${o}" \u2014 not present in the registry passed to createServers().`);r[o]={...s,repo:i};}return r}function mo(e,t={}){return {admin(n){let r=Hn(e,n.repos,"admin"),o=On({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return Mn(o,t)},crud(n){let r=Hn(e,n.repos,"crud"),o=Zn({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return Mn(o,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}),rn(e,r)},history(n){return qt(e,n)}}}exports.CSS=Ur;exports.ClientScript=Ze;exports.DEFAULT_HTML_CSP=Tn;exports.MiniRouter=se;exports.createServers=mo;exports.renderDashboard=St;exports.renderField=it;exports.renderForm=ye;exports.renderFormPage=ve;exports.renderList=kt;exports.renderPage=qe;exports.securityHeaders=Le;exports.zodToFields=ae;//# sourceMappingURL=index.cjs.map
1157
+ </html>`}async function fo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Zn(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:i=[],verbose:p=false,httpsOptions:d}=e,y=t==="/"?"":t.replace(/\/$/,""),g={};for(let[m,a]of Object.entries(n)){let u=a.schema??a.repo.schema??null;if(!u)throw new Error(`[createCrudServer] Repository "${m}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let f,k,h,S;if(a.fieldsConfig){let C=a.fieldsConfig;f=[],k=[],h=[],S=[];for(let[E,O]of Object.entries(C))for(let I of O)I==="filterable"?f.push(E):I==="orderable"?k.push(E):I==="mutable"?h.push(E):I==="create"&&S.push(E);k.length===0&&(k=f),f.length===0&&(f=void 0),k&&k.length===0&&(k=void 0),h.length===0&&(h=void 0),S.length===0&&(S=void 0);}let R=(()=>{let C=a.repo._parentKeys;return C&&C.length>0?C:void 0})();if(R&&S)for(let C of R)S.includes(C)||S.push(C);let T={name:m,path:a.path,repo:a.repo,schema:u,systemKeys:a.repo._systemKeys??[a.documentKey??"docId"],documentKey:a.documentKey??"docId",pathKey:a.repo._pathKey??void 0,isGroup:!!a.repo._isGroup,parentKeys:R,createdKey:a.repo._createdKey??void 0,pageSize:a.pageSize??25,filterableFields:f,orderableFields:k,mutableFields:h,createFields:S,allowDelete:a.allowDelete??false,allowedIncludes:a.allowedIncludes,validate:a.validate,rules:a.rules};g[m]=T;}let w=zn(g,y,p,!!s),$=e.openapi,x=$&&typeof $=="object"?$:{},v=null;function A(){if(!v){let m=s?fe(s)||typeof s=="function"?"bearer":"basic":false;v=Ft(g,y,{...x,auth:x.auth??m});}return v}let c=new se;if(o!==false){let m=o===void 0?{csp:false}:o;c.use(Le(m));}if(c.use((m,a,u)=>{a.set("Access-Control-Allow-Origin","*"),a.set("Access-Control-Allow-Credentials","true"),u();}),r&&c.use(async(m,a,u)=>{let f=m;if(String(f.headers?.["content-type"]??"").includes("application/json")){if(typeof f.body=="string")try{m.body=JSON.parse(f.body);}catch{}else if(Buffer.isBuffer(m.rawBody))try{let h=await fo(f);m.body=JSON.parse(h);}catch{}}await u();}),s)if(fe(s)){for(let m of s.routes){let a=`${y}${m.path}`;m.method==="GET"?c.get(a,m.handler):c.post(a,m.handler);}c.use(s.middleware);}else if(typeof s=="function")c.use(s);else {let m=s.realm??"API",a="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");c.use((u,f,k)=>{if((u.headers?.authorization??"")!==a){f.status(401).set("WWW-Authenticate",`Basic realm="${m}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}k();});}for(let m of i)c.use(m);if($!==false){let m=`${y}/__spec.json`,a=`${y}/__docs`;c.get(m,(u,f)=>{let k=A();f.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(k,null,2));}),c.get(a,(u,f)=>{let k=ee(u,y)+"/__spec.json",h=po(x.title??"CRUD API",k);f.status(200).set("Content-Type","text/html; charset=utf-8").send(h);});}c.use((m,a,u)=>{if(m.method==="OPTIONS"){w.handleOptions(m,a);return}u();}),c.get(`${y}/:repoName`,w.handleList),c.post(`${y}/:repoName/query`,w.handleQuery),c.get(`${y}/:repoName/:id`,w.handleGet),c.post(`${y}/:repoName`,w.handleCreate),c.put(`${y}/:repoName/:id`,(m,a)=>w.handleUpdate(m,a,false)),c.patch(`${y}/:repoName/:id`,(m,a)=>w.handleUpdate(m,a,true)),c.delete(`${y}/:repoName/:id`,w.handleDelete);let l=async(m,a)=>{await c.handle(m,a);};return l.spec=A,d&&(l.httpsOptions=d),l}function Mn(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function Hn(e,t,n){let r={};for(let[o,s]of Object.entries(t)){if(!s)continue;let i=e[o];if(!i)throw new Error(`[createServers.${n}] Unknown repo "${o}" \u2014 not present in the registry passed to createServers().`);r[o]={...s,repo:i};}return r}function mo(e,t={}){return {admin(n){let r=Hn(e,n.repos,"admin"),o=On({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return Mn(o,t)},crud(n){let r=Hn(e,n.repos,"crud"),o=Zn({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return Mn(o,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}),rn(e,r)},history(n){return qt(e,n)}}}exports.CSS=Ur;exports.ClientScript=Ze;exports.DEFAULT_HTML_CSP=Tn;exports.MiniRouter=se;exports.createServers=mo;exports.renderDashboard=St;exports.renderField=it;exports.renderForm=ye;exports.renderFormPage=ve;exports.renderList=kt;exports.renderPage=qe;exports.securityHeaders=Le;exports.zodToFields=ae;//# sourceMappingURL=index.cjs.map
1158
1158
  //# sourceMappingURL=index.cjs.map