@lpdjs/firestore-repo-service 2.6.14 → 2.6.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -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 Ar=Object.defineProperty;var tt=(e,t)=>()=>(e&&(t=e(e=0)),t);var Or=(e,t)=>{for(var n in t)Ar(e,n,{get:t[n],enumerable:true});};function q(e){let t=e,n=t._zod?.def?.type;if(n)return no[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 On(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function $n(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 re(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 Ze(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 Le(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 ut(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function En(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 no,qe=tt(()=>{no={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 Wn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function So({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 Ie({val:e,mismatch:t}){let n=ko(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(So,{message:t})]}):n}function ko(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(Wn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Wn,{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 gt=tt(()=>{});function Fe(e){if(!e)return "unknown";let t=jt(e);switch(q(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function jt(e){let t=q(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?jt(n):e}return e}function _e(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=jt(r);if(q(s)!=="ZodObject")return;r=re(s)[o];}return r}function Oo(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 Ve(e,t){if(e==="unknown")return null;let n=Oo(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 Mt=tt(()=>{qe();});var Xn={};Or(Xn,{PanelMany:()=>Eo,PanelOne:()=>$o,RightPanel:()=>Ht});function $o({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??""),a=`${n}/${t}/${encodeURIComponent(s)}/edit`,l=Jn(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:a,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(i=>{let u=e[i],y=l[i],d=y?Ve(y,u):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:i}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(Ie,{val:u,mismatch:d})})]})})})]})}function Eo({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:l}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,u=Jn(a,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:i,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((y,d)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y},d)),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((y,d)=>{let g=String(y.docId??y.id??""),x=`${n}/${t}/${encodeURIComponent(g)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((b,v)=>{let k=y[b],w=u[b],c=w?Ve(w,k):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(Ie,{val:k,mismatch:c})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:x,class:"btn btn-xs btn-ghost",children:"Edit"})})]},d)})})]})}),(l.hasPrev||l.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[l.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":l.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),l.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":l.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Jn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Fe(_e(e,r));return n}var Ht,Bt=tt(()=>{gt();Mt();Ht=({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 $r(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function He(e,t){return t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}function vt(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function cn(e){let[t,n,r]=e;return vt(e)?$r(r,30).map(s=>[t,n,s]):[e]}function nt(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function dn(e){let t=await Promise.all(e.map(o=>o.get())),n=new Map;t.forEach(o=>{o.docs.forEach(s=>{n.has(s.id)||n.set(s.id,s);});});let r=t[0];if(!r)throw new Error("No snapshots returned");return {...r,docs:Array.from(n.values()),size:n.size,empty:n.size===0}}async function Te(e,t){let n=t.orWhere&&t.orWhere.length>0,r=t.orWhereGroups&&t.orWhereGroups.length>0;if(!n&&!r){if(!t.where||t.where.length===0)return He(e,t).get();if(!t.where.some(vt)){let d=nt(e,t.where);return d=He(d,t),d.get()}let i=t.where.map(cn),y=wt(i).map(d=>{let g=nt(e,d);return g=He(g,t),g});return dn(y)}let o=t.where??[],s=[...t.orWhere?.map(l=>[l])??[],...t.orWhereGroups??[]],a=[];for(let l of s){let i=[...o,...l];if(i.some(vt)){let y=i.map(cn),g=wt(y).map(x=>{let b=nt(e,x);return b=He(b,t),b});a.push(...g);}else {let y=nt(e,i);y=He(y,t),a.push(y);}}return dn(a)}function wt(e){if(e.length===0)return [[]];let t=e[0];if(e.length===1&&t)return t.map(s=>[s]);if(!t)return [[]];let n=e.slice(1),r=wt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var Rt="preserve";function Er(e){Rt=e;}function St(){return Rt}function Pr(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function kt(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(Pr(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 Dr(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function rt(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>rt(t));if(Dr(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=rt(r);return t}return e}function U(e){return Rt==="normalize"?rt(e):e}function pn(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function pe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ge(e,t){return t.where&&t.where.forEach(([n,r,o])=>{e=e.where(String(n),r,o);}),t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}async function ot(e,t){let n={...t,limit:t.pageSize+1};t.cursor&&(t.direction==="prev"?n.endBefore=t.cursor:n.startAfter=t.cursor);let o=(await Te(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,l=a.map(u=>U({...u.data(),docId:u.id})),i=t.direction==="prev";return {data:l,nextCursor:i?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:i?s?a[0]:void 0:a[0],hasNextPage:i?!!t.cursor:s,hasPrevPage:i?s:!!t.cursor,pageSize:l.length}}async function*Tt(e,t){let n,r=true;for(;r;){let o=await ot(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function ze(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 Ct(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(!Ct(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)||!Ct(e[s],t[s],n))return false;return true}return false}function st(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},a=t??{},l=new Set([...Object.keys(s),...Object.keys(a)]),i={};for(let u of l){if(r.has(u)||o&&!o.has(u))continue;let y=s[u],d=a[u];Ct(y,d)||(i[u]={oldValue:y===void 0?null:y,newValue:d===void 0?null:d,type:{old:ze(y),new:ze(d)}});}return i}var Ir=5;function Fr(e){return e.schemaVersion===2}function fn(e){if(typeof e!="string")return "object";switch(e){case "string":case "number":case "boolean":case "object":case "array":case "timestamp":case "date":case "null":case "undefined":return e;default:return "object"}}function _r(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function Nr(e){let t={};e.historyUserId!==void 0&&(t.userId=e.historyUserId??null),e.historyUserEmail!==void 0&&(t.userEmail=e.historyUserEmail??null);let n=e.extraHistoryDetails??null;n&&(n.reason!==void 0&&(t.reason=n.reason??null),n.comment!==void 0&&(t.comment=n.comment??null));let r={},o=false;if(e.historyDetails&&typeof e.historyDetails=="object")for(let[s,a]of Object.entries(e.historyDetails))r[s]=a,o=true;if(e.extraContentKeys&&typeof e.extraContentKeys=="object")for(let[s,a]of Object.entries(e.extraContentKeys))r[`content.${s}`]=a,o=true;return o&&(t.extras=r),t}function jr(e){let t=e.changes?.oldValue??null,n=e.changes?.newValue??null,r=e.types?.oldValue,o=e.types?.newValue;return {oldValue:t,newValue:n,type:{old:r?fn(r):ze(t),new:o?fn(o):ze(n)}}}function Mr(e){let t=jr(e),n=Nr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function Hr(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function Br(e,t){return (e.userId??null)===(t.userId??null)}function yn(e,t={}){let n=t.groupToleranceMs??Ir,r=[];for(let o of e){if(Fr(o)){r.push(_r(o));continue}let a=Mr(o),l=r[r.length-1];l&&l.schemaVersion===1&&Hr(l.historySetAt,a.historySetAt,n)&&Br(l.meta,a.meta)?Object.assign(l.changes,a.changes):r.push(a);}return r}var Zr=7e5;function at(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,(a,l)=>l instanceof firestore.Timestamp?l.toMillis():l),"utf8")}catch{return 0}};if(o(r.changes)>Zr){let s={};for(let[a,l]of Object.entries(r.changes)){let i=o(l.oldValue),u=o(l.newValue);s[a]={oldValue:i>5e4?"[truncated]":l.oldValue,newValue:u>5e4?"[truncated]":l.newValue,type:l.type};}r.changes=s,r._truncated=true;}return r}async function it(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 lt(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=y=>{if(!y)return;let d=n[y];return d===void 0||d===null?null:String(d)},a=s(o.userId);a!==void 0&&(r.userId=a);let l=s(o.userEmail);l!==void 0&&(r.userEmail=l);let i=s(o.reason);i!==void 0&&(r.reason=i);let u=s(o.comment);if(u!==void 0&&(r.comment=u),o.extras&&o.extras.length>0){let y={},d=false;for(let g of o.extras)g in n&&(y[g]=n[g],d=true);d&&(r.extras=y);}return r}function ct(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 Lr="history",qr=50;function mn(e,t,n){return e(...n).collection(t)}function Kr(e){return String(e[e.length-1]??"")}function gn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??Lr;async function s(...y){let d={},g=y,x=y[y.length-1];x!==null&&typeof x=="object"&&!(x instanceof firestore.Timestamp)&&("limit"in x||"cursor"in x||"direction"in x)&&(d=x,g=y.slice(0,-1));let b=mn(e,o,g),v=d.direction??"desc",k=b.orderBy("historySetAt",v);return d.cursor&&(k=k.startAfter(d.cursor)),d.limit&&d.limit>0&&(k=k.limit(d.limit)),(await k.get()).docs.map(c=>({id:c.id,data:c.data()}))}async function a(...y){let d={},g=y,x=y[y.length-1];x!==null&&typeof x=="object"&&!(x instanceof firestore.Timestamp)&&("limit"in x||"cursor"in x||"direction"in x||"fields"in x||"operations"in x)&&(d=x,g=y.slice(0,-1));let b=d.limit??qr,v=Math.max(b,Math.min(b*8,500)),k=await s(...g,{limit:v,cursor:d.cursor,direction:d.direction??"desc"}),w=yn(k.map(c=>c.data));if(d.fields&&d.fields.length>0){let c=new Set(d.fields);w=w.filter(f=>Object.keys(f.changes).some(m=>c.has(m)));}if(d.operations&&d.operations.length>0){let c=new Set(d.operations);w=w.filter(f=>c.has(f.operation));}return w.slice(0,b)}async function l(...y){let d=y[y.length-1],g={},x,b;return d!==null&&typeof d=="object"&&!(d instanceof firestore.Timestamp)?(g=d,x=y[y.length-2],b=y.slice(0,-2)):(x=d,b=y.slice(0,-1)),a(...b,{...g,fields:[x]})}async function i(...y){let d=y[y.length-1],g={},x,b;return d!==null&&typeof d=="object"&&!(d instanceof firestore.Timestamp)?(g=d,x=y[y.length-2],b=y.slice(0,-2)):(x=d,b=y.slice(0,-1)),a(...b,{...g,operations:[x]})}async function u(...y){let d=y[y.length-1],g=y.slice(0,-1),x=Kr(g),b=st(d.before??{},d.after??{},{include:r.include,exclude:r.exclude,metaFields:ct(r),systemKeys:t});if(d.operation==="update"&&Object.keys(b).length===0)return null;let k={...lt(d.after??d.before??null,r),...d.meta??{}},w=at({entityId:x,operation:d.operation,changes:b,meta:k,config:r}),c=mn(e,o,g),f=await it(c,w,r,{repoName:n,docId:x,before:d.before??null,after:d.after??null});return !f.written||!f.entry?null:{historyDocId:f.entry.historyDocId,historyToObjectId:f.entry.historyToObjectId,historySetAt:f.entry.historySetAt,schemaVersion:2,operation:f.entry.operation,meta:f.entry.meta,changes:f.entry.changes}}return {list:a,raw:s,byField:l,byOperation:i,recordManual:u}}function hn(e){return {count:async(t={})=>{let n=e;return n=ge(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let l=a.data()[t];typeof l=="number"&&(s+=l);}),s},average:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(l=>{let i=l.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function bn(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let l=e.batch();return {batch:l,set:(...i)=>{let u=i[i.length-1],y=typeof u=="object"&&u!==null&&"merge"in u,d=y?i[i.length-2]:i[i.length-1],g=y?i.slice(0,-2):i.slice(0,-1),x=y?u:{merge:true},b=t(...g),v={...d},k=g[g.length-1];n&&k&&(v[n]=k),r&&(v[r]=b.path),o&&(v[o]=a()),s&&(v[s]=a()),l.set(b,v,x);},update:(...i)=>{let u=i.pop(),d=t(...i),g={...u};s&&(g[s]=a()),l.update(d,g);},delete:(...i)=>{let u=t(...i);l.delete(u);},commit:async()=>{await l.commit();}}}}}var Ur=new Set([4,8,10,13,14]);function Ot(e,t){let n=[],r=t.maxAttempts??5;return e.onWriteError(o=>{let s=o?.code;if(o.failedAttempts<r&&s!==void 0&&Ur.has(s))return true;let a={ref:o.documentRef,error:o};return n.push(a),t.onError?.(a),false}),t.onSuccess&&e.onWriteResult(o=>t.onSuccess(o)),n}function $t(e,t){if(e.length>0&&!t.onError){let n=new Error(`bulk operation failed for ${e.length} document(s): `+e.slice(0,5).map(r=>`${r.ref.path} (${r.error.message})`).join("; "));throw n.failures=e,n}return {failures:e}}function xn(e,t,n){let r=()=>new Date;return {set:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:y,merge:d=true}=i,g={...y};t&&(g[t]=r()),n&&(g[n]=r()),a.set(u,g,{merge:d});}return await a.close(),$t(l,s)},update:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:y}=i,d={...y};n&&(d[n]=r()),a.update(u,d);}return await a.close(),$t(l,s)},delete:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o)i&&a.delete(i);return await a.close(),$t(l,s)}}}function vn(e,t,n,r,o,s){let a=()=>new Date;return {create:async d=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let g,x,b={...d};if(o&&(b[o]=a()),s&&(b[s]=a()),d[n]){x=d[n],g=e.doc(x);let k=r?{...b,[r]:g.path}:b;await g.set(k);}else {g=await e.add(b),x=g.id;let k={[n]:x};r&&(k[r]=g.path),await g.update(k);}let v=await g.get();return U(v.data())},set:async(...d)=>{let g=d[d.length-1],x=typeof g=="object"&&g!==null&&"merge"in g,b=x?d[d.length-2]:d[d.length-1],v=x?d.slice(0,-2):d.slice(0,-1),k=x?g:{merge:true},w={...b};s&&(w[s]=a());let c=t(...v),f=v[v.length-1];n&&f!=null&&(w[n]=f),r&&(w[r]=c.path),await c.set(w,k);let m=await c.get();return U(m.data())},update:async(...d)=>{let g=d.pop(),x=d,b={...g};s&&(b[s]=a());let v=t(...x);await v.update(b);let k=await v.get();return U(k.data())},delete:async(...d)=>{await t(...d).delete();}}}function wn(e,t,n,r,o){let s={};return s.byList=async(a,l,i="in",u={})=>{if(l.length===0)return [];let y=[],d=pn(l,30);for(let g of d){let x=e;x=x.where(a,i,g),u.select&&u.select.length>0&&(x=x.select(...u.select.map(v=>String(v)))),(await x.get()).forEach(v=>{let k=U(v.data());y.push(u.returnDoc?{data:k,doc:v}:k);});}return y},t.forEach(a=>{let l=`by${pe(String(a))}`;s[l]=async(i,u={})=>{let y=typeof u=="boolean"?{returnDoc:u}:u;if(String(a)===o){let k=await r(i).get();if(!k.exists)return null;let w=U(k.data());return y.returnDoc?{data:w,doc:k}:w}let d=e;d=d.where(String(a),"==",i).limit(1),y.select&&y.select.length>0&&(d=d.select(...y.select.map(v=>String(v))));let g=await d.get();if(g.empty)return null;let x=g.docs[0];if(!x)return null;let b=U(x.data());return y.returnDoc?{data:b,doc:x}:b};}),s}function Rn(e,t,n,r){let o={},s=async(a,l)=>{if(!n||!r||l.length===0)return a;let i=l.map(u=>typeof u=="string"?{key:u}:{key:u.relation,select:u.select});return Promise.all(a.map(async u=>{let y=await Promise.all(i.map(async({key:g,select:x})=>{let b=n[g];if(!b)return [g,void 0];let v=r[b.repo];if(!v)return [g,void 0];let k=u[g];if(k==null)return [g,b.type==="one"?null:[]];let w=x?{select:x}:void 0;try{if(b.type==="one"){let c=`by${pe(b.key)}`,f=typeof v.get?.[c]=="function"?await v.get[c](k,w):null;return [g,f]}else {let c=`by${pe(b.key)}`,f=typeof v.query?.[c]=="function"?await v.query[c](k,w):[];return [g,f]}}catch(c){return console.error(`[include] Error populating "${g}":`,c),[g,b.type==="one"?null:[]]}})),d={};for(let[g,x]of y)g!==void 0&&(d[g]=x);return {...u,populated:d}}))};return t.forEach(a=>{let l=`by${pe(a)}`;o[l]=async(i,u={})=>{let y={...u,where:[[a,"==",i],...u.where??[]]};return (await Te(e,y)).docs.map(g=>U(g.data()))};}),o.by=async a=>(await Te(e,a)).docs.map(i=>U(i.data())),o.getAll=async(a={})=>(await Te(e,a)).docs.map(i=>U(i.data())),o.onSnapshot=(a,l,i)=>ge(e,a).onSnapshot(y=>{l(y.docs.map(d=>U(d.data())));},i),o.paginate=async a=>{let{include:l,...i}=a,u=await ot(e,i);if(l&&l.length>0){let y=await s(u.data,l);return {...u,data:y}}return u},o.paginateAll=async function*(a){let{include:l,...i}=a;for await(let u of Tt(e,i))if(l&&l.length>0){let y=await s(u.data,l);yield {...u,data:y};}else yield u;},o}function Sn(e,t){return {populate:async(n,r)=>{if(!e.relationalKeys)return {...n,populated:{}};let o,s={};if(typeof r=="object"&&!Array.isArray(r))if("relation"in r){let i=r;o=[i.relation],i.select&&(s[i.relation]=i.select);}else if("relations"in r){let i=r;o=Array.isArray(i.relations)?i.relations:[i.relations],s=i.select??{};}else o=[];else o=Array.isArray(r)?r:[r];let a=await Promise.all(o.map(async i=>{let u=e.relationalKeys?.[i];if(!u)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let y=t[u.repo];if(!y)return console.warn(`[populate] Repository "${u.repo}" not found in mapping`),[i,void 0];let d=n[i];if(d==null)return [i,u.type==="one"?null:[]];let g=s[i],x=g?{select:g}:void 0;try{if(u.type==="one"){let b=`by${pe(u.key)}`,v=typeof y.get?.[b]=="function"?await y.get[b](d,x):null;return [i,v]}else {let b=`by${pe(u.key)}`,v=typeof y.query?.[b]=="function"?await y.query[b](d,x):[];return [i,v]}}catch(b){return console.error(`[populate] Error populating "${i}":`,b),[i,u.type==="one"?null:[]]}})),l={};for(let[i,u]of a)u!==void 0&&(l[i]=u);return {...n,populated:l}}}}var Vr=new Set([4,8,10,13,14]);function kn(e,t,n,r,o,s){let a=()=>new Date;return {backfillKeys:async(i={})=>{let{overwriteCreated:u=false,touchUpdated:y=true,overwritePath:d=false,pageSize:g=300,dryRun:x=false,maxAttempts:b=5,onError:v,onSuccess:k}=i,w=[],c=0,f=0,m=0,p=x?null:e.bulkWriter();p&&(p.onWriteError(R=>{let S=R?.code;if(R.failedAttempts<b&&S!==void 0&&Vr.has(S))return true;let C={path:R?.documentRef?.path??"(unknown)",error:R};return w.push(C),v?.(C),false}),k&&p.onWriteResult(R=>k(R.path)));let h;for(;;){let R=t.orderBy(firestore.FieldPath.documentId());h&&(R=R.startAfter(h)),R=R.limit(g);let S=await R.get();if(S.empty)break;for(let C of S.docs){c++;let T=C.data(),O={};if(n&&T[n]==null&&(O[n]=C.id),r&&(d||T[r]==null)&&T[r]!==C.ref.path&&(O[r]=C.ref.path),o&&(u||T[o]==null)&&(O[o]=a()),y&&s&&T[s]==null&&(O[s]=a()),Object.keys(O).length===0){m++;continue}f++,p&&p.set(C.ref,O,{merge:true});}if(S.size<g)break;h=S.docs[S.docs.length-1];}return p&&await p.close(),{scanned:c,written:f,skipped:m,failures:w}}}}function Tn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),l=await r.get(a);return l.exists?U({...l.data(),docId:l.id}):null},set:(...s)=>{let a=s[s.length-1],l=typeof a=="object"&&a!==null&&"merge"in a,i=l?s[s.length-2]:s[s.length-1],u=l?s.slice(0,-2):s.slice(0,-1),y=l?a:{merge:true},d=t(...u);r.set(d,i,y);},update:(...s)=>{let a=s[s.length-1],l=s.slice(0,-1),i=t(...l);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function Wr(e){if(typeof e!="function")return [];let n=e.toString().match(/^\s*(?:function\s*\w*\s*)?\(([^)]*)\)/);if(!n?.[1])return [];let r=n[1].split(",").map(o=>o.trim().replace(/\s*[:=].*$/,"").trim()).filter(Boolean);return r.length<=2?[]:r.slice(1,-1)}function Et(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...w)=>t.refCb(e,...w),a=wn(r,t.foreignKeys,o,s,t.documentKey),l=Rn(r,t.queryKeys,t.relationalKeys,n),i=hn(r),u=vn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),y=bn(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),d=Tn(e,s),g=xn(e,t.createdKey,t.updatedKey),x=kn(e,r,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),b=Sn(t,n),v=t.history,k=v?.enabled?gn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(w=>typeof w=="string"),t.path??"(unknown)",v):null;return {ref:r,documentRef:s,get:a,query:l,aggregate:i,...u,batch:y,transaction:d,bulk:g,system:x,...b,...k?{history:k}:{},_historySubcollection:k?v?.subcollection??"history":void 0,_historyConfig:v,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(w=>typeof w=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Wr(t.refCb):[],_createdKey:t.createdKey??null}}var Gr="history";function Jr(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 Cn(e,t){let{onDocumentWritten:n}=t.deps,r={};for(let[o,s]of Object.entries(e)){let a=s._historyConfig??(typeof s.history=="object"&&s.history!==null&&"enabled"in s.history?s.history:void 0);if(!a?.enabled)continue;let l=a.subcollection??Gr,i=a.ttl??t.defaults?.ttl,u=t.repos?.[o],y;if(s._isGroup){if(!u?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}y=u.triggerPath;}else y=u?.triggerPath??Jr(o,s);if(!y)continue;let d=s._systemKeys??[],g=d[0]??"docId",x=ct(a);r[`${o}_onHistory`]=n(y,async b=>{try{let v=b.data?.before?.data(),k=b.data?.after?.data(),w;if(!v&&k)w="create";else if(v&&!k)w="delete";else if(v&&k)w="update";else return;let c=String(k?.[g]??v?.[g]??b.params?.docId??b.data?.after?.id??b.data?.before?.id??"");if(!c)return;let f=st(v??{},k??{},{include:a.include,exclude:a.exclude,metaFields:x,systemKeys:d});if(w==="update"&&Object.keys(f).length===0)return;let m=lt(k??v??null,a),p=at({entityId:c,operation:w,changes:f,meta:m,config:a,ttlOverride:i}),h=b.data?.after?.ref??b.data?.before?.ref;if(!h)return;let R=h.collection(l);await it(R,p,a,{repoName:o,docId:c,before:v??null,after:k??null});}catch(v){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,v);}});}return r}function Xr(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 Yr(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var oe=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}=Xr(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=Yr(t),s=null,a={};for(let u of this.routes){if(u.method!==r)continue;let y=o.match(u.pattern);if(y){s=u,a={},u.paramNames.forEach((d,g)=>{a[d]=decodeURIComponent(y[g+1]??"");});break}}let l=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(l,n,i);}catch(u){this.errorHandler(u,t,n);}}async runMiddlewareChain(t,n,r){let o=0,s=async()=>{if(o<this.middlewares.length){let a=this.middlewares[o++];await a(t,n,s);}else await r(t,n);};await s();}};function ne(e,t,n){let r=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let a=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=n??process.env.FUNCTION_REGION??"us-central1",i=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${a}/${l}/${i}${r}`}let o=process.env.K_SERVICE,s=e?.hostname??e?.headers?.host??"";return o&&typeof s=="string"&&s.includes("cloudfunctions.net")?`/${o.toLowerCase()}${r}`:r}function An(e){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e[0];return typeof t=="string"?t:void 0}}function he(e){return !!e&&typeof e=="object"&&e.__authExtension===true}qe();var be="__sync_version";var ro=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function oo(e){let t=e,n=false;for(;;){let r=q(t);if(!ro.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var so={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Pn(e,t,n,r,o,s,a,l){for(let[i,u]of Object.entries(e)){let y=n?`${n}__${i}`:i;if(o.has(i)||o.has(y))continue;let{inner:d,nullable:g}=oo(u),x=q(d),b=r||g;if(x==="ZodObject"){let c=re(d);Pn(c,t,y,b,o,s,a,l);continue}let v=so[x]??"json",k=y===a||i===a,w=s[y]??s[i]??y;l.push({name:w,sqlType:t.mapType(v),nullable:k?false:b,isPrimaryKey:k});}}function pt(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),l=re(e),i=[];return Pn(l,t,"",false,a,s,r,i),i.some(u=>u.name===be)||i.push({name:be,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}function Dn(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(Dn)):e}var ao=32,io=5e3;function In(e,t,n,r=new WeakSet,o=0){if(o>ao){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,a]of Object.entries(e)){if(Object.keys(n).length>=io)break;let l=t?`${t}__${s}`:s;a!=null&&typeof a=="object"&&!Array.isArray(a)&&!(a instanceof Date)&&!Buffer.isBuffer(a)&&!(a instanceof Uint8Array)&&typeof a.toDate!="function"&&!("latitude"in a&&"longitude"in a)?In(a,l,n,r,o+1):n[l]=Dn(a);}r.delete(e);}function Ke(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};In(e,"",o);let s={};for(let[a,l]of Object.entries(o)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let u=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[u]=l;}return s}function fe(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 Or=Object.defineProperty;var nt=(e,t)=>()=>(e&&(t=e(e=0)),t);var $r=(e,t)=>{for(var n in t)Or(e,n,{get:t[n],enumerable:true});};function U(e){let t=e,n=t._zod?.def?.type;if(n)return ro[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 On(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function $n(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 re(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 Ze(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 Le(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function Ue(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function En(e){let t=e;return Array.isArray(t.options)?t.options:Array.isArray(t._zod?.def?.options)?t._zod.def.options:Array.isArray(t._def?.options)?t._def.options:[]}function Pn(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 ro,qe=nt(()=>{ro={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 Gn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function ko({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 Ie({val:e,mismatch:t}){let n=To(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(ko,{message:t})]}):n}function To(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(Gn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Gn,{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 gt=nt(()=>{});function _e(e){if(!e)return "unknown";let t=jt(e);switch(U(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 jt(e){let t=U(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?jt(n):e}return e}function Fe(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=jt(r);if(U(s)!=="ZodObject")return;r=re(s)[o];}return r}function $o(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 We(e,t){if(e==="unknown")return null;let n=$o(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 Mt=nt(()=>{qe();});var Yn={};$r(Yn,{PanelMany:()=>Po,PanelOne:()=>Eo,RightPanel:()=>Ht});function Eo({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??""),a=`${n}/${t}/${encodeURIComponent(s)}/edit`,l=Xn(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:a,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(i=>{let u=e[i],y=l[i],d=y?We(y,u):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:i}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(Ie,{val:u,mismatch:d})})]})})})]})}function Po({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:l}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,u=Xn(a,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:i,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((y,d)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y},d)),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((y,d)=>{let g=String(y.docId??y.id??""),x=`${n}/${t}/${encodeURIComponent(g)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((b,v)=>{let k=y[b],w=u[b],c=w?We(w,k):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(Ie,{val:k,mismatch:c})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:x,class:"btn btn-xs btn-ghost",children:"Edit"})})]},d)})})]})}),(l.hasPrev||l.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[l.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":l.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),l.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":l.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Xn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=_e(Fe(e,r));return n}var Ht,Bt=nt(()=>{gt();Mt();Ht=({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 Er(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function He(e,t){return t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}function vt(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function cn(e){let[t,n,r]=e;return vt(e)?Er(r,30).map(s=>[t,n,s]):[e]}function rt(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function dn(e){let t=await Promise.all(e.map(o=>o.get())),n=new Map;t.forEach(o=>{o.docs.forEach(s=>{n.has(s.id)||n.set(s.id,s);});});let r=t[0];if(!r)throw new Error("No snapshots returned");return {...r,docs:Array.from(n.values()),size:n.size,empty:n.size===0}}async function Te(e,t){let n=t.orWhere&&t.orWhere.length>0,r=t.orWhereGroups&&t.orWhereGroups.length>0;if(!n&&!r){if(!t.where||t.where.length===0)return He(e,t).get();if(!t.where.some(vt)){let d=rt(e,t.where);return d=He(d,t),d.get()}let i=t.where.map(cn),y=wt(i).map(d=>{let g=rt(e,d);return g=He(g,t),g});return dn(y)}let o=t.where??[],s=[...t.orWhere?.map(l=>[l])??[],...t.orWhereGroups??[]],a=[];for(let l of s){let i=[...o,...l];if(i.some(vt)){let y=i.map(cn),g=wt(y).map(x=>{let b=rt(e,x);return b=He(b,t),b});a.push(...g);}else {let y=rt(e,i);y=He(y,t),a.push(y);}}return dn(a)}function wt(e){if(e.length===0)return [[]];let t=e[0];if(e.length===1&&t)return t.map(s=>[s]);if(!t)return [[]];let n=e.slice(1),r=wt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var Rt="preserve";function Pr(e){Rt=e;}function St(){return Rt}function Dr(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function kt(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(Dr(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 Ir(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ot(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>ot(t));if(Ir(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=ot(r);return t}return e}function K(e){return Rt==="normalize"?ot(e):e}function pn(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function pe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ge(e,t){return t.where&&t.where.forEach(([n,r,o])=>{e=e.where(String(n),r,o);}),t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}async function st(e,t){let n={...t,limit:t.pageSize+1};t.cursor&&(t.direction==="prev"?n.endBefore=t.cursor:n.startAfter=t.cursor);let o=(await Te(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,l=a.map(u=>K({...u.data(),docId:u.id})),i=t.direction==="prev";return {data:l,nextCursor:i?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:i?s?a[0]:void 0:a[0],hasNextPage:i?!!t.cursor:s,hasPrevPage:i?s:!!t.cursor,pageSize:l.length}}async function*Tt(e,t){let n,r=true;for(;r;){let o=await st(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function ze(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 Ct(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(!Ct(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)||!Ct(e[s],t[s],n))return false;return true}return false}function at(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},a=t??{},l=new Set([...Object.keys(s),...Object.keys(a)]),i={};for(let u of l){if(r.has(u)||o&&!o.has(u))continue;let y=s[u],d=a[u];Ct(y,d)||(i[u]={oldValue:y===void 0?null:y,newValue:d===void 0?null:d,type:{old:ze(y),new:ze(d)}});}return i}var _r=5;function Fr(e){return e.schemaVersion===2}function fn(e){if(typeof e!="string")return "object";switch(e){case "string":case "number":case "boolean":case "object":case "array":case "timestamp":case "date":case "null":case "undefined":return e;default:return "object"}}function Nr(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function jr(e){let t={};e.historyUserId!==void 0&&(t.userId=e.historyUserId??null),e.historyUserEmail!==void 0&&(t.userEmail=e.historyUserEmail??null);let n=e.extraHistoryDetails??null;n&&(n.reason!==void 0&&(t.reason=n.reason??null),n.comment!==void 0&&(t.comment=n.comment??null));let r={},o=false;if(e.historyDetails&&typeof e.historyDetails=="object")for(let[s,a]of Object.entries(e.historyDetails))r[s]=a,o=true;if(e.extraContentKeys&&typeof e.extraContentKeys=="object")for(let[s,a]of Object.entries(e.extraContentKeys))r[`content.${s}`]=a,o=true;return o&&(t.extras=r),t}function Mr(e){let t=e.changes?.oldValue??null,n=e.changes?.newValue??null,r=e.types?.oldValue,o=e.types?.newValue;return {oldValue:t,newValue:n,type:{old:r?fn(r):ze(t),new:o?fn(o):ze(n)}}}function Hr(e){let t=Mr(e),n=jr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function Br(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function zr(e,t){return (e.userId??null)===(t.userId??null)}function yn(e,t={}){let n=t.groupToleranceMs??_r,r=[];for(let o of e){if(Fr(o)){r.push(Nr(o));continue}let a=Hr(o),l=r[r.length-1];l&&l.schemaVersion===1&&Br(l.historySetAt,a.historySetAt,n)&&zr(l.meta,a.meta)?Object.assign(l.changes,a.changes):r.push(a);}return r}var Lr=7e5;function it(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,(a,l)=>l instanceof firestore.Timestamp?l.toMillis():l),"utf8")}catch{return 0}};if(o(r.changes)>Lr){let s={};for(let[a,l]of Object.entries(r.changes)){let i=o(l.oldValue),u=o(l.newValue);s[a]={oldValue:i>5e4?"[truncated]":l.oldValue,newValue:u>5e4?"[truncated]":l.newValue,type:l.type};}r.changes=s,r._truncated=true;}return r}async function lt(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 ct(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=y=>{if(!y)return;let d=n[y];return d===void 0||d===null?null:String(d)},a=s(o.userId);a!==void 0&&(r.userId=a);let l=s(o.userEmail);l!==void 0&&(r.userEmail=l);let i=s(o.reason);i!==void 0&&(r.reason=i);let u=s(o.comment);if(u!==void 0&&(r.comment=u),o.extras&&o.extras.length>0){let y={},d=false;for(let g of o.extras)g in n&&(y[g]=n[g],d=true);d&&(r.extras=y);}return r}function dt(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 Ur="history",qr=50;function mn(e,t,n){return e(...n).collection(t)}function Kr(e){return String(e[e.length-1]??"")}function gn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??Ur;async function s(...y){let d={},g=y,x=y[y.length-1];x!==null&&typeof x=="object"&&!(x instanceof firestore.Timestamp)&&("limit"in x||"cursor"in x||"direction"in x)&&(d=x,g=y.slice(0,-1));let b=mn(e,o,g),v=d.direction??"desc",k=b.orderBy("historySetAt",v);return d.cursor&&(k=k.startAfter(d.cursor)),d.limit&&d.limit>0&&(k=k.limit(d.limit)),(await k.get()).docs.map(c=>({id:c.id,data:c.data()}))}async function a(...y){let d={},g=y,x=y[y.length-1];x!==null&&typeof x=="object"&&!(x instanceof firestore.Timestamp)&&("limit"in x||"cursor"in x||"direction"in x||"fields"in x||"operations"in x)&&(d=x,g=y.slice(0,-1));let b=d.limit??qr,v=Math.max(b,Math.min(b*8,500)),k=await s(...g,{limit:v,cursor:d.cursor,direction:d.direction??"desc"}),w=yn(k.map(c=>c.data));if(d.fields&&d.fields.length>0){let c=new Set(d.fields);w=w.filter(f=>Object.keys(f.changes).some(m=>c.has(m)));}if(d.operations&&d.operations.length>0){let c=new Set(d.operations);w=w.filter(f=>c.has(f.operation));}return w.slice(0,b)}async function l(...y){let d=y[y.length-1],g={},x,b;return d!==null&&typeof d=="object"&&!(d instanceof firestore.Timestamp)?(g=d,x=y[y.length-2],b=y.slice(0,-2)):(x=d,b=y.slice(0,-1)),a(...b,{...g,fields:[x]})}async function i(...y){let d=y[y.length-1],g={},x,b;return d!==null&&typeof d=="object"&&!(d instanceof firestore.Timestamp)?(g=d,x=y[y.length-2],b=y.slice(0,-2)):(x=d,b=y.slice(0,-1)),a(...b,{...g,operations:[x]})}async function u(...y){let d=y[y.length-1],g=y.slice(0,-1),x=Kr(g),b=at(d.before??{},d.after??{},{include:r.include,exclude:r.exclude,metaFields:dt(r),systemKeys:t});if(d.operation==="update"&&Object.keys(b).length===0)return null;let k={...ct(d.after??d.before??null,r),...d.meta??{}},w=it({entityId:x,operation:d.operation,changes:b,meta:k,config:r}),c=mn(e,o,g),f=await lt(c,w,r,{repoName:n,docId:x,before:d.before??null,after:d.after??null});return !f.written||!f.entry?null:{historyDocId:f.entry.historyDocId,historyToObjectId:f.entry.historyToObjectId,historySetAt:f.entry.historySetAt,schemaVersion:2,operation:f.entry.operation,meta:f.entry.meta,changes:f.entry.changes}}return {list:a,raw:s,byField:l,byOperation:i,recordManual:u}}function hn(e){return {count:async(t={})=>{let n=e;return n=ge(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let l=a.data()[t];typeof l=="number"&&(s+=l);}),s},average:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(l=>{let i=l.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function bn(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let l=e.batch();return {batch:l,set:(...i)=>{let u=i[i.length-1],y=typeof u=="object"&&u!==null&&"merge"in u,d=y?i[i.length-2]:i[i.length-1],g=y?i.slice(0,-2):i.slice(0,-1),x=y?u:{merge:true},b=t(...g),v={...d},k=g[g.length-1];n&&k&&(v[n]=k),r&&(v[r]=b.path),o&&(v[o]=a()),s&&(v[s]=a()),l.set(b,v,x);},update:(...i)=>{let u=i.pop(),d=t(...i),g={...u};s&&(g[s]=a()),l.update(d,g);},delete:(...i)=>{let u=t(...i);l.delete(u);},commit:async()=>{await l.commit();}}}}}var Qr=new Set([4,8,10,13,14]);function Ot(e,t){let n=[],r=t.maxAttempts??5;return e.onWriteError(o=>{let s=o?.code;if(o.failedAttempts<r&&s!==void 0&&Qr.has(s))return true;let a={ref:o.documentRef,error:o};return n.push(a),t.onError?.(a),false}),t.onSuccess&&e.onWriteResult(o=>t.onSuccess(o)),n}function $t(e,t){if(e.length>0&&!t.onError){let n=new Error(`bulk operation failed for ${e.length} document(s): `+e.slice(0,5).map(r=>`${r.ref.path} (${r.error.message})`).join("; "));throw n.failures=e,n}return {failures:e}}function xn(e,t,n){let r=()=>new Date;return {set:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:y,merge:d=true}=i,g={...y};t&&(g[t]=r()),n&&(g[n]=r()),a.set(u,g,{merge:d});}return await a.close(),$t(l,s)},update:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:y}=i,d={...y};n&&(d[n]=r()),a.update(u,d);}return await a.close(),$t(l,s)},delete:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o)i&&a.delete(i);return await a.close(),$t(l,s)}}}function vn(e,t,n,r,o,s){let a=()=>new Date;return {create:async d=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let g,x,b={...d};if(o&&(b[o]=a()),s&&(b[s]=a()),d[n]){x=d[n],g=e.doc(x);let k=r?{...b,[r]:g.path}:b;await g.set(k);}else {g=await e.add(b),x=g.id;let k={[n]:x};r&&(k[r]=g.path),await g.update(k);}let v=await g.get();return K(v.data())},set:async(...d)=>{let g=d[d.length-1],x=typeof g=="object"&&g!==null&&"merge"in g,b=x?d[d.length-2]:d[d.length-1],v=x?d.slice(0,-2):d.slice(0,-1),k=x?g:{merge:true},w={...b};s&&(w[s]=a());let c=t(...v),f=v[v.length-1];n&&f!=null&&(w[n]=f),r&&(w[r]=c.path),await c.set(w,k);let m=await c.get();return K(m.data())},update:async(...d)=>{let g=d.pop(),x=d,b={...g};s&&(b[s]=a());let v=t(...x);await v.update(b);let k=await v.get();return K(k.data())},delete:async(...d)=>{await t(...d).delete();}}}function wn(e,t,n,r,o){let s={};return s.byList=async(a,l,i="in",u={})=>{if(l.length===0)return [];let y=[],d=pn(l,30);for(let g of d){let x=e;x=x.where(a,i,g),u.select&&u.select.length>0&&(x=x.select(...u.select.map(v=>String(v)))),(await x.get()).forEach(v=>{let k=K(v.data());y.push(u.returnDoc?{data:k,doc:v}:k);});}return y},t.forEach(a=>{let l=`by${pe(String(a))}`;s[l]=async(i,u={})=>{let y=typeof u=="boolean"?{returnDoc:u}:u;if(String(a)===o){let k=await r(i).get();if(!k.exists)return null;let w=K(k.data());return y.returnDoc?{data:w,doc:k}:w}let d=e;d=d.where(String(a),"==",i).limit(1),y.select&&y.select.length>0&&(d=d.select(...y.select.map(v=>String(v))));let g=await d.get();if(g.empty)return null;let x=g.docs[0];if(!x)return null;let b=K(x.data());return y.returnDoc?{data:b,doc:x}:b};}),s}function Rn(e,t,n,r){let o={},s=async(a,l)=>{if(!n||!r||l.length===0)return a;let i=l.map(u=>typeof u=="string"?{key:u}:{key:u.relation,select:u.select});return Promise.all(a.map(async u=>{let y=await Promise.all(i.map(async({key:g,select:x})=>{let b=n[g];if(!b)return [g,void 0];let v=r[b.repo];if(!v)return [g,void 0];let k=u[g];if(k==null)return [g,b.type==="one"?null:[]];let w=x?{select:x}:void 0;try{if(b.type==="one"){let c=`by${pe(b.key)}`,f=typeof v.get?.[c]=="function"?await v.get[c](k,w):null;return [g,f]}else {let c=`by${pe(b.key)}`,f=typeof v.query?.[c]=="function"?await v.query[c](k,w):[];return [g,f]}}catch(c){return console.error(`[include] Error populating "${g}":`,c),[g,b.type==="one"?null:[]]}})),d={};for(let[g,x]of y)g!==void 0&&(d[g]=x);return {...u,populated:d}}))};return t.forEach(a=>{let l=`by${pe(a)}`;o[l]=async(i,u={})=>{let y={...u,where:[[a,"==",i],...u.where??[]]};return (await Te(e,y)).docs.map(g=>K(g.data()))};}),o.by=async a=>(await Te(e,a)).docs.map(i=>K(i.data())),o.getAll=async(a={})=>(await Te(e,a)).docs.map(i=>K(i.data())),o.onSnapshot=(a,l,i)=>ge(e,a).onSnapshot(y=>{l(y.docs.map(d=>K(d.data())));},i),o.paginate=async a=>{let{include:l,...i}=a,u=await st(e,i);if(l&&l.length>0){let y=await s(u.data,l);return {...u,data:y}}return u},o.paginateAll=async function*(a){let{include:l,...i}=a;for await(let u of Tt(e,i))if(l&&l.length>0){let y=await s(u.data,l);yield {...u,data:y};}else yield u;},o}function Sn(e,t){return {populate:async(n,r)=>{if(!e.relationalKeys)return {...n,populated:{}};let o,s={};if(typeof r=="object"&&!Array.isArray(r))if("relation"in r){let i=r;o=[i.relation],i.select&&(s[i.relation]=i.select);}else if("relations"in r){let i=r;o=Array.isArray(i.relations)?i.relations:[i.relations],s=i.select??{};}else o=[];else o=Array.isArray(r)?r:[r];let a=await Promise.all(o.map(async i=>{let u=e.relationalKeys?.[i];if(!u)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let y=t[u.repo];if(!y)return console.warn(`[populate] Repository "${u.repo}" not found in mapping`),[i,void 0];let d=n[i];if(d==null)return [i,u.type==="one"?null:[]];let g=s[i],x=g?{select:g}:void 0;try{if(u.type==="one"){let b=`by${pe(u.key)}`,v=typeof y.get?.[b]=="function"?await y.get[b](d,x):null;return [i,v]}else {let b=`by${pe(u.key)}`,v=typeof y.query?.[b]=="function"?await y.query[b](d,x):[];return [i,v]}}catch(b){return console.error(`[populate] Error populating "${i}":`,b),[i,u.type==="one"?null:[]]}})),l={};for(let[i,u]of a)u!==void 0&&(l[i]=u);return {...n,populated:l}}}}var Wr=new Set([4,8,10,13,14]);function kn(e,t,n,r,o,s){let a=()=>new Date;return {backfillKeys:async(i={})=>{let{overwriteCreated:u=false,touchUpdated:y=true,overwritePath:d=false,pageSize:g=300,dryRun:x=false,maxAttempts:b=5,onError:v,onSuccess:k}=i,w=[],c=0,f=0,m=0,p=x?null:e.bulkWriter();p&&(p.onWriteError(R=>{let S=R?.code;if(R.failedAttempts<b&&S!==void 0&&Wr.has(S))return true;let C={path:R?.documentRef?.path??"(unknown)",error:R};return w.push(C),v?.(C),false}),k&&p.onWriteResult(R=>k(R.path)));let h;for(;;){let R=t.orderBy(firestore.FieldPath.documentId());h&&(R=R.startAfter(h)),R=R.limit(g);let S=await R.get();if(S.empty)break;for(let C of S.docs){c++;let T=C.data(),O={};if(n&&T[n]==null&&(O[n]=C.id),r&&(d||T[r]==null)&&T[r]!==C.ref.path&&(O[r]=C.ref.path),o&&(u||T[o]==null)&&(O[o]=a()),y&&s&&T[s]==null&&(O[s]=a()),Object.keys(O).length===0){m++;continue}f++,p&&p.set(C.ref,O,{merge:true});}if(S.size<g)break;h=S.docs[S.docs.length-1];}return p&&await p.close(),{scanned:c,written:f,skipped:m,failures:w}}}}function Tn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),l=await r.get(a);return l.exists?K({...l.data(),docId:l.id}):null},set:(...s)=>{let a=s[s.length-1],l=typeof a=="object"&&a!==null&&"merge"in a,i=l?s[s.length-2]:s[s.length-1],u=l?s.slice(0,-2):s.slice(0,-1),y=l?a:{merge:true},d=t(...u);r.set(d,i,y);},update:(...s)=>{let a=s[s.length-1],l=s.slice(0,-1),i=t(...l);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function Gr(e){if(typeof e!="function")return [];let n=e.toString().match(/^\s*(?:function\s*\w*\s*)?\(([^)]*)\)/);if(!n?.[1])return [];let r=n[1].split(",").map(o=>o.trim().replace(/\s*[:=].*$/,"").trim()).filter(Boolean);return r.length<=2?[]:r.slice(1,-1)}function Et(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...w)=>t.refCb(e,...w),a=wn(r,t.foreignKeys,o,s,t.documentKey),l=Rn(r,t.queryKeys,t.relationalKeys,n),i=hn(r),u=vn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),y=bn(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),d=Tn(e,s),g=xn(e,t.createdKey,t.updatedKey),x=kn(e,r,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),b=Sn(t,n),v=t.history,k=v?.enabled?gn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(w=>typeof w=="string"),t.path??"(unknown)",v):null;return {ref:r,documentRef:s,get:a,query:l,aggregate:i,...u,batch:y,transaction:d,bulk:g,system:x,...b,...k?{history:k}:{},_historySubcollection:k?v?.subcollection??"history":void 0,_historyConfig:v,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(w=>typeof w=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Gr(t.refCb):[],_createdKey:t.createdKey??null}}var Jr="history";function Xr(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 Cn(e,t){let{onDocumentWritten:n}=t.deps,r={};for(let[o,s]of Object.entries(e)){let a=s._historyConfig??(typeof s.history=="object"&&s.history!==null&&"enabled"in s.history?s.history:void 0);if(!a?.enabled)continue;let l=a.subcollection??Jr,i=a.ttl??t.defaults?.ttl,u=t.repos?.[o],y;if(s._isGroup){if(!u?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}y=u.triggerPath;}else y=u?.triggerPath??Xr(o,s);if(!y)continue;let d=s._systemKeys??[],g=d[0]??"docId",x=dt(a);r[`${o}_onHistory`]=n(y,async b=>{try{let v=b.data?.before?.data(),k=b.data?.after?.data(),w;if(!v&&k)w="create";else if(v&&!k)w="delete";else if(v&&k)w="update";else return;let c=String(k?.[g]??v?.[g]??b.params?.docId??b.data?.after?.id??b.data?.before?.id??"");if(!c)return;let f=at(v??{},k??{},{include:a.include,exclude:a.exclude,metaFields:x,systemKeys:d});if(w==="update"&&Object.keys(f).length===0)return;let m=ct(k??v??null,a),p=it({entityId:c,operation:w,changes:f,meta:m,config:a,ttlOverride:i}),h=b.data?.after?.ref??b.data?.before?.ref;if(!h)return;let R=h.collection(l);await lt(R,p,a,{repoName:o,docId:c,before:v??null,after:k??null});}catch(v){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,v);}});}return r}function Yr(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 eo(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var oe=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}=Yr(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=eo(t),s=null,a={};for(let u of this.routes){if(u.method!==r)continue;let y=o.match(u.pattern);if(y){s=u,a={},u.paramNames.forEach((d,g)=>{a[d]=decodeURIComponent(y[g+1]??"");});break}}let l=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(l,n,i);}catch(u){this.errorHandler(u,t,n);}}async runMiddlewareChain(t,n,r){let o=0,s=async()=>{if(o<this.middlewares.length){let a=this.middlewares[o++];await a(t,n,s);}else await r(t,n);};await s();}};function ne(e,t,n){let r=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let a=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=n??process.env.FUNCTION_REGION??"us-central1",i=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${a}/${l}/${i}${r}`}let o=process.env.K_SERVICE,s=e?.hostname??e?.headers?.host??"";return o&&typeof s=="string"&&s.includes("cloudfunctions.net")?`/${o.toLowerCase()}${r}`:r}function An(e){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e[0];return typeof t=="string"?t:void 0}}function he(e){return !!e&&typeof e=="object"&&e.__authExtension===true}qe();var be="__sync_version";var oo=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function so(e){let t=e,n=false;for(;;){let r=U(t);if(!oo.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var ao={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Dn(e,t,n,r,o,s,a,l){for(let[i,u]of Object.entries(e)){let y=n?`${n}__${i}`:i;if(o.has(i)||o.has(y))continue;let{inner:d,nullable:g}=so(u),x=U(d),b=r||g;if(x==="ZodObject"){let c=re(d);Dn(c,t,y,b,o,s,a,l);continue}let v=ao[x]??"json",k=y===a||i===a,w=s[y]??s[i]??y;l.push({name:w,sqlType:t.mapType(v),nullable:k?false:b,isPrimaryKey:k});}}function pt(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),l=re(e),i=[];return Dn(l,t,"",false,a,s,r,i),i.some(u=>u.name===be)||i.push({name:be,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}function In(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(In)):e}var io=32,lo=5e3;function _n(e,t,n,r=new WeakSet,o=0){if(o>io){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,a]of Object.entries(e)){if(Object.keys(n).length>=lo)break;let l=t?`${t}__${s}`:s;a!=null&&typeof a=="object"&&!Array.isArray(a)&&!(a instanceof Date)&&!Buffer.isBuffer(a)&&!(a instanceof Uint8Array)&&typeof a.toDate!="function"&&!("latitude"in a&&"longitude"in a)?_n(a,l,n,r,o+1):n[l]=In(a);}r.delete(e);}function Ke(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};_n(e,"",o);let s={};for(let[a,l]of Object.entries(o)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let u=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[u]=l;}return s}function fe(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>
@@ -58,7 +58,7 @@ ${n}
58
58
  <form method="POST" action="${b}/${v.name}/force-sync">
59
59
  <button type="submit" class="btn btn-primary">Start Force Sync</button>
60
60
  </form>
61
- </div>`);ye(x,k);}),d.post(`${i}/:repoName/force-sync`,async(g,x)=>{let b=ne(g,i),v=y.find(C=>C.name===g.params.repoName);if(!v){Pe(x,{error:`Unknown repo: ${g.params.repoName}`},404);return}let k=v.repo.ref;if(!k){Pe(x,{error:`No collection reference for "${v.name}"`},400);return}let w=0,c=0,f=[],m=500,p=k.limit(m),h=null;try{for(;;){let O=await(h?p.startAfter(h):p).get();if(O.empty)break;for(let A of O.docs){let E=A.data(),$=String(E[v.documentKey]??A.id),P=Ke(E,{exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap});try{await r({operation:"UPSERT",repoName:v.name,docId:$,data:P,timestamp:new Date().toISOString()}),w++;}catch(F){c++;let j=F?.message??String(F);console.error(`[ForceSync:${v.name}] doc=${$} failed:`,F),f.length<5&&f.push(`${$}: ${j}`);}}if(h=O.docs[O.docs.length-1],O.docs.length<m)break}let C=n.get(v.name);C&&await C.flush();}catch(C){if(ft(g)){Pe(x,{error:C?.message??String(C),synced:w,errors:c},500);return}ye(x,fe(`Force Sync: ${v.name}`,b,`<div class="card">
61
+ </div>`);ye(x,k);}),d.post(`${i}/:repoName/force-sync`,async(g,x)=>{let b=ne(g,i),v=y.find(C=>C.name===g.params.repoName);if(!v){Pe(x,{error:`Unknown repo: ${g.params.repoName}`},404);return}let k=v.repo.ref;if(!k){Pe(x,{error:`No collection reference for "${v.name}"`},400);return}let w=0,c=0,f=[],m=500,p=k.limit(m),h=null;try{for(;;){let O=await(h?p.startAfter(h):p).get();if(O.empty)break;for(let A of O.docs){let E=A.data(),$=String(E[v.documentKey]??A.id),P=Ke(E,{exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap});try{await r({operation:"UPSERT",repoName:v.name,docId:$,data:P,timestamp:new Date().toISOString()}),w++;}catch(_){c++;let j=_?.message??String(_);console.error(`[ForceSync:${v.name}] doc=${$} failed:`,_),f.length<5&&f.push(`${$}: ${j}`);}}if(h=O.docs[O.docs.length-1],O.docs.length<m)break}let C=n.get(v.name);C&&await C.flush();}catch(C){if(ft(g)){Pe(x,{error:C?.message??String(C),synced:w,errors:c},500);return}ye(x,fe(`Force Sync: ${v.name}`,b,`<div class="card">
62
62
  <p class="badge badge-err">Error: ${C?.message??String(C)}</p>
63
63
  <p>Synced ${w} docs before failure (${c} errors).</p>
64
64
  </div>`),500);return}if(ft(g)){Pe(x,{repo:v.name,table:v.tableName,synced:w,errors:c,...f.length>0&&{errorSamples:f}});return}let R=f.length>0?`<details style="margin-top:1rem"><summary>First ${f.length} error(s)</summary>
@@ -81,7 +81,7 @@ ${n}
81
81
  ${p("BigQuery",m.bigquery)}
82
82
  ${p("Pub/Sub",m.pubsub)}
83
83
  ${p("Firestore",m.firestore)}
84
- </div>`);ye(x,S);}),async(g,x)=>{await d.handle(g,x);}}var lo="firestore-sync";function co(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 _n(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??lo,l={},i=new Map;function u(d){let g=i.get(d);return g||(g=s.topic(d),i.set(d,g),g)}async function y(d,g){await u(d).publishMessage({json:g});}for(let[d,g]of Object.entries(e)){let x=t?.repos?.[d],b;if(g._isGroup){if(!x?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${d}". Provide a triggerPath in the sync repos config for group collections.`);continue}b=x.triggerPath;}else b=x?.triggerPath??co(d,g);if(!b)continue;let v=g._systemKeys?.[0]??"docId",k=`${a}-${d}`;l[`${d}_onCreate`]=n(b,async w=>{let c=w.data;if(!c)return;let f=c.data();if(!f)return;let m=String(f[v]??c.id),p=Ke(f,{exclude:x?.exclude,columnMap:x?.columnMap}),h={operation:"INSERT",repoName:d,docId:m,data:p,timestamp:new Date().toISOString(),version:Date.now()};await y(k,h);}),l[`${d}_onUpdate`]=r(b,async w=>{let c=w.data?.after;if(!c)return;let f=c.data();if(!f)return;let m=String(f[v]??c.id),p=Ke(f,{exclude:x?.exclude,columnMap:x?.columnMap}),h={operation:"UPSERT",repoName:d,docId:m,data:p,timestamp:new Date().toISOString(),version:Date.now()};await y(k,h);}),l[`${d}_onDelete`]=o(b,async w=>{let c=w.data;if(!c)return;let f=c.data(),m=String(f?.[v]??c.id),p={operation:"DELETE",repoName:d,docId:m,data:null,timestamp:new Date().toISOString(),version:Date.now()};await y(k,p);});}return l}function Nn(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function jn(e,t){let n=Nn(e),r=Nn(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var yt=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 a=n.get(s.docId);if(!a)n.set(s.docId,s.data);else {let l=Number(a[be]??0);Number(s.data[be]??0)>=l&&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 Mn=new Set,Pt=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 uo(e,t,n,r,o,s,a){if(Mn.has(e))return;let l=pt(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:l});else if(t.getTableColumnsWithTypes){let u=await t.getTableColumnsWithTypes(r),y=[];for(let d of l){let g=u.get(d.name);if(g===void 0){y.push(d);continue}if(t.dialect.name==="bigquery"&&!jn(g,d.sqlType))throw new Pt(r,d.name,g,d.sqlType)}y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}else {let u=new Set(await t.getTableColumns(r)),y=l.filter(d=>!u.has(d.name));y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}Mn.add(e);}function Hn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:l="firestore-sync",maxDlqAttempts:i=5,workerOptions:u,repos:y={}}=t,d=new Map;function g(v,k){let w=d.get(v);if(w)return w;let f=y[v]?.tableName??v,m=`${l}-${v}-dlq`,p=n.pubsub.topic(m),h=false,R=async()=>{if(!h){try{await p.create(),console.info(`[SyncWorker] Created DLQ topic "${m}"`);}catch(C){if(C?.code!==6)throw C}h=true;}},S=async(C,T)=>{console.error(`[SyncWorker] Flush failed for "${v}" (${C.length} events):`,T),await R(),await Promise.all(C.map(O=>{let A=(O.attempts??0)+1;if(i>0&&A>i)return console.error(`[SyncWorker] Dropping event for "${v}" after ${A-1} DLQ attempts:`,{docId:O.docId,operation:O.operation}),Promise.resolve();let E={...O,attempts:A,firstFailedAt:O.firstFailedAt??Date.now()};return p.publishMessage({json:E})}));};return w=new yt({adapter:r,tableName:f,primaryKey:k,batchSize:o,flushIntervalMs:s,onFlushError:S}),d.set(v,w),w}async function x(v){let{repoName:k}=v,w=e[k];if(!w){console.warn(`[SyncWorker] Unknown repo "${k}", skipping event`);return}let c=w._systemKeys?.[0]??w.documentKey??"docId",f=y[k],m=f?.columnMap,p=m?.[c]??c;if(a){let R=w.schema??void 0;if(R){let S=f?.tableName??k;await uo(k,r,R,S,c,f?.exclude,m);}}let h=g(k,p);v.data&&(v.data[be]=v.version??Date.now()),h.enqueue(v);}function b(v){let k=async w=>{let c=w.data?.message?.json??w.data?.json;if(!c){console.warn("[SyncWorker] Received empty PubSub message");return}await x(c);let f=d.get(c.repoName);f&&await f.flush();};return u?n.pubsubHandler.onMessagePublished({topic:v,...u},k):n.pubsubHandler.onMessagePublished(v,k)}return {handleMessage:x,createHandler:b,queues:d,async shutdown(){let v=[];for(let k of d.values())v.push(k.shutdown());await Promise.all(v);}}}var po="firestore-sync";function Bn(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 zn(e,t){let{deps:n,adapter:r,topicPrefix:o=po,batchSize:s,flushIntervalMs:a,autoMigrate:l,admin:i,workerOptions:u,repos:y}=t,d=Bn(n.pubsub),g=Bn(r),x=_n(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:d},topicPrefix:o,repos:y}),b=Hn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:d},adapter:g,batchSize:s,flushIntervalMs:a,autoMigrate:l,topicPrefix:o,workerOptions:u,repos:y}),v={};for(let c of Object.keys(e))v[`sync_${c}`]=b.createHandler(`${o}-${c}`);let k=null;i&&(k=Fn(e,g,b.queues,b.handleMessage,i,y??{},d,o),v.adminsync=i.onRequest?i.httpsOptions?i.onRequest(i.httpsOptions,k):i.onRequest(k):k);let w={functions:{...x,...v},adminHandler:k,handleMessage:b.handleMessage,queues:b.queues,shutdown:b.shutdown};for(let c of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(w,c,{enumerable:false});return w}qe();qe();function fo(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Zn(e){let t=e,n=true,r=false,o;for(;;){let s=q(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=$n(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function le(e,t=""){if(q(e)==="ZodObject"){let r=re(e);return Object.entries(r).map(([o,s])=>Ln(t?`${t}.${o}`:o,o,s))}return [Ln(t||"value",t||"value",e)]}function Ln(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=Zn(n),l=q(r),i=fo(t.split(".").pop()??t);switch(l){case "ZodString":{let u=En(r),y=u.includes("email"),d=u.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:y?"email":d?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:i,type:"number",required:o,nullable:s,defaultValue:a};case "ZodBoolean":return {name:e,label:i,type:"checkbox",required:o,nullable:s,defaultValue:a};case "ZodDate":case "ZodCoerce":return {name:e,label:i,type:"datetime-local",required:o,nullable:s,defaultValue:a};case "ZodEnum":{let u=Ze(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:u}}case "ZodNativeEnum":{let u=Le(r),y=Object.values(u).filter(d=>typeof d=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:y}}case "ZodLiteral":{let u=String(ut(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[u]}}case "ZodObject":{let u=le(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:u,hint:"JSON object"}}case "ZodArray":{let u=On(r);if(!u)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:y}=Zn(u),d=q(y),g,x,b;switch(d){case "ZodString":g="text";break;case "ZodNumber":case "ZodBigInt":g="number";break;case "ZodBoolean":g="checkbox";break;case "ZodDate":g="datetime-local";break;case "ZodEnum":g="select",x=Ze(y);break;case "ZodNativeEnum":g="select",x=Object.values(Le(y)).filter(v=>typeof v=="string");break;case "ZodObject":g="object",b=le(y);break;default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"}}return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,arrayElementType:g,arrayElementOptions:x,arrayElementFields:b}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function Dt(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",a=e.defaultValue==="__null__",l=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
84
+ </div>`);ye(x,S);}),async(g,x)=>{await d.handle(g,x);}}var co="firestore-sync";function uo(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 Nn(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??co,l={},i=new Map;function u(d){let g=i.get(d);return g||(g=s.topic(d),i.set(d,g),g)}async function y(d,g){await u(d).publishMessage({json:g});}for(let[d,g]of Object.entries(e)){let x=t?.repos?.[d],b;if(g._isGroup){if(!x?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${d}". Provide a triggerPath in the sync repos config for group collections.`);continue}b=x.triggerPath;}else b=x?.triggerPath??uo(d,g);if(!b)continue;let v=g._systemKeys?.[0]??"docId",k=`${a}-${d}`;l[`${d}_onCreate`]=n(b,async w=>{let c=w.data;if(!c)return;let f=c.data();if(!f)return;let m=String(f[v]??c.id),p=Ke(f,{exclude:x?.exclude,columnMap:x?.columnMap}),h={operation:"INSERT",repoName:d,docId:m,data:p,timestamp:new Date().toISOString(),version:Date.now()};await y(k,h);}),l[`${d}_onUpdate`]=r(b,async w=>{let c=w.data?.after;if(!c)return;let f=c.data();if(!f)return;let m=String(f[v]??c.id),p=Ke(f,{exclude:x?.exclude,columnMap:x?.columnMap}),h={operation:"UPSERT",repoName:d,docId:m,data:p,timestamp:new Date().toISOString(),version:Date.now()};await y(k,h);}),l[`${d}_onDelete`]=o(b,async w=>{let c=w.data;if(!c)return;let f=c.data(),m=String(f?.[v]??c.id),p={operation:"DELETE",repoName:d,docId:m,data:null,timestamp:new Date().toISOString(),version:Date.now()};await y(k,p);});}return l}function jn(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function Mn(e,t){let n=jn(e),r=jn(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var yt=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 a=n.get(s.docId);if(!a)n.set(s.docId,s.data);else {let l=Number(a[be]??0);Number(s.data[be]??0)>=l&&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 Hn=new Set,Pt=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 po(e,t,n,r,o,s,a){if(Hn.has(e))return;let l=pt(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:l});else if(t.getTableColumnsWithTypes){let u=await t.getTableColumnsWithTypes(r),y=[];for(let d of l){let g=u.get(d.name);if(g===void 0){y.push(d);continue}if(t.dialect.name==="bigquery"&&!Mn(g,d.sqlType))throw new Pt(r,d.name,g,d.sqlType)}y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}else {let u=new Set(await t.getTableColumns(r)),y=l.filter(d=>!u.has(d.name));y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}Hn.add(e);}function Bn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:l="firestore-sync",maxDlqAttempts:i=5,workerOptions:u,repos:y={}}=t,d=new Map;function g(v,k){let w=d.get(v);if(w)return w;let f=y[v]?.tableName??v,m=`${l}-${v}-dlq`,p=n.pubsub.topic(m),h=false,R=async()=>{if(!h){try{await p.create(),console.info(`[SyncWorker] Created DLQ topic "${m}"`);}catch(C){if(C?.code!==6)throw C}h=true;}},S=async(C,T)=>{console.error(`[SyncWorker] Flush failed for "${v}" (${C.length} events):`,T),await R(),await Promise.all(C.map(O=>{let A=(O.attempts??0)+1;if(i>0&&A>i)return console.error(`[SyncWorker] Dropping event for "${v}" after ${A-1} DLQ attempts:`,{docId:O.docId,operation:O.operation}),Promise.resolve();let E={...O,attempts:A,firstFailedAt:O.firstFailedAt??Date.now()};return p.publishMessage({json:E})}));};return w=new yt({adapter:r,tableName:f,primaryKey:k,batchSize:o,flushIntervalMs:s,onFlushError:S}),d.set(v,w),w}async function x(v){let{repoName:k}=v,w=e[k];if(!w){console.warn(`[SyncWorker] Unknown repo "${k}", skipping event`);return}let c=w._systemKeys?.[0]??w.documentKey??"docId",f=y[k],m=f?.columnMap,p=m?.[c]??c;if(a){let R=w.schema??void 0;if(R){let S=f?.tableName??k;await po(k,r,R,S,c,f?.exclude,m);}}let h=g(k,p);v.data&&(v.data[be]=v.version??Date.now()),h.enqueue(v);}function b(v){let k=async w=>{let c=w.data?.message?.json??w.data?.json;if(!c){console.warn("[SyncWorker] Received empty PubSub message");return}await x(c);let f=d.get(c.repoName);f&&await f.flush();};return u?n.pubsubHandler.onMessagePublished({topic:v,...u},k):n.pubsubHandler.onMessagePublished(v,k)}return {handleMessage:x,createHandler:b,queues:d,async shutdown(){let v=[];for(let k of d.values())v.push(k.shutdown());await Promise.all(v);}}}var fo="firestore-sync";function zn(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 Zn(e,t){let{deps:n,adapter:r,topicPrefix:o=fo,batchSize:s,flushIntervalMs:a,autoMigrate:l,admin:i,workerOptions:u,repos:y}=t,d=zn(n.pubsub),g=zn(r),x=Nn(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:d},topicPrefix:o,repos:y}),b=Bn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:d},adapter:g,batchSize:s,flushIntervalMs:a,autoMigrate:l,topicPrefix:o,workerOptions:u,repos:y}),v={};for(let c of Object.keys(e))v[`sync_${c}`]=b.createHandler(`${o}-${c}`);let k=null;i&&(k=Fn(e,g,b.queues,b.handleMessage,i,y??{},d,o),v.adminsync=i.onRequest?i.httpsOptions?i.onRequest(i.httpsOptions,k):i.onRequest(k):k);let w={functions:{...x,...v},adminHandler:k,handleMessage:b.handleMessage,queues:b.queues,shutdown:b.shutdown};for(let c of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(w,c,{enumerable:false});return w}qe();qe();function yo(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Ln(e){let t=e,n=true,r=false,o;for(;;){let s=U(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=$n(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function le(e,t=""){if(U(e)==="ZodObject"){let r=re(e);return Object.entries(r).map(([o,s])=>Un(t?`${t}.${o}`:o,o,s))}return [Un(t||"value",t||"value",e)]}function Un(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=Ln(n),l=U(r),i=yo(t.split(".").pop()??t);switch(l){case "ZodString":{let u=Pn(r),y=u.includes("email"),d=u.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:y?"email":d?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:i,type:"number",required:o,nullable:s,defaultValue:a};case "ZodBoolean":return {name:e,label:i,type:"checkbox",required:o,nullable:s,defaultValue:a};case "ZodDate":case "ZodCoerce":return {name:e,label:i,type:"datetime-local",required:o,nullable:s,defaultValue:a};case "ZodEnum":{let u=Ze(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:u}}case "ZodNativeEnum":{let u=Le(r),y=Object.values(u).filter(d=>typeof d=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:y}}case "ZodLiteral":{let u=String(Ue(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[u]}}case "ZodUnion":{let u=En(r);if(u.length>0&&u.every(d=>U(d)==="ZodLiteral")){let d=u.map(g=>String(Ue(g)??""));return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:d}}return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}case "ZodObject":{let u=le(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:u,hint:"JSON object"}}case "ZodArray":{let u=On(r);if(!u)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:y}=Ln(u),d=U(y),g,x,b;switch(d){case "ZodString":g="text";break;case "ZodNumber":case "ZodBigInt":g="number";break;case "ZodBoolean":g="checkbox";break;case "ZodDate":g="datetime-local";break;case "ZodEnum":g="select",x=Ze(y);break;case "ZodNativeEnum":g="select",x=Object.values(Le(y)).filter(v=>typeof v=="string");break;case "ZodObject":g="object",b=le(y);break;default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"}}return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,arrayElementType:g,arrayElementOptions:x,arrayElementFields:b}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function Dt(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",a=e.defaultValue==="__null__",l=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=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="${a?"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" ${a?"checked":""}
@@ -118,7 +118,7 @@ ${n}
118
118
  ${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
119
119
  ${(e.options??[]).map(y=>`<option value="${N(y)}"${l===y?" selected":""}>${N(y)}</option>`).join(`
120
120
  `)}
121
- </select>`;break;case "textarea":if(e.arrayElementType)return yo(e,t);if(e.nested&&e.nested.length>0){let y=e.nested.map(d=>Dt(d,t+1)).join(`
121
+ </select>`;break;case "textarea":if(e.arrayElementType)return mo(e,t);if(e.nested&&e.nested.length>0){let y=e.nested.map(d=>Dt(d,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">
@@ -142,7 +142,7 @@ ${n}
142
142
  <div class="flex-1 min-w-0">${u}</div>
143
143
  ${i}
144
144
  </div>
145
- </div>`}function N(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function yo(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.defaultValue==="__null__",s=e.arrayElementType==="object",a=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{a=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(a)||(a=[]);let l=s?a.map(y=>Kn(e,y??{})).join(`
145
+ </div>`}function N(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function mo(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.defaultValue==="__null__",s=e.arrayElementType==="object",a=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{a=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(a)||(a=[]);let l=s?a.map(y=>Kn(e,y??{})).join(`
146
146
  `):a.map(y=>qn(e,y)).join(`
147
147
  `),i=s?Kn(e,{}):qn(e,""),u=e.nullable?`<span class="flex items-center gap-1 mt-2">
148
148
  <input type="hidden" id="${r}__isnull" name="${N(e.name)}__isnull" value="${o?"1":""}">
@@ -216,7 +216,7 @@ ${n}
216
216
  <button type="submit" class="btn btn-primary btn-sm">${N(r)}</button>
217
217
  <button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
218
218
  </div>
219
- </form>`}var mo=new Set(["<","<=",">",">=","!="]),go=new Set(["array-contains","array-contains-any"]);function It(e){return e==="desc"?"DESCENDING":"ASCENDING"}function ho(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function bo(e,t,n,r,o){let s=[],a=new Set;for(let i of r)if(i.op==="=="||i.op==="in"||i.op==="not-in"){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,order:"ASCENDING"});}for(let i of r)if(go.has(i.op)){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,arrayConfig:"CONTAINS"});}for(let i of r)if(mo.has(i.op)){if(a.has(i.field))continue;a.add(i.field);let u=o?.field===i.field?It(o.dir):"ASCENDING";s.push({fieldPath:i.field,order:u});}if(o&&!a.has(o.field)&&s.push({fieldPath:o.field,order:It(o.dir)}),s.length===1&&n)return wo(e,t,s[0]);let l=o&&s.some(i=>i.fieldPath===o.field)?It(o.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:l}),xo(e,t,n,s)}function xo(e,t,n,r,o="(default)"){let s=`projects/${e}/databases/${o}/collectionGroups/${t}/indexes/_`,a=[...Nt(1,s),...mt(2,n?2:1)];for(let u of r)a.push(...Un(3,Qn(u)));let l=o==="(default)"?"-default-":o,i=encodeURIComponent(Vn(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${l}/indexes?create_composite=${i}`}function vo(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function Ft(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function _t(e,t){return e<<3|t}function Nt(e,t){let n=Array.from(new TextEncoder().encode(t));return [_t(e,2),...Ft(n.length),...n]}function mt(e,t){return [_t(e,0),...Ft(t)]}function Un(e,t){return [_t(e,2),...Ft(t.length),...t]}function Qn(e){let t=[...Nt(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...mt(3,1)):t.push(...mt(2,e.order==="DESCENDING"?2:1)),t}function Vn(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 wo(e,t,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...Nt(1,o),...mt(2,2),...Un(3,Qn(n))],a=r==="(default)"?"-default-":r,l=encodeURIComponent(Vn(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${l}`}function Ro(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 Ce(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Ue(e,t){let n=e??{},r=Ce(e),o;if(r&&(o=n.message?vo(n.message):void 0,!o)){let s=Ro(t.ref);if(s){let a=ho(t.path);o=bo(s,a,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}}gt();var Gn=`// \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
219
+ </form>`}var go=new Set(["<","<=",">",">=","!="]),ho=new Set(["array-contains","array-contains-any"]);function It(e){return e==="desc"?"DESCENDING":"ASCENDING"}function bo(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function xo(e,t,n,r,o){let s=[],a=new Set;for(let i of r)if(i.op==="=="||i.op==="in"||i.op==="not-in"){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,order:"ASCENDING"});}for(let i of r)if(ho.has(i.op)){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,arrayConfig:"CONTAINS"});}for(let i of r)if(go.has(i.op)){if(a.has(i.field))continue;a.add(i.field);let u=o?.field===i.field?It(o.dir):"ASCENDING";s.push({fieldPath:i.field,order:u});}if(o&&!a.has(o.field)&&s.push({fieldPath:o.field,order:It(o.dir)}),s.length===1&&n)return Ro(e,t,s[0]);let l=o&&s.some(i=>i.fieldPath===o.field)?It(o.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:l}),vo(e,t,n,s)}function vo(e,t,n,r,o="(default)"){let s=`projects/${e}/databases/${o}/collectionGroups/${t}/indexes/_`,a=[...Nt(1,s),...mt(2,n?2:1)];for(let u of r)a.push(...Qn(3,Vn(u)));let l=o==="(default)"?"-default-":o,i=encodeURIComponent(Wn(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${l}/indexes?create_composite=${i}`}function wo(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function _t(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function Ft(e,t){return e<<3|t}function Nt(e,t){let n=Array.from(new TextEncoder().encode(t));return [Ft(e,2),..._t(n.length),...n]}function mt(e,t){return [Ft(e,0),..._t(t)]}function Qn(e,t){return [Ft(e,2),..._t(t.length),...t]}function Vn(e){let t=[...Nt(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...mt(3,1)):t.push(...mt(2,e.order==="DESCENDING"?2:1)),t}function Wn(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 Ro(e,t,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...Nt(1,o),...mt(2,2),...Qn(3,Vn(n))],a=r==="(default)"?"-default-":r,l=encodeURIComponent(Wn(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${l}`}function So(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 Ce(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Qe(e,t){let n=e??{},r=Ce(e),o;if(r&&(o=n.message?wo(n.message):void 0,!o)){let s=So(t.ref);if(s){let a=bo(t.path);o=xo(s,a,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}}gt();var Jn=`// \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
220
220
  function frsGetBasePath() {
221
221
  var root = document.querySelector("[data-frs-panel-root]");
222
222
  var bp = root && root.getAttribute("data-frs-base-path");
@@ -1143,7 +1143,7 @@ function initColumnReorder(table) {
1143
1143
  });
1144
1144
  });
1145
1145
  }
1146
- `;function Qe(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Gn}})}Bt();function ve(e){return "<!DOCTYPE html>"+server.renderToString(e)}var Io=["corporate","silk","dark"],Fo=()=>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:Io.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))})]}),we=({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(Fo,{})})]}),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((a,l)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},l):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},l))})}),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(Ht,{basePath:s}),jsxRuntime.jsx(Qe,{})]})]})};function zt(e,t){return ve(jsxRuntime.jsx(we,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Zt(e,t){return ve(jsxRuntime.jsx(we,{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 er=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],_o=[{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"}],No=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function jo(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return _o;case "ZodBoolean":return er;case "ZodArray":return No;default:return er}}var Re="__null__";function Mo(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="${Re}"]');if(!o){o=document.createElement('option');o.value='${Re}';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='${Re}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${Re}"][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!=='${Re}')?i.dataset._prev:'';}}})(this)`}function Ho(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 We({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:Mo(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Bo({col:e,active:t}){let n=t?.value??"",r=n===Re,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,a=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let l=new Set(n.split(",").map(u=>u.trim()).filter(Boolean)),i=`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(u=>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:u,checked:l.has(u),"data-enum-group":i,onchange:Ho(o,i)}),jsxRuntime.jsx("span",{children:u})]},u))]})}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(l=>jsxRuntime.jsx("option",{value:l,selected:n===l,children:l},l)),e.nullable&&jsxRuntime.jsx("option",{value:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(We,{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:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(We,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let l=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:l?"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(We,{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(We,{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(We,{inputId:o,active:r})]})}function Lt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(i=>[i.field,i])),s=n.length>0,a=n.length>=2||r&&s,l=t.filter(i=>i.zodType!=="ZodObject"&&i.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:l.map(i=>{let u=jo(i.zodType),y=o[i.name],d=y?.op??u[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:i.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(g=>jsxRuntime.jsx("option",{value:g.value,selected:g.value===d,children:g.label},g.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:u[0].value}),jsxRuntime.jsx(Bo,{col:i,active:y})]})]},i.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"}),a&&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 qt(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,l=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 ve(jsxRuntime.jsx(we,{opts:{title:a,breadcrumb:l,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}})})})}))}gt();Mt();function Kt(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 tr(e,t,n,r,o){let s=Kt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function zo(e,t,n,r){let o=Kt(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 Zo(e,t,n){return `?${Kt(t,n,e).toString()}`}function Ut(e,t,n,r,o,s,a=[],l=[],i=false,u=[],y,d,g,x,b,v,k,w=false){let c=`${r}/${e}`,f=`${c}/create`,m={};if(k)for(let T of n)m[T]=Fe(_e(k,T));let p=(v??[]).filter(T=>{let O=m[T]??Fe(_e(k,T));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),h=p.length>0,R=i,S=R||h,C=p.map(T=>{let O=_e(k,T),A=Fe(O),E=a.find($=>$.name===T);return {name:T,type:A,enumValues:E?.enumValues??null,nullable:E?.nullable??false}});return ve(jsxRuntime.jsxs(we,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Lt,{action:c,columnMeta:a,activeFilters:l,isGroup:x}),g&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${g.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:g.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:g.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:g.message})]}),g.indexUrl&&jsxRuntime.jsx("a",{href:g.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 b=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of"," ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:b})]})," ","document",(typeof b=="number"?b: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(T=>jsxRuntime.jsx("a",{href:Zo(T,l,y),class:`join-item btn btn-xs ${d===T?"btn-active btn-primary":"btn-outline"}`,children:T},T))})]})]}),jsxRuntime.jsx("a",{href:f,class:"btn btn-primary btn-sm",children:"+ New"})]}),S&&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 b=="number"?String(b):"","data-frs-page-size":String(d??t.length),"data-frs-allow-delete":R?"1":"0","data-frs-allow-update":h?"1":"0","data-frs-fields":JSON.stringify(C),"data-frs-filters":JSON.stringify(l),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof b=="number"&&b>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",b," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",b??"?"," 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:[h&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),R&&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:[S&&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((T,O)=>{let A=y?.field===T,E=A?y.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:zo(T,y,l,d),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[T,E]})},O)}),u.map((T,O)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:T.column},`rel-${O}`)),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+u.length+1+(S?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((T,O)=>{let A=String(T.docId??T.id??""),E=`${r}/${e}/${encodeURIComponent(A)}/edit`,$=`${r}/${e}/${encodeURIComponent(A)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":A,children:[S&&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:A,"aria-label":`Select ${A}`})}),n.map((P,F)=>{let j=T[P],_=m[P],D=_?Ve(_,j):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Ie,{val:j,mismatch:D})},F)}),u.map((P,F)=>{let j=T[P.key];if(j==null||j==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${F}`);let _=P.type==="one"?`${r}/${P.targetRepo}/${encodeURIComponent(String(j))}/edit`:`${r}/${P.targetRepo}?fv_${P.targetKey}=${encodeURIComponent(String(j))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:_,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":P.type,"data-frs-rel-repo":P.targetRepo,"data-frs-rel-fk":P.targetKey,"data-frs-rel-val":String(j),"data-frs-rel-label":P.column,children:P.column})},`rel-${F}`)}),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"}),w&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(A)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),i&&jsxRuntime.jsx("form",{method:"post",action:$,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},O)})})]})}),(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:tr(l,o.prevCursor,"prev",y,d),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:tr(l,o.nextCursor,"next",y,d),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof b=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[b," total document",b!==1?"s":"",l.length>0?" matching filters":""]})]}),S&&h&&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"}),p.map(T=>jsxRuntime.jsx("option",{value:T,children:T},T))]})]}),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"})})]})]}))}function Ge(e,t){return zt(e,t)}function Qt(e,t){return Zt(e,t)}function Vt(e,t,n,r,o,s,a,l,i,u,y,d,g,x,b,v,k,w){return Ut(e,t,n,r,o,s,a,l,i,u,y,d,g,x,b,v,k,w)}function Se(e,t,n,r,o,s){return qt(e,t,n,r,o,s)}var Wt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Uo(){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>=Wt.length*4||(e+=Wt.charAt(r%Wt.length));}}return e}function bt(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 Ne(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 Gt(e,t,n){let r=e.documentKey??"docId",o=Ue(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 H(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Jt(e,t){e.status(302).set("Location",t).send("");}function Xt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=en(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let u={},y=false;for(let[x,b]of Object.entries(e))x.startsWith(`${o}.`)&&(u[x.slice(o.length+1)]=b,y=true);if(y){let x=s;for(;;){let b=q(x);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")x=G(x);else break}r[o]=Xt(u,x);continue}let d=e[o],g=Array.isArray(d)?d[d.length-1]:d;if(g)try{r[o]=JSON.parse(g);}catch{r[o]=g;}continue}let l=e[o],i=Array.isArray(l)?l[l.length-1]:l;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?r[o]=null:r[o]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(i);break;case "ZodDate":r[o]=new Date(i);break;case "ZodArray":try{r[o]=JSON.parse(i);}catch{r[o]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{r[o]=JSON.parse(i);break}catch{}r[o]=i;}}return r}function nr(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 en(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Qo(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function or(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=G(t);continue}return false}}function sr(e){let t=Qo(e),n=q(t);if(n==="ZodEnum"){let r=Ze(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Le(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=ut(t);return typeof r=="string"?[r]:void 0}}function ar(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,a=e[o];if(a===null){r[s]="__null__";continue}if(a===void 0)continue;let l=t.shape[o];for(;;){let u=q(l);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")l=G(l);else break}let i=q(l);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let u=ar(a,l,s);Object.assign(r,u);}else if(i==="ZodDate"){let u=nr(a);u!==null&&(r[s]=u);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let u=nr(a);r[s]=u??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function Yt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Yt(n.nested,t):void 0}))}function Vo(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 a=o.slice(3);if(!t.has(a))continue;let l=(s??"").trim();if(!l)continue;let i=e[`fo_${a}`]??"==",u=n.has(i)?i:"==";r.push({field:a,op:u,value:l});}return r}function rr(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 ir(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,a=t.shape[o];if(!a){r.push({name:s,zodType:"ZodString"});continue}let l=en(a);if(l==="ZodObject"){let i=a;for(;;){let y=q(i);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")i=G(i);else break}let u=re(i);r.push(...ir(Object.keys(u),i,s));}else r.push({name:s,zodType:l,nullable:or(a),enumValues:sr(a)});}return r}function Wo(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let a=q(r);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")r=G(r);else break}let s=re(r);if(!(o in s))return null;r=s[o];}return r}function Oe(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let a=s.indexOf(".");if(a===-1)n.push(s);else {let l=s.slice(0,a),i=s.slice(a+1);r.has(l)||r.set(l,[]),r.get(l).push(i);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let l=e.shape[s];for(;;){let i=q(l);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")l=G(l);else break}if(q(l)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Oe(l,a);}return zod.z.object(o)}function me(e,t,n){return ne(e,t,n)}function lr(e,t,n){let r=(c,f)=>{let m=me(c,t,n),p=Object.values(e).map(h=>({name:h.name,path:h.path}));H(f,Qt(p,m));},o=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=p.pageSize??25,R=c.query??{},S=R.cursor,C=R.dir==="prev"?"prev":"next",T=R.ob??"",O=R.od==="desc"?"desc":"asc",A=T?{field:T,dir:O}:void 0,E=parseInt(R.ps??""),$=Number.isFinite(E)&&E>0?Math.min(E,200):h,P=p.listColumns??Object.keys(p.schema.shape),F=p.documentKey??"docId",j=[F,...P.filter(W=>W!==F)];A&&(new Set([F,...P]).has(A.field)||(A=void 0));let _=p.filterableFields?(()=>{let W=[];for(let ue of p.filterableFields)(ue.includes(".")||P.includes(ue))&&W.push(ue);return W})():P,D=(()=>{let W=[];for(let ue of _)if(ue.includes(".")){let Ee=Wo(p.schema,ue);W.push({name:ue,zodType:Ee?en(Ee):"ZodString",nullable:Ee?or(Ee):false,enumValues:Ee?sr(Ee):void 0});}else W.push(...ir([ue],p.schema));return W})(),Q=new Set(D.map(W=>W.name)),de=Vo(R,Q),K=rr(de),ie;if(S)try{let W=p.repo.ref;typeof W.doc=="function"&&(ie=await W.doc(S).get());}catch{}let[X,et]=await Promise.all([p.repo.query.paginate({pageSize:$,cursor:ie,direction:C,...K.length>0?{where:K}:{},...A?{orderBy:[{field:A.field,direction:A.dir}]}:{}}).catch(W=>({queryError:Ue(W,{ref:p.repo.ref,path:p.path,isGroup:!!p.isGroup,filters:de,sort:A})})),p.repo.aggregate.count(K.length>0?{where:K}:{}).catch(()=>{})]),$e="queryError"in X,Rr=$e?[]:X.data,Sr=$e?"":X.nextCursor?.id??"",kr=$e?"":X.prevCursor?.id??"",Tr=$e?X.queryError:void 0,Cr=me(c,t,n);H(f,Vt(p.name,Rr,j,Cr,{hasPrev:$e?false:X.hasPrevPage,hasNext:$e?false:X.hasNextPage,prevCursor:kr,nextCursor:Sr},void 0,D,de,p.allowDelete??false,p.relationalMeta,A,$,Tr,p.isGroup,et,p.mutableFields,p.schema,p.historyEnabled));},s=(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=Oe(p.schema,p.createFields),S=le(R),C=`${h}/${p.name}/create`,T=xe(S,C,"POST","Create document");H(f,Se(p.name,T,"create",null,h));},a=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=c.body??{},S=Xt(R,p.schema),C=Oe(p.schema,p.createFields),T=C.safeParse(S);if(!T.success){let O=le(C),A=`${h}/${p.name}/create`,E=xe(O,A,"POST","Create document"),$=T.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");H(f,Se(p.name,E,"create",null,h,{type:"error",message:`Validation error: ${$}`}),422);return}try{if(p.isGroup&&p.parentKeys&&p.parentKeys.length>0){let O={...T.data};p.createdKey&&(O[p.createdKey]=new Date);let A=p.parentKeys.filter(F=>!O[F]);if(A.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${A.join(", ")}`);let E=p.parentKeys.map(F=>O[F]),$=p.documentKey??"docId",P=O[$]||Uo();await p.repo.set(...E,P,O);}else await p.repo.create(T.data);Jt(f,`${h}/${p.name}?flash=created`);}catch(O){let A=Oe(p.schema,p.createFields),E=le(A),$=`${h}/${p.name}/create`,P=xe(E,$,"POST","Create document");H(f,Se(p.name,P,"create",null,h,{type:"error",message:`Save error: ${O.message}`}),500);}},l=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}let R=me(c,t,n),S=null;try{S=await Ne(h,p);}catch($){let P=Gt(h,p,$),F=Ce($)?424:500;H(f,Ge("",{title:`Edit ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Edit ${p}`}],flash:P}),F);return}if(!S){H(f,"Document not found",404);return}let C=ar(S,h.schema),T=Oe(h.schema,h.mutableFields),O=Yt(le(T),C),A=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,E=xe(O,A,"POST","Save changes");H(f,Se(h.name,E,"edit",p,R));},i=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}let R=me(c,t,n),S=c.body??{},C=Xt(S,h.schema),T=Oe(h.schema,h.mutableFields),A=T.partial().safeParse(C);if(!A.success){let E=Object.fromEntries(Object.entries(S).map(([_,D])=>[_,Array.isArray(D)?D.join(","):D??""])),$=Yt(le(T),E),P=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,F=xe($,P,"POST","Save changes"),j=A.error.issues.map(_=>`${_.path.join(".")}: ${_.message}`).join(", ");H(f,Se(h.name,F,"edit",p,R,{type:"error",message:`Validation error: ${j}`}),422);return}try{let E=await Ne(h,p),$=(E&&bt(E,h.pathKey))??[p];await h.repo.update(...$,A.data),Jt(f,`${R}/${h.name}?flash=updated`);}catch(E){let $=Oe(h.schema,h.mutableFields),P=le($),F=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,j=xe(P,F,"POST","Save changes"),_=Ce(E)?Gt(h,p,E):{type:"error",message:`Save error: ${E.message}`},D=Ce(E)?424:500;H(f,Se(h.name,j,"edit",p,R,_),D);}},u=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}if(!h.allowDelete){H(f,"Delete is not allowed for this repository",403);return}let R=me(c,t,n);try{let S=await Ne(h,p),C=(S&&bt(S,h.pathKey))??[p];await h.repo.delete(...C),Jt(f,`${R}/${h.name}?flash=deleted`);}catch(S){let C=Ce(S)?Gt(h,p,S):{type:"error",message:`Delete error: ${S.message}`},T=Ce(S)?424:500;H(f,Ge("",{title:`Delete ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Delete ${p}`}],flash:C}),T);}},y=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=c.query,S=R?.type==="many"?"many":"one",C=Math.max(1,Math.min(100,Number(R?.ps??25)||25)),T=p.listColumns??Object.keys(re(p.schema)),{PanelOne:O,PanelMany:A}=await Promise.resolve().then(()=>(Bt(),Xn)),{renderToString:E}=await import('hono/jsx/dom/server');if(S==="one"){let D=String(R?.id??"");if(!D){H(f,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Q=await Ne(p,D),de=E(O({doc:Q,repoName:p.name,basePath:h,schema:p.schema,columns:T}));H(f,de);}catch(Q){H(f,`<div class='p-6 text-error text-sm'>Error: ${Q.message}</div>`,500);}return}let $=String(R?.fk??""),P=String(R?.fv??"");if(!$||!P){H(f,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let F=R?.cursor??"",j=R?.dir==="prev"?"prev":"next",_;if(F)try{let D=p.repo.ref;typeof D.doc=="function"&&(_=await D.doc(F).get());}catch{}try{let D=await p.repo.query.paginate({pageSize:C,cursor:_,direction:j,where:[[$,"==",Go(P)]]}),Q=E(A({docs:D.data,repoName:p.name,basePath:h,fk:$,fv:P,columns:T,schema:p.schema,pagination:{hasPrev:D.hasPrevPage,hasNext:D.hasNextPage,prevCursor:D.prevCursor?.id??"",nextCursor:D.nextCursor?.id??"",pageSize:C}}));H(f,Q);}catch(D){H(f,`<div class='p-6 text-error text-sm'>Error: ${D.message}</div>`,500);}},d=async(c,f)=>{let m=[];for(let p of f){let h;if(c.isGroup||c.parentKeys?.length){let R=await Ne(c,p);h=R?bt(R,c.pathKey):void 0;}h||(h=[p]);try{let R=c.repo.documentRef(...h);R&&m.push(R);}catch{}}return m},g=async(c,f)=>{let m=rr(f),p=c.documentKey??"docId",h=[],R;for(;;){let S=await c.repo.query.paginate({pageSize:500,cursor:R,direction:"next",...m.length>0?{where:m}:{}});for(let C of S.data){let T=String(C[p]??C.id??"");T&&h.push(T);}if(!S.hasNextPage||!S.nextCursor)break;R=S.nextCursor;}return h},x=async(c,f)=>{let m=c.params.repoName;if(!m){te(f,{error:"Bad request"},400);return}let p=e[m];if(!p){te(f,{error:"Repository not found"},404);return}if(!p.allowDelete){te(f,{error:"Delete is not allowed for this repository"},403);return}let h=c.body??{};try{let R=await v(p,h);if(R.length===0){te(f,{deleted:0});return}let S=await d(p,R);for(let C=0;C<S.length;C+=500)await p.repo.bulk.delete(S.slice(C,C+500));te(f,{deleted:S.length});}catch(R){te(f,{error:R.message},500);}},b=async(c,f)=>{let m=c.params.repoName;if(!m){te(f,{error:"Bad request"},400);return}let p=e[m];if(!p){te(f,{error:"Repository not found"},404);return}let h=c.body??{},R=String(h.field??"");if(!R){te(f,{error:"Missing 'field'"},400);return}if(!p.mutableFields||!p.mutableFields.includes(R)){te(f,{error:`Field '${R}' is not bulk-updatable`},403);return}let S=p.schema.shape?.[R],C=h.value;if(S){let T=S.safeParse(h.value);if(!T.success){te(f,{error:`Invalid value for '${R}': ${T.error.message}`},400);return}C=T.data;}try{let T=await v(p,h);if(T.length===0){te(f,{updated:0});return}let A=(await d(p,T)).map(E=>({docRef:E,data:{[R]:C}}));for(let E=0;E<A.length;E+=500)await p.repo.bulk.update(A.slice(E,E+500));te(f,{updated:A.length});}catch(T){te(f,{error:T.message},500);}};async function v(c,f){if(f.selectAll){let m=k(f.filters,c);return await g(c,m)}return Array.isArray(f.ids)?f.ids.filter(m=>typeof m=="string"&&!!m):[]}function k(c,f){if(!Array.isArray(c))return [];let m=new Set((f.filterableFields??Object.keys(re(f.schema))).map(R=>String(R))),p=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),h=[];for(let R of c)R&&typeof R=="object"&&typeof R.field=="string"&&m.has(R.field)&&typeof R.value=="string"&&p.has(String(R.op))&&h.push({field:R.field,op:R.op,value:R.value});return h}return {handleDashboard:r,handleList:o,handleCreateForm:s,handleCreateSubmit:a,handleEditForm:l,handleEditSubmit:i,handleDelete:u,handlePanel:y,handleBulkDelete:x,handleBulkUpdate:b,handleHistory:async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}if(!h.historyEnabled||!h.repo.history){H(f,"History not enabled for this repository",404);return}let R=me(c,t,n),S=h.historySubcollection??"history",C=[p];try{let D=await Ne(h,p),Q=D?bt(D,h.pathKey):void 0;Q&&Q.length>0&&(C=Q);}catch{}let T=parseInt(String(c.query?.limit??"")),O=Number.isFinite(T)&&T>0?Math.min(T,500):100,A=[],E;try{A=await h.repo.history.list(...C,{limit:O});}catch(D){E=D.message;}let $=D=>String(D??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),P=D=>{if(D===void 0)return '<span class="opacity-40">undefined</span>';if(D===null)return '<span class="opacity-40">null</span>';if(typeof D=="object")try{return `<code class="text-xs">${$(JSON.stringify(D))}</code>`}catch{return $(String(D))}return $(String(D))},F=D=>D?typeof D.toDate=="function"?D.toDate().toISOString():D instanceof Date?D.toISOString():$(String(D)):"",j=D=>`<span class="badge badge-sm ${D==="create"?"badge-success":D==="delete"?"badge-error":"badge-info"}">${$(D)}</span>`,_="";if(_+='<div class="flex items-center justify-between mb-4">',_+=`<a href="${R}/${h.name}/${encodeURIComponent(p)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,_+=`<a href="${R}/${h.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>${$(S)}</code> \xB7 Showing up to ${O} entries.</p>`,E)_+=`<div class="alert alert-error mb-4">${$(E)}</div>`;else if(A.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 D of A){let Q=D.meta??{},de=[Q.reason,Q.comment].filter(X=>X!=null&&X!=="").map(X=>$(String(X))).join(" \u2014 "),K="",ie=Object.keys(D.changes??{});ie.length===0?K='<span class="opacity-40">\u2014</span>':K='<ul class="space-y-1">'+ie.map(X=>{let et=D.changes[X];return `<li><strong>${$(X)}</strong>: ${P(et.oldValue)} \u2192 ${P(et.newValue)}</li>`}).join("")+"</ul>",_+="<tr>",_+=`<td class="whitespace-nowrap text-xs font-mono">${$(F(D.historySetAt))}</td>`,_+=`<td>${j(D.operation??"update")}</td>`,_+=`<td class="text-xs">${$(Q.userEmail??Q.userId??"")}</td>`,_+=`<td class="text-xs">${de}</td>`,_+=`<td>${K}</td>`,_+="</tr>";}_+="</tbody></table></div>";}H(f,Ge(_,{title:`History \u2014 ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`History ${p}`}]}));}}}function te(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Go(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var cr="https://cdn.jsdelivr.net",dr="https://www.gstatic.com",ur=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${cr} ${dr}`,`style-src 'self' 'unsafe-inline' ${cr}`,`connect-src 'self' ${dr} 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 Je(e={}){let t=e.csp===void 0?ur: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,a,l)=>{typeof a?.setHeader=="function"&&(a.setHeader("X-Content-Type-Options","nosniff"),n&&a.setHeader("X-Frame-Options",n),r&&a.setHeader("Referrer-Policy",r),o&&a.setHeader("Cache-Control",o),t&&a.setHeader("Content-Security-Policy",t)),await l();}}async function Jo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Xo(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," ")),a=t[o];a===void 0?t[o]=s:Array.isArray(a)?a.push(s):t[o]=[a,s];}return t}function pr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],httpsOptions:l}=e,i=t==="/"?"":t.replace(/\/$/,""),u={};for(let[x,b]of Object.entries(n)){let v=b.schema??b.repo.schema??null;if(!v)throw new Error(`[createAdminServer] Repository "${x}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let k,w,c;if(b.fieldsConfig){let p=b.fieldsConfig;k=[],w=[],c=[];for(let[h,R]of Object.entries(p))for(let S of R)S==="filterable"?k.push(h):S==="mutable"?w.push(h):S==="create"&&c.push(h);k.length===0&&(k=void 0),w.length===0&&(w=void 0),c.length===0&&(c=void 0);}let f=(()=>{let p=b.repo._parentKeys;return p&&p.length>0?p:void 0})();if(f&&c)for(let p of f)c.includes(p)||c.push(p);let m={name:x,path:b.path,repo:b.repo,schema:v,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:f,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:k,mutableFields:w,createFields:c,allowDelete:b.allowDelete??false,historyEnabled:!!b.repo.history,historySubcollection:(b.repo.history&&b.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!b.relationalFields||b.relationalFields.length===0)return;let p=b.repo.relationalKeys??{},h=[];for(let R of b.relationalFields){let S=p[R.key];S&&h.push({key:R.key,column:R.column,targetRepo:String(S.repo),targetKey:String(S.key),type:S.type});}return h.length>0?h:void 0})()};u[x]=m;}let y=lr(u,i,An(l?.region)),d=new oe;if(o!==false&&d.use(Je(o===void 0?{}:o)),r&&d.use(async(x,b,v)=>{let k=x,w=String(k.headers?.["content-type"]??"");if(w.includes("application/x-www-form-urlencoded")){let c=await Jo(k);x.body=Xo(c);}else if(w.includes("application/json")&&typeof k.body=="string")try{x.body=JSON.parse(k.body);}catch{}await v();}),s)if(he(s)){for(let x of s.routes){let b=`${i}${x.path}`;x.method==="GET"?d.get(b,x.handler):d.post(b,x.handler);}d.use(s.middleware);}else if(typeof s=="function")d.use(s);else {let x=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");d.use((v,k,w)=>{if((v.headers?.authorization??"")!==b){k.status(401).set("WWW-Authenticate",`Basic realm="${x}"`).set("Content-Type","text/plain").send("Unauthorized");return}w();});}for(let x of a)d.use(x);d.get(`${i}/`,y.handleDashboard),d.get(`${i}`,y.handleDashboard),d.get(`${i}/:repoName/_panel`,y.handlePanel),d.post(`${i}/:repoName/_bulk/delete`,y.handleBulkDelete),d.post(`${i}/:repoName/_bulk/update`,y.handleBulkUpdate),d.get(`${i}/:repoName`,y.handleList),d.get(`${i}/:repoName/create`,y.handleCreateForm),d.post(`${i}/:repoName/create`,y.handleCreateSubmit),d.get(`${i}/:repoName/:id/edit`,y.handleEditForm),d.post(`${i}/:repoName/:id/edit`,y.handleEditSubmit),d.get(`${i}/:repoName/:id/history`,y.handleHistory),d.post(`${i}/:repoName/:id/delete`,y.handleDelete);let g=async(x,b)=>{await d.handle(x,b);};return l&&(g.httpsOptions=l),g}function rn(e,t,n=200){let r=U(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function je(e,t,n,r=200){rn(e,{success:true,data:t,meta:n},r);}function L(e,t,n=400){rn(e,{success:false,error:t},n);}function tn(e,t,n,r,o){let s=Ue(t,n),a=s.type==="index",l=a?424:500,u={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(u.errorType="index",s.indexUrl&&(u.indexUrl=s.indexUrl)),rn(e,u,l);}var nn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function es(){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>=nn.length*4||(e+=nn.charAt(r%nn.length));}}return e}function Me(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=>kt(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=Me(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Me(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Me(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Me(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=Me(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function ts(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let a of s){if(n.includes(a))continue;let l=a.split(".")[0];l&&r[l]&&(o[l]=r[l]);}return zod.z.object(o)}function fr(e,t,n,r=false,o=[]){try{let s=ts(e,n,o),a=r?s.partial():s;return {success:!0,data:(St()==="normalize"?Me(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function ns(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,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let l=Array.isArray(a)?a[0]:a;if(l===void 0||l==="")continue;let i=s.match(/^(\w+)__(\w+)$/),u,y="==";if(i&&i[1]&&i[2]){u=i[1];let g=i[2];if(o[g])y=o[g];else continue}else if(!i)u=s;else continue;if(r&&!r.has(u))continue;let d=l;y==="in"||y==="not-in"||y==="array-contains-any"?d=l.split(",").map(g=>yr(g.trim())):d=yr(l),n.push({field:u,op:y,value:d});}return n}function yr(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 xt(e){return e?{docId:e.id}:null}async function mr(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 gr(e,t,n,r=false){async function o(w,c,f,m){if(!r)return true;let p=c.rules?.[f];if(!p)return L(w,`Operation "${f}" is not allowed for this repository`,403),false;try{return await p(m)?!0:(L(w,"Forbidden",403),!1)}catch(h){let R=n&&h instanceof Error?h.message:"Forbidden";return L(w,R,403),false}}async function s(w,c,f,m){if(!r)return m;let p=w.rules?.filter;if(!p)return m;let h=[];for(let R of m)try{await p({user:c,doc:R,params:f})&&h.push(R);}catch{}return h}function a(w){return w?.user??null}function l(w,c){return !w||!e[w]?(L(c,`Repository "${w}" not found`,404),null):e[w]}function i(w,c){if(!c)return;let f=w[c];if(typeof f!="string"||!f)return;let m=f.split("/").filter(Boolean),p=[];for(let h=1;h<m.length;h+=2)p.push(m[h]);return p.length>0?p:void 0}async function u(w,c){let f=`by${w.documentKey.charAt(0).toUpperCase()}${w.documentKey.slice(1)}`,m=w.repo.get[f];if(typeof m=="function")try{let h=await m(c);if(h)return h}catch{}return (await w.repo.query.by({where:[[w.documentKey,"==",c]],limit:1}))[0]??null}async function y(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=a(w);if(!await o(c,m,"list",{user:p,query:w.query??{},params:f}))return;let h=[],R;try{let S=w.query??{},C=Math.min(Number(S.pageSize)||m.pageSize,100),T=S.cursor,O=S.direction?.toLowerCase()==="prev"?"prev":"next",A=S.orderBy,E=S.orderDir?.toLowerCase()==="desc"?"desc":"asc",$=S.select,P=$?$.split(",").map(K=>K.trim()):void 0,F;m.allowedIncludes&&S.includes&&(F=(typeof S.includes=="string"?S.includes.split(",").map(ie=>ie.trim()):Array.isArray(S.includes)?S.includes:[]).filter(ie=>typeof ie=="string"&&m.allowedIncludes.includes(ie)),F?.length===0&&(F=void 0));let j=ns(S,m.filterableFields);h=j.map(K=>({field:K.field,op:K.op,value:String(K.value??"")})),A&&(R={field:A,dir:E});let _={pageSize:C,direction:O};if(T)try{let K=typeof T=="string"?JSON.parse(T):T;_.cursor=await mr(m,K);}catch{}if(A){if(m.orderableFields&&!m.orderableFields.includes(A)){L(c,`Field not orderable: ${A}`,400);return}_.orderBy=[{field:A,direction:E}];}j.length>0&&(_.where=j.map(K=>[K.field,K.op,K.value])),P&&(_.select=P),F&&(_.include=F);let D=await m.repo.query.paginate(_),de={items:await s(m,a(w),f,D.data),hasNextPage:D.hasNextPage,hasPrevPage:D.hasPrevPage,nextCursor:xt(D.nextCursor),prevCursor:xt(D.prevCursor)};je(c,de,{pageSize:C,hasMore:D.hasNextPage});}catch(S){tn(c,S,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:h,sort:R},"Failed to fetch documents",n);}}async function d(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=a(w);if(!await o(c,m,"list",{user:p,query:w.body??{},params:f}))return;let h=[],R;try{let S=w.body??{},C=Math.min(S.pageSize||m.pageSize,100),T=S.direction==="prev"?"prev":"next";S.where&&(h=S.where.map(P=>({field:String(P[0]),op:P[1],value:String(P[2]??"")}))),S.orderBy&&S.orderBy[0]&&(R={field:S.orderBy[0].field,dir:S.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:C,direction:T};if(S.cursor)try{let P=typeof S.cursor=="string"?JSON.parse(S.cursor):S.cursor;O.cursor=await mr(m,P);}catch{}if(m.allowedIncludes&&S.includes&&S.includes.length>0){let P=S.includes.filter(F=>typeof F=="string"?m.allowedIncludes.includes(F):typeof F=="object"&&F!==null&&"relation"in F&&typeof F.relation=="string"?m.allowedIncludes.includes(F.relation):!1);P.length>0&&(O.include=P);}if(S.where&&S.where.length>0){if(m.filterableFields){let P=new Set(m.filterableFields),F=S.where.filter(j=>!P.has(j[0]));if(F.length>0){L(c,`Fields not filterable: ${F.map(j=>j[0]).join(", ")}`,400);return}}O.where=S.where;}if(S.orWhere&&S.orWhere.length>0){if(m.filterableFields){let P=new Set(m.filterableFields),F=S.orWhere.filter(j=>!P.has(j[0]));if(F.length>0){L(c,`Fields not filterable: ${F.map(j=>j[0]).join(", ")}`,400);return}}O.orWhere=S.orWhere;}if(S.orWhereGroups&&S.orWhereGroups.length>0){if(m.filterableFields){let P=new Set(m.filterableFields);for(let F of S.orWhereGroups){let j=F.filter(_=>!P.has(_[0]));if(j.length>0){L(c,`Fields not filterable: ${j.map(_=>_[0]).join(", ")}`,400);return}}}O.orWhereGroups=S.orWhereGroups;}if(S.orderBy&&S.orderBy.length>0){if(m.orderableFields){let P=new Set(m.orderableFields),F=S.orderBy.filter(j=>!P.has(j.field));if(F.length>0){L(c,`Fields not orderable: ${F.map(j=>j.field).join(", ")}`,400);return}}O.orderBy=S.orderBy;}S.select&&S.select.length>0&&(O.select=S.select);let A=await m.repo.query.paginate(O),$={items:await s(m,a(w),f,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:xt(A.nextCursor),prevCursor:xt(A.prevCursor)};je(c,$,{pageSize:C,hasMore:A.hasNextPage});}catch(S){tn(c,S,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:h,sort:R},"Failed to query documents",n);}}async function g(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=f.id;if(!p){L(c,"Document ID required",400);return}try{let h=await u(m,p);if(!h){L(c,"Document not found",404);return}let R=a(w);if(!await o(c,m,"get",{user:R,doc:h,params:f}))return;if(r&&m.rules?.filter)try{if(!await m.rules.filter({user:R,doc:h,params:f})){L(c,"Document not found",404);return}}catch{L(c,"Document not found",404);return}je(c,h);}catch(h){tn(c,h,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:[{field:m.documentKey,op:"==",value:p}]},"Failed to fetch document",n);}}async function x(w,c){let f=w.params||{},m=l(f.repoName,c);if(m)try{let p=w.body??{},h=a(w);if(!await o(c,m,"create",{user:h,body:p,params:f}))return;let R=fr(m.schema,p,m.createFields,!1,m.systemKeys);if(!R.success){L(c,R.error,400);return}if(m.validate){let C=await m.validate(R.data,"create");if(C){L(c,C,400);return}}let S;if(m.isGroup&&m.parentKeys&&m.parentKeys.length>0){let C={...R.data};m.createdKey&&(C[m.createdKey]=new Date);let T=m.parentKeys.filter(E=>!C[E]);if(T.length>0){L(c,`Missing parent key(s) for subcollection create: ${T.join(", ")}`,400);return}let O=m.parentKeys.map(E=>C[E]),A=C[m.documentKey]||es();S=await m.repo.set(...O,A,C);}else S=await m.repo.create(R.data);je(c,S,void 0,201);}catch(p){let h=n&&p instanceof Error?p.message:"Failed to create document";L(c,h,500);}}async function b(w,c,f){let m=w.params||{},p=l(m.repoName,c);if(!p)return;let h=m.id;if(!h){L(c,"Document ID required",400);return}try{let R=w.body??{},S=await u(p,h);if(!S){L(c,"Document not found",404);return}let C=a(w);if(!await o(c,p,"update",{user:C,doc:S,body:R,params:m}))return;let T=fr(p.schema,R,p.mutableFields,f,p.systemKeys);if(!T.success){L(c,T.error,400);return}if(p.validate){let E=await p.validate(T.data,"update");if(E){L(c,E,400);return}}let O=i(S,p.pathKey)??[h],A=await p.repo.update(...O,T.data);je(c,A);}catch(R){let S=n&&R instanceof Error?R.message:"Failed to update document";L(c,S,500);}}async function v(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;if(!m.allowDelete){L(c,"Delete not allowed for this repository",403);return}let p=f.id;if(!p){L(c,"Document ID required",400);return}try{let h=await u(m,p);if(!h){L(c,"Document not found",404);return}let R=a(w);if(!await o(c,m,"delete",{user:R,doc:h,params:f}))return;let S=i(h,m.pathKey)??[p];await m.repo.delete(...S),je(c,{deleted:!0});}catch(h){let R=n&&h instanceof Error?h.message:"Failed to delete document";L(c,R,500);}}function k(w,c){c.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:y,handleQuery:d,handleGet:g,handleCreate:x,handleUpdate:b,handleDelete:v,handleOptions:k}}function on(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 ae(e){return {$ref:`#/components/schemas/${e}`}}function ee(e){return {description:e,content:{"application/json":{schema:ae("ErrorResponse")}}}}function Ye(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function hr(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 rs(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 os(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 ss(){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 as(e,t,n,r,o){let s={},a=e.name,l=`${t}/${e.name}`,i=`${l}/{${e.documentKey}}`,u={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[l]={get:{operationId:`list${ke(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...rs(e),...os(e)],responses:{200:hr(ae(n)),500:ee("Internal server error")}},post:{operationId:`create${ke(e.name)}`,summary:`Create a ${ce(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae(r??n)}}},responses:{201:Ye("Document created",ae(n)),400:ee("Validation error"),500:ee("Internal server error")}}},s[`${l}/query`]={post:{operationId:`query${ke(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae("QueryRequestBody")}}},responses:{200:hr(ae(n)),400:ee("Invalid query"),500:ee("Internal server error")}}};let y={};return y.get={operationId:`get${ke(ce(e.name))}`,summary:`Get a single ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:Ye("Document found",ae(n)),404:ee("Document not found"),500:ee("Internal server error")}},y.put={operationId:`update${ke(ce(e.name))}`,summary:`Update a ${ce(e.name)} (full replace)`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:ae(o??n)}}},responses:{200:Ye("Document updated",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},y.patch={operationId:`patch${ke(ce(e.name))}`,summary:`Partially update a ${ce(e.name)}`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:{allOf:[ae(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Ye("Document patched",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},e.allowDelete&&(y.delete={operationId:`delete${ke(ce(e.name))}`,summary:`Delete a ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:Ye("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:ee("Document not found"),500:ee("Internal server error")}}),s[i]=y,s}function an(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:l=false}=n,i=t==="/"?"":t.replace(/\/$/,""),u={},y={},d=[];u.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},u.QueryRequestBody=ss();for(let[v,k]of Object.entries(e)){let w=ke(ce(v)),c=`${w}Create`,f=`${w}Update`;u[w]=on(k.schema);let m=T=>{let O=T&&T.length>0?T:Object.keys(k.schema.shape),A={};for(let E of O){let $=E.split(".")[0];$&&k.schema.shape[$]&&!k.systemKeys.includes($)&&(A[$]=k.schema.shape[$]);}return A},p=null,h=m(k.createFields);Object.keys(h).length>0&&(u[c]=on(zod.z.object(h)),p=c);let R=null,S=m(k.mutableFields);Object.keys(S).length>0&&(u[f]=on(zod.z.object(S)),R=f);let C=as(k,i,w,p,R);Object.assign(y,C),d.push({name:v,description:`Operations on ${v} (collection: ${k.path})`});}let g={},x;return l==="basic"?(g.basicAuth={type:"http",scheme:"basic"},x=[{basicAuth:[]}]):l==="bearer"&&(g.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},x=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:y,components:{schemas:u,...Object.keys(g).length>0?{securitySchemes:g}:{}},...x?{security:x}:{},tags:d}}function ke(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ce(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 is(e,t){return `<!DOCTYPE html>
1146
+ `;function Ve(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Jn}})}Bt();function ve(e){return "<!DOCTYPE html>"+server.renderToString(e)}var _o=["corporate","silk","dark"],Fo=()=>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:_o.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))})]}),we=({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(Fo,{})})]}),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((a,l)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},l):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},l))})}),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(Ht,{basePath:s}),jsxRuntime.jsx(Ve,{})]})]})};function zt(e,t){return ve(jsxRuntime.jsx(we,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Zt(e,t){return ve(jsxRuntime.jsx(we,{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 tr=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],No=[{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"}],jo=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function Mo(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return No;case "ZodBoolean":return tr;case "ZodArray":return jo;default:return tr}}var Re="__null__";function Ho(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="${Re}"]');if(!o){o=document.createElement('option');o.value='${Re}';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='${Re}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${Re}"][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!=='${Re}')?i.dataset._prev:'';}}})(this)`}function Bo(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 Ge({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:Ho(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function zo({col:e,active:t}){let n=t?.value??"",r=n===Re,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,a=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let l=new Set(n.split(",").map(u=>u.trim()).filter(Boolean)),i=`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(u=>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:u,checked:l.has(u),"data-enum-group":i,onchange:Bo(o,i)}),jsxRuntime.jsx("span",{children:u})]},u))]})}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(l=>jsxRuntime.jsx("option",{value:l,selected:n===l,children:l},l)),e.nullable&&jsxRuntime.jsx("option",{value:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ge,{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:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let l=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:l?"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(Ge,{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(Ge,{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(Ge,{inputId:o,active:r})]})}function Lt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(i=>[i.field,i])),s=n.length>0,a=n.length>=2||r&&s,l=t.filter(i=>i.zodType!=="ZodObject"&&i.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:l.map(i=>{let u=Mo(i.zodType),y=o[i.name],d=y?.op??u[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:i.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(g=>jsxRuntime.jsx("option",{value:g.value,selected:g.value===d,children:g.label},g.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:u[0].value}),jsxRuntime.jsx(zo,{col:i,active:y})]})]},i.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"}),a&&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 Ut(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,l=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 ve(jsxRuntime.jsx(we,{opts:{title:a,breadcrumb:l,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}})})})}))}gt();Mt();function qt(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 nr(e,t,n,r,o){let s=qt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Zo(e,t,n,r){let o=qt(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 Lo(e,t,n){return `?${qt(t,n,e).toString()}`}function Kt(e,t,n,r,o,s,a=[],l=[],i=false,u=[],y,d,g,x,b,v,k,w=false){let c=`${r}/${e}`,f=`${c}/create`,m={};if(k)for(let T of n)m[T]=_e(Fe(k,T));let p=(v??[]).filter(T=>{let O=m[T]??_e(Fe(k,T));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),h=p.length>0,R=i,S=R||h,C=p.map(T=>{let O=Fe(k,T),A=_e(O),E=a.find($=>$.name===T);return {name:T,type:A,enumValues:E?.enumValues??null,nullable:E?.nullable??false}});return ve(jsxRuntime.jsxs(we,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Lt,{action:c,columnMeta:a,activeFilters:l,isGroup:x}),g&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${g.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:g.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:g.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:g.message})]}),g.indexUrl&&jsxRuntime.jsx("a",{href:g.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 b=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of"," ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:b})]})," ","document",(typeof b=="number"?b: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(T=>jsxRuntime.jsx("a",{href:Lo(T,l,y),class:`join-item btn btn-xs ${d===T?"btn-active btn-primary":"btn-outline"}`,children:T},T))})]})]}),jsxRuntime.jsx("a",{href:f,class:"btn btn-primary btn-sm",children:"+ New"})]}),S&&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 b=="number"?String(b):"","data-frs-page-size":String(d??t.length),"data-frs-allow-delete":R?"1":"0","data-frs-allow-update":h?"1":"0","data-frs-fields":JSON.stringify(C),"data-frs-filters":JSON.stringify(l),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof b=="number"&&b>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",b," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",b??"?"," 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:[h&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),R&&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:[S&&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((T,O)=>{let A=y?.field===T,E=A?y.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:Zo(T,y,l,d),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[T,E]})},O)}),u.map((T,O)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:T.column},`rel-${O}`)),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+u.length+1+(S?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((T,O)=>{let A=String(T.docId??T.id??""),E=`${r}/${e}/${encodeURIComponent(A)}/edit`,$=`${r}/${e}/${encodeURIComponent(A)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":A,children:[S&&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:A,"aria-label":`Select ${A}`})}),n.map((P,_)=>{let j=T[P],F=m[P],D=F?We(F,j):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Ie,{val:j,mismatch:D})},_)}),u.map((P,_)=>{let j=T[P.key];if(j==null||j==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${_}`);let F=P.type==="one"?`${r}/${P.targetRepo}/${encodeURIComponent(String(j))}/edit`:`${r}/${P.targetRepo}?fv_${P.targetKey}=${encodeURIComponent(String(j))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:F,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":P.type,"data-frs-rel-repo":P.targetRepo,"data-frs-rel-fk":P.targetKey,"data-frs-rel-val":String(j),"data-frs-rel-label":P.column,children:P.column})},`rel-${_}`)}),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"}),w&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(A)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),i&&jsxRuntime.jsx("form",{method:"post",action:$,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},O)})})]})}),(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:nr(l,o.prevCursor,"prev",y,d),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:nr(l,o.nextCursor,"next",y,d),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof b=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[b," total document",b!==1?"s":"",l.length>0?" matching filters":""]})]}),S&&h&&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"}),p.map(T=>jsxRuntime.jsx("option",{value:T,children:T},T))]})]}),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"})})]})]}))}function Je(e,t){return zt(e,t)}function Qt(e,t){return Zt(e,t)}function Vt(e,t,n,r,o,s,a,l,i,u,y,d,g,x,b,v,k,w){return Kt(e,t,n,r,o,s,a,l,i,u,y,d,g,x,b,v,k,w)}function Se(e,t,n,r,o,s){return Ut(e,t,n,r,o,s)}var Wt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Qo(){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>=Wt.length*4||(e+=Wt.charAt(r%Wt.length));}}return e}function bt(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 Ne(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 Gt(e,t,n){let r=e.documentKey??"docId",o=Qe(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 H(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Jt(e,t){e.status(302).set("Location",t).send("");}function Xt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=en(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let u={},y=false;for(let[x,b]of Object.entries(e))x.startsWith(`${o}.`)&&(u[x.slice(o.length+1)]=b,y=true);if(y){let x=s;for(;;){let b=U(x);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")x=G(x);else break}r[o]=Xt(u,x);continue}let d=e[o],g=Array.isArray(d)?d[d.length-1]:d;if(g)try{r[o]=JSON.parse(g);}catch{r[o]=g;}continue}let l=e[o],i=Array.isArray(l)?l[l.length-1]:l;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?r[o]=null:r[o]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(i);break;case "ZodDate":r[o]=new Date(i);break;case "ZodArray":try{r[o]=JSON.parse(i);}catch{r[o]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{r[o]=JSON.parse(i);break}catch{}r[o]=i;}}return r}function rr(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 en(e){let t=e;for(;;){let n=U(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Vo(e){let t=e;for(;;){let n=U(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function sr(e){let t=e;for(;;){let n=U(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=G(t);continue}return false}}function ar(e){let t=Vo(e),n=U(t);if(n==="ZodEnum"){let r=Ze(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Le(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=Ue(t);return typeof r=="string"?[r]:void 0}}function ir(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,a=e[o];if(a===null){r[s]="__null__";continue}if(a===void 0)continue;let l=t.shape[o];for(;;){let u=U(l);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")l=G(l);else break}let i=U(l);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let u=ir(a,l,s);Object.assign(r,u);}else if(i==="ZodDate"){let u=rr(a);u!==null&&(r[s]=u);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let u=rr(a);r[s]=u??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function Yt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Yt(n.nested,t):void 0}))}function Wo(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 a=o.slice(3);if(!t.has(a))continue;let l=(s??"").trim();if(!l)continue;let i=e[`fo_${a}`]??"==",u=n.has(i)?i:"==";r.push({field:a,op:u,value:l});}return r}function or(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 lr(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,a=t.shape[o];if(!a){r.push({name:s,zodType:"ZodString"});continue}let l=en(a);if(l==="ZodObject"){let i=a;for(;;){let y=U(i);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")i=G(i);else break}let u=re(i);r.push(...lr(Object.keys(u),i,s));}else r.push({name:s,zodType:l,nullable:sr(a),enumValues:ar(a)});}return r}function Go(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let a=U(r);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")r=G(r);else break}let s=re(r);if(!(o in s))return null;r=s[o];}return r}function Oe(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let a=s.indexOf(".");if(a===-1)n.push(s);else {let l=s.slice(0,a),i=s.slice(a+1);r.has(l)||r.set(l,[]),r.get(l).push(i);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let l=e.shape[s];for(;;){let i=U(l);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")l=G(l);else break}if(U(l)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Oe(l,a);}return zod.z.object(o)}function me(e,t,n){return ne(e,t,n)}function cr(e,t,n){let r=(c,f)=>{let m=me(c,t,n),p=Object.values(e).map(h=>({name:h.name,path:h.path}));H(f,Qt(p,m));},o=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=p.pageSize??25,R=c.query??{},S=R.cursor,C=R.dir==="prev"?"prev":"next",T=R.ob??"",O=R.od==="desc"?"desc":"asc",A=T?{field:T,dir:O}:void 0,E=parseInt(R.ps??""),$=Number.isFinite(E)&&E>0?Math.min(E,200):h,P=p.listColumns??Object.keys(p.schema.shape),_=p.documentKey??"docId",j=[_,...P.filter(W=>W!==_)];A&&(new Set([_,...P]).has(A.field)||(A=void 0));let F=p.filterableFields?(()=>{let W=[];for(let ue of p.filterableFields)(ue.includes(".")||P.includes(ue))&&W.push(ue);return W})():P,D=(()=>{let W=[];for(let ue of F)if(ue.includes(".")){let Ee=Go(p.schema,ue);W.push({name:ue,zodType:Ee?en(Ee):"ZodString",nullable:Ee?sr(Ee):false,enumValues:Ee?ar(Ee):void 0});}else W.push(...lr([ue],p.schema));return W})(),Q=new Set(D.map(W=>W.name)),de=Wo(R,Q),q=or(de),ie;if(S)try{let W=p.repo.ref;typeof W.doc=="function"&&(ie=await W.doc(S).get());}catch{}let[X,tt]=await Promise.all([p.repo.query.paginate({pageSize:$,cursor:ie,direction:C,...q.length>0?{where:q}:{},...A?{orderBy:[{field:A.field,direction:A.dir}]}:{}}).catch(W=>({queryError:Qe(W,{ref:p.repo.ref,path:p.path,isGroup:!!p.isGroup,filters:de,sort:A})})),p.repo.aggregate.count(q.length>0?{where:q}:{}).catch(()=>{})]),$e="queryError"in X,Sr=$e?[]:X.data,kr=$e?"":X.nextCursor?.id??"",Tr=$e?"":X.prevCursor?.id??"",Cr=$e?X.queryError:void 0,Ar=me(c,t,n);H(f,Vt(p.name,Sr,j,Ar,{hasPrev:$e?false:X.hasPrevPage,hasNext:$e?false:X.hasNextPage,prevCursor:Tr,nextCursor:kr},void 0,D,de,p.allowDelete??false,p.relationalMeta,A,$,Cr,p.isGroup,tt,p.mutableFields,p.schema,p.historyEnabled));},s=(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=Oe(p.schema,p.createFields),S=le(R),C=`${h}/${p.name}/create`,T=xe(S,C,"POST","Create document");H(f,Se(p.name,T,"create",null,h));},a=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=c.body??{},S=Xt(R,p.schema),C=Oe(p.schema,p.createFields),T=C.safeParse(S);if(!T.success){let O=le(C),A=`${h}/${p.name}/create`,E=xe(O,A,"POST","Create document"),$=T.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");H(f,Se(p.name,E,"create",null,h,{type:"error",message:`Validation error: ${$}`}),422);return}try{if(p.isGroup&&p.parentKeys&&p.parentKeys.length>0){let O={...T.data};p.createdKey&&(O[p.createdKey]=new Date);let A=p.parentKeys.filter(_=>!O[_]);if(A.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${A.join(", ")}`);let E=p.parentKeys.map(_=>O[_]),$=p.documentKey??"docId",P=O[$]||Qo();await p.repo.set(...E,P,O);}else await p.repo.create(T.data);Jt(f,`${h}/${p.name}?flash=created`);}catch(O){let A=Oe(p.schema,p.createFields),E=le(A),$=`${h}/${p.name}/create`,P=xe(E,$,"POST","Create document");H(f,Se(p.name,P,"create",null,h,{type:"error",message:`Save error: ${O.message}`}),500);}},l=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}let R=me(c,t,n),S=null;try{S=await Ne(h,p);}catch($){let P=Gt(h,p,$),_=Ce($)?424:500;H(f,Je("",{title:`Edit ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Edit ${p}`}],flash:P}),_);return}if(!S){H(f,"Document not found",404);return}let C=ir(S,h.schema),T=Oe(h.schema,h.mutableFields),O=Yt(le(T),C),A=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,E=xe(O,A,"POST","Save changes");H(f,Se(h.name,E,"edit",p,R));},i=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}let R=me(c,t,n),S=c.body??{},C=Xt(S,h.schema),T=Oe(h.schema,h.mutableFields),A=T.partial().safeParse(C);if(!A.success){let E=Object.fromEntries(Object.entries(S).map(([F,D])=>[F,Array.isArray(D)?D.join(","):D??""])),$=Yt(le(T),E),P=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,_=xe($,P,"POST","Save changes"),j=A.error.issues.map(F=>`${F.path.join(".")}: ${F.message}`).join(", ");H(f,Se(h.name,_,"edit",p,R,{type:"error",message:`Validation error: ${j}`}),422);return}try{let E=await Ne(h,p),$=(E&&bt(E,h.pathKey))??[p];await h.repo.update(...$,A.data),Jt(f,`${R}/${h.name}?flash=updated`);}catch(E){let $=Oe(h.schema,h.mutableFields),P=le($),_=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,j=xe(P,_,"POST","Save changes"),F=Ce(E)?Gt(h,p,E):{type:"error",message:`Save error: ${E.message}`},D=Ce(E)?424:500;H(f,Se(h.name,j,"edit",p,R,F),D);}},u=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}if(!h.allowDelete){H(f,"Delete is not allowed for this repository",403);return}let R=me(c,t,n);try{let S=await Ne(h,p),C=(S&&bt(S,h.pathKey))??[p];await h.repo.delete(...C),Jt(f,`${R}/${h.name}?flash=deleted`);}catch(S){let C=Ce(S)?Gt(h,p,S):{type:"error",message:`Delete error: ${S.message}`},T=Ce(S)?424:500;H(f,Je("",{title:`Delete ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Delete ${p}`}],flash:C}),T);}},y=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=c.query,S=R?.type==="many"?"many":"one",C=Math.max(1,Math.min(100,Number(R?.ps??25)||25)),T=p.listColumns??Object.keys(re(p.schema)),{PanelOne:O,PanelMany:A}=await Promise.resolve().then(()=>(Bt(),Yn)),{renderToString:E}=await import('hono/jsx/dom/server');if(S==="one"){let D=String(R?.id??"");if(!D){H(f,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Q=await Ne(p,D),de=E(O({doc:Q,repoName:p.name,basePath:h,schema:p.schema,columns:T}));H(f,de);}catch(Q){H(f,`<div class='p-6 text-error text-sm'>Error: ${Q.message}</div>`,500);}return}let $=String(R?.fk??""),P=String(R?.fv??"");if(!$||!P){H(f,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let _=R?.cursor??"",j=R?.dir==="prev"?"prev":"next",F;if(_)try{let D=p.repo.ref;typeof D.doc=="function"&&(F=await D.doc(_).get());}catch{}try{let D=await p.repo.query.paginate({pageSize:C,cursor:F,direction:j,where:[[$,"==",Jo(P)]]}),Q=E(A({docs:D.data,repoName:p.name,basePath:h,fk:$,fv:P,columns:T,schema:p.schema,pagination:{hasPrev:D.hasPrevPage,hasNext:D.hasNextPage,prevCursor:D.prevCursor?.id??"",nextCursor:D.nextCursor?.id??"",pageSize:C}}));H(f,Q);}catch(D){H(f,`<div class='p-6 text-error text-sm'>Error: ${D.message}</div>`,500);}},d=async(c,f)=>{let m=[];for(let p of f){let h;if(c.isGroup||c.parentKeys?.length){let R=await Ne(c,p);h=R?bt(R,c.pathKey):void 0;}h||(h=[p]);try{let R=c.repo.documentRef(...h);R&&m.push(R);}catch{}}return m},g=async(c,f)=>{let m=or(f),p=c.documentKey??"docId",h=[],R;for(;;){let S=await c.repo.query.paginate({pageSize:500,cursor:R,direction:"next",...m.length>0?{where:m}:{}});for(let C of S.data){let T=String(C[p]??C.id??"");T&&h.push(T);}if(!S.hasNextPage||!S.nextCursor)break;R=S.nextCursor;}return h},x=async(c,f)=>{let m=c.params.repoName;if(!m){te(f,{error:"Bad request"},400);return}let p=e[m];if(!p){te(f,{error:"Repository not found"},404);return}if(!p.allowDelete){te(f,{error:"Delete is not allowed for this repository"},403);return}let h=c.body??{};try{let R=await v(p,h);if(R.length===0){te(f,{deleted:0});return}let S=await d(p,R);for(let C=0;C<S.length;C+=500)await p.repo.bulk.delete(S.slice(C,C+500));te(f,{deleted:S.length});}catch(R){te(f,{error:R.message},500);}},b=async(c,f)=>{let m=c.params.repoName;if(!m){te(f,{error:"Bad request"},400);return}let p=e[m];if(!p){te(f,{error:"Repository not found"},404);return}let h=c.body??{},R=String(h.field??"");if(!R){te(f,{error:"Missing 'field'"},400);return}if(!p.mutableFields||!p.mutableFields.includes(R)){te(f,{error:`Field '${R}' is not bulk-updatable`},403);return}let S=p.schema.shape?.[R],C=h.value;if(S){let T=S.safeParse(h.value);if(!T.success){te(f,{error:`Invalid value for '${R}': ${T.error.message}`},400);return}C=T.data;}try{let T=await v(p,h);if(T.length===0){te(f,{updated:0});return}let A=(await d(p,T)).map(E=>({docRef:E,data:{[R]:C}}));for(let E=0;E<A.length;E+=500)await p.repo.bulk.update(A.slice(E,E+500));te(f,{updated:A.length});}catch(T){te(f,{error:T.message},500);}};async function v(c,f){if(f.selectAll){let m=k(f.filters,c);return await g(c,m)}return Array.isArray(f.ids)?f.ids.filter(m=>typeof m=="string"&&!!m):[]}function k(c,f){if(!Array.isArray(c))return [];let m=new Set((f.filterableFields??Object.keys(re(f.schema))).map(R=>String(R))),p=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),h=[];for(let R of c)R&&typeof R=="object"&&typeof R.field=="string"&&m.has(R.field)&&typeof R.value=="string"&&p.has(String(R.op))&&h.push({field:R.field,op:R.op,value:R.value});return h}return {handleDashboard:r,handleList:o,handleCreateForm:s,handleCreateSubmit:a,handleEditForm:l,handleEditSubmit:i,handleDelete:u,handlePanel:y,handleBulkDelete:x,handleBulkUpdate:b,handleHistory:async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}if(!h.historyEnabled||!h.repo.history){H(f,"History not enabled for this repository",404);return}let R=me(c,t,n),S=h.historySubcollection??"history",C=[p];try{let D=await Ne(h,p),Q=D?bt(D,h.pathKey):void 0;Q&&Q.length>0&&(C=Q);}catch{}let T=parseInt(String(c.query?.limit??"")),O=Number.isFinite(T)&&T>0?Math.min(T,500):100,A=[],E;try{A=await h.repo.history.list(...C,{limit:O});}catch(D){E=D.message;}let $=D=>String(D??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),P=D=>{if(D===void 0)return '<span class="opacity-40">undefined</span>';if(D===null)return '<span class="opacity-40">null</span>';if(typeof D=="object")try{return `<code class="text-xs">${$(JSON.stringify(D))}</code>`}catch{return $(String(D))}return $(String(D))},_=D=>D?typeof D.toDate=="function"?D.toDate().toISOString():D instanceof Date?D.toISOString():$(String(D)):"",j=D=>`<span class="badge badge-sm ${D==="create"?"badge-success":D==="delete"?"badge-error":"badge-info"}">${$(D)}</span>`,F="";if(F+='<div class="flex items-center justify-between mb-4">',F+=`<a href="${R}/${h.name}/${encodeURIComponent(p)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,F+=`<a href="${R}/${h.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,F+="</div>",F+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${$(S)}</code> \xB7 Showing up to ${O} entries.</p>`,E)F+=`<div class="alert alert-error mb-4">${$(E)}</div>`;else if(A.length===0)F+='<div class="alert">No history entries found.</div>';else {F+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',F+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let D of A){let Q=D.meta??{},de=[Q.reason,Q.comment].filter(X=>X!=null&&X!=="").map(X=>$(String(X))).join(" \u2014 "),q="",ie=Object.keys(D.changes??{});ie.length===0?q='<span class="opacity-40">\u2014</span>':q='<ul class="space-y-1">'+ie.map(X=>{let tt=D.changes[X];return `<li><strong>${$(X)}</strong>: ${P(tt.oldValue)} \u2192 ${P(tt.newValue)}</li>`}).join("")+"</ul>",F+="<tr>",F+=`<td class="whitespace-nowrap text-xs font-mono">${$(_(D.historySetAt))}</td>`,F+=`<td>${j(D.operation??"update")}</td>`,F+=`<td class="text-xs">${$(Q.userEmail??Q.userId??"")}</td>`,F+=`<td class="text-xs">${de}</td>`,F+=`<td>${q}</td>`,F+="</tr>";}F+="</tbody></table></div>";}H(f,Je(F,{title:`History \u2014 ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`History ${p}`}]}));}}}function te(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Jo(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var dr="https://cdn.jsdelivr.net",ur="https://www.gstatic.com",pr=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${dr} ${ur}`,`style-src 'self' 'unsafe-inline' ${dr}`,`connect-src 'self' ${ur} 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 Xe(e={}){let t=e.csp===void 0?pr: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,a,l)=>{typeof a?.setHeader=="function"&&(a.setHeader("X-Content-Type-Options","nosniff"),n&&a.setHeader("X-Frame-Options",n),r&&a.setHeader("Referrer-Policy",r),o&&a.setHeader("Cache-Control",o),t&&a.setHeader("Content-Security-Policy",t)),await l();}}async function Xo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Yo(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," ")),a=t[o];a===void 0?t[o]=s:Array.isArray(a)?a.push(s):t[o]=[a,s];}return t}function fr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],httpsOptions:l}=e,i=t==="/"?"":t.replace(/\/$/,""),u={};for(let[x,b]of Object.entries(n)){let v=b.schema??b.repo.schema??null;if(!v)throw new Error(`[createAdminServer] Repository "${x}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let k,w,c;if(b.fieldsConfig){let p=b.fieldsConfig;k=[],w=[],c=[];for(let[h,R]of Object.entries(p))for(let S of R)S==="filterable"?k.push(h):S==="mutable"?w.push(h):S==="create"&&c.push(h);k.length===0&&(k=void 0),w.length===0&&(w=void 0),c.length===0&&(c=void 0);}let f=(()=>{let p=b.repo._parentKeys;return p&&p.length>0?p:void 0})();if(f&&c)for(let p of f)c.includes(p)||c.push(p);let m={name:x,path:b.path,repo:b.repo,schema:v,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:f,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:k,mutableFields:w,createFields:c,allowDelete:b.allowDelete??false,historyEnabled:!!b.repo.history,historySubcollection:(b.repo.history&&b.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!b.relationalFields||b.relationalFields.length===0)return;let p=b.repo.relationalKeys??{},h=[];for(let R of b.relationalFields){let S=p[R.key];S&&h.push({key:R.key,column:R.column,targetRepo:String(S.repo),targetKey:String(S.key),type:S.type});}return h.length>0?h:void 0})()};u[x]=m;}let y=cr(u,i,An(l?.region)),d=new oe;if(o!==false&&d.use(Xe(o===void 0?{}:o)),r&&d.use(async(x,b,v)=>{let k=x,w=String(k.headers?.["content-type"]??"");if(w.includes("application/x-www-form-urlencoded")){let c=await Xo(k);x.body=Yo(c);}else if(w.includes("application/json")&&typeof k.body=="string")try{x.body=JSON.parse(k.body);}catch{}await v();}),s)if(he(s)){for(let x of s.routes){let b=`${i}${x.path}`;x.method==="GET"?d.get(b,x.handler):d.post(b,x.handler);}d.use(s.middleware);}else if(typeof s=="function")d.use(s);else {let x=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");d.use((v,k,w)=>{if((v.headers?.authorization??"")!==b){k.status(401).set("WWW-Authenticate",`Basic realm="${x}"`).set("Content-Type","text/plain").send("Unauthorized");return}w();});}for(let x of a)d.use(x);d.get(`${i}/`,y.handleDashboard),d.get(`${i}`,y.handleDashboard),d.get(`${i}/:repoName/_panel`,y.handlePanel),d.post(`${i}/:repoName/_bulk/delete`,y.handleBulkDelete),d.post(`${i}/:repoName/_bulk/update`,y.handleBulkUpdate),d.get(`${i}/:repoName`,y.handleList),d.get(`${i}/:repoName/create`,y.handleCreateForm),d.post(`${i}/:repoName/create`,y.handleCreateSubmit),d.get(`${i}/:repoName/:id/edit`,y.handleEditForm),d.post(`${i}/:repoName/:id/edit`,y.handleEditSubmit),d.get(`${i}/:repoName/:id/history`,y.handleHistory),d.post(`${i}/:repoName/:id/delete`,y.handleDelete);let g=async(x,b)=>{await d.handle(x,b);};return l&&(g.httpsOptions=l),g}function rn(e,t,n=200){let r=K(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function je(e,t,n,r=200){rn(e,{success:true,data:t,meta:n},r);}function L(e,t,n=400){rn(e,{success:false,error:t},n);}function tn(e,t,n,r,o){let s=Qe(t,n),a=s.type==="index",l=a?424:500,u={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(u.errorType="index",s.indexUrl&&(u.indexUrl=s.indexUrl)),rn(e,u,l);}var nn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function ts(){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>=nn.length*4||(e+=nn.charAt(r%nn.length));}}return e}function Me(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=>kt(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=Me(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Me(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Me(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Me(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=Me(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function ns(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let a of s){if(n.includes(a))continue;let l=a.split(".")[0];l&&r[l]&&(o[l]=r[l]);}return zod.z.object(o)}function yr(e,t,n,r=false,o=[]){try{let s=ns(e,n,o),a=r?s.partial():s;return {success:!0,data:(St()==="normalize"?Me(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function rs(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,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let l=Array.isArray(a)?a[0]:a;if(l===void 0||l==="")continue;let i=s.match(/^(\w+)__(\w+)$/),u,y="==";if(i&&i[1]&&i[2]){u=i[1];let g=i[2];if(o[g])y=o[g];else continue}else if(!i)u=s;else continue;if(r&&!r.has(u))continue;let d=l;y==="in"||y==="not-in"||y==="array-contains-any"?d=l.split(",").map(g=>mr(g.trim())):d=mr(l),n.push({field:u,op:y,value:d});}return n}function mr(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 xt(e){return e?{docId:e.id}:null}async function gr(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 hr(e,t,n,r=false){async function o(w,c,f,m){if(!r)return true;let p=c.rules?.[f];if(!p)return L(w,`Operation "${f}" is not allowed for this repository`,403),false;try{return await p(m)?!0:(L(w,"Forbidden",403),!1)}catch(h){let R=n&&h instanceof Error?h.message:"Forbidden";return L(w,R,403),false}}async function s(w,c,f,m){if(!r)return m;let p=w.rules?.filter;if(!p)return m;let h=[];for(let R of m)try{await p({user:c,doc:R,params:f})&&h.push(R);}catch{}return h}function a(w){return w?.user??null}function l(w,c){return !w||!e[w]?(L(c,`Repository "${w}" not found`,404),null):e[w]}function i(w,c){if(!c)return;let f=w[c];if(typeof f!="string"||!f)return;let m=f.split("/").filter(Boolean),p=[];for(let h=1;h<m.length;h+=2)p.push(m[h]);return p.length>0?p:void 0}async function u(w,c){let f=`by${w.documentKey.charAt(0).toUpperCase()}${w.documentKey.slice(1)}`,m=w.repo.get[f];if(typeof m=="function")try{let h=await m(c);if(h)return h}catch{}return (await w.repo.query.by({where:[[w.documentKey,"==",c]],limit:1}))[0]??null}async function y(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=a(w);if(!await o(c,m,"list",{user:p,query:w.query??{},params:f}))return;let h=[],R;try{let S=w.query??{},C=Math.min(Number(S.pageSize)||m.pageSize,100),T=S.cursor,O=S.direction?.toLowerCase()==="prev"?"prev":"next",A=S.orderBy,E=S.orderDir?.toLowerCase()==="desc"?"desc":"asc",$=S.select,P=$?$.split(",").map(q=>q.trim()):void 0,_;m.allowedIncludes&&S.includes&&(_=(typeof S.includes=="string"?S.includes.split(",").map(ie=>ie.trim()):Array.isArray(S.includes)?S.includes:[]).filter(ie=>typeof ie=="string"&&m.allowedIncludes.includes(ie)),_?.length===0&&(_=void 0));let j=rs(S,m.filterableFields);h=j.map(q=>({field:q.field,op:q.op,value:String(q.value??"")})),A&&(R={field:A,dir:E});let F={pageSize:C,direction:O};if(T)try{let q=typeof T=="string"?JSON.parse(T):T;F.cursor=await gr(m,q);}catch{}if(A){if(m.orderableFields&&!m.orderableFields.includes(A)){L(c,`Field not orderable: ${A}`,400);return}F.orderBy=[{field:A,direction:E}];}j.length>0&&(F.where=j.map(q=>[q.field,q.op,q.value])),P&&(F.select=P),_&&(F.include=_);let D=await m.repo.query.paginate(F),de={items:await s(m,a(w),f,D.data),hasNextPage:D.hasNextPage,hasPrevPage:D.hasPrevPage,nextCursor:xt(D.nextCursor),prevCursor:xt(D.prevCursor)};je(c,de,{pageSize:C,hasMore:D.hasNextPage});}catch(S){tn(c,S,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:h,sort:R},"Failed to fetch documents",n);}}async function d(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=a(w);if(!await o(c,m,"list",{user:p,query:w.body??{},params:f}))return;let h=[],R;try{let S=w.body??{},C=Math.min(S.pageSize||m.pageSize,100),T=S.direction==="prev"?"prev":"next";S.where&&(h=S.where.map(P=>({field:String(P[0]),op:P[1],value:String(P[2]??"")}))),S.orderBy&&S.orderBy[0]&&(R={field:S.orderBy[0].field,dir:S.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:C,direction:T};if(S.cursor)try{let P=typeof S.cursor=="string"?JSON.parse(S.cursor):S.cursor;O.cursor=await gr(m,P);}catch{}if(m.allowedIncludes&&S.includes&&S.includes.length>0){let P=S.includes.filter(_=>typeof _=="string"?m.allowedIncludes.includes(_):typeof _=="object"&&_!==null&&"relation"in _&&typeof _.relation=="string"?m.allowedIncludes.includes(_.relation):!1);P.length>0&&(O.include=P);}if(S.where&&S.where.length>0){if(m.filterableFields){let P=new Set(m.filterableFields),_=S.where.filter(j=>!P.has(j[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(j=>j[0]).join(", ")}`,400);return}}O.where=S.where;}if(S.orWhere&&S.orWhere.length>0){if(m.filterableFields){let P=new Set(m.filterableFields),_=S.orWhere.filter(j=>!P.has(j[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(j=>j[0]).join(", ")}`,400);return}}O.orWhere=S.orWhere;}if(S.orWhereGroups&&S.orWhereGroups.length>0){if(m.filterableFields){let P=new Set(m.filterableFields);for(let _ of S.orWhereGroups){let j=_.filter(F=>!P.has(F[0]));if(j.length>0){L(c,`Fields not filterable: ${j.map(F=>F[0]).join(", ")}`,400);return}}}O.orWhereGroups=S.orWhereGroups;}if(S.orderBy&&S.orderBy.length>0){if(m.orderableFields){let P=new Set(m.orderableFields),_=S.orderBy.filter(j=>!P.has(j.field));if(_.length>0){L(c,`Fields not orderable: ${_.map(j=>j.field).join(", ")}`,400);return}}O.orderBy=S.orderBy;}S.select&&S.select.length>0&&(O.select=S.select);let A=await m.repo.query.paginate(O),$={items:await s(m,a(w),f,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:xt(A.nextCursor),prevCursor:xt(A.prevCursor)};je(c,$,{pageSize:C,hasMore:A.hasNextPage});}catch(S){tn(c,S,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:h,sort:R},"Failed to query documents",n);}}async function g(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=f.id;if(!p){L(c,"Document ID required",400);return}try{let h=await u(m,p);if(!h){L(c,"Document not found",404);return}let R=a(w);if(!await o(c,m,"get",{user:R,doc:h,params:f}))return;if(r&&m.rules?.filter)try{if(!await m.rules.filter({user:R,doc:h,params:f})){L(c,"Document not found",404);return}}catch{L(c,"Document not found",404);return}je(c,h);}catch(h){tn(c,h,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:[{field:m.documentKey,op:"==",value:p}]},"Failed to fetch document",n);}}async function x(w,c){let f=w.params||{},m=l(f.repoName,c);if(m)try{let p=w.body??{},h=a(w);if(!await o(c,m,"create",{user:h,body:p,params:f}))return;let R=yr(m.schema,p,m.createFields,!1,m.systemKeys);if(!R.success){L(c,R.error,400);return}if(m.validate){let C=await m.validate(R.data,"create");if(C){L(c,C,400);return}}let S;if(m.isGroup&&m.parentKeys&&m.parentKeys.length>0){let C={...R.data};m.createdKey&&(C[m.createdKey]=new Date);let T=m.parentKeys.filter(E=>!C[E]);if(T.length>0){L(c,`Missing parent key(s) for subcollection create: ${T.join(", ")}`,400);return}let O=m.parentKeys.map(E=>C[E]),A=C[m.documentKey]||ts();S=await m.repo.set(...O,A,C);}else S=await m.repo.create(R.data);je(c,S,void 0,201);}catch(p){let h=n&&p instanceof Error?p.message:"Failed to create document";L(c,h,500);}}async function b(w,c,f){let m=w.params||{},p=l(m.repoName,c);if(!p)return;let h=m.id;if(!h){L(c,"Document ID required",400);return}try{let R=w.body??{},S=await u(p,h);if(!S){L(c,"Document not found",404);return}let C=a(w);if(!await o(c,p,"update",{user:C,doc:S,body:R,params:m}))return;let T=yr(p.schema,R,p.mutableFields,f,p.systemKeys);if(!T.success){L(c,T.error,400);return}if(p.validate){let E=await p.validate(T.data,"update");if(E){L(c,E,400);return}}let O=i(S,p.pathKey)??[h],A=await p.repo.update(...O,T.data);je(c,A);}catch(R){let S=n&&R instanceof Error?R.message:"Failed to update document";L(c,S,500);}}async function v(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;if(!m.allowDelete){L(c,"Delete not allowed for this repository",403);return}let p=f.id;if(!p){L(c,"Document ID required",400);return}try{let h=await u(m,p);if(!h){L(c,"Document not found",404);return}let R=a(w);if(!await o(c,m,"delete",{user:R,doc:h,params:f}))return;let S=i(h,m.pathKey)??[p];await m.repo.delete(...S),je(c,{deleted:!0});}catch(h){let R=n&&h instanceof Error?h.message:"Failed to delete document";L(c,R,500);}}function k(w,c){c.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:y,handleQuery:d,handleGet:g,handleCreate:x,handleUpdate:b,handleDelete:v,handleOptions:k}}function on(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 ae(e){return {$ref:`#/components/schemas/${e}`}}function ee(e){return {description:e,content:{"application/json":{schema:ae("ErrorResponse")}}}}function et(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function br(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 os(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 ss(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 as(){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 is(e,t,n,r,o){let s={},a=e.name,l=`${t}/${e.name}`,i=`${l}/{${e.documentKey}}`,u={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[l]={get:{operationId:`list${ke(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...os(e),...ss(e)],responses:{200:br(ae(n)),500:ee("Internal server error")}},post:{operationId:`create${ke(e.name)}`,summary:`Create a ${ce(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae(r??n)}}},responses:{201:et("Document created",ae(n)),400:ee("Validation error"),500:ee("Internal server error")}}},s[`${l}/query`]={post:{operationId:`query${ke(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae("QueryRequestBody")}}},responses:{200:br(ae(n)),400:ee("Invalid query"),500:ee("Internal server error")}}};let y={};return y.get={operationId:`get${ke(ce(e.name))}`,summary:`Get a single ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:et("Document found",ae(n)),404:ee("Document not found"),500:ee("Internal server error")}},y.put={operationId:`update${ke(ce(e.name))}`,summary:`Update a ${ce(e.name)} (full replace)`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:ae(o??n)}}},responses:{200:et("Document updated",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},y.patch={operationId:`patch${ke(ce(e.name))}`,summary:`Partially update a ${ce(e.name)}`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:{allOf:[ae(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:et("Document patched",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},e.allowDelete&&(y.delete={operationId:`delete${ke(ce(e.name))}`,summary:`Delete a ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:et("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:ee("Document not found"),500:ee("Internal server error")}}),s[i]=y,s}function an(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:l=false}=n,i=t==="/"?"":t.replace(/\/$/,""),u={},y={},d=[];u.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},u.QueryRequestBody=as();for(let[v,k]of Object.entries(e)){let w=ke(ce(v)),c=`${w}Create`,f=`${w}Update`;u[w]=on(k.schema);let m=T=>{let O=T&&T.length>0?T:Object.keys(k.schema.shape),A={};for(let E of O){let $=E.split(".")[0];$&&k.schema.shape[$]&&!k.systemKeys.includes($)&&(A[$]=k.schema.shape[$]);}return A},p=null,h=m(k.createFields);Object.keys(h).length>0&&(u[c]=on(zod.z.object(h)),p=c);let R=null,S=m(k.mutableFields);Object.keys(S).length>0&&(u[f]=on(zod.z.object(S)),R=f);let C=is(k,i,w,p,R);Object.assign(y,C),d.push({name:v,description:`Operations on ${v} (collection: ${k.path})`});}let g={},x;return l==="basic"?(g.basicAuth={type:"http",scheme:"basic"},x=[{basicAuth:[]}]):l==="bearer"&&(g.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},x=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:y,components:{schemas:u,...Object.keys(g).length>0?{securitySchemes:g}:{}},...x?{security:x}:{},tags:d}}function ke(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ce(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 ls(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 ls(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function br(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],verbose:l=false,httpsOptions:i}=e,u=t==="/"?"":t.replace(/\/$/,""),y={};for(let[f,m]of Object.entries(n)){let p=m.schema??m.repo.schema??null;if(!p)throw new Error(`[createCrudServer] Repository "${f}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let h,R,S,C;if(m.fieldsConfig){let A=m.fieldsConfig;h=[],R=[],S=[],C=[];for(let[E,$]of Object.entries(A))for(let P of $)P==="filterable"?h.push(E):P==="orderable"?R.push(E):P==="mutable"?S.push(E):P==="create"&&C.push(E);R.length===0&&(R=h),h.length===0&&(h=void 0),R&&R.length===0&&(R=void 0),S.length===0&&(S=void 0),C.length===0&&(C=void 0);}let T=(()=>{let A=m.repo._parentKeys;return A&&A.length>0?A:void 0})();if(T&&C)for(let A of T)C.includes(A)||C.push(A);let O={name:f,path:m.path,repo:m.repo,schema:p,systemKeys:m.repo._systemKeys??[m.documentKey??"docId"],documentKey:m.documentKey??"docId",pathKey:m.repo._pathKey??void 0,isGroup:!!m.repo._isGroup,parentKeys:T,createdKey:m.repo._createdKey??void 0,pageSize:m.pageSize??25,filterableFields:h,orderableFields:R,mutableFields:S,createFields:C,allowDelete:m.allowDelete??false,allowedIncludes:m.allowedIncludes,validate:m.validate,rules:m.rules};y[f]=O;}let g=gr(y,u,l,!!s),x=e.openapi,b=x&&typeof x=="object"?x:{},v=null;function k(){if(!v){let f=s?he(s)||typeof s=="function"?"bearer":"basic":false;v=an(y,u,{...b,auth:b.auth??f});}return v}let w=new oe;if(o!==false){let f=o===void 0?{csp:false}:o;w.use(Je(f));}if(w.use((f,m,p)=>{m.set("Access-Control-Allow-Origin","*"),m.set("Access-Control-Allow-Credentials","true"),p();}),r&&w.use(async(f,m,p)=>{let h=f;if(String(h.headers?.["content-type"]??"").includes("application/json")){if(typeof h.body=="string")try{f.body=JSON.parse(h.body);}catch{}else if(Buffer.isBuffer(f.rawBody))try{let S=await ls(h);f.body=JSON.parse(S);}catch{}}await p();}),s)if(he(s)){for(let f of s.routes){let m=`${u}${f.path}`;f.method==="GET"?w.get(m,f.handler):w.post(m,f.handler);}w.use(s.middleware);}else if(typeof s=="function")w.use(s);else {let f=s.realm??"API",m="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");w.use((p,h,R)=>{if((p.headers?.authorization??"")!==m){h.status(401).set("WWW-Authenticate",`Basic realm="${f}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}R();});}for(let f of a)w.use(f);if(x!==false){let f=`${u}/__spec.json`,m=`${u}/__docs`;w.get(f,(p,h)=>{let R=k();h.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(R,null,2));}),w.get(m,(p,h)=>{let R=ne(p,u)+"/__spec.json",S=is(b.title??"CRUD API",R);h.status(200).set("Content-Type","text/html; charset=utf-8").send(S);});}w.use((f,m,p)=>{if(f.method==="OPTIONS"){g.handleOptions(f,m);return}p();}),w.get(`${u}/:repoName`,g.handleList),w.post(`${u}/:repoName/query`,g.handleQuery),w.get(`${u}/:repoName/:id`,g.handleGet),w.post(`${u}/:repoName`,g.handleCreate),w.put(`${u}/:repoName/:id`,(f,m)=>g.handleUpdate(f,m,false)),w.patch(`${u}/:repoName/:id`,(f,m)=>g.handleUpdate(f,m,true)),w.delete(`${u}/:repoName/:id`,g.handleDelete);let c=async(f,m)=>{await w.handle(f,m);};return c.spec=k,i&&(c.httpsOptions=i),c}function xr(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function vr(e,t,n){let r={};for(let[o,s]of Object.entries(t)){if(!s)continue;let a=e[o];if(!a)throw new Error(`[createServers.${n}] Unknown repo "${o}" \u2014 not present in the registry passed to createServers().`);r[o]={...s,repo:a};}return r}function wr(e,t={}){return {admin(n){let r=vr(e,n.repos,"admin"),o=pr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return xr(o,t)},crud(n){let r=vr(e,n.repos,"crud"),o=br({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return xr(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}),zn(e,r)},history(n){return Cn(e,n)}}}function Il(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function Fl(e,t){let n={...e};for(let r in t)t[r]&&(n[r]={...e[r],relationalKeys:t[r]});return n}var ln=class{constructor(t,n){this.allRepositories={};this.initialized=false;this.dbFactory=t,this.mapping=n;}get db(){return this._db??(this._db=this.dbFactory())}ensureInitialized(){this.initialized||(this.initializeRepositories(),this.initialized=true);}initializeRepositories(){let t=this.db;for(let n of Object.keys(this.mapping))this.allRepositories[n]=Et(t,this.mapping[n],{});for(let n of Object.keys(this.mapping))this.allRepositories[n]=Et(t,this.mapping[n],this.allRepositories);}getRepository(t){return this.ensureInitialized(),this.allRepositories[t]}};function _l(e,t){let n=new ln(e,t),r=Object.keys(t);return new Proxy(n,{get(o,s){return typeof s=="string"&&s in t?o.getRepository(s):o[s]},ownKeys(){return r},getOwnPropertyDescriptor(o,s){if(typeof s=="string"&&s in t)return {configurable:true,enumerable:true,writable:false}}})}exports.MiniRouter=oe;exports.RepositoryMapping=ln;exports.applyPaginationQueryOptions=ge;exports.buildAndExecuteQuery=Te;exports.buildRepositoryRelations=Fl;exports.coerceToDate=kt;exports.createPaginationIterator=Tt;exports.createRepositoryConfig=Il;exports.createRepositoryMapping=_l;exports.createServers=wr;exports.executePaginatedQuery=ot;exports.getDateHandling=St;exports.normalizeTimestamps=rt;exports.setDateHandling=Er;//# sourceMappingURL=index.cjs.map
1157
+ </html>`}async function cs(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function xr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],verbose:l=false,httpsOptions:i}=e,u=t==="/"?"":t.replace(/\/$/,""),y={};for(let[f,m]of Object.entries(n)){let p=m.schema??m.repo.schema??null;if(!p)throw new Error(`[createCrudServer] Repository "${f}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let h,R,S,C;if(m.fieldsConfig){let A=m.fieldsConfig;h=[],R=[],S=[],C=[];for(let[E,$]of Object.entries(A))for(let P of $)P==="filterable"?h.push(E):P==="orderable"?R.push(E):P==="mutable"?S.push(E):P==="create"&&C.push(E);R.length===0&&(R=h),h.length===0&&(h=void 0),R&&R.length===0&&(R=void 0),S.length===0&&(S=void 0),C.length===0&&(C=void 0);}let T=(()=>{let A=m.repo._parentKeys;return A&&A.length>0?A:void 0})();if(T&&C)for(let A of T)C.includes(A)||C.push(A);let O={name:f,path:m.path,repo:m.repo,schema:p,systemKeys:m.repo._systemKeys??[m.documentKey??"docId"],documentKey:m.documentKey??"docId",pathKey:m.repo._pathKey??void 0,isGroup:!!m.repo._isGroup,parentKeys:T,createdKey:m.repo._createdKey??void 0,pageSize:m.pageSize??25,filterableFields:h,orderableFields:R,mutableFields:S,createFields:C,allowDelete:m.allowDelete??false,allowedIncludes:m.allowedIncludes,validate:m.validate,rules:m.rules};y[f]=O;}let g=hr(y,u,l,!!s),x=e.openapi,b=x&&typeof x=="object"?x:{},v=null;function k(){if(!v){let f=s?he(s)||typeof s=="function"?"bearer":"basic":false;v=an(y,u,{...b,auth:b.auth??f});}return v}let w=new oe;if(o!==false){let f=o===void 0?{csp:false}:o;w.use(Xe(f));}if(w.use((f,m,p)=>{m.set("Access-Control-Allow-Origin","*"),m.set("Access-Control-Allow-Credentials","true"),p();}),r&&w.use(async(f,m,p)=>{let h=f;if(String(h.headers?.["content-type"]??"").includes("application/json")){if(typeof h.body=="string")try{f.body=JSON.parse(h.body);}catch{}else if(Buffer.isBuffer(f.rawBody))try{let S=await cs(h);f.body=JSON.parse(S);}catch{}}await p();}),s)if(he(s)){for(let f of s.routes){let m=`${u}${f.path}`;f.method==="GET"?w.get(m,f.handler):w.post(m,f.handler);}w.use(s.middleware);}else if(typeof s=="function")w.use(s);else {let f=s.realm??"API",m="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");w.use((p,h,R)=>{if((p.headers?.authorization??"")!==m){h.status(401).set("WWW-Authenticate",`Basic realm="${f}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}R();});}for(let f of a)w.use(f);if(x!==false){let f=`${u}/__spec.json`,m=`${u}/__docs`;w.get(f,(p,h)=>{let R=k();h.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(R,null,2));}),w.get(m,(p,h)=>{let R=ne(p,u)+"/__spec.json",S=ls(b.title??"CRUD API",R);h.status(200).set("Content-Type","text/html; charset=utf-8").send(S);});}w.use((f,m,p)=>{if(f.method==="OPTIONS"){g.handleOptions(f,m);return}p();}),w.get(`${u}/:repoName`,g.handleList),w.post(`${u}/:repoName/query`,g.handleQuery),w.get(`${u}/:repoName/:id`,g.handleGet),w.post(`${u}/:repoName`,g.handleCreate),w.put(`${u}/:repoName/:id`,(f,m)=>g.handleUpdate(f,m,false)),w.patch(`${u}/:repoName/:id`,(f,m)=>g.handleUpdate(f,m,true)),w.delete(`${u}/:repoName/:id`,g.handleDelete);let c=async(f,m)=>{await w.handle(f,m);};return c.spec=k,i&&(c.httpsOptions=i),c}function vr(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function wr(e,t,n){let r={};for(let[o,s]of Object.entries(t)){if(!s)continue;let a=e[o];if(!a)throw new Error(`[createServers.${n}] Unknown repo "${o}" \u2014 not present in the registry passed to createServers().`);r[o]={...s,repo:a};}return r}function Rr(e,t={}){return {admin(n){let r=wr(e,n.repos,"admin"),o=fr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return vr(o,t)},crud(n){let r=wr(e,n.repos,"crud"),o=xr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return vr(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}),Zn(e,r)},history(n){return Cn(e,n)}}}function _l(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function Fl(e,t){let n={...e};for(let r in t)t[r]&&(n[r]={...e[r],relationalKeys:t[r]});return n}var ln=class{constructor(t,n){this.allRepositories={};this.initialized=false;this.dbFactory=t,this.mapping=n;}get db(){return this._db??(this._db=this.dbFactory())}ensureInitialized(){this.initialized||(this.initializeRepositories(),this.initialized=true);}initializeRepositories(){let t=this.db;for(let n of Object.keys(this.mapping))this.allRepositories[n]=Et(t,this.mapping[n],{});for(let n of Object.keys(this.mapping))this.allRepositories[n]=Et(t,this.mapping[n],this.allRepositories);}getRepository(t){return this.ensureInitialized(),this.allRepositories[t]}};function Nl(e,t){let n=new ln(e,t),r=Object.keys(t);return new Proxy(n,{get(o,s){return typeof s=="string"&&s in t?o.getRepository(s):o[s]},ownKeys(){return r},getOwnPropertyDescriptor(o,s){if(typeof s=="string"&&s in t)return {configurable:true,enumerable:true,writable:false}}})}exports.MiniRouter=oe;exports.RepositoryMapping=ln;exports.applyPaginationQueryOptions=ge;exports.buildAndExecuteQuery=Te;exports.buildRepositoryRelations=Fl;exports.coerceToDate=kt;exports.createPaginationIterator=Tt;exports.createRepositoryConfig=_l;exports.createRepositoryMapping=Nl;exports.createServers=Rr;exports.executePaginatedQuery=st;exports.getDateHandling=St;exports.normalizeTimestamps=ot;exports.setDateHandling=Pr;//# sourceMappingURL=index.cjs.map
1158
1158
  //# sourceMappingURL=index.cjs.map