@lpdjs/firestore-repo-service 2.6.10 → 2.6.12
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/{create-servers-k4vH90mn.d.cts → create-servers-Bq9lnpg6.d.cts} +7 -7
- package/dist/{create-servers-DA8xV-aT.d.ts → create-servers-dXpZiSOT.d.ts} +7 -7
- package/dist/{firebase-auth-BTclYg-c.d.cts → firebase-auth-t1CAR-lp.d.cts} +9 -0
- package/dist/{firebase-auth-BTclYg-c.d.ts → firebase-auth-t1CAR-lp.d.ts} +9 -0
- package/dist/{index-BRjxlxWa.d.ts → index-4gzZw5m_.d.ts} +2 -2
- package/dist/{index-BOYhux7q.d.cts → index-CXWiqnFs.d.cts} +2 -2
- package/dist/index.cjs +15 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.js +15 -15
- package/dist/index.js.map +1 -1
- package/dist/{openapi-BnVlzg59.d.ts → openapi-Bq6KTWCR.d.ts} +1 -1
- package/dist/{openapi-Cci3oqin.d.cts → openapi-D71F-INl.d.cts} +1 -1
- package/dist/{queue-QISiqmAy.d.cts → queue-Bl-S-I-7.d.cts} +1 -1
- package/dist/{queue-B7uCIF1O.d.ts → queue-DP7t5Jp7.d.ts} +1 -1
- package/dist/servers/admin/index.cjs +4 -4
- package/dist/servers/admin/index.cjs.map +1 -1
- package/dist/servers/admin/index.d.cts +3 -3
- package/dist/servers/admin/index.d.ts +3 -3
- package/dist/servers/admin/index.js +4 -4
- package/dist/servers/admin/index.js.map +1 -1
- package/dist/servers/auth/index.cjs +10 -6
- package/dist/servers/auth/index.cjs.map +1 -1
- package/dist/servers/auth/index.d.cts +1 -1
- package/dist/servers/auth/index.d.ts +1 -1
- package/dist/servers/auth/index.js +10 -6
- package/dist/servers/auth/index.js.map +1 -1
- package/dist/servers/crud/index.cjs +2 -2
- package/dist/servers/crud/index.cjs.map +1 -1
- package/dist/servers/crud/index.d.cts +5 -5
- package/dist/servers/crud/index.d.ts +5 -5
- package/dist/servers/crud/index.js +2 -2
- package/dist/servers/crud/index.js.map +1 -1
- package/dist/servers/hono/cli.cjs +187 -65
- package/dist/servers/hono/cli.cjs.map +1 -1
- package/dist/servers/hono/cli.js +187 -65
- package/dist/servers/hono/cli.js.map +1 -1
- package/dist/servers/hono/index.cjs +233 -3
- package/dist/servers/hono/index.cjs.map +1 -1
- package/dist/servers/hono/index.d.cts +188 -76
- package/dist/servers/hono/index.d.ts +188 -76
- package/dist/servers/hono/index.js +233 -3
- package/dist/servers/hono/index.js.map +1 -1
- package/dist/servers/index.cjs +1 -1
- package/dist/servers/index.cjs.map +1 -1
- package/dist/servers/index.d.cts +8 -8
- package/dist/servers/index.d.ts +8 -8
- package/dist/servers/index.js +1 -1
- package/dist/servers/index.js.map +1 -1
- package/dist/sync/bigquery.d.cts +2 -2
- package/dist/sync/bigquery.d.ts +2 -2
- package/dist/sync/index.cjs +13 -13
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.d.cts +5 -5
- package/dist/sync/index.d.ts +5 -5
- package/dist/sync/index.js +13 -13
- package/dist/sync/index.js.map +1 -1
- package/dist/{types-CCREogoy.d.cts → types-BxsdnGDM.d.cts} +1 -1
- package/dist/{types-n7q6N_Zw.d.ts → types-C6I3WtJS.d.ts} +1 -1
- package/dist/{types-B7KFW9S9.d.cts → types-C_alF2Xe.d.cts} +1 -1
- package/dist/{types-CMrrjq1V.d.ts → types-CmSUreTx.d.ts} +1 -1
- package/package.json +1 -1
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 Tr=Object.defineProperty;var et=(e,t)=>()=>(e&&(t=e(e=0)),t);var Cr=(e,t)=>{for(var n in t)Tr(e,n,{get:t[n],enumerable:true});};function q(e){let t=e,n=t._zod?.def?.type;if(n)return eo[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 Cn(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function An(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 ne(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 Ze(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 dt(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function On(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 eo,Le=et(()=>{eo={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 Qn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function wo({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 De({val:e,mismatch:t}){let n=Ro(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(wo,{message:t})]}):n}function Ro(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(Qn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Qn,{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 mt=et(()=>{});function Ie(e){if(!e)return "unknown";let t=Nt(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 Nt(e){let t=q(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?Nt(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=Nt(r);if(q(s)!=="ZodObject")return;r=ne(s)[o];}return r}function Co(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 Qe(e,t){if(e==="unknown")return null;let n=Co(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 jt=et(()=>{Le();});var Gn={};Cr(Gn,{PanelMany:()=>Oo,PanelOne:()=>Ao,RightPanel:()=>Mt});function Ao({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`,d=Wn(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 f=e[i],y=d[i],u=y?Qe(y,f):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(De,{val:f,mismatch:u})})]})})})]})}function Oo({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:d}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,f=Wn(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,u)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y},u)),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,u)=>{let m=String(y.docId??y.id??""),v=`${n}/${t}/${encodeURIComponent(m)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((b,w)=>{let S=y[b],p=f[b],c=p?Qe(p,S):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(De,{val:S,mismatch:c})},w)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:v,class:"btn btn-xs btn-ghost",children:"Edit"})})]},u)})})]})}),(d.hasPrev||d.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[d.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":d.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),d.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":d.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Wn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Ie(Fe(e,r));return n}var Mt,Bt=et(()=>{mt();jt();Mt=({basePath:e=""})=>jsxRuntime.jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Ar(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function Me(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 xt(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function ln(e){let[t,n,r]=e;return xt(e)?Ar(r,30).map(s=>[t,n,s]):[e]}function tt(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function cn(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 ke(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 Me(e,t).get();if(!t.where.some(xt)){let u=tt(e,t.where);return u=Me(u,t),u.get()}let i=t.where.map(ln),y=vt(i).map(u=>{let m=tt(e,u);return m=Me(m,t),m});return cn(y)}let o=t.where??[],s=[...t.orWhere?.map(d=>[d])??[],...t.orWhereGroups??[]],a=[];for(let d of s){let i=[...o,...d];if(i.some(xt)){let y=i.map(ln),m=vt(y).map(v=>{let b=tt(e,v);return b=Me(b,t),b});a.push(...m);}else {let y=tt(e,i);y=Me(y,t),a.push(y);}}return cn(a)}function vt(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=vt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var wt="preserve";function Or(e){wt=e;}function Rt(){return wt}function $r(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function St(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($r(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 Pr(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nt(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>nt(t));if(Pr(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=nt(r);return t}return e}function U(e){return wt==="normalize"?nt(e):e}function un(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function de(e){return e.charAt(0).toUpperCase()+e.slice(1)}function me(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 rt(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 ke(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,d=a.map(f=>U({...f.data(),docId:f.id})),i=t.direction==="prev";return {data:d,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:d.length}}async function*kt(e,t){let n,r=true;for(;r;){let o=await rt(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function He(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 Tt(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(!Tt(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)||!Tt(e[s],t[s],n))return false;return true}return false}function ot(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??{},d=new Set([...Object.keys(s),...Object.keys(a)]),i={};for(let f of d){if(r.has(f)||o&&!o.has(f))continue;let y=s[f],u=a[f];Tt(y,u)||(i[f]={oldValue:y===void 0?null:y,newValue:u===void 0?null:u,type:{old:He(y),new:He(u)}});}return i}var Er=5;function Dr(e){return e.schemaVersion===2}function pn(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 Ir(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function Fr(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 _r(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?pn(r):He(t),new:o?pn(o):He(n)}}}function Nr(e){let t=_r(e),n=Fr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function jr(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function Mr(e,t){return (e.userId??null)===(t.userId??null)}function fn(e,t={}){let n=t.groupToleranceMs??Er,r=[];for(let o of e){if(Dr(o)){r.push(Ir(o));continue}let a=Nr(o),d=r[r.length-1];d&&d.schemaVersion===1&&jr(d.historySetAt,a.historySetAt,n)&&Mr(d.meta,a.meta)?Object.assign(d.changes,a.changes):r.push(a);}return r}var Hr=7e5;function st(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,d)=>d instanceof firestore.Timestamp?d.toMillis():d),"utf8")}catch{return 0}};if(o(r.changes)>Hr){let s={};for(let[a,d]of Object.entries(r.changes)){let i=o(d.oldValue),f=o(d.newValue);s[a]={oldValue:i>5e4?"[truncated]":d.oldValue,newValue:f>5e4?"[truncated]":d.newValue,type:d.type};}r.changes=s,r._truncated=true;}return r}async function at(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 it(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=y=>{if(!y)return;let u=n[y];return u===void 0||u===null?null:String(u)},a=s(o.userId);a!==void 0&&(r.userId=a);let d=s(o.userEmail);d!==void 0&&(r.userEmail=d);let i=s(o.reason);i!==void 0&&(r.reason=i);let f=s(o.comment);if(f!==void 0&&(r.comment=f),o.extras&&o.extras.length>0){let y={},u=false;for(let m of o.extras)m in n&&(y[m]=n[m],u=true);u&&(r.extras=y);}return r}function lt(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 zr="history",Zr=50;function yn(e,t,n){return e(...n).collection(t)}function Lr(e){return String(e[e.length-1]??"")}function mn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??zr;async function s(...y){let u={},m=y,v=y[y.length-1];v!==null&&typeof v=="object"&&!(v instanceof firestore.Timestamp)&&("limit"in v||"cursor"in v||"direction"in v)&&(u=v,m=y.slice(0,-1));let b=yn(e,o,m),w=u.direction??"desc",S=b.orderBy("historySetAt",w);return u.cursor&&(S=S.startAfter(u.cursor)),u.limit&&u.limit>0&&(S=S.limit(u.limit)),(await S.get()).docs.map(c=>({id:c.id,data:c.data()}))}async function a(...y){let u={},m=y,v=y[y.length-1];v!==null&&typeof v=="object"&&!(v instanceof firestore.Timestamp)&&("limit"in v||"cursor"in v||"direction"in v||"fields"in v||"operations"in v)&&(u=v,m=y.slice(0,-1));let b=u.limit??Zr,w=Math.max(b,Math.min(b*8,500)),S=await s(...m,{limit:w,cursor:u.cursor,direction:u.direction??"desc"}),p=fn(S.map(c=>c.data));if(u.fields&&u.fields.length>0){let c=new Set(u.fields);p=p.filter(h=>Object.keys(h.changes).some(l=>c.has(l)));}if(u.operations&&u.operations.length>0){let c=new Set(u.operations);p=p.filter(h=>c.has(h.operation));}return p.slice(0,b)}async function d(...y){let u=y[y.length-1],m={},v,b;return u!==null&&typeof u=="object"&&!(u instanceof firestore.Timestamp)?(m=u,v=y[y.length-2],b=y.slice(0,-2)):(v=u,b=y.slice(0,-1)),a(...b,{...m,fields:[v]})}async function i(...y){let u=y[y.length-1],m={},v,b;return u!==null&&typeof u=="object"&&!(u instanceof firestore.Timestamp)?(m=u,v=y[y.length-2],b=y.slice(0,-2)):(v=u,b=y.slice(0,-1)),a(...b,{...m,operations:[v]})}async function f(...y){let u=y[y.length-1],m=y.slice(0,-1),v=Lr(m),b=ot(u.before??{},u.after??{},{include:r.include,exclude:r.exclude,metaFields:lt(r),systemKeys:t});if(u.operation==="update"&&Object.keys(b).length===0)return null;let S={...it(u.after??u.before??null,r),...u.meta??{}},p=st({entityId:v,operation:u.operation,changes:b,meta:S,config:r}),c=yn(e,o,m),h=await at(c,p,r,{repoName:n,docId:v,before:u.before??null,after:u.after??null});return !h.written||!h.entry?null:{historyDocId:h.entry.historyDocId,historyToObjectId:h.entry.historyToObjectId,historySetAt:h.entry.historySetAt,schemaVersion:2,operation:h.entry.operation,meta:h.entry.meta,changes:h.entry.changes}}return {list:a,raw:s,byField:d,byOperation:i,recordManual:f}}function gn(e){return {count:async(t={})=>{let n=e;return n=me(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=me(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let d=a.data()[t];typeof d=="number"&&(s+=d);}),s},average:async(t,n={})=>{let r=e;r=me(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(d=>{let i=d.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function hn(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let d=e.batch();return {batch:d,set:(...i)=>{let f=i[i.length-1],y=typeof f=="object"&&f!==null&&"merge"in f,u=y?i[i.length-2]:i[i.length-1],m=y?i.slice(0,-2):i.slice(0,-1),v=y?f:{merge:true},b=t(...m),w={...u},S=m[m.length-1];n&&S&&(w[n]=S),r&&(w[r]=b.path),o&&(w[o]=a()),s&&(w[s]=a()),d.set(b,w,v);},update:(...i)=>{let f=i.pop(),u=t(...i),m={...f};s&&(m[s]=a()),d.update(u,m);},delete:(...i)=>{let f=t(...i);d.delete(f);},commit:async()=>{await d.commit();}}}}}var qr=new Set([4,8,10,13,14]);function At(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 Ot(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 bn(e,t,n){let r=()=>new Date;return {set:async(o,s={})=>{let a=e.bulkWriter(),d=At(a,s);for(let i of o){if(!i)continue;let{docRef:f,data:y,merge:u=true}=i,m={...y};t&&(m[t]=r()),n&&(m[n]=r()),a.set(f,m,{merge:u});}return await a.close(),Ot(d,s)},update:async(o,s={})=>{let a=e.bulkWriter(),d=At(a,s);for(let i of o){if(!i)continue;let{docRef:f,data:y}=i,u={...y};n&&(u[n]=r()),a.update(f,u);}return await a.close(),Ot(d,s)},delete:async(o,s={})=>{let a=e.bulkWriter(),d=At(a,s);for(let i of o)i&&a.delete(i);return await a.close(),Ot(d,s)}}}function xn(e,t,n,r,o,s){let a=()=>new Date;return {create:async u=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let m,v,b={...u};if(o&&(b[o]=a()),s&&(b[s]=a()),u[n]){v=u[n],m=e.doc(v);let S=r?{...b,[r]:m.path}:b;await m.set(S);}else {m=await e.add(b),v=m.id;let S={[n]:v};r&&(S[r]=m.path),await m.update(S);}let w=await m.get();return U(w.data())},set:async(...u)=>{let m=u[u.length-1],v=typeof m=="object"&&m!==null&&"merge"in m,b=v?u[u.length-2]:u[u.length-1],w=v?u.slice(0,-2):u.slice(0,-1),S=v?m:{merge:true},p={...b};s&&(p[s]=a());let c=t(...w),h=w[w.length-1];n&&h!=null&&(p[n]=h),r&&(p[r]=c.path),await c.set(p,S);let l=await c.get();return U(l.data())},update:async(...u)=>{let m=u.pop(),v=u,b={...m};s&&(b[s]=a());let w=t(...v);await w.update(b);let S=await w.get();return U(S.data())},delete:async(...u)=>{await t(...u).delete();}}}function vn(e,t,n,r,o){let s={};return s.byList=async(a,d,i="in",f={})=>{if(d.length===0)return [];let y=[],u=un(d,30);for(let m of u){let v=e;v=v.where(a,i,m),f.select&&f.select.length>0&&(v=v.select(...f.select.map(w=>String(w)))),(await v.get()).forEach(w=>{let S=U(w.data());y.push(f.returnDoc?{data:S,doc:w}:S);});}return y},t.forEach(a=>{let d=`by${de(String(a))}`;s[d]=async(i,f={})=>{let y=typeof f=="boolean"?{returnDoc:f}:f;if(String(a)===o){let S=await r(i).get();if(!S.exists)return null;let p=U(S.data());return y.returnDoc?{data:p,doc:S}:p}let u=e;u=u.where(String(a),"==",i).limit(1),y.select&&y.select.length>0&&(u=u.select(...y.select.map(w=>String(w))));let m=await u.get();if(m.empty)return null;let v=m.docs[0];if(!v)return null;let b=U(v.data());return y.returnDoc?{data:b,doc:v}:b};}),s}function wn(e,t,n,r){let o={},s=async(a,d)=>{if(!n||!r||d.length===0)return a;let i=d.map(f=>typeof f=="string"?{key:f}:{key:f.relation,select:f.select});return Promise.all(a.map(async f=>{let y=await Promise.all(i.map(async({key:m,select:v})=>{let b=n[m];if(!b)return [m,void 0];let w=r[b.repo];if(!w)return [m,void 0];let S=f[m];if(S==null)return [m,b.type==="one"?null:[]];let p=v?{select:v}:void 0;try{if(b.type==="one"){let c=`by${de(b.key)}`,h=typeof w.get?.[c]=="function"?await w.get[c](S,p):null;return [m,h]}else {let c=`by${de(b.key)}`,h=typeof w.query?.[c]=="function"?await w.query[c](S,p):[];return [m,h]}}catch(c){return console.error(`[include] Error populating "${m}":`,c),[m,b.type==="one"?null:[]]}})),u={};for(let[m,v]of y)m!==void 0&&(u[m]=v);return {...f,populated:u}}))};return t.forEach(a=>{let d=`by${de(a)}`;o[d]=async(i,f={})=>{let y={...f,where:[[a,"==",i],...f.where??[]]};return (await ke(e,y)).docs.map(m=>U(m.data()))};}),o.by=async a=>(await ke(e,a)).docs.map(i=>U(i.data())),o.getAll=async(a={})=>(await ke(e,a)).docs.map(i=>U(i.data())),o.onSnapshot=(a,d,i)=>me(e,a).onSnapshot(y=>{d(y.docs.map(u=>U(u.data())));},i),o.paginate=async a=>{let{include:d,...i}=a,f=await rt(e,i);if(d&&d.length>0){let y=await s(f.data,d);return {...f,data:y}}return f},o.paginateAll=async function*(a){let{include:d,...i}=a;for await(let f of kt(e,i))if(d&&d.length>0){let y=await s(f.data,d);yield {...f,data:y};}else yield f;},o}function Rn(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 f=e.relationalKeys?.[i];if(!f)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let y=t[f.repo];if(!y)return console.warn(`[populate] Repository "${f.repo}" not found in mapping`),[i,void 0];let u=n[i];if(u==null)return [i,f.type==="one"?null:[]];let m=s[i],v=m?{select:m}:void 0;try{if(f.type==="one"){let b=`by${de(f.key)}`,w=typeof y.get?.[b]=="function"?await y.get[b](u,v):null;return [i,w]}else {let b=`by${de(f.key)}`,w=typeof y.query?.[b]=="function"?await y.query[b](u,v):[];return [i,w]}}catch(b){return console.error(`[populate] Error populating "${i}":`,b),[i,f.type==="one"?null:[]]}})),d={};for(let[i,f]of a)f!==void 0&&(d[i]=f);return {...n,populated:d}}}}var Ur=new Set([4,8,10,13,14]);function Sn(e,t,n,r,o,s){let a=()=>new Date;return {backfillKeys:async(i={})=>{let{overwriteCreated:f=false,touchUpdated:y=true,overwritePath:u=false,pageSize:m=300,dryRun:v=false,maxAttempts:b=5,onError:w,onSuccess:S}=i,p=[],c=0,h=0,l=0,g=v?null:e.bulkWriter();g&&(g.onWriteError(k=>{let R=k?.code;if(k.failedAttempts<b&&R!==void 0&&Ur.has(R))return true;let T={path:k?.documentRef?.path??"(unknown)",error:k};return p.push(T),w?.(T),false}),S&&g.onWriteResult(k=>S(k.path)));let x;for(;;){let k=t.orderBy(firestore.FieldPath.documentId());x&&(k=k.startAfter(x)),k=k.limit(m);let R=await k.get();if(R.empty)break;for(let T of R.docs){c++;let C=T.data(),O={};if(n&&C[n]==null&&(O[n]=T.id),r&&(u||C[r]==null)&&C[r]!==T.ref.path&&(O[r]=T.ref.path),o&&(f||C[o]==null)&&(O[o]=a()),y&&s&&C[s]==null&&(O[s]=a()),Object.keys(O).length===0){l++;continue}h++,g&&g.set(T.ref,O,{merge:true});}if(R.size<m)break;x=R.docs[R.docs.length-1];}return g&&await g.close(),{scanned:c,written:h,skipped:l,failures:p}}}}function kn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),d=await r.get(a);return d.exists?U({...d.data(),docId:d.id}):null},set:(...s)=>{let a=s[s.length-1],d=typeof a=="object"&&a!==null&&"merge"in a,i=d?s[s.length-2]:s[s.length-1],f=d?s.slice(0,-2):s.slice(0,-1),y=d?a:{merge:true},u=t(...f);r.set(u,i,y);},update:(...s)=>{let a=s[s.length-1],d=s.slice(0,-1),i=t(...d);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function Qr(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 $t(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...p)=>t.refCb(e,...p),a=vn(r,t.foreignKeys,o,s,t.documentKey),d=wn(r,t.queryKeys,t.relationalKeys,n),i=gn(r),f=xn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),y=hn(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),u=kn(e,s),m=bn(e,t.createdKey,t.updatedKey),v=Sn(e,r,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),b=Rn(t,n),w=t.history,S=w?.enabled?mn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(p=>typeof p=="string"),t.path??"(unknown)",w):null;return {ref:r,documentRef:s,get:a,query:d,aggregate:i,...f,batch:y,transaction:u,bulk:m,system:v,...b,...S?{history:S}:{},_historySubcollection:S?w?.subcollection??"history":void 0,_historyConfig:w,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(p=>typeof p=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Qr(t.refCb):[],_createdKey:t.createdKey??null}}var Vr="history";function Wr(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 Tn(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 d=a.subcollection??Vr,i=a.ttl??t.defaults?.ttl,f=t.repos?.[o],y;if(s._isGroup){if(!f?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}y=f.triggerPath;}else y=f?.triggerPath??Wr(o,s);if(!y)continue;let u=s._systemKeys??[],m=u[0]??"docId",v=lt(a);r[`${o}_onHistory`]=n(y,async b=>{try{let w=b.data?.before?.data(),S=b.data?.after?.data(),p;if(!w&&S)p="create";else if(w&&!S)p="delete";else if(w&&S)p="update";else return;let c=String(S?.[m]??w?.[m]??b.params?.docId??b.data?.after?.id??b.data?.before?.id??"");if(!c)return;let h=ot(w??{},S??{},{include:a.include,exclude:a.exclude,metaFields:v,systemKeys:u});if(p==="update"&&Object.keys(h).length===0)return;let l=it(S??w??null,a),g=st({entityId:c,operation:p,changes:h,meta:l,config:a,ttlOverride:i}),x=b.data?.after?.ref??b.data?.before?.ref;if(!x)return;let k=x.collection(d);await at(k,g,a,{repoName:o,docId:c,before:w??null,after:S??null});}catch(w){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,w);}});}return r}function Gr(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 Jr(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var re=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}=Gr(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=Jr(t),s=null,a={};for(let f of this.routes){if(f.method!==r)continue;let y=o.match(f.pattern);if(y){s=f,a={},f.paramNames.forEach((u,m)=>{a[u]=decodeURIComponent(y[m+1]??"");});break}}let d=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,i);}catch(f){this.errorHandler(f,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 te(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",a=process.env.FUNCTION_REGION??"us-central1",d=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${a}/${d}${n}`}let r=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return r&&typeof o=="string"&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function ge(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Le();var he="__sync_version";var to=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function no(e){let t=e,n=false;for(;;){let r=q(t);if(!to.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var ro={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function $n(e,t,n,r,o,s,a,d){for(let[i,f]of Object.entries(e)){let y=n?`${n}__${i}`:i;if(o.has(i)||o.has(y))continue;let{inner:u,nullable:m}=no(f),v=q(u),b=r||m;if(v==="ZodObject"){let c=ne(u);$n(c,t,y,b,o,s,a,d);continue}let w=ro[v]??"json",S=y===a||i===a,p=s[y]??s[i]??y;d.push({name:p,sqlType:t.mapType(w),nullable:S?false:b,isPrimaryKey:S});}}function ut(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),d=ne(e),i=[];return $n(d,t,"",false,a,s,r,i),i.some(f=>f.name===he)||i.push({name:he,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}function Pn(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(Pn)):e}var oo=32,so=5e3;function En(e,t,n,r=new WeakSet,o=0){if(o>oo){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>=so)break;let d=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)?En(a,d,n,r,o+1):n[d]=Pn(a);}r.delete(e);}function qe(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};En(e,"",o);let s={};for(let[a,d]of Object.entries(o)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let f=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[f]=d;}return s}function ue(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 Tr=Object.defineProperty;var et=(e,t)=>()=>(e&&(t=e(e=0)),t);var Cr=(e,t)=>{for(var n in t)Tr(e,n,{get:t[n],enumerable:true});};function q(e){let t=e,n=t._zod?.def?.type;if(n)return eo[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 Cn(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function An(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 ne(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 Ze(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 dt(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function On(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 eo,Le=et(()=>{eo={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 Qn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function wo({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 De({val:e,mismatch:t}){let n=Ro(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(wo,{message:t})]}):n}function Ro(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(Qn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Qn,{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 mt=et(()=>{});function Ie(e){if(!e)return "unknown";let t=Nt(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 Nt(e){let t=q(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?Nt(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=Nt(r);if(q(s)!=="ZodObject")return;r=ne(s)[o];}return r}function Co(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 Qe(e,t){if(e==="unknown")return null;let n=Co(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 jt=et(()=>{Le();});var Gn={};Cr(Gn,{PanelMany:()=>Oo,PanelOne:()=>Ao,RightPanel:()=>Mt});function Ao({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`,d=Wn(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 f=e[i],y=d[i],u=y?Qe(y,f):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(De,{val:f,mismatch:u})})]})})})]})}function Oo({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:d}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,f=Wn(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,u)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y},u)),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,u)=>{let m=String(y.docId??y.id??""),v=`${n}/${t}/${encodeURIComponent(m)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((b,w)=>{let S=y[b],p=f[b],c=p?Qe(p,S):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(De,{val:S,mismatch:c})},w)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:v,class:"btn btn-xs btn-ghost",children:"Edit"})})]},u)})})]})}),(d.hasPrev||d.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[d.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":d.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),d.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":d.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Wn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Ie(Fe(e,r));return n}var Mt,Ht=et(()=>{mt();jt();Mt=({basePath:e=""})=>jsxRuntime.jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Ar(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function Me(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 xt(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function ln(e){let[t,n,r]=e;return xt(e)?Ar(r,30).map(s=>[t,n,s]):[e]}function tt(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function cn(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 ke(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 Me(e,t).get();if(!t.where.some(xt)){let u=tt(e,t.where);return u=Me(u,t),u.get()}let i=t.where.map(ln),y=vt(i).map(u=>{let m=tt(e,u);return m=Me(m,t),m});return cn(y)}let o=t.where??[],s=[...t.orWhere?.map(d=>[d])??[],...t.orWhereGroups??[]],a=[];for(let d of s){let i=[...o,...d];if(i.some(xt)){let y=i.map(ln),m=vt(y).map(v=>{let b=tt(e,v);return b=Me(b,t),b});a.push(...m);}else {let y=tt(e,i);y=Me(y,t),a.push(y);}}return cn(a)}function vt(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=vt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var wt="preserve";function Or(e){wt=e;}function Rt(){return wt}function $r(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function St(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($r(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 Er(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nt(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>nt(t));if(Er(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=nt(r);return t}return e}function U(e){return wt==="normalize"?nt(e):e}function un(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function de(e){return e.charAt(0).toUpperCase()+e.slice(1)}function me(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 rt(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 ke(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,d=a.map(f=>U({...f.data(),docId:f.id})),i=t.direction==="prev";return {data:d,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:d.length}}async function*kt(e,t){let n,r=true;for(;r;){let o=await rt(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function Be(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 Tt(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(!Tt(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)||!Tt(e[s],t[s],n))return false;return true}return false}function ot(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??{},d=new Set([...Object.keys(s),...Object.keys(a)]),i={};for(let f of d){if(r.has(f)||o&&!o.has(f))continue;let y=s[f],u=a[f];Tt(y,u)||(i[f]={oldValue:y===void 0?null:y,newValue:u===void 0?null:u,type:{old:Be(y),new:Be(u)}});}return i}var Pr=5;function Dr(e){return e.schemaVersion===2}function pn(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 Ir(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function Fr(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 _r(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?pn(r):Be(t),new:o?pn(o):Be(n)}}}function Nr(e){let t=_r(e),n=Fr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function jr(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function Mr(e,t){return (e.userId??null)===(t.userId??null)}function fn(e,t={}){let n=t.groupToleranceMs??Pr,r=[];for(let o of e){if(Dr(o)){r.push(Ir(o));continue}let a=Nr(o),d=r[r.length-1];d&&d.schemaVersion===1&&jr(d.historySetAt,a.historySetAt,n)&&Mr(d.meta,a.meta)?Object.assign(d.changes,a.changes):r.push(a);}return r}var Br=7e5;function st(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,d)=>d instanceof firestore.Timestamp?d.toMillis():d),"utf8")}catch{return 0}};if(o(r.changes)>Br){let s={};for(let[a,d]of Object.entries(r.changes)){let i=o(d.oldValue),f=o(d.newValue);s[a]={oldValue:i>5e4?"[truncated]":d.oldValue,newValue:f>5e4?"[truncated]":d.newValue,type:d.type};}r.changes=s,r._truncated=true;}return r}async function at(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 it(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=y=>{if(!y)return;let u=n[y];return u===void 0||u===null?null:String(u)},a=s(o.userId);a!==void 0&&(r.userId=a);let d=s(o.userEmail);d!==void 0&&(r.userEmail=d);let i=s(o.reason);i!==void 0&&(r.reason=i);let f=s(o.comment);if(f!==void 0&&(r.comment=f),o.extras&&o.extras.length>0){let y={},u=false;for(let m of o.extras)m in n&&(y[m]=n[m],u=true);u&&(r.extras=y);}return r}function lt(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 zr="history",Zr=50;function yn(e,t,n){return e(...n).collection(t)}function Lr(e){return String(e[e.length-1]??"")}function mn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??zr;async function s(...y){let u={},m=y,v=y[y.length-1];v!==null&&typeof v=="object"&&!(v instanceof firestore.Timestamp)&&("limit"in v||"cursor"in v||"direction"in v)&&(u=v,m=y.slice(0,-1));let b=yn(e,o,m),w=u.direction??"desc",S=b.orderBy("historySetAt",w);return u.cursor&&(S=S.startAfter(u.cursor)),u.limit&&u.limit>0&&(S=S.limit(u.limit)),(await S.get()).docs.map(c=>({id:c.id,data:c.data()}))}async function a(...y){let u={},m=y,v=y[y.length-1];v!==null&&typeof v=="object"&&!(v instanceof firestore.Timestamp)&&("limit"in v||"cursor"in v||"direction"in v||"fields"in v||"operations"in v)&&(u=v,m=y.slice(0,-1));let b=u.limit??Zr,w=Math.max(b,Math.min(b*8,500)),S=await s(...m,{limit:w,cursor:u.cursor,direction:u.direction??"desc"}),p=fn(S.map(c=>c.data));if(u.fields&&u.fields.length>0){let c=new Set(u.fields);p=p.filter(h=>Object.keys(h.changes).some(l=>c.has(l)));}if(u.operations&&u.operations.length>0){let c=new Set(u.operations);p=p.filter(h=>c.has(h.operation));}return p.slice(0,b)}async function d(...y){let u=y[y.length-1],m={},v,b;return u!==null&&typeof u=="object"&&!(u instanceof firestore.Timestamp)?(m=u,v=y[y.length-2],b=y.slice(0,-2)):(v=u,b=y.slice(0,-1)),a(...b,{...m,fields:[v]})}async function i(...y){let u=y[y.length-1],m={},v,b;return u!==null&&typeof u=="object"&&!(u instanceof firestore.Timestamp)?(m=u,v=y[y.length-2],b=y.slice(0,-2)):(v=u,b=y.slice(0,-1)),a(...b,{...m,operations:[v]})}async function f(...y){let u=y[y.length-1],m=y.slice(0,-1),v=Lr(m),b=ot(u.before??{},u.after??{},{include:r.include,exclude:r.exclude,metaFields:lt(r),systemKeys:t});if(u.operation==="update"&&Object.keys(b).length===0)return null;let S={...it(u.after??u.before??null,r),...u.meta??{}},p=st({entityId:v,operation:u.operation,changes:b,meta:S,config:r}),c=yn(e,o,m),h=await at(c,p,r,{repoName:n,docId:v,before:u.before??null,after:u.after??null});return !h.written||!h.entry?null:{historyDocId:h.entry.historyDocId,historyToObjectId:h.entry.historyToObjectId,historySetAt:h.entry.historySetAt,schemaVersion:2,operation:h.entry.operation,meta:h.entry.meta,changes:h.entry.changes}}return {list:a,raw:s,byField:d,byOperation:i,recordManual:f}}function gn(e){return {count:async(t={})=>{let n=e;return n=me(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=me(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let d=a.data()[t];typeof d=="number"&&(s+=d);}),s},average:async(t,n={})=>{let r=e;r=me(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(d=>{let i=d.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function hn(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let d=e.batch();return {batch:d,set:(...i)=>{let f=i[i.length-1],y=typeof f=="object"&&f!==null&&"merge"in f,u=y?i[i.length-2]:i[i.length-1],m=y?i.slice(0,-2):i.slice(0,-1),v=y?f:{merge:true},b=t(...m),w={...u},S=m[m.length-1];n&&S&&(w[n]=S),r&&(w[r]=b.path),o&&(w[o]=a()),s&&(w[s]=a()),d.set(b,w,v);},update:(...i)=>{let f=i.pop(),u=t(...i),m={...f};s&&(m[s]=a()),d.update(u,m);},delete:(...i)=>{let f=t(...i);d.delete(f);},commit:async()=>{await d.commit();}}}}}var qr=new Set([4,8,10,13,14]);function At(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 Ot(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 bn(e,t,n){let r=()=>new Date;return {set:async(o,s={})=>{let a=e.bulkWriter(),d=At(a,s);for(let i of o){if(!i)continue;let{docRef:f,data:y,merge:u=true}=i,m={...y};t&&(m[t]=r()),n&&(m[n]=r()),a.set(f,m,{merge:u});}return await a.close(),Ot(d,s)},update:async(o,s={})=>{let a=e.bulkWriter(),d=At(a,s);for(let i of o){if(!i)continue;let{docRef:f,data:y}=i,u={...y};n&&(u[n]=r()),a.update(f,u);}return await a.close(),Ot(d,s)},delete:async(o,s={})=>{let a=e.bulkWriter(),d=At(a,s);for(let i of o)i&&a.delete(i);return await a.close(),Ot(d,s)}}}function xn(e,t,n,r,o,s){let a=()=>new Date;return {create:async u=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let m,v,b={...u};if(o&&(b[o]=a()),s&&(b[s]=a()),u[n]){v=u[n],m=e.doc(v);let S=r?{...b,[r]:m.path}:b;await m.set(S);}else {m=await e.add(b),v=m.id;let S={[n]:v};r&&(S[r]=m.path),await m.update(S);}let w=await m.get();return U(w.data())},set:async(...u)=>{let m=u[u.length-1],v=typeof m=="object"&&m!==null&&"merge"in m,b=v?u[u.length-2]:u[u.length-1],w=v?u.slice(0,-2):u.slice(0,-1),S=v?m:{merge:true},p={...b};s&&(p[s]=a());let c=t(...w),h=w[w.length-1];n&&h!=null&&(p[n]=h),r&&(p[r]=c.path),await c.set(p,S);let l=await c.get();return U(l.data())},update:async(...u)=>{let m=u.pop(),v=u,b={...m};s&&(b[s]=a());let w=t(...v);await w.update(b);let S=await w.get();return U(S.data())},delete:async(...u)=>{await t(...u).delete();}}}function vn(e,t,n,r,o){let s={};return s.byList=async(a,d,i="in",f={})=>{if(d.length===0)return [];let y=[],u=un(d,30);for(let m of u){let v=e;v=v.where(a,i,m),f.select&&f.select.length>0&&(v=v.select(...f.select.map(w=>String(w)))),(await v.get()).forEach(w=>{let S=U(w.data());y.push(f.returnDoc?{data:S,doc:w}:S);});}return y},t.forEach(a=>{let d=`by${de(String(a))}`;s[d]=async(i,f={})=>{let y=typeof f=="boolean"?{returnDoc:f}:f;if(String(a)===o){let S=await r(i).get();if(!S.exists)return null;let p=U(S.data());return y.returnDoc?{data:p,doc:S}:p}let u=e;u=u.where(String(a),"==",i).limit(1),y.select&&y.select.length>0&&(u=u.select(...y.select.map(w=>String(w))));let m=await u.get();if(m.empty)return null;let v=m.docs[0];if(!v)return null;let b=U(v.data());return y.returnDoc?{data:b,doc:v}:b};}),s}function wn(e,t,n,r){let o={},s=async(a,d)=>{if(!n||!r||d.length===0)return a;let i=d.map(f=>typeof f=="string"?{key:f}:{key:f.relation,select:f.select});return Promise.all(a.map(async f=>{let y=await Promise.all(i.map(async({key:m,select:v})=>{let b=n[m];if(!b)return [m,void 0];let w=r[b.repo];if(!w)return [m,void 0];let S=f[m];if(S==null)return [m,b.type==="one"?null:[]];let p=v?{select:v}:void 0;try{if(b.type==="one"){let c=`by${de(b.key)}`,h=typeof w.get?.[c]=="function"?await w.get[c](S,p):null;return [m,h]}else {let c=`by${de(b.key)}`,h=typeof w.query?.[c]=="function"?await w.query[c](S,p):[];return [m,h]}}catch(c){return console.error(`[include] Error populating "${m}":`,c),[m,b.type==="one"?null:[]]}})),u={};for(let[m,v]of y)m!==void 0&&(u[m]=v);return {...f,populated:u}}))};return t.forEach(a=>{let d=`by${de(a)}`;o[d]=async(i,f={})=>{let y={...f,where:[[a,"==",i],...f.where??[]]};return (await ke(e,y)).docs.map(m=>U(m.data()))};}),o.by=async a=>(await ke(e,a)).docs.map(i=>U(i.data())),o.getAll=async(a={})=>(await ke(e,a)).docs.map(i=>U(i.data())),o.onSnapshot=(a,d,i)=>me(e,a).onSnapshot(y=>{d(y.docs.map(u=>U(u.data())));},i),o.paginate=async a=>{let{include:d,...i}=a,f=await rt(e,i);if(d&&d.length>0){let y=await s(f.data,d);return {...f,data:y}}return f},o.paginateAll=async function*(a){let{include:d,...i}=a;for await(let f of kt(e,i))if(d&&d.length>0){let y=await s(f.data,d);yield {...f,data:y};}else yield f;},o}function Rn(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 f=e.relationalKeys?.[i];if(!f)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let y=t[f.repo];if(!y)return console.warn(`[populate] Repository "${f.repo}" not found in mapping`),[i,void 0];let u=n[i];if(u==null)return [i,f.type==="one"?null:[]];let m=s[i],v=m?{select:m}:void 0;try{if(f.type==="one"){let b=`by${de(f.key)}`,w=typeof y.get?.[b]=="function"?await y.get[b](u,v):null;return [i,w]}else {let b=`by${de(f.key)}`,w=typeof y.query?.[b]=="function"?await y.query[b](u,v):[];return [i,w]}}catch(b){return console.error(`[populate] Error populating "${i}":`,b),[i,f.type==="one"?null:[]]}})),d={};for(let[i,f]of a)f!==void 0&&(d[i]=f);return {...n,populated:d}}}}var Ur=new Set([4,8,10,13,14]);function Sn(e,t,n,r,o,s){let a=()=>new Date;return {backfillKeys:async(i={})=>{let{overwriteCreated:f=false,touchUpdated:y=true,overwritePath:u=false,pageSize:m=300,dryRun:v=false,maxAttempts:b=5,onError:w,onSuccess:S}=i,p=[],c=0,h=0,l=0,g=v?null:e.bulkWriter();g&&(g.onWriteError(k=>{let R=k?.code;if(k.failedAttempts<b&&R!==void 0&&Ur.has(R))return true;let T={path:k?.documentRef?.path??"(unknown)",error:k};return p.push(T),w?.(T),false}),S&&g.onWriteResult(k=>S(k.path)));let x;for(;;){let k=t.orderBy(firestore.FieldPath.documentId());x&&(k=k.startAfter(x)),k=k.limit(m);let R=await k.get();if(R.empty)break;for(let T of R.docs){c++;let C=T.data(),O={};if(n&&C[n]==null&&(O[n]=T.id),r&&(u||C[r]==null)&&C[r]!==T.ref.path&&(O[r]=T.ref.path),o&&(f||C[o]==null)&&(O[o]=a()),y&&s&&C[s]==null&&(O[s]=a()),Object.keys(O).length===0){l++;continue}h++,g&&g.set(T.ref,O,{merge:true});}if(R.size<m)break;x=R.docs[R.docs.length-1];}return g&&await g.close(),{scanned:c,written:h,skipped:l,failures:p}}}}function kn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),d=await r.get(a);return d.exists?U({...d.data(),docId:d.id}):null},set:(...s)=>{let a=s[s.length-1],d=typeof a=="object"&&a!==null&&"merge"in a,i=d?s[s.length-2]:s[s.length-1],f=d?s.slice(0,-2):s.slice(0,-1),y=d?a:{merge:true},u=t(...f);r.set(u,i,y);},update:(...s)=>{let a=s[s.length-1],d=s.slice(0,-1),i=t(...d);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function Qr(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 $t(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...p)=>t.refCb(e,...p),a=vn(r,t.foreignKeys,o,s,t.documentKey),d=wn(r,t.queryKeys,t.relationalKeys,n),i=gn(r),f=xn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),y=hn(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),u=kn(e,s),m=bn(e,t.createdKey,t.updatedKey),v=Sn(e,r,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),b=Rn(t,n),w=t.history,S=w?.enabled?mn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(p=>typeof p=="string"),t.path??"(unknown)",w):null;return {ref:r,documentRef:s,get:a,query:d,aggregate:i,...f,batch:y,transaction:u,bulk:m,system:v,...b,...S?{history:S}:{},_historySubcollection:S?w?.subcollection??"history":void 0,_historyConfig:w,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(p=>typeof p=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Qr(t.refCb):[],_createdKey:t.createdKey??null}}var Vr="history";function Wr(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 Tn(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 d=a.subcollection??Vr,i=a.ttl??t.defaults?.ttl,f=t.repos?.[o],y;if(s._isGroup){if(!f?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}y=f.triggerPath;}else y=f?.triggerPath??Wr(o,s);if(!y)continue;let u=s._systemKeys??[],m=u[0]??"docId",v=lt(a);r[`${o}_onHistory`]=n(y,async b=>{try{let w=b.data?.before?.data(),S=b.data?.after?.data(),p;if(!w&&S)p="create";else if(w&&!S)p="delete";else if(w&&S)p="update";else return;let c=String(S?.[m]??w?.[m]??b.params?.docId??b.data?.after?.id??b.data?.before?.id??"");if(!c)return;let h=ot(w??{},S??{},{include:a.include,exclude:a.exclude,metaFields:v,systemKeys:u});if(p==="update"&&Object.keys(h).length===0)return;let l=it(S??w??null,a),g=st({entityId:c,operation:p,changes:h,meta:l,config:a,ttlOverride:i}),x=b.data?.after?.ref??b.data?.before?.ref;if(!x)return;let k=x.collection(d);await at(k,g,a,{repoName:o,docId:c,before:w??null,after:S??null});}catch(w){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,w);}});}return r}function Gr(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 Jr(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var re=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}=Gr(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=Jr(t),s=null,a={};for(let f of this.routes){if(f.method!==r)continue;let y=o.match(f.pattern);if(y){s=f,a={},f.paramNames.forEach((u,m)=>{a[u]=decodeURIComponent(y[m+1]??"");});break}}let d=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,i);}catch(f){this.errorHandler(f,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 te(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",a=process.env.FUNCTION_REGION??"us-central1",d=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${a}/${d}${n}`}let r=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return r&&typeof o=="string"&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function ge(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Le();var he="__sync_version";var to=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function no(e){let t=e,n=false;for(;;){let r=q(t);if(!to.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var ro={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function $n(e,t,n,r,o,s,a,d){for(let[i,f]of Object.entries(e)){let y=n?`${n}__${i}`:i;if(o.has(i)||o.has(y))continue;let{inner:u,nullable:m}=no(f),v=q(u),b=r||m;if(v==="ZodObject"){let c=ne(u);$n(c,t,y,b,o,s,a,d);continue}let w=ro[v]??"json",S=y===a||i===a,p=s[y]??s[i]??y;d.push({name:p,sqlType:t.mapType(w),nullable:S?false:b,isPrimaryKey:S});}}function ut(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),d=ne(e),i=[];return $n(d,t,"",false,a,s,r,i),i.some(f=>f.name===he)||i.push({name:he,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}function En(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(En)):e}var oo=32,so=5e3;function Pn(e,t,n,r=new WeakSet,o=0){if(o>oo){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>=so)break;let d=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)?Pn(a,d,n,r,o+1):n[d]=En(a);}r.delete(e);}function qe(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};Pn(e,"",o);let s={};for(let[a,d]of Object.entries(o)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let f=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[f]=d;}return s}function ue(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>
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
<nav><a href="${t}/">\u2190 Dashboard</a></nav>
|
|
29
29
|
<h1>${e}</h1>
|
|
30
30
|
${n}
|
|
31
|
-
</body></html>`}function pe(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function
|
|
31
|
+
</body></html>`}function pe(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Ee(e,t,n=200){e.status(n).set("Content-Type","application/json").send(JSON.stringify(t,null,2));}function pt(e){return (e.headers?.accept??"").includes("application/json")}function Dn(e,t,n,r,o,s,a,d){let i=(o.basePath??"/").replace(/\/$/,"")||"",f=o.featuresFlag??{},y=[];for(let[m,v]of Object.entries(e)){let b=s[m];y.push({name:m,schema:v.schema??null,documentKey:v._systemKeys?.[0]??v.documentKey??"docId",tableName:b?.tableName??m,isGroup:!!v._isGroup,repoCfg:b,repo:v});}let u=new re;if(o.auth)if(ge(o.auth)){let m=o.auth;for(let v of m.routes){let b=`${i}${v.path}`;v.method==="GET"?u.get(b,v.handler):u.post(b,v.handler);}u.use(m.middleware);}else if(typeof o.auth=="function")u.use(o.auth);else {let m=o.auth.realm??"Sync Admin",v="Basic "+Buffer.from(`${o.auth.username}:${o.auth.password}`).toString("base64");u.use((b,w,S)=>{if((b.headers?.authorization??"")!==v){w.status(401).set("WWW-Authenticate",`Basic realm="${m}"`).set("Content-Type","text/plain").send("Unauthorized");return}S();});}return u.get(`${i}/`,(m,v)=>{let b=te(m,i),w=y.map(c=>{let h=[];return f.healthCheck&&h.push(`<a class="btn" href="${b}/${c.name}/health">Health</a>`),f.manualSync&&h.push(`<a class="btn btn-primary" href="${b}/${c.name}/force-sync">Force Sync</a>`),`<tr>
|
|
32
32
|
<td><strong>${c.name}</strong></td>
|
|
33
33
|
<td>${c.tableName}</td>
|
|
34
34
|
<td>${c.isGroup?'<span class="badge badge-warn">group</span>':'<span class="badge badge-ok">collection</span>'}</td>
|
|
@@ -41,9 +41,9 @@ ${n}
|
|
|
41
41
|
<tbody>${w}</tbody>
|
|
42
42
|
</table>
|
|
43
43
|
${S}
|
|
44
|
-
</div>`);pe(v,p);}),u.get(`${i}`,(m,v)=>{let b=te(m,i);v.status(302).set("Location",`${b}/`).send("");}),f.healthCheck&&u.get(`${i}/:repoName/health`,async(m,v)=>{let b=te(m,i),w=y.find($=>$.name===m.params.repoName);if(!w){pe(v,ue("Not Found",b,`<p>Unknown repo: ${m.params.repoName}</p>`),404);return}if(!w.schema){pe(v,ue("Health Check",b,`<p class="badge badge-warn">No Zod schema attached to "${w.name}"</p>`));return}let S=ut(w.schema,t.dialect,{primaryKey:w.documentKey,exclude:w.repoCfg?.exclude,columnMap:w.repoCfg?.columnMap}),p=[],c=false,h=null;try{c=await t.tableExists(w.tableName),c&&(p=await t.getTableColumns(w.tableName));}catch($){h=$?.message??String($);}let l=new Set(p),g=new Set(S.map($=>$.name)),x=S.filter($=>!l.has($.name)),k=p.filter($=>!g.has($)),R=S.filter($=>l.has($.name)),T=c&&x.length===0&&!h;if(pt(m)){
|
|
44
|
+
</div>`);pe(v,p);}),u.get(`${i}`,(m,v)=>{let b=te(m,i);v.status(302).set("Location",`${b}/`).send("");}),f.healthCheck&&u.get(`${i}/:repoName/health`,async(m,v)=>{let b=te(m,i),w=y.find($=>$.name===m.params.repoName);if(!w){pe(v,ue("Not Found",b,`<p>Unknown repo: ${m.params.repoName}</p>`),404);return}if(!w.schema){pe(v,ue("Health Check",b,`<p class="badge badge-warn">No Zod schema attached to "${w.name}"</p>`));return}let S=ut(w.schema,t.dialect,{primaryKey:w.documentKey,exclude:w.repoCfg?.exclude,columnMap:w.repoCfg?.columnMap}),p=[],c=false,h=null;try{c=await t.tableExists(w.tableName),c&&(p=await t.getTableColumns(w.tableName));}catch($){h=$?.message??String($);}let l=new Set(p),g=new Set(S.map($=>$.name)),x=S.filter($=>!l.has($.name)),k=p.filter($=>!g.has($)),R=S.filter($=>l.has($.name)),T=c&&x.length===0&&!h;if(pt(m)){Ee(v,{repo:w.name,table:w.tableName,tableExists:c,healthy:T,error:h,columns:{expected:S.map($=>({name:$.name,type:$.sqlType,nullable:$.nullable,isPrimaryKey:$.isPrimaryKey})),actual:p,matched:R.map($=>$.name),missing:x.map($=>({name:$.name,type:$.sqlType})),extra:k}});return}let C=T?'<span class="badge badge-ok">Healthy</span>':'<span class="badge badge-err">Unhealthy</span>',O=S.map($=>{let D=l.has($.name)?'<span class="badge badge-ok">OK</span>':'<span class="badge badge-err">MISSING</span>';return `<tr><td>${$.name}</td><td>${$.sqlType}</td><td>${$.nullable?"Yes":"No"}</td><td>${$.isPrimaryKey?"\u2713":""}</td><td>${D}</td></tr>`}).join(`
|
|
45
45
|
`),A=k.map($=>`<tr><td>${$}</td><td colspan="3" class="muted">not in schema</td><td><span class="badge badge-warn">EXTRA</span></td></tr>`).join(`
|
|
46
|
-
`),
|
|
46
|
+
`),E=ue(`Health: ${w.name}`,b,`<div class="card">
|
|
47
47
|
<p>Table: <code>${w.tableName}</code> ${c?C:'<span class="badge badge-err">NOT FOUND</span>'}</p>
|
|
48
48
|
${h?`<p class="badge badge-err">Error: ${h}</p>`:""}
|
|
49
49
|
<h2>Columns</h2>
|
|
@@ -51,17 +51,17 @@ ${n}
|
|
|
51
51
|
<thead><tr><th>Column</th><th>SQL Type</th><th>Nullable</th><th>PK</th><th>Status</th></tr></thead>
|
|
52
52
|
<tbody>${O}${A}</tbody>
|
|
53
53
|
</table>
|
|
54
|
-
</div>`);pe(v,
|
|
54
|
+
</div>`);pe(v,E);}),f.manualSync&&(u.get(`${i}/:repoName/force-sync`,(m,v)=>{let b=te(m,i),w=y.find(p=>p.name===m.params.repoName);if(!w){pe(v,ue("Not Found",b,`<p>Unknown repo: ${m.params.repoName}</p>`),404);return}let S=ue(`Force Sync: ${w.name}`,b,`<div class="card">
|
|
55
55
|
<p>This will read <strong>all</strong> documents from the <code>${w.name}</code> Firestore collection
|
|
56
56
|
and upsert them into the <code>${w.tableName}</code> SQL table.</p>
|
|
57
57
|
<p class="muted" style="margin:.75rem 0">This may take a while for large collections.</p>
|
|
58
58
|
<form method="POST" action="${b}/${w.name}/force-sync">
|
|
59
59
|
<button type="submit" class="btn btn-primary">Start Force Sync</button>
|
|
60
60
|
</form>
|
|
61
|
-
</div>`);pe(v,S);}),u.post(`${i}/:repoName/force-sync`,async(m,v)=>{let b=te(m,i),w=y.find(T=>T.name===m.params.repoName);if(!w){
|
|
61
|
+
</div>`);pe(v,S);}),u.post(`${i}/:repoName/force-sync`,async(m,v)=>{let b=te(m,i),w=y.find(T=>T.name===m.params.repoName);if(!w){Ee(v,{error:`Unknown repo: ${m.params.repoName}`},404);return}let S=w.repo.ref;if(!S){Ee(v,{error:`No collection reference for "${w.name}"`},400);return}let p=0,c=0,h=[],l=500,g=S.limit(l),x=null;try{for(;;){let O=await(x?g.startAfter(x):g).get();if(O.empty)break;for(let A of O.docs){let E=A.data(),$=String(E[w.documentKey]??A.id),D=qe(E,{exclude:w.repoCfg?.exclude,columnMap:w.repoCfg?.columnMap});try{await r({operation:"UPSERT",repoName:w.name,docId:$,data:D,timestamp:new Date().toISOString()}),p++;}catch(_){c++;let I=_?.message??String(_);console.error(`[ForceSync:${w.name}] doc=${$} failed:`,_),h.length<5&&h.push(`${$}: ${I}`);}}if(x=O.docs[O.docs.length-1],O.docs.length<l)break}let T=n.get(w.name);T&&await T.flush();}catch(T){if(pt(m)){Ee(v,{error:T?.message??String(T),synced:p,errors:c},500);return}pe(v,ue(`Force Sync: ${w.name}`,b,`<div class="card">
|
|
62
62
|
<p class="badge badge-err">Error: ${T?.message??String(T)}</p>
|
|
63
63
|
<p>Synced ${p} docs before failure (${c} errors).</p>
|
|
64
|
-
</div>`),500);return}if(pt(m)){
|
|
64
|
+
</div>`),500);return}if(pt(m)){Ee(v,{repo:w.name,table:w.tableName,synced:p,errors:c,...h.length>0&&{errorSamples:h}});return}let k=h.length>0?`<details style="margin-top:1rem"><summary>First ${h.length} error(s)</summary>
|
|
65
65
|
<pre style="white-space:pre-wrap">${h.map(T=>T.replace(/[<>&]/g,C=>`&#${C.charCodeAt(0)};`)).join(`
|
|
66
66
|
|
|
67
67
|
`)}</pre></details>`:"",R=ue(`Force Sync: ${w.name}`,b,`<div class="card">
|
|
@@ -69,10 +69,10 @@ ${n}
|
|
|
69
69
|
<p>Synced <strong>${p}</strong> documents to <code>${w.tableName}</code>.</p>
|
|
70
70
|
${c>0?`<p class="badge badge-warn">${c} error(s)</p>`:""}
|
|
71
71
|
${k}
|
|
72
|
-
</div>`);pe(v,R);})),f.configCheck&&u.get(`${i}/config-check`,async(m,v)=>{let b=te(m,i),w=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??process.env.GCP_PROJECT??"unknown",S="https://console.cloud.google.com",p=d??"firestore-sync",c=[];try{await t.tableExists("__nonexistent_health_check__"),c.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable"});}catch(T){let C=T?.message??String(T),O=C.toLowerCase(),A=O.includes("disabled")||O.includes("has not been used")||O.includes("accessnotconfigured"),
|
|
73
|
-
`),console:`${S}/iam-admin/iam?project=${w}`}}):D?c.push({name:"BigQuery Dataset",category:"bigquery",status:"error",message:`Dataset not found: ${C}`,fix:{hint:"Create the dataset first",gcloud:`bq mk --dataset ${w}:YOUR_DATASET_ID`,console:`${S}/bigquery?project=${w}`}}):c.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable (table lookup returned expected error)"});}for(let T of y)try{let C=await t.tableExists(T.tableName);c.push({name:`Table: ${T.tableName}`,category:"bigquery",status:C?"ok":"warn",message:C?`Table \`${T.tableName}\` exists`:`Table \`${T.tableName}\` does not exist yet`,...!C&&{fix:{hint:"Table will be auto-created on first sync if autoMigrate is enabled. Or create it manually."}}});}catch(C){c.push({name:`Table: ${T.tableName}`,category:"bigquery",status:"error",message:C?.message??String(C)});}if(a)for(let T of y){let C=`${p}-${T.name}`;try{let O=a.topic(C);if(typeof O.exists=="function"){let[A]=await O.exists();c.push({name:`Topic: ${C}`,category:"pubsub",status:A?"ok":"error",message:A?`Topic \`${C}\` exists`:`Topic \`${C}\` does not exist`,...!A&&{fix:{gcloud:`gcloud pubsub topics create ${C} --project=${w}`,console:`${S}/cloudpubsub/topic/list?project=${w}`}}});}else c.push({name:`Topic: ${C}`,category:"pubsub",status:"warn",message:"Cannot verify topic existence (PubSub client doesn't expose .exists())",fix:{gcloud:`gcloud pubsub topics create ${C} --project=${w}`,console:`${S}/cloudpubsub/topic/list?project=${w}`,hint:"Ensure the topic exists. It is auto-created by the Firebase emulator but must exist in production."}});}catch(O){let A=O?.message??String(O),
|
|
72
|
+
</div>`);pe(v,R);})),f.configCheck&&u.get(`${i}/config-check`,async(m,v)=>{let b=te(m,i),w=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??process.env.GCP_PROJECT??"unknown",S="https://console.cloud.google.com",p=d??"firestore-sync",c=[];try{await t.tableExists("__nonexistent_health_check__"),c.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable"});}catch(T){let C=T?.message??String(T),O=C.toLowerCase(),A=O.includes("disabled")||O.includes("has not been used")||O.includes("accessnotconfigured"),E=O.includes("permission")||C.includes("403")||O.includes("access denied"),$=O.includes("project")&&O.includes("not found"),D=O.includes("not found")||C.includes("404");A?c.push({name:"BigQuery API",category:"bigquery",status:"error",message:"BigQuery API is not enabled",fix:{gcloud:`gcloud services enable bigquery.googleapis.com --project=${w}`,console:`${S}/apis/library/bigquery.googleapis.com?project=${w}`}}):$?c.push({name:"BigQuery Project",category:"bigquery",status:"error",message:C,fix:{hint:"The GCP project does not exist or the credentials don't have access to it. In the Firebase emulator, GCLOUD_PROJECT may override the configured projectId. Ensure you pass the correct projectId to the BigQuery constructor and have valid credentials.",console:`${S}/home/dashboard`}}):E?c.push({name:"BigQuery API",category:"bigquery",status:"error",message:`Permission denied: ${C}`,fix:{hint:"Grant the service account BigQuery Data Editor + BigQuery Job User roles",gcloud:[`SA=$(gcloud run services describe YOUR_SERVICE --region=YOUR_REGION --format="value(spec.template.spec.serviceAccountName)" --project=${w})`,`gcloud projects add-iam-policy-binding ${w} --member="serviceAccount:$SA" --role="roles/bigquery.dataEditor"`,`gcloud projects add-iam-policy-binding ${w} --member="serviceAccount:$SA" --role="roles/bigquery.jobUser"`].join(`
|
|
73
|
+
`),console:`${S}/iam-admin/iam?project=${w}`}}):D?c.push({name:"BigQuery Dataset",category:"bigquery",status:"error",message:`Dataset not found: ${C}`,fix:{hint:"Create the dataset first",gcloud:`bq mk --dataset ${w}:YOUR_DATASET_ID`,console:`${S}/bigquery?project=${w}`}}):c.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable (table lookup returned expected error)"});}for(let T of y)try{let C=await t.tableExists(T.tableName);c.push({name:`Table: ${T.tableName}`,category:"bigquery",status:C?"ok":"warn",message:C?`Table \`${T.tableName}\` exists`:`Table \`${T.tableName}\` does not exist yet`,...!C&&{fix:{hint:"Table will be auto-created on first sync if autoMigrate is enabled. Or create it manually."}}});}catch(C){c.push({name:`Table: ${T.tableName}`,category:"bigquery",status:"error",message:C?.message??String(C)});}if(a)for(let T of y){let C=`${p}-${T.name}`;try{let O=a.topic(C);if(typeof O.exists=="function"){let[A]=await O.exists();c.push({name:`Topic: ${C}`,category:"pubsub",status:A?"ok":"error",message:A?`Topic \`${C}\` exists`:`Topic \`${C}\` does not exist`,...!A&&{fix:{gcloud:`gcloud pubsub topics create ${C} --project=${w}`,console:`${S}/cloudpubsub/topic/list?project=${w}`}}});}else c.push({name:`Topic: ${C}`,category:"pubsub",status:"warn",message:"Cannot verify topic existence (PubSub client doesn't expose .exists())",fix:{gcloud:`gcloud pubsub topics create ${C} --project=${w}`,console:`${S}/cloudpubsub/topic/list?project=${w}`,hint:"Ensure the topic exists. It is auto-created by the Firebase emulator but must exist in production."}});}catch(O){let A=O?.message??String(O),E=A.includes("disabled")||A.includes("has not been used");if(c.push({name:E?"Pub/Sub API":`Topic: ${C}`,category:"pubsub",status:"error",message:E?"Pub/Sub API is not enabled":A,fix:E?{gcloud:`gcloud services enable pubsub.googleapis.com --project=${w}`,console:`${S}/apis/library/pubsub.googleapis.com?project=${w}`}:{gcloud:`gcloud pubsub topics create ${C} --project=${w}`,console:`${S}/cloudpubsub/topic/list?project=${w}`}}),E)break}}else c.push({name:"Pub/Sub Client",category:"pubsub",status:"warn",message:"PubSub client not available for config check"});if(pt(m)){let T=c.every(C=>C.status==="ok");Ee(v,{project:w,healthy:T,checks:c});return}let h=T=>T==="ok"?'<span class="badge badge-ok">OK</span>':T==="warn"?'<span class="badge badge-warn">WARN</span>':'<span class="badge badge-err">ERROR</span>',l={bigquery:c.filter(T=>T.category==="bigquery"),pubsub:c.filter(T=>T.category==="pubsub"),firestore:c.filter(T=>T.category==="firestore")},g=(T,C)=>{if(C.length===0)return "";let O=C.map(A=>{let E="";if(A.fix){let $=[];A.fix.hint&&$.push(`<p class="muted">${A.fix.hint}</p>`),A.fix.gcloud&&$.push(`<pre>$ ${A.fix.gcloud}</pre>`),A.fix.console&&$.push(`<p><a href="${A.fix.console}" target="_blank">Open GCP Console \u2192</a></p>`),E=`<div style="margin-top:.5rem">${$.join("")}</div>`;}return `<tr>
|
|
74
74
|
<td>${h(A.status)}</td>
|
|
75
|
-
<td><strong>${A.name}</strong><br><span class="muted">${A.message}</span>${
|
|
75
|
+
<td><strong>${A.name}</strong><br><span class="muted">${A.message}</span>${E}</td>
|
|
76
76
|
</tr>`}).join(`
|
|
77
77
|
`);return `<h2>${T}</h2>
|
|
78
78
|
<table><thead><tr><th style="width:80px">Status</th><th>Check</th></tr></thead>
|
|
@@ -81,7 +81,7 @@ ${n}
|
|
|
81
81
|
${g("BigQuery",l.bigquery)}
|
|
82
82
|
${g("Pub/Sub",l.pubsub)}
|
|
83
83
|
${g("Firestore",l.firestore)}
|
|
84
|
-
</div>`);pe(v,R);}),async(m,v)=>{await u.handle(m,v);}}var ao="firestore-sync";function io(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 In(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??ao,d={},i=new Map;function f(u){let m=i.get(u);return m||(m=s.topic(u),i.set(u,m),m)}async function y(u,m){await f(u).publishMessage({json:m});}for(let[u,m]of Object.entries(e)){let v=t?.repos?.[u],b;if(m._isGroup){if(!v?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${u}". Provide a triggerPath in the sync repos config for group collections.`);continue}b=v.triggerPath;}else b=v?.triggerPath??io(u,m);if(!b)continue;let w=m._systemKeys?.[0]??"docId",S=`${a}-${u}`;d[`${u}_onCreate`]=n(b,async p=>{let c=p.data;if(!c)return;let h=c.data();if(!h)return;let l=String(h[w]??c.id),g=qe(h,{exclude:v?.exclude,columnMap:v?.columnMap}),x={operation:"INSERT",repoName:u,docId:l,data:g,timestamp:new Date().toISOString(),version:Date.now()};await y(S,x);}),d[`${u}_onUpdate`]=r(b,async p=>{let c=p.data?.after;if(!c)return;let h=c.data();if(!h)return;let l=String(h[w]??c.id),g=qe(h,{exclude:v?.exclude,columnMap:v?.columnMap}),x={operation:"UPSERT",repoName:u,docId:l,data:g,timestamp:new Date().toISOString(),version:Date.now()};await y(S,x);}),d[`${u}_onDelete`]=o(b,async p=>{let c=p.data;if(!c)return;let h=c.data(),l=String(h?.[w]??c.id),g={operation:"DELETE",repoName:u,docId:l,data:null,timestamp:new Date().toISOString(),version:Date.now()};await y(S,g);});}return d}function Fn(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function _n(e,t){let n=Fn(e),r=Fn(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var ft=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 d=Number(a[he]??0);Number(s.data[he]??0)>=d&&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 Nn=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 lo(e,t,n,r,o,s,a){if(Nn.has(e))return;let d=ut(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:d});else if(t.getTableColumnsWithTypes){let f=await t.getTableColumnsWithTypes(r),y=[];for(let u of d){let m=f.get(u.name);if(m===void 0){y.push(u);continue}if(t.dialect.name==="bigquery"&&!_n(m,u.sqlType))throw new Pt(r,u.name,m,u.sqlType)}y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}else {let f=new Set(await t.getTableColumns(r)),y=d.filter(u=>!f.has(u.name));y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}Nn.add(e);}function jn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:d="firestore-sync",maxDlqAttempts:i=5,workerOptions:f,repos:y={}}=t,u=new Map;function m(w,S){let p=u.get(w);if(p)return p;let h=y[w]?.tableName??w,l=`${d}-${w}-dlq`,g=n.pubsub.topic(l),x=false,k=async()=>{if(!x){try{await g.create(),console.info(`[SyncWorker] Created DLQ topic "${l}"`);}catch(T){if(T?.code!==6)throw T}x=true;}},R=async(T,C)=>{console.error(`[SyncWorker] Flush failed for "${w}" (${T.length} events):`,C),await k(),await Promise.all(T.map(O=>{let A=(O.attempts??0)+1;if(i>0&&A>i)return console.error(`[SyncWorker] Dropping event for "${w}" after ${A-1} DLQ attempts:`,{docId:O.docId,operation:O.operation}),Promise.resolve();let P={...O,attempts:A,firstFailedAt:O.firstFailedAt??Date.now()};return g.publishMessage({json:P})}));};return p=new ft({adapter:r,tableName:h,primaryKey:S,batchSize:o,flushIntervalMs:s,onFlushError:R}),u.set(w,p),p}async function v(w){let{repoName:S}=w,p=e[S];if(!p){console.warn(`[SyncWorker] Unknown repo "${S}", skipping event`);return}let c=p._systemKeys?.[0]??p.documentKey??"docId",h=y[S],l=h?.columnMap,g=l?.[c]??c;if(a){let k=p.schema??void 0;if(k){let R=h?.tableName??S;await lo(S,r,k,R,c,h?.exclude,l);}}let x=m(S,g);w.data&&(w.data[he]=w.version??Date.now()),x.enqueue(w);}function b(w){let S=async p=>{let c=p.data?.message?.json??p.data?.json;if(!c){console.warn("[SyncWorker] Received empty PubSub message");return}await v(c);let h=u.get(c.repoName);h&&await h.flush();};return f?n.pubsubHandler.onMessagePublished({topic:w,...f},S):n.pubsubHandler.onMessagePublished(w,S)}return {handleMessage:v,createHandler:b,queues:u,async shutdown(){let w=[];for(let S of u.values())w.push(S.shutdown());await Promise.all(w);}}}var co="firestore-sync";function Mn(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 Bn(e,t){let{deps:n,adapter:r,topicPrefix:o=co,batchSize:s,flushIntervalMs:a,autoMigrate:d,admin:i,workerOptions:f,repos:y}=t,u=Mn(n.pubsub),m=Mn(r),v=In(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:u},topicPrefix:o,repos:y}),b=jn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:u},adapter:m,batchSize:s,flushIntervalMs:a,autoMigrate:d,topicPrefix:o,workerOptions:f,repos:y}),w={};for(let c of Object.keys(e))w[`sync_${c}`]=b.createHandler(`${o}-${c}`);let S=null;i&&(S=Dn(e,m,b.queues,b.handleMessage,i,y??{},u,o),w.adminsync=i.onRequest?i.httpsOptions?i.onRequest(i.httpsOptions,S):i.onRequest(S):S);let p={functions:{...v,...w},adminHandler:S,handleMessage:b.handleMessage,queues:b.queues,shutdown:b.shutdown};for(let c of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(p,c,{enumerable:false});return p}Le();Le();function uo(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Hn(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=An(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function ie(e,t=""){if(q(e)==="ZodObject"){let r=ne(e);return Object.entries(r).map(([o,s])=>zn(t?`${t}.${o}`:o,o,s))}return [zn(t||"value",t||"value",e)]}function zn(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=Hn(n),d=q(r),i=uo(t.split(".").pop()??t);switch(d){case "ZodString":{let f=On(r),y=f.includes("email"),u=f.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:y?"email":u?"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 f=ze(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:f}}case "ZodNativeEnum":{let f=Ze(r),y=Object.values(f).filter(u=>typeof u=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:y}}case "ZodLiteral":{let f=String(dt(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[f]}}case "ZodObject":{let f=ie(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:f,hint:"JSON object"}}case "ZodArray":{let f=Cn(r);if(!f)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:y}=Hn(f),u=q(y),m,v,b;switch(u){case "ZodString":m="text";break;case "ZodNumber":case "ZodBigInt":m="number";break;case "ZodBoolean":m="checkbox";break;case "ZodDate":m="datetime-local";break;case "ZodEnum":m="select",v=ze(y);break;case "ZodNativeEnum":m="select",v=Object.values(Ze(y)).filter(w=>typeof w=="string");break;case "ZodObject":m="object",b=ie(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:m,arrayElementOptions:v,arrayElementFields:b}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function Et(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__",d=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
|
|
84
|
+
</div>`);pe(v,R);}),async(m,v)=>{await u.handle(m,v);}}var ao="firestore-sync";function io(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 In(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??ao,d={},i=new Map;function f(u){let m=i.get(u);return m||(m=s.topic(u),i.set(u,m),m)}async function y(u,m){await f(u).publishMessage({json:m});}for(let[u,m]of Object.entries(e)){let v=t?.repos?.[u],b;if(m._isGroup){if(!v?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${u}". Provide a triggerPath in the sync repos config for group collections.`);continue}b=v.triggerPath;}else b=v?.triggerPath??io(u,m);if(!b)continue;let w=m._systemKeys?.[0]??"docId",S=`${a}-${u}`;d[`${u}_onCreate`]=n(b,async p=>{let c=p.data;if(!c)return;let h=c.data();if(!h)return;let l=String(h[w]??c.id),g=qe(h,{exclude:v?.exclude,columnMap:v?.columnMap}),x={operation:"INSERT",repoName:u,docId:l,data:g,timestamp:new Date().toISOString(),version:Date.now()};await y(S,x);}),d[`${u}_onUpdate`]=r(b,async p=>{let c=p.data?.after;if(!c)return;let h=c.data();if(!h)return;let l=String(h[w]??c.id),g=qe(h,{exclude:v?.exclude,columnMap:v?.columnMap}),x={operation:"UPSERT",repoName:u,docId:l,data:g,timestamp:new Date().toISOString(),version:Date.now()};await y(S,x);}),d[`${u}_onDelete`]=o(b,async p=>{let c=p.data;if(!c)return;let h=c.data(),l=String(h?.[w]??c.id),g={operation:"DELETE",repoName:u,docId:l,data:null,timestamp:new Date().toISOString(),version:Date.now()};await y(S,g);});}return d}function Fn(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function _n(e,t){let n=Fn(e),r=Fn(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var ft=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 d=Number(a[he]??0);Number(s.data[he]??0)>=d&&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 Nn=new Set,Et=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 lo(e,t,n,r,o,s,a){if(Nn.has(e))return;let d=ut(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:d});else if(t.getTableColumnsWithTypes){let f=await t.getTableColumnsWithTypes(r),y=[];for(let u of d){let m=f.get(u.name);if(m===void 0){y.push(u);continue}if(t.dialect.name==="bigquery"&&!_n(m,u.sqlType))throw new Et(r,u.name,m,u.sqlType)}y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}else {let f=new Set(await t.getTableColumns(r)),y=d.filter(u=>!f.has(u.name));y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}Nn.add(e);}function jn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:d="firestore-sync",maxDlqAttempts:i=5,workerOptions:f,repos:y={}}=t,u=new Map;function m(w,S){let p=u.get(w);if(p)return p;let h=y[w]?.tableName??w,l=`${d}-${w}-dlq`,g=n.pubsub.topic(l),x=false,k=async()=>{if(!x){try{await g.create(),console.info(`[SyncWorker] Created DLQ topic "${l}"`);}catch(T){if(T?.code!==6)throw T}x=true;}},R=async(T,C)=>{console.error(`[SyncWorker] Flush failed for "${w}" (${T.length} events):`,C),await k(),await Promise.all(T.map(O=>{let A=(O.attempts??0)+1;if(i>0&&A>i)return console.error(`[SyncWorker] Dropping event for "${w}" after ${A-1} DLQ attempts:`,{docId:O.docId,operation:O.operation}),Promise.resolve();let E={...O,attempts:A,firstFailedAt:O.firstFailedAt??Date.now()};return g.publishMessage({json:E})}));};return p=new ft({adapter:r,tableName:h,primaryKey:S,batchSize:o,flushIntervalMs:s,onFlushError:R}),u.set(w,p),p}async function v(w){let{repoName:S}=w,p=e[S];if(!p){console.warn(`[SyncWorker] Unknown repo "${S}", skipping event`);return}let c=p._systemKeys?.[0]??p.documentKey??"docId",h=y[S],l=h?.columnMap,g=l?.[c]??c;if(a){let k=p.schema??void 0;if(k){let R=h?.tableName??S;await lo(S,r,k,R,c,h?.exclude,l);}}let x=m(S,g);w.data&&(w.data[he]=w.version??Date.now()),x.enqueue(w);}function b(w){let S=async p=>{let c=p.data?.message?.json??p.data?.json;if(!c){console.warn("[SyncWorker] Received empty PubSub message");return}await v(c);let h=u.get(c.repoName);h&&await h.flush();};return f?n.pubsubHandler.onMessagePublished({topic:w,...f},S):n.pubsubHandler.onMessagePublished(w,S)}return {handleMessage:v,createHandler:b,queues:u,async shutdown(){let w=[];for(let S of u.values())w.push(S.shutdown());await Promise.all(w);}}}var co="firestore-sync";function Mn(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 Hn(e,t){let{deps:n,adapter:r,topicPrefix:o=co,batchSize:s,flushIntervalMs:a,autoMigrate:d,admin:i,workerOptions:f,repos:y}=t,u=Mn(n.pubsub),m=Mn(r),v=In(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:u},topicPrefix:o,repos:y}),b=jn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:u},adapter:m,batchSize:s,flushIntervalMs:a,autoMigrate:d,topicPrefix:o,workerOptions:f,repos:y}),w={};for(let c of Object.keys(e))w[`sync_${c}`]=b.createHandler(`${o}-${c}`);let S=null;i&&(S=Dn(e,m,b.queues,b.handleMessage,i,y??{},u,o),w.adminsync=i.onRequest?i.httpsOptions?i.onRequest(i.httpsOptions,S):i.onRequest(S):S);let p={functions:{...v,...w},adminHandler:S,handleMessage:b.handleMessage,queues:b.queues,shutdown:b.shutdown};for(let c of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(p,c,{enumerable:false});return p}Le();Le();function uo(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Bn(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=An(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function ie(e,t=""){if(q(e)==="ZodObject"){let r=ne(e);return Object.entries(r).map(([o,s])=>zn(t?`${t}.${o}`:o,o,s))}return [zn(t||"value",t||"value",e)]}function zn(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=Bn(n),d=q(r),i=uo(t.split(".").pop()??t);switch(d){case "ZodString":{let f=On(r),y=f.includes("email"),u=f.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:y?"email":u?"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 f=ze(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:f}}case "ZodNativeEnum":{let f=Ze(r),y=Object.values(f).filter(u=>typeof u=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:y}}case "ZodLiteral":{let f=String(dt(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[f]}}case "ZodObject":{let f=ie(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:f,hint:"JSON object"}}case "ZodArray":{let f=Cn(r);if(!f)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:y}=Bn(f),u=q(y),m,v,b;switch(u){case "ZodString":m="text";break;case "ZodNumber":case "ZodBigInt":m="number";break;case "ZodBoolean":m="checkbox";break;case "ZodDate":m="datetime-local";break;case "ZodEnum":m="select",v=ze(y);break;case "ZodNativeEnum":m="select",v=Object.values(Ze(y)).filter(w=>typeof w=="string");break;case "ZodObject":m="object",b=ie(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:m,arrayElementOptions:v,arrayElementFields:b}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function Pt(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__",d=!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)}"${d===y?" selected":""}>${N(y)}</option>`).join(`
|
|
120
120
|
`)}
|
|
121
|
-
</select>`;break;case "textarea":if(e.arrayElementType)return po(e,t);if(e.nested&&e.nested.length>0){let y=e.nested.map(u=>
|
|
121
|
+
</select>`;break;case "textarea":if(e.arrayElementType)return po(e,t);if(e.nested&&e.nested.length>0){let y=e.nested.map(u=>Pt(u,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">
|
|
@@ -208,7 +208,7 @@ ${n}
|
|
|
208
208
|
<input type="text" data-frs-key="${N(o.name)}" value="${N(a)}" class="input input-bordered input-sm w-full">
|
|
209
209
|
</div>`}}).join(`
|
|
210
210
|
`)}
|
|
211
|
-
</div>`}function be(e,t,n,r="Save"){let o=e.map(s=>
|
|
211
|
+
</div>`}function be(e,t,n,r="Save"){let o=e.map(s=>Pt(s)).join(`
|
|
212
212
|
`);return `
|
|
213
213
|
<form action="${N(t)}" method="${n}" novalidate data-frs-form>
|
|
214
214
|
${o}
|
|
@@ -1143,7 +1143,7 @@ function initColumnReorder(table) {
|
|
|
1143
1143
|
});
|
|
1144
1144
|
});
|
|
1145
1145
|
}
|
|
1146
|
-
`;function Ue(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Vn}})}Bt();function xe(e){return "<!DOCTYPE html>"+server.renderToString(e)}var Eo=["corporate","silk","dark"],Do=()=>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:Eo.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))})]}),ve=({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(Do,{})})]}),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,d)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},d):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},d))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(Mt,{basePath:s}),jsxRuntime.jsx(Ue,{})]})]})};function Ht(e,t){return xe(jsxRuntime.jsx(ve,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function zt(e,t){return xe(jsxRuntime.jsx(ve,{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 Xn=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],Io=[{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"}],Fo=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function _o(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return Io;case "ZodBoolean":return Xn;case "ZodArray":return Fo;default:return Xn}}var we="__null__";function No(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="${we}"]');if(!o){o=document.createElement('option');o.value='${we}';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='${we}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${we}"][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!=='${we}')?i.dataset._prev:'';}}})(this)`}function jo(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 Ve({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:No(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Mo({col:e,active:t}){let n=t?.value??"",r=n===we,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 d=new Set(n.split(",").map(f=>f.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(f=>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:f,checked:d.has(f),"data-enum-group":i,onchange:jo(o,i)}),jsxRuntime.jsx("span",{children:f})]},f))]})}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(d=>jsxRuntime.jsx("option",{value:d,selected:n===d,children:d},d)),e.nullable&&jsxRuntime.jsx("option",{value:we,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ve,{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:we,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ve,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:d?"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(Ve,{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(Ve,{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(Ve,{inputId:o,active:r})]})}function Zt({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,d=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:d.map(i=>{let f=_o(i.zodType),y=o[i.name],u=y?.op??f[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:[f.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:f.map(m=>jsxRuntime.jsx("option",{value:m.value,selected:m.value===u,children:m.label},m.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:f[0].value}),jsxRuntime.jsx(Mo,{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 Lt(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=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 xe(jsxRuntime.jsx(ve,{opts:{title:a,breadcrumb:d,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}})})})}))}mt();jt();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 Yn(e,t,n,r,o){let s=qt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Bo(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 Ho(e,t,n){return `?${qt(t,n,e).toString()}`}function Kt(e,t,n,r,o,s,a=[],d=[],i=false,f=[],y,u,m,v,b,w,S,p=false){let c=`${r}/${e}`,h=`${c}/create`,l={};if(S)for(let C of n)l[C]=Ie(Fe(S,C));let g=(w??[]).filter(C=>{let O=l[C]??Ie(Fe(S,C));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),x=g.length>0,k=i,R=k||x,T=g.map(C=>{let O=Fe(S,C),A=Ie(O),P=a.find($=>$.name===C);return {name:C,type:A,enumValues:P?.enumValues??null,nullable:P?.nullable??false}});return xe(jsxRuntime.jsxs(ve,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Zt,{action:c,columnMeta:a,activeFilters:d,isGroup:v}),m&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${m.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:m.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:m.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:m.message})]}),m.indexUrl&&jsxRuntime.jsx("a",{href:m.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(C=>jsxRuntime.jsx("a",{href:Ho(C,d,y),class:`join-item btn btn-xs ${u===C?"btn-active btn-primary":"btn-outline"}`,children:C},C))})]})]}),jsxRuntime.jsx("a",{href:h,class:"btn btn-primary btn-sm",children:"+ New"})]}),R&&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(u??t.length),"data-frs-allow-delete":k?"1":"0","data-frs-allow-update":x?"1":"0","data-frs-fields":JSON.stringify(T),"data-frs-filters":JSON.stringify(d),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 link-primary 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:[x&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),k&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[R&&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((C,O)=>{let A=y?.field===C,P=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:Bo(C,y,d,u),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[C,P]})},O)}),f.map((C,O)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:C.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+f.length+1+(R?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((C,O)=>{let A=String(C.docId??C.id??""),P=`${r}/${e}/${encodeURIComponent(A)}/edit`,$=`${r}/${e}/${encodeURIComponent(A)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":A,children:[R&&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((D,_)=>{let I=C[D],E=l[D],Z=E?Qe(E,I):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(De,{val:I,mismatch:Z})},_)}),f.map((D,_)=>{let I=C[D.key];if(I==null||I==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${_}`);let E=D.type==="one"?`${r}/${D.targetRepo}/${encodeURIComponent(String(I))}/edit`:`${r}/${D.targetRepo}?fv_${D.targetKey}=${encodeURIComponent(String(I))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:E,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":D.type,"data-frs-rel-repo":D.targetRepo,"data-frs-rel-fk":D.targetKey,"data-frs-rel-val":String(I),"data-frs-rel-label":D.column,children:D.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:P,class:"btn btn-xs btn-outline",children:"Edit"}),p&&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:Yn(d,o.prevCursor,"prev",y,u),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:Yn(d,o.nextCursor,"next",y,u),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":"",d.length>0?" matching filters":""]})]}),R&&x&&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"}),g.map(C=>jsxRuntime.jsx("option",{value:C,children:C},C))]})]}),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 We(e,t){return Ht(e,t)}function Ut(e,t){return zt(e,t)}function Qt(e,t,n,r,o,s,a,d,i,f,y,u,m,v,b,w,S,p){return Kt(e,t,n,r,o,s,a,d,i,f,y,u,m,v,b,w,S,p)}function Re(e,t,n,r,o,s){return Lt(e,t,n,r,o,s)}var Vt="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>=Vt.length*4||(e+=Vt.charAt(r%Vt.length));}}return e}function ht(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 _e(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 Wt(e,t,n){let r=e.documentKey??"docId",o=Ke(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 M(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Gt(e,t){e.status(302).set("Location",t).send("");}function Jt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=Yt(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let f={},y=false;for(let[v,b]of Object.entries(e))v.startsWith(`${o}.`)&&(f[v.slice(o.length+1)]=b,y=true);if(y){let v=s;for(;;){let b=q(v);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")v=G(v);else break}r[o]=Jt(f,v);continue}let u=e[o],m=Array.isArray(u)?u[u.length-1]:u;if(m)try{r[o]=JSON.parse(m);}catch{r[o]=m;}continue}let d=e[o],i=Array.isArray(d)?d[d.length-1]:d;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 er(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 Yt(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Ko(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function nr(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 rr(e){let t=Ko(e),n=q(t);if(n==="ZodEnum"){let r=ze(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Ze(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=dt(t);return typeof r=="string"?[r]:void 0}}function or(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 d=t.shape[o];for(;;){let f=q(d);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")d=G(d);else break}let i=q(d);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let f=or(a,d,s);Object.assign(r,f);}else if(i==="ZodDate"){let f=er(a);f!==null&&(r[s]=f);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let f=er(a);r[s]=f??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function Xt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Xt(n.nested,t):void 0}))}function Uo(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 d=(s??"").trim();if(!d)continue;let i=e[`fo_${a}`]??"==",f=n.has(i)?i:"==";r.push({field:a,op:f,value:d});}return r}function tr(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 sr(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 d=Yt(a);if(d==="ZodObject"){let i=a;for(;;){let y=q(i);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")i=G(i);else break}let f=ne(i);r.push(...sr(Object.keys(f),i,s));}else r.push({name:s,zodType:d,nullable:nr(a),enumValues:rr(a)});}return r}function Qo(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=ne(r);if(!(o in s))return null;r=s[o];}return r}function Ae(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 d=s.slice(0,a),i=s.slice(a+1);r.has(d)||r.set(d,[]),r.get(d).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 d=e.shape[s];for(;;){let i=q(d);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")d=G(d);else break}if(q(d)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Ae(d,a);}return zod.z.object(o)}function fe(e,t){return te(e,t)}function ar(e,t){let n=(p,c)=>{let h=fe(p,t),l=Object.values(e).map(g=>({name:g.name,path:g.path}));M(c,Ut(l,h));},r=async(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=l.pageSize??25,x=p.query??{},k=x.cursor,R=x.dir==="prev"?"prev":"next",T=x.ob??"",C=x.od==="desc"?"desc":"asc",O=T?{field:T,dir:C}:void 0,A=parseInt(x.ps??""),P=Number.isFinite(A)&&A>0?Math.min(A,200):g,$=l.listColumns??Object.keys(l.schema.shape),D=l.documentKey??"docId",_=[D,...$.filter(W=>W!==D)];O&&(new Set([D,...$]).has(O.field)||(O=void 0));let I=l.filterableFields?(()=>{let W=[];for(let ce of l.filterableFields)(ce.includes(".")||$.includes(ce))&&W.push(ce);return W})():$,E=(()=>{let W=[];for(let ce of I)if(ce.includes(".")){let $e=Qo(l.schema,ce);W.push({name:ce,zodType:$e?Yt($e):"ZodString",nullable:$e?nr($e):false,enumValues:$e?rr($e):void 0});}else W.push(...sr([ce],l.schema));return W})(),Z=new Set(E.map(W=>W.name)),ye=Uo(x,Z),ae=tr(ye),Q;if(k)try{let W=l.repo.ref;typeof W.doc=="function"&&(Q=await W.doc(k).get());}catch{}let[K,Ye]=await Promise.all([l.repo.query.paginate({pageSize:P,cursor:Q,direction:R,...ae.length>0?{where:ae}:{},...O?{orderBy:[{field:O.field,direction:O.dir}]}:{}}).catch(W=>({queryError:Ke(W,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:ye,sort:O})})),l.repo.aggregate.count(ae.length>0?{where:ae}:{}).catch(()=>{})]),Oe="queryError"in K,vr=Oe?[]:K.data,wr=Oe?"":K.nextCursor?.id??"",Rr=Oe?"":K.prevCursor?.id??"",Sr=Oe?K.queryError:void 0,kr=fe(p,t);M(c,Qt(l.name,vr,_,kr,{hasPrev:Oe?false:K.hasPrevPage,hasNext:Oe?false:K.hasNextPage,prevCursor:Rr,nextCursor:wr},void 0,E,ye,l.allowDelete??false,l.relationalMeta,O,P,Sr,l.isGroup,Ye,l.mutableFields,l.schema,l.historyEnabled));},o=(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=fe(p,t),x=Ae(l.schema,l.createFields),k=ie(x),R=`${g}/${l.name}/create`,T=be(k,R,"POST","Create document");M(c,Re(l.name,T,"create",null,g));},s=async(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=fe(p,t),x=p.body??{},k=Jt(x,l.schema),R=Ae(l.schema,l.createFields),T=R.safeParse(k);if(!T.success){let C=ie(R),O=`${g}/${l.name}/create`,A=be(C,O,"POST","Create document"),P=T.error.issues.map($=>`${$.path.join(".")}: ${$.message}`).join(", ");M(c,Re(l.name,A,"create",null,g,{type:"error",message:`Validation error: ${P}`}),422);return}try{if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let C={...T.data};l.createdKey&&(C[l.createdKey]=new Date);let O=l.parentKeys.filter(D=>!C[D]);if(O.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${O.join(", ")}`);let A=l.parentKeys.map(D=>C[D]),P=l.documentKey??"docId",$=C[P]||qo();await l.repo.set(...A,$,C);}else await l.repo.create(T.data);Gt(c,`${g}/${l.name}?flash=created`);}catch(C){let O=Ae(l.schema,l.createFields),A=ie(O),P=`${g}/${l.name}/create`,$=be(A,P,"POST","Create document");M(c,Re(l.name,$,"create",null,g,{type:"error",message:`Save error: ${C.message}`}),500);}},a=async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}let x=fe(p,t),k=null;try{k=await _e(g,l);}catch(P){let $=Wt(g,l,P),D=Te(P)?424:500;M(c,We("",{title:`Edit ${g.name} / ${l}`,basePath:x,breadcrumb:[{label:"Repositories",href:x},{label:g.name,href:`${x}/${g.name}`},{label:`Edit ${l}`}],flash:$}),D);return}if(!k){M(c,"Document not found",404);return}let R=or(k,g.schema),T=Ae(g.schema,g.mutableFields),C=Xt(ie(T),R),O=`${x}/${g.name}/${encodeURIComponent(l)}/edit`,A=be(C,O,"POST","Save changes");M(c,Re(g.name,A,"edit",l,x));},d=async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}let x=fe(p,t),k=p.body??{},R=Jt(k,g.schema),T=Ae(g.schema,g.mutableFields),O=T.partial().safeParse(R);if(!O.success){let A=Object.fromEntries(Object.entries(k).map(([I,E])=>[I,Array.isArray(E)?E.join(","):E??""])),P=Xt(ie(T),A),$=`${x}/${g.name}/${encodeURIComponent(l)}/edit`,D=be(P,$,"POST","Save changes"),_=O.error.issues.map(I=>`${I.path.join(".")}: ${I.message}`).join(", ");M(c,Re(g.name,D,"edit",l,x,{type:"error",message:`Validation error: ${_}`}),422);return}try{let A=await _e(g,l),P=(A&&ht(A,g.pathKey))??[l];await g.repo.update(...P,O.data),Gt(c,`${x}/${g.name}?flash=updated`);}catch(A){let P=Ae(g.schema,g.mutableFields),$=ie(P),D=`${x}/${g.name}/${encodeURIComponent(l)}/edit`,_=be($,D,"POST","Save changes"),I=Te(A)?Wt(g,l,A):{type:"error",message:`Save error: ${A.message}`},E=Te(A)?424:500;M(c,Re(g.name,_,"edit",l,x,I),E);}},i=async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}if(!g.allowDelete){M(c,"Delete is not allowed for this repository",403);return}let x=fe(p,t);try{let k=await _e(g,l),R=(k&&ht(k,g.pathKey))??[l];await g.repo.delete(...R),Gt(c,`${x}/${g.name}?flash=deleted`);}catch(k){let R=Te(k)?Wt(g,l,k):{type:"error",message:`Delete error: ${k.message}`},T=Te(k)?424:500;M(c,We("",{title:`Delete ${g.name} / ${l}`,basePath:x,breadcrumb:[{label:"Repositories",href:x},{label:g.name,href:`${x}/${g.name}`},{label:`Delete ${l}`}],flash:R}),T);}},f=async(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=fe(p,t),x=p.query,k=x?.type==="many"?"many":"one",R=Math.max(1,Math.min(100,Number(x?.ps??25)||25)),T=l.listColumns??Object.keys(ne(l.schema)),{PanelOne:C,PanelMany:O}=await Promise.resolve().then(()=>(Bt(),Gn)),{renderToString:A}=await import('hono/jsx/dom/server');if(k==="one"){let E=String(x?.id??"");if(!E){M(c,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Z=await _e(l,E),ye=A(C({doc:Z,repoName:l.name,basePath:g,schema:l.schema,columns:T}));M(c,ye);}catch(Z){M(c,`<div class='p-6 text-error text-sm'>Error: ${Z.message}</div>`,500);}return}let P=String(x?.fk??""),$=String(x?.fv??"");if(!P||!$){M(c,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let D=x?.cursor??"",_=x?.dir==="prev"?"prev":"next",I;if(D)try{let E=l.repo.ref;typeof E.doc=="function"&&(I=await E.doc(D).get());}catch{}try{let E=await l.repo.query.paginate({pageSize:R,cursor:I,direction:_,where:[[P,"==",Vo($)]]}),Z=A(O({docs:E.data,repoName:l.name,basePath:g,fk:P,fv:$,columns:T,schema:l.schema,pagination:{hasPrev:E.hasPrevPage,hasNext:E.hasNextPage,prevCursor:E.prevCursor?.id??"",nextCursor:E.nextCursor?.id??"",pageSize:R}}));M(c,Z);}catch(E){M(c,`<div class='p-6 text-error text-sm'>Error: ${E.message}</div>`,500);}},y=async(p,c)=>{let h=[];for(let l of c){let g;if(p.isGroup||p.parentKeys?.length){let x=await _e(p,l);g=x?ht(x,p.pathKey):void 0;}g||(g=[l]);try{let x=p.repo.documentRef(...g);x&&h.push(x);}catch{}}return h},u=async(p,c)=>{let h=tr(c),l=p.documentKey??"docId",g=[],x;for(;;){let k=await p.repo.query.paginate({pageSize:500,cursor:x,direction:"next",...h.length>0?{where:h}:{}});for(let R of k.data){let T=String(R[l]??R.id??"");T&&g.push(T);}if(!k.hasNextPage||!k.nextCursor)break;x=k.nextCursor;}return g},m=async(p,c)=>{let h=p.params.repoName;if(!h){ee(c,{error:"Bad request"},400);return}let l=e[h];if(!l){ee(c,{error:"Repository not found"},404);return}if(!l.allowDelete){ee(c,{error:"Delete is not allowed for this repository"},403);return}let g=p.body??{};try{let x=await b(l,g);if(x.length===0){ee(c,{deleted:0});return}let k=await y(l,x);for(let R=0;R<k.length;R+=500)await l.repo.bulk.delete(k.slice(R,R+500));ee(c,{deleted:k.length});}catch(x){ee(c,{error:x.message},500);}},v=async(p,c)=>{let h=p.params.repoName;if(!h){ee(c,{error:"Bad request"},400);return}let l=e[h];if(!l){ee(c,{error:"Repository not found"},404);return}let g=p.body??{},x=String(g.field??"");if(!x){ee(c,{error:"Missing 'field'"},400);return}if(!l.mutableFields||!l.mutableFields.includes(x)){ee(c,{error:`Field '${x}' is not bulk-updatable`},403);return}let k=l.schema.shape?.[x],R=g.value;if(k){let T=k.safeParse(g.value);if(!T.success){ee(c,{error:`Invalid value for '${x}': ${T.error.message}`},400);return}R=T.data;}try{let T=await b(l,g);if(T.length===0){ee(c,{updated:0});return}let O=(await y(l,T)).map(A=>({docRef:A,data:{[x]:R}}));for(let A=0;A<O.length;A+=500)await l.repo.bulk.update(O.slice(A,A+500));ee(c,{updated:O.length});}catch(T){ee(c,{error:T.message},500);}};async function b(p,c){if(c.selectAll){let h=w(c.filters,p);return await u(p,h)}return Array.isArray(c.ids)?c.ids.filter(h=>typeof h=="string"&&!!h):[]}function w(p,c){if(!Array.isArray(p))return [];let h=new Set((c.filterableFields??Object.keys(ne(c.schema))).map(x=>String(x))),l=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),g=[];for(let x of p)x&&typeof x=="object"&&typeof x.field=="string"&&h.has(x.field)&&typeof x.value=="string"&&l.has(String(x.op))&&g.push({field:x.field,op:x.op,value:x.value});return g}return {handleDashboard:n,handleList:r,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:a,handleEditSubmit:d,handleDelete:i,handlePanel:f,handleBulkDelete:m,handleBulkUpdate:v,handleHistory:async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}if(!g.historyEnabled||!g.repo.history){M(c,"History not enabled for this repository",404);return}let x=fe(p,t),k=g.historySubcollection??"history",R=[l];try{let E=await _e(g,l),Z=E?ht(E,g.pathKey):void 0;Z&&Z.length>0&&(R=Z);}catch{}let T=parseInt(String(p.query?.limit??"")),C=Number.isFinite(T)&&T>0?Math.min(T,500):100,O=[],A;try{O=await g.repo.history.list(...R,{limit:C});}catch(E){A=E.message;}let P=E=>String(E??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),$=E=>{if(E===void 0)return '<span class="opacity-40">undefined</span>';if(E===null)return '<span class="opacity-40">null</span>';if(typeof E=="object")try{return `<code class="text-xs">${P(JSON.stringify(E))}</code>`}catch{return P(String(E))}return P(String(E))},D=E=>E?typeof E.toDate=="function"?E.toDate().toISOString():E instanceof Date?E.toISOString():P(String(E)):"",_=E=>`<span class="badge badge-sm ${E==="create"?"badge-success":E==="delete"?"badge-error":"badge-info"}">${P(E)}</span>`,I="";if(I+='<div class="flex items-center justify-between mb-4">',I+=`<a href="${x}/${g.name}/${encodeURIComponent(l)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,I+=`<a href="${x}/${g.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,I+="</div>",I+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${P(k)}</code> \xB7 Showing up to ${C} entries.</p>`,A)I+=`<div class="alert alert-error mb-4">${P(A)}</div>`;else if(O.length===0)I+='<div class="alert">No history entries found.</div>';else {I+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',I+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let E of O){let Z=E.meta??{},ye=[Z.reason,Z.comment].filter(K=>K!=null&&K!=="").map(K=>P(String(K))).join(" \u2014 "),ae="",Q=Object.keys(E.changes??{});Q.length===0?ae='<span class="opacity-40">\u2014</span>':ae='<ul class="space-y-1">'+Q.map(K=>{let Ye=E.changes[K];return `<li><strong>${P(K)}</strong>: ${$(Ye.oldValue)} \u2192 ${$(Ye.newValue)}</li>`}).join("")+"</ul>",I+="<tr>",I+=`<td class="whitespace-nowrap text-xs font-mono">${P(D(E.historySetAt))}</td>`,I+=`<td>${_(E.operation??"update")}</td>`,I+=`<td class="text-xs">${P(Z.userEmail??Z.userId??"")}</td>`,I+=`<td class="text-xs">${ye}</td>`,I+=`<td>${ae}</td>`,I+="</tr>";}I+="</tbody></table></div>";}M(c,We(I,{title:`History \u2014 ${g.name} / ${l}`,basePath:x,breadcrumb:[{label:"Repositories",href:x},{label:g.name,href:`${x}/${g.name}`},{label:`History ${l}`}]}));}}}function ee(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Vo(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var ir="https://cdn.jsdelivr.net",lr="https://www.gstatic.com",cr=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${ir} ${lr}`,`style-src 'self' 'unsafe-inline' ${ir}`,`connect-src 'self' ${lr} 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 Ge(e={}){let t=e.csp===void 0?cr: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,d)=>{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 d();}}async function Wo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Go(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 dr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],httpsOptions:d}=e,i=t==="/"?"":t.replace(/\/$/,""),f={};for(let[v,b]of Object.entries(n)){let w=b.schema??b.repo.schema??null;if(!w)throw new Error(`[createAdminServer] Repository "${v}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let S,p,c;if(b.fieldsConfig){let g=b.fieldsConfig;S=[],p=[],c=[];for(let[x,k]of Object.entries(g))for(let R of k)R==="filterable"?S.push(x):R==="mutable"?p.push(x):R==="create"&&c.push(x);S.length===0&&(S=void 0),p.length===0&&(p=void 0),c.length===0&&(c=void 0);}let h=(()=>{let g=b.repo._parentKeys;return g&&g.length>0?g:void 0})();if(h&&c)for(let g of h)c.includes(g)||c.push(g);let l={name:v,path:b.path,repo:b.repo,schema:w,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:h,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:S,mutableFields:p,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 g=b.repo.relationalKeys??{},x=[];for(let k of b.relationalFields){let R=g[k.key];R&&x.push({key:k.key,column:k.column,targetRepo:String(R.repo),targetKey:String(R.key),type:R.type});}return x.length>0?x:void 0})()};f[v]=l;}let y=ar(f,i),u=new re;if(o!==false&&u.use(Ge(o===void 0?{}:o)),r&&u.use(async(v,b,w)=>{let S=v,p=String(S.headers?.["content-type"]??"");if(p.includes("application/x-www-form-urlencoded")){let c=await Wo(S);v.body=Go(c);}else if(p.includes("application/json")&&typeof S.body=="string")try{v.body=JSON.parse(S.body);}catch{}await w();}),s)if(ge(s)){for(let v of s.routes){let b=`${i}${v.path}`;v.method==="GET"?u.get(b,v.handler):u.post(b,v.handler);}u.use(s.middleware);}else if(typeof s=="function")u.use(s);else {let v=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");u.use((w,S,p)=>{if((w.headers?.authorization??"")!==b){S.status(401).set("WWW-Authenticate",`Basic realm="${v}"`).set("Content-Type","text/plain").send("Unauthorized");return}p();});}for(let v of a)u.use(v);u.get(`${i}/`,y.handleDashboard),u.get(`${i}`,y.handleDashboard),u.get(`${i}/:repoName/_panel`,y.handlePanel),u.post(`${i}/:repoName/_bulk/delete`,y.handleBulkDelete),u.post(`${i}/:repoName/_bulk/update`,y.handleBulkUpdate),u.get(`${i}/:repoName`,y.handleList),u.get(`${i}/:repoName/create`,y.handleCreateForm),u.post(`${i}/:repoName/create`,y.handleCreateSubmit),u.get(`${i}/:repoName/:id/edit`,y.handleEditForm),u.post(`${i}/:repoName/:id/edit`,y.handleEditSubmit),u.get(`${i}/:repoName/:id/history`,y.handleHistory),u.post(`${i}/:repoName/:id/delete`,y.handleDelete);let m=async(v,b)=>{await u.handle(v,b);};return d&&(m.httpsOptions=d),m}function nn(e,t,n=200){let r=U(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Ne(e,t,n,r=200){nn(e,{success:true,data:t,meta:n},r);}function L(e,t,n=400){nn(e,{success:false,error:t},n);}function en(e,t,n,r,o){let s=Ke(t,n),a=s.type==="index",d=a?424:500,f={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(f.errorType="index",s.indexUrl&&(f.indexUrl=s.indexUrl)),nn(e,f,d);}var tn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Xo(){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>=tn.length*4||(e+=tn.charAt(r%tn.length));}}return e}function je(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=>St(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=je(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(je(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return je(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return je(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=je(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function Yo(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 d=a.split(".")[0];d&&r[d]&&(o[d]=r[d]);}return zod.z.object(o)}function ur(e,t,n,r=false,o=[]){try{let s=Yo(e,n,o),a=r?s.partial():s;return {success:!0,data:(Rt()==="normalize"?je(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(d=>`${d.path.join(".")}: ${d.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function es(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 d=Array.isArray(a)?a[0]:a;if(d===void 0||d==="")continue;let i=s.match(/^(\w+)__(\w+)$/),f,y="==";if(i&&i[1]&&i[2]){f=i[1];let m=i[2];if(o[m])y=o[m];else continue}else if(!i)f=s;else continue;if(r&&!r.has(f))continue;let u=d;y==="in"||y==="not-in"||y==="array-contains-any"?u=d.split(",").map(m=>pr(m.trim())):u=pr(d),n.push({field:f,op:y,value:u});}return n}function pr(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 bt(e){return e?{docId:e.id}:null}async function fr(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 yr(e,t,n,r=false){async function o(p,c,h,l){if(!r)return true;let g=c.rules?.[h];if(!g)return L(p,`Operation "${h}" is not allowed for this repository`,403),false;try{return await g(l)?!0:(L(p,"Forbidden",403),!1)}catch(x){let k=n&&x instanceof Error?x.message:"Forbidden";return L(p,k,403),false}}async function s(p,c,h,l){if(!r)return l;let g=p.rules?.filter;if(!g)return l;let x=[];for(let k of l)try{await g({user:c,doc:k,params:h})&&x.push(k);}catch{}return x}function a(p){return p?.user??null}function d(p,c){return !p||!e[p]?(L(c,`Repository "${p}" not found`,404),null):e[p]}function i(p,c){if(!c)return;let h=p[c];if(typeof h!="string"||!h)return;let l=h.split("/").filter(Boolean),g=[];for(let x=1;x<l.length;x+=2)g.push(l[x]);return g.length>0?g:void 0}async function f(p,c){let h=`by${p.documentKey.charAt(0).toUpperCase()}${p.documentKey.slice(1)}`,l=p.repo.get[h];if(typeof l=="function")try{let x=await l(c);if(x)return x}catch{}return (await p.repo.query.by({where:[[p.documentKey,"==",c]],limit:1}))[0]??null}async function y(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;let g=a(p);if(!await o(c,l,"list",{user:g,query:p.query??{},params:h}))return;let x=[],k;try{let R=p.query??{},T=Math.min(Number(R.pageSize)||l.pageSize,100),C=R.cursor,O=R.direction?.toLowerCase()==="prev"?"prev":"next",A=R.orderBy,P=R.orderDir?.toLowerCase()==="desc"?"desc":"asc",$=R.select,D=$?$.split(",").map(Q=>Q.trim()):void 0,_;l.allowedIncludes&&R.includes&&(_=(typeof R.includes=="string"?R.includes.split(",").map(K=>K.trim()):Array.isArray(R.includes)?R.includes:[]).filter(K=>typeof K=="string"&&l.allowedIncludes.includes(K)),_?.length===0&&(_=void 0));let I=es(R,l.filterableFields);x=I.map(Q=>({field:Q.field,op:Q.op,value:String(Q.value??"")})),A&&(k={field:A,dir:P});let E={pageSize:T,direction:O};if(C)try{let Q=typeof C=="string"?JSON.parse(C):C;E.cursor=await fr(l,Q);}catch{}if(A){if(l.orderableFields&&!l.orderableFields.includes(A)){L(c,`Field not orderable: ${A}`,400);return}E.orderBy=[{field:A,direction:P}];}I.length>0&&(E.where=I.map(Q=>[Q.field,Q.op,Q.value])),D&&(E.select=D),_&&(E.include=_);let Z=await l.repo.query.paginate(E),ae={items:await s(l,a(p),h,Z.data),hasNextPage:Z.hasNextPage,hasPrevPage:Z.hasPrevPage,nextCursor:bt(Z.nextCursor),prevCursor:bt(Z.prevCursor)};Ne(c,ae,{pageSize:T,hasMore:Z.hasNextPage});}catch(R){en(c,R,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:x,sort:k},"Failed to fetch documents",n);}}async function u(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;let g=a(p);if(!await o(c,l,"list",{user:g,query:p.body??{},params:h}))return;let x=[],k;try{let R=p.body??{},T=Math.min(R.pageSize||l.pageSize,100),C=R.direction==="prev"?"prev":"next";R.where&&(x=R.where.map(D=>({field:String(D[0]),op:D[1],value:String(D[2]??"")}))),R.orderBy&&R.orderBy[0]&&(k={field:R.orderBy[0].field,dir:R.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:T,direction:C};if(R.cursor)try{let D=typeof R.cursor=="string"?JSON.parse(R.cursor):R.cursor;O.cursor=await fr(l,D);}catch{}if(l.allowedIncludes&&R.includes&&R.includes.length>0){let D=R.includes.filter(_=>typeof _=="string"?l.allowedIncludes.includes(_):typeof _=="object"&&_!==null&&"relation"in _&&typeof _.relation=="string"?l.allowedIncludes.includes(_.relation):!1);D.length>0&&(O.include=D);}if(R.where&&R.where.length>0){if(l.filterableFields){let D=new Set(l.filterableFields),_=R.where.filter(I=>!D.has(I[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(I=>I[0]).join(", ")}`,400);return}}O.where=R.where;}if(R.orWhere&&R.orWhere.length>0){if(l.filterableFields){let D=new Set(l.filterableFields),_=R.orWhere.filter(I=>!D.has(I[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(I=>I[0]).join(", ")}`,400);return}}O.orWhere=R.orWhere;}if(R.orWhereGroups&&R.orWhereGroups.length>0){if(l.filterableFields){let D=new Set(l.filterableFields);for(let _ of R.orWhereGroups){let I=_.filter(E=>!D.has(E[0]));if(I.length>0){L(c,`Fields not filterable: ${I.map(E=>E[0]).join(", ")}`,400);return}}}O.orWhereGroups=R.orWhereGroups;}if(R.orderBy&&R.orderBy.length>0){if(l.orderableFields){let D=new Set(l.orderableFields),_=R.orderBy.filter(I=>!D.has(I.field));if(_.length>0){L(c,`Fields not orderable: ${_.map(I=>I.field).join(", ")}`,400);return}}O.orderBy=R.orderBy;}R.select&&R.select.length>0&&(O.select=R.select);let A=await l.repo.query.paginate(O),$={items:await s(l,a(p),h,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:bt(A.nextCursor),prevCursor:bt(A.prevCursor)};Ne(c,$,{pageSize:T,hasMore:A.hasNextPage});}catch(R){en(c,R,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:x,sort:k},"Failed to query documents",n);}}async function m(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;let g=h.id;if(!g){L(c,"Document ID required",400);return}try{let x=await f(l,g);if(!x){L(c,"Document not found",404);return}let k=a(p);if(!await o(c,l,"get",{user:k,doc:x,params:h}))return;if(r&&l.rules?.filter)try{if(!await l.rules.filter({user:k,doc:x,params:h})){L(c,"Document not found",404);return}}catch{L(c,"Document not found",404);return}Ne(c,x);}catch(x){en(c,x,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:[{field:l.documentKey,op:"==",value:g}]},"Failed to fetch document",n);}}async function v(p,c){let h=p.params||{},l=d(h.repoName,c);if(l)try{let g=p.body??{},x=a(p);if(!await o(c,l,"create",{user:x,body:g,params:h}))return;let k=ur(l.schema,g,l.createFields,!1,l.systemKeys);if(!k.success){L(c,k.error,400);return}if(l.validate){let T=await l.validate(k.data,"create");if(T){L(c,T,400);return}}let R;if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let T={...k.data};l.createdKey&&(T[l.createdKey]=new Date);let C=l.parentKeys.filter(P=>!T[P]);if(C.length>0){L(c,`Missing parent key(s) for subcollection create: ${C.join(", ")}`,400);return}let O=l.parentKeys.map(P=>T[P]),A=T[l.documentKey]||Xo();R=await l.repo.set(...O,A,T);}else R=await l.repo.create(k.data);Ne(c,R,void 0,201);}catch(g){let x=n&&g instanceof Error?g.message:"Failed to create document";L(c,x,500);}}async function b(p,c,h){let l=p.params||{},g=d(l.repoName,c);if(!g)return;let x=l.id;if(!x){L(c,"Document ID required",400);return}try{let k=p.body??{},R=await f(g,x);if(!R){L(c,"Document not found",404);return}let T=a(p);if(!await o(c,g,"update",{user:T,doc:R,body:k,params:l}))return;let C=ur(g.schema,k,g.mutableFields,h,g.systemKeys);if(!C.success){L(c,C.error,400);return}if(g.validate){let P=await g.validate(C.data,"update");if(P){L(c,P,400);return}}let O=i(R,g.pathKey)??[x],A=await g.repo.update(...O,C.data);Ne(c,A);}catch(k){let R=n&&k instanceof Error?k.message:"Failed to update document";L(c,R,500);}}async function w(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;if(!l.allowDelete){L(c,"Delete not allowed for this repository",403);return}let g=h.id;if(!g){L(c,"Document ID required",400);return}try{let x=await f(l,g);if(!x){L(c,"Document not found",404);return}let k=a(p);if(!await o(c,l,"delete",{user:k,doc:x,params:h}))return;let R=i(x,l.pathKey)??[g];await l.repo.delete(...R),Ne(c,{deleted:!0});}catch(x){let k=n&&x instanceof Error?x.message:"Failed to delete document";L(c,k,500);}}function S(p,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:u,handleGet:m,handleCreate:v,handleUpdate:b,handleDelete:w,handleOptions:S}}function rn(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 se(e){return {$ref:`#/components/schemas/${e}`}}function Y(e){return {description:e,content:{"application/json":{schema:se("ErrorResponse")}}}}function Xe(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function mr(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 ts(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 ns(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 rs(){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 os(e,t,n,r,o){let s={},a=e.name,d=`${t}/${e.name}`,i=`${d}/{${e.documentKey}}`,f={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[d]={get:{operationId:`list${Se(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...ts(e),...ns(e)],responses:{200:mr(se(n)),500:Y("Internal server error")}},post:{operationId:`create${Se(e.name)}`,summary:`Create a ${le(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:se(r??n)}}},responses:{201:Xe("Document created",se(n)),400:Y("Validation error"),500:Y("Internal server error")}}},s[`${d}/query`]={post:{operationId:`query${Se(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:se("QueryRequestBody")}}},responses:{200:mr(se(n)),400:Y("Invalid query"),500:Y("Internal server error")}}};let y={};return y.get={operationId:`get${Se(le(e.name))}`,summary:`Get a single ${le(e.name)}`,tags:[a],parameters:[f],responses:{200:Xe("Document found",se(n)),404:Y("Document not found"),500:Y("Internal server error")}},y.put={operationId:`update${Se(le(e.name))}`,summary:`Update a ${le(e.name)} (full replace)`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:se(o??n)}}},responses:{200:Xe("Document updated",se(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},y.patch={operationId:`patch${Se(le(e.name))}`,summary:`Partially update a ${le(e.name)}`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:{allOf:[se(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Xe("Document patched",se(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},e.allowDelete&&(y.delete={operationId:`delete${Se(le(e.name))}`,summary:`Delete a ${le(e.name)}`,tags:[a],parameters:[f],responses:{200:Xe("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:Y("Document not found"),500:Y("Internal server error")}}),s[i]=y,s}function sn(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:d=false}=n,i=t==="/"?"":t.replace(/\/$/,""),f={},y={},u=[];f.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},f.QueryRequestBody=rs();for(let[w,S]of Object.entries(e)){let p=Se(le(w)),c=`${p}Create`,h=`${p}Update`;f[p]=rn(S.schema);let l=C=>{let O=C&&C.length>0?C:Object.keys(S.schema.shape),A={};for(let P of O){let $=P.split(".")[0];$&&S.schema.shape[$]&&!S.systemKeys.includes($)&&(A[$]=S.schema.shape[$]);}return A},g=null,x=l(S.createFields);Object.keys(x).length>0&&(f[c]=rn(zod.z.object(x)),g=c);let k=null,R=l(S.mutableFields);Object.keys(R).length>0&&(f[h]=rn(zod.z.object(R)),k=h);let T=os(S,i,p,g,k);Object.assign(y,T),u.push({name:w,description:`Operations on ${w} (collection: ${S.path})`});}let m={},v;return d==="basic"?(m.basicAuth={type:"http",scheme:"basic"},v=[{basicAuth:[]}]):d==="bearer"&&(m.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},v=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:y,components:{schemas:f,...Object.keys(m).length>0?{securitySchemes:m}:{}},...v?{security:v}:{},tags:u}}function Se(e){return e.charAt(0).toUpperCase()+e.slice(1)}function le(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 ss(e,t){return `<!DOCTYPE html>
|
|
1146
|
+
`;function Ue(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Vn}})}Ht();function xe(e){return "<!DOCTYPE html>"+server.renderToString(e)}var Po=["corporate","silk","dark"],Do=()=>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:Po.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))})]}),ve=({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(Do,{})})]}),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,d)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},d):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},d))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(Mt,{basePath:s}),jsxRuntime.jsx(Ue,{})]})]})};function Bt(e,t){return xe(jsxRuntime.jsx(ve,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function zt(e,t){return xe(jsxRuntime.jsx(ve,{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 Xn=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],Io=[{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"}],Fo=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function _o(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return Io;case "ZodBoolean":return Xn;case "ZodArray":return Fo;default:return Xn}}var we="__null__";function No(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="${we}"]');if(!o){o=document.createElement('option');o.value='${we}';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='${we}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${we}"][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!=='${we}')?i.dataset._prev:'';}}})(this)`}function jo(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 Ve({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:No(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Mo({col:e,active:t}){let n=t?.value??"",r=n===we,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 d=new Set(n.split(",").map(f=>f.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(f=>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:f,checked:d.has(f),"data-enum-group":i,onchange:jo(o,i)}),jsxRuntime.jsx("span",{children:f})]},f))]})}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(d=>jsxRuntime.jsx("option",{value:d,selected:n===d,children:d},d)),e.nullable&&jsxRuntime.jsx("option",{value:we,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ve,{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:we,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ve,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:d?"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(Ve,{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(Ve,{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(Ve,{inputId:o,active:r})]})}function Zt({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,d=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:d.map(i=>{let f=_o(i.zodType),y=o[i.name],u=y?.op??f[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:[f.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:f.map(m=>jsxRuntime.jsx("option",{value:m.value,selected:m.value===u,children:m.label},m.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:f[0].value}),jsxRuntime.jsx(Mo,{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 Lt(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=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 xe(jsxRuntime.jsx(ve,{opts:{title:a,breadcrumb:d,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}})})})}))}mt();jt();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 Yn(e,t,n,r,o){let s=qt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Ho(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 Bo(e,t,n){return `?${qt(t,n,e).toString()}`}function Kt(e,t,n,r,o,s,a=[],d=[],i=false,f=[],y,u,m,v,b,w,S,p=false){let c=`${r}/${e}`,h=`${c}/create`,l={};if(S)for(let C of n)l[C]=Ie(Fe(S,C));let g=(w??[]).filter(C=>{let O=l[C]??Ie(Fe(S,C));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),x=g.length>0,k=i,R=k||x,T=g.map(C=>{let O=Fe(S,C),A=Ie(O),E=a.find($=>$.name===C);return {name:C,type:A,enumValues:E?.enumValues??null,nullable:E?.nullable??false}});return xe(jsxRuntime.jsxs(ve,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Zt,{action:c,columnMeta:a,activeFilters:d,isGroup:v}),m&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${m.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:m.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:m.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:m.message})]}),m.indexUrl&&jsxRuntime.jsx("a",{href:m.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(C=>jsxRuntime.jsx("a",{href:Bo(C,d,y),class:`join-item btn btn-xs ${u===C?"btn-active btn-primary":"btn-outline"}`,children:C},C))})]})]}),jsxRuntime.jsx("a",{href:h,class:"btn btn-primary btn-sm",children:"+ New"})]}),R&&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(u??t.length),"data-frs-allow-delete":k?"1":"0","data-frs-allow-update":x?"1":"0","data-frs-fields":JSON.stringify(T),"data-frs-filters":JSON.stringify(d),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:[x&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),k&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[R&&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((C,O)=>{let A=y?.field===C,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:Ho(C,y,d,u),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[C,E]})},O)}),f.map((C,O)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:C.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+f.length+1+(R?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((C,O)=>{let A=String(C.docId??C.id??""),E=`${r}/${e}/${encodeURIComponent(A)}/edit`,$=`${r}/${e}/${encodeURIComponent(A)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":A,children:[R&&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((D,_)=>{let I=C[D],P=l[D],Z=P?Qe(P,I):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(De,{val:I,mismatch:Z})},_)}),f.map((D,_)=>{let I=C[D.key];if(I==null||I==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${_}`);let P=D.type==="one"?`${r}/${D.targetRepo}/${encodeURIComponent(String(I))}/edit`:`${r}/${D.targetRepo}?fv_${D.targetKey}=${encodeURIComponent(String(I))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:P,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":D.type,"data-frs-rel-repo":D.targetRepo,"data-frs-rel-fk":D.targetKey,"data-frs-rel-val":String(I),"data-frs-rel-label":D.column,children:D.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"}),p&&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:Yn(d,o.prevCursor,"prev",y,u),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:Yn(d,o.nextCursor,"next",y,u),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":"",d.length>0?" matching filters":""]})]}),R&&x&&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"}),g.map(C=>jsxRuntime.jsx("option",{value:C,children:C},C))]})]}),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 We(e,t){return Bt(e,t)}function Ut(e,t){return zt(e,t)}function Qt(e,t,n,r,o,s,a,d,i,f,y,u,m,v,b,w,S,p){return Kt(e,t,n,r,o,s,a,d,i,f,y,u,m,v,b,w,S,p)}function Re(e,t,n,r,o,s){return Lt(e,t,n,r,o,s)}var Vt="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>=Vt.length*4||(e+=Vt.charAt(r%Vt.length));}}return e}function ht(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 _e(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 Wt(e,t,n){let r=e.documentKey??"docId",o=Ke(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 M(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Gt(e,t){e.status(302).set("Location",t).send("");}function Jt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=Yt(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let f={},y=false;for(let[v,b]of Object.entries(e))v.startsWith(`${o}.`)&&(f[v.slice(o.length+1)]=b,y=true);if(y){let v=s;for(;;){let b=q(v);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")v=G(v);else break}r[o]=Jt(f,v);continue}let u=e[o],m=Array.isArray(u)?u[u.length-1]:u;if(m)try{r[o]=JSON.parse(m);}catch{r[o]=m;}continue}let d=e[o],i=Array.isArray(d)?d[d.length-1]:d;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 er(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 Yt(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Ko(e){let t=e;for(;;){let n=q(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function nr(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 rr(e){let t=Ko(e),n=q(t);if(n==="ZodEnum"){let r=ze(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Ze(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=dt(t);return typeof r=="string"?[r]:void 0}}function or(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 d=t.shape[o];for(;;){let f=q(d);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")d=G(d);else break}let i=q(d);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let f=or(a,d,s);Object.assign(r,f);}else if(i==="ZodDate"){let f=er(a);f!==null&&(r[s]=f);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let f=er(a);r[s]=f??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function Xt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Xt(n.nested,t):void 0}))}function Uo(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 d=(s??"").trim();if(!d)continue;let i=e[`fo_${a}`]??"==",f=n.has(i)?i:"==";r.push({field:a,op:f,value:d});}return r}function tr(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 sr(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 d=Yt(a);if(d==="ZodObject"){let i=a;for(;;){let y=q(i);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")i=G(i);else break}let f=ne(i);r.push(...sr(Object.keys(f),i,s));}else r.push({name:s,zodType:d,nullable:nr(a),enumValues:rr(a)});}return r}function Qo(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=ne(r);if(!(o in s))return null;r=s[o];}return r}function Ae(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 d=s.slice(0,a),i=s.slice(a+1);r.has(d)||r.set(d,[]),r.get(d).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 d=e.shape[s];for(;;){let i=q(d);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")d=G(d);else break}if(q(d)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Ae(d,a);}return zod.z.object(o)}function fe(e,t){return te(e,t)}function ar(e,t){let n=(p,c)=>{let h=fe(p,t),l=Object.values(e).map(g=>({name:g.name,path:g.path}));M(c,Ut(l,h));},r=async(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=l.pageSize??25,x=p.query??{},k=x.cursor,R=x.dir==="prev"?"prev":"next",T=x.ob??"",C=x.od==="desc"?"desc":"asc",O=T?{field:T,dir:C}:void 0,A=parseInt(x.ps??""),E=Number.isFinite(A)&&A>0?Math.min(A,200):g,$=l.listColumns??Object.keys(l.schema.shape),D=l.documentKey??"docId",_=[D,...$.filter(W=>W!==D)];O&&(new Set([D,...$]).has(O.field)||(O=void 0));let I=l.filterableFields?(()=>{let W=[];for(let ce of l.filterableFields)(ce.includes(".")||$.includes(ce))&&W.push(ce);return W})():$,P=(()=>{let W=[];for(let ce of I)if(ce.includes(".")){let $e=Qo(l.schema,ce);W.push({name:ce,zodType:$e?Yt($e):"ZodString",nullable:$e?nr($e):false,enumValues:$e?rr($e):void 0});}else W.push(...sr([ce],l.schema));return W})(),Z=new Set(P.map(W=>W.name)),ye=Uo(x,Z),ae=tr(ye),Q;if(k)try{let W=l.repo.ref;typeof W.doc=="function"&&(Q=await W.doc(k).get());}catch{}let[K,Ye]=await Promise.all([l.repo.query.paginate({pageSize:E,cursor:Q,direction:R,...ae.length>0?{where:ae}:{},...O?{orderBy:[{field:O.field,direction:O.dir}]}:{}}).catch(W=>({queryError:Ke(W,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:ye,sort:O})})),l.repo.aggregate.count(ae.length>0?{where:ae}:{}).catch(()=>{})]),Oe="queryError"in K,vr=Oe?[]:K.data,wr=Oe?"":K.nextCursor?.id??"",Rr=Oe?"":K.prevCursor?.id??"",Sr=Oe?K.queryError:void 0,kr=fe(p,t);M(c,Qt(l.name,vr,_,kr,{hasPrev:Oe?false:K.hasPrevPage,hasNext:Oe?false:K.hasNextPage,prevCursor:Rr,nextCursor:wr},void 0,P,ye,l.allowDelete??false,l.relationalMeta,O,E,Sr,l.isGroup,Ye,l.mutableFields,l.schema,l.historyEnabled));},o=(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=fe(p,t),x=Ae(l.schema,l.createFields),k=ie(x),R=`${g}/${l.name}/create`,T=be(k,R,"POST","Create document");M(c,Re(l.name,T,"create",null,g));},s=async(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=fe(p,t),x=p.body??{},k=Jt(x,l.schema),R=Ae(l.schema,l.createFields),T=R.safeParse(k);if(!T.success){let C=ie(R),O=`${g}/${l.name}/create`,A=be(C,O,"POST","Create document"),E=T.error.issues.map($=>`${$.path.join(".")}: ${$.message}`).join(", ");M(c,Re(l.name,A,"create",null,g,{type:"error",message:`Validation error: ${E}`}),422);return}try{if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let C={...T.data};l.createdKey&&(C[l.createdKey]=new Date);let O=l.parentKeys.filter(D=>!C[D]);if(O.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${O.join(", ")}`);let A=l.parentKeys.map(D=>C[D]),E=l.documentKey??"docId",$=C[E]||qo();await l.repo.set(...A,$,C);}else await l.repo.create(T.data);Gt(c,`${g}/${l.name}?flash=created`);}catch(C){let O=Ae(l.schema,l.createFields),A=ie(O),E=`${g}/${l.name}/create`,$=be(A,E,"POST","Create document");M(c,Re(l.name,$,"create",null,g,{type:"error",message:`Save error: ${C.message}`}),500);}},a=async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}let x=fe(p,t),k=null;try{k=await _e(g,l);}catch(E){let $=Wt(g,l,E),D=Te(E)?424:500;M(c,We("",{title:`Edit ${g.name} / ${l}`,basePath:x,breadcrumb:[{label:"Repositories",href:x},{label:g.name,href:`${x}/${g.name}`},{label:`Edit ${l}`}],flash:$}),D);return}if(!k){M(c,"Document not found",404);return}let R=or(k,g.schema),T=Ae(g.schema,g.mutableFields),C=Xt(ie(T),R),O=`${x}/${g.name}/${encodeURIComponent(l)}/edit`,A=be(C,O,"POST","Save changes");M(c,Re(g.name,A,"edit",l,x));},d=async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}let x=fe(p,t),k=p.body??{},R=Jt(k,g.schema),T=Ae(g.schema,g.mutableFields),O=T.partial().safeParse(R);if(!O.success){let A=Object.fromEntries(Object.entries(k).map(([I,P])=>[I,Array.isArray(P)?P.join(","):P??""])),E=Xt(ie(T),A),$=`${x}/${g.name}/${encodeURIComponent(l)}/edit`,D=be(E,$,"POST","Save changes"),_=O.error.issues.map(I=>`${I.path.join(".")}: ${I.message}`).join(", ");M(c,Re(g.name,D,"edit",l,x,{type:"error",message:`Validation error: ${_}`}),422);return}try{let A=await _e(g,l),E=(A&&ht(A,g.pathKey))??[l];await g.repo.update(...E,O.data),Gt(c,`${x}/${g.name}?flash=updated`);}catch(A){let E=Ae(g.schema,g.mutableFields),$=ie(E),D=`${x}/${g.name}/${encodeURIComponent(l)}/edit`,_=be($,D,"POST","Save changes"),I=Te(A)?Wt(g,l,A):{type:"error",message:`Save error: ${A.message}`},P=Te(A)?424:500;M(c,Re(g.name,_,"edit",l,x,I),P);}},i=async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}if(!g.allowDelete){M(c,"Delete is not allowed for this repository",403);return}let x=fe(p,t);try{let k=await _e(g,l),R=(k&&ht(k,g.pathKey))??[l];await g.repo.delete(...R),Gt(c,`${x}/${g.name}?flash=deleted`);}catch(k){let R=Te(k)?Wt(g,l,k):{type:"error",message:`Delete error: ${k.message}`},T=Te(k)?424:500;M(c,We("",{title:`Delete ${g.name} / ${l}`,basePath:x,breadcrumb:[{label:"Repositories",href:x},{label:g.name,href:`${x}/${g.name}`},{label:`Delete ${l}`}],flash:R}),T);}},f=async(p,c)=>{let h=p.params.repoName;if(!h){M(c,"Bad request",400);return}let l=e[h];if(!l){M(c,"Repository not found",404);return}let g=fe(p,t),x=p.query,k=x?.type==="many"?"many":"one",R=Math.max(1,Math.min(100,Number(x?.ps??25)||25)),T=l.listColumns??Object.keys(ne(l.schema)),{PanelOne:C,PanelMany:O}=await Promise.resolve().then(()=>(Ht(),Gn)),{renderToString:A}=await import('hono/jsx/dom/server');if(k==="one"){let P=String(x?.id??"");if(!P){M(c,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Z=await _e(l,P),ye=A(C({doc:Z,repoName:l.name,basePath:g,schema:l.schema,columns:T}));M(c,ye);}catch(Z){M(c,`<div class='p-6 text-error text-sm'>Error: ${Z.message}</div>`,500);}return}let E=String(x?.fk??""),$=String(x?.fv??"");if(!E||!$){M(c,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let D=x?.cursor??"",_=x?.dir==="prev"?"prev":"next",I;if(D)try{let P=l.repo.ref;typeof P.doc=="function"&&(I=await P.doc(D).get());}catch{}try{let P=await l.repo.query.paginate({pageSize:R,cursor:I,direction:_,where:[[E,"==",Vo($)]]}),Z=A(O({docs:P.data,repoName:l.name,basePath:g,fk:E,fv:$,columns:T,schema:l.schema,pagination:{hasPrev:P.hasPrevPage,hasNext:P.hasNextPage,prevCursor:P.prevCursor?.id??"",nextCursor:P.nextCursor?.id??"",pageSize:R}}));M(c,Z);}catch(P){M(c,`<div class='p-6 text-error text-sm'>Error: ${P.message}</div>`,500);}},y=async(p,c)=>{let h=[];for(let l of c){let g;if(p.isGroup||p.parentKeys?.length){let x=await _e(p,l);g=x?ht(x,p.pathKey):void 0;}g||(g=[l]);try{let x=p.repo.documentRef(...g);x&&h.push(x);}catch{}}return h},u=async(p,c)=>{let h=tr(c),l=p.documentKey??"docId",g=[],x;for(;;){let k=await p.repo.query.paginate({pageSize:500,cursor:x,direction:"next",...h.length>0?{where:h}:{}});for(let R of k.data){let T=String(R[l]??R.id??"");T&&g.push(T);}if(!k.hasNextPage||!k.nextCursor)break;x=k.nextCursor;}return g},m=async(p,c)=>{let h=p.params.repoName;if(!h){ee(c,{error:"Bad request"},400);return}let l=e[h];if(!l){ee(c,{error:"Repository not found"},404);return}if(!l.allowDelete){ee(c,{error:"Delete is not allowed for this repository"},403);return}let g=p.body??{};try{let x=await b(l,g);if(x.length===0){ee(c,{deleted:0});return}let k=await y(l,x);for(let R=0;R<k.length;R+=500)await l.repo.bulk.delete(k.slice(R,R+500));ee(c,{deleted:k.length});}catch(x){ee(c,{error:x.message},500);}},v=async(p,c)=>{let h=p.params.repoName;if(!h){ee(c,{error:"Bad request"},400);return}let l=e[h];if(!l){ee(c,{error:"Repository not found"},404);return}let g=p.body??{},x=String(g.field??"");if(!x){ee(c,{error:"Missing 'field'"},400);return}if(!l.mutableFields||!l.mutableFields.includes(x)){ee(c,{error:`Field '${x}' is not bulk-updatable`},403);return}let k=l.schema.shape?.[x],R=g.value;if(k){let T=k.safeParse(g.value);if(!T.success){ee(c,{error:`Invalid value for '${x}': ${T.error.message}`},400);return}R=T.data;}try{let T=await b(l,g);if(T.length===0){ee(c,{updated:0});return}let O=(await y(l,T)).map(A=>({docRef:A,data:{[x]:R}}));for(let A=0;A<O.length;A+=500)await l.repo.bulk.update(O.slice(A,A+500));ee(c,{updated:O.length});}catch(T){ee(c,{error:T.message},500);}};async function b(p,c){if(c.selectAll){let h=w(c.filters,p);return await u(p,h)}return Array.isArray(c.ids)?c.ids.filter(h=>typeof h=="string"&&!!h):[]}function w(p,c){if(!Array.isArray(p))return [];let h=new Set((c.filterableFields??Object.keys(ne(c.schema))).map(x=>String(x))),l=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),g=[];for(let x of p)x&&typeof x=="object"&&typeof x.field=="string"&&h.has(x.field)&&typeof x.value=="string"&&l.has(String(x.op))&&g.push({field:x.field,op:x.op,value:x.value});return g}return {handleDashboard:n,handleList:r,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:a,handleEditSubmit:d,handleDelete:i,handlePanel:f,handleBulkDelete:m,handleBulkUpdate:v,handleHistory:async(p,c)=>{let h=p.params.repoName,l=p.params.id;if(!h||!l){M(c,"Bad request",400);return}let g=e[h];if(!g){M(c,"Repository not found",404);return}if(!g.historyEnabled||!g.repo.history){M(c,"History not enabled for this repository",404);return}let x=fe(p,t),k=g.historySubcollection??"history",R=[l];try{let P=await _e(g,l),Z=P?ht(P,g.pathKey):void 0;Z&&Z.length>0&&(R=Z);}catch{}let T=parseInt(String(p.query?.limit??"")),C=Number.isFinite(T)&&T>0?Math.min(T,500):100,O=[],A;try{O=await g.repo.history.list(...R,{limit:C});}catch(P){A=P.message;}let E=P=>String(P??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),$=P=>{if(P===void 0)return '<span class="opacity-40">undefined</span>';if(P===null)return '<span class="opacity-40">null</span>';if(typeof P=="object")try{return `<code class="text-xs">${E(JSON.stringify(P))}</code>`}catch{return E(String(P))}return E(String(P))},D=P=>P?typeof P.toDate=="function"?P.toDate().toISOString():P instanceof Date?P.toISOString():E(String(P)):"",_=P=>`<span class="badge badge-sm ${P==="create"?"badge-success":P==="delete"?"badge-error":"badge-info"}">${E(P)}</span>`,I="";if(I+='<div class="flex items-center justify-between mb-4">',I+=`<a href="${x}/${g.name}/${encodeURIComponent(l)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,I+=`<a href="${x}/${g.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,I+="</div>",I+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${E(k)}</code> \xB7 Showing up to ${C} entries.</p>`,A)I+=`<div class="alert alert-error mb-4">${E(A)}</div>`;else if(O.length===0)I+='<div class="alert">No history entries found.</div>';else {I+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',I+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let P of O){let Z=P.meta??{},ye=[Z.reason,Z.comment].filter(K=>K!=null&&K!=="").map(K=>E(String(K))).join(" \u2014 "),ae="",Q=Object.keys(P.changes??{});Q.length===0?ae='<span class="opacity-40">\u2014</span>':ae='<ul class="space-y-1">'+Q.map(K=>{let Ye=P.changes[K];return `<li><strong>${E(K)}</strong>: ${$(Ye.oldValue)} \u2192 ${$(Ye.newValue)}</li>`}).join("")+"</ul>",I+="<tr>",I+=`<td class="whitespace-nowrap text-xs font-mono">${E(D(P.historySetAt))}</td>`,I+=`<td>${_(P.operation??"update")}</td>`,I+=`<td class="text-xs">${E(Z.userEmail??Z.userId??"")}</td>`,I+=`<td class="text-xs">${ye}</td>`,I+=`<td>${ae}</td>`,I+="</tr>";}I+="</tbody></table></div>";}M(c,We(I,{title:`History \u2014 ${g.name} / ${l}`,basePath:x,breadcrumb:[{label:"Repositories",href:x},{label:g.name,href:`${x}/${g.name}`},{label:`History ${l}`}]}));}}}function ee(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Vo(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var ir="https://cdn.jsdelivr.net",lr="https://www.gstatic.com",cr=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${ir} ${lr}`,`style-src 'self' 'unsafe-inline' ${ir}`,`connect-src 'self' ${lr} 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 Ge(e={}){let t=e.csp===void 0?cr: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,d)=>{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 d();}}async function Wo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Go(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 dr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],httpsOptions:d}=e,i=t==="/"?"":t.replace(/\/$/,""),f={};for(let[v,b]of Object.entries(n)){let w=b.schema??b.repo.schema??null;if(!w)throw new Error(`[createAdminServer] Repository "${v}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let S,p,c;if(b.fieldsConfig){let g=b.fieldsConfig;S=[],p=[],c=[];for(let[x,k]of Object.entries(g))for(let R of k)R==="filterable"?S.push(x):R==="mutable"?p.push(x):R==="create"&&c.push(x);S.length===0&&(S=void 0),p.length===0&&(p=void 0),c.length===0&&(c=void 0);}let h=(()=>{let g=b.repo._parentKeys;return g&&g.length>0?g:void 0})();if(h&&c)for(let g of h)c.includes(g)||c.push(g);let l={name:v,path:b.path,repo:b.repo,schema:w,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:h,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:S,mutableFields:p,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 g=b.repo.relationalKeys??{},x=[];for(let k of b.relationalFields){let R=g[k.key];R&&x.push({key:k.key,column:k.column,targetRepo:String(R.repo),targetKey:String(R.key),type:R.type});}return x.length>0?x:void 0})()};f[v]=l;}let y=ar(f,i),u=new re;if(o!==false&&u.use(Ge(o===void 0?{}:o)),r&&u.use(async(v,b,w)=>{let S=v,p=String(S.headers?.["content-type"]??"");if(p.includes("application/x-www-form-urlencoded")){let c=await Wo(S);v.body=Go(c);}else if(p.includes("application/json")&&typeof S.body=="string")try{v.body=JSON.parse(S.body);}catch{}await w();}),s)if(ge(s)){for(let v of s.routes){let b=`${i}${v.path}`;v.method==="GET"?u.get(b,v.handler):u.post(b,v.handler);}u.use(s.middleware);}else if(typeof s=="function")u.use(s);else {let v=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");u.use((w,S,p)=>{if((w.headers?.authorization??"")!==b){S.status(401).set("WWW-Authenticate",`Basic realm="${v}"`).set("Content-Type","text/plain").send("Unauthorized");return}p();});}for(let v of a)u.use(v);u.get(`${i}/`,y.handleDashboard),u.get(`${i}`,y.handleDashboard),u.get(`${i}/:repoName/_panel`,y.handlePanel),u.post(`${i}/:repoName/_bulk/delete`,y.handleBulkDelete),u.post(`${i}/:repoName/_bulk/update`,y.handleBulkUpdate),u.get(`${i}/:repoName`,y.handleList),u.get(`${i}/:repoName/create`,y.handleCreateForm),u.post(`${i}/:repoName/create`,y.handleCreateSubmit),u.get(`${i}/:repoName/:id/edit`,y.handleEditForm),u.post(`${i}/:repoName/:id/edit`,y.handleEditSubmit),u.get(`${i}/:repoName/:id/history`,y.handleHistory),u.post(`${i}/:repoName/:id/delete`,y.handleDelete);let m=async(v,b)=>{await u.handle(v,b);};return d&&(m.httpsOptions=d),m}function nn(e,t,n=200){let r=U(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Ne(e,t,n,r=200){nn(e,{success:true,data:t,meta:n},r);}function L(e,t,n=400){nn(e,{success:false,error:t},n);}function en(e,t,n,r,o){let s=Ke(t,n),a=s.type==="index",d=a?424:500,f={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(f.errorType="index",s.indexUrl&&(f.indexUrl=s.indexUrl)),nn(e,f,d);}var tn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Xo(){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>=tn.length*4||(e+=tn.charAt(r%tn.length));}}return e}function je(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=>St(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=je(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(je(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return je(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return je(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=je(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function Yo(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 d=a.split(".")[0];d&&r[d]&&(o[d]=r[d]);}return zod.z.object(o)}function ur(e,t,n,r=false,o=[]){try{let s=Yo(e,n,o),a=r?s.partial():s;return {success:!0,data:(Rt()==="normalize"?je(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(d=>`${d.path.join(".")}: ${d.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function es(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 d=Array.isArray(a)?a[0]:a;if(d===void 0||d==="")continue;let i=s.match(/^(\w+)__(\w+)$/),f,y="==";if(i&&i[1]&&i[2]){f=i[1];let m=i[2];if(o[m])y=o[m];else continue}else if(!i)f=s;else continue;if(r&&!r.has(f))continue;let u=d;y==="in"||y==="not-in"||y==="array-contains-any"?u=d.split(",").map(m=>pr(m.trim())):u=pr(d),n.push({field:f,op:y,value:u});}return n}function pr(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 bt(e){return e?{docId:e.id}:null}async function fr(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 yr(e,t,n,r=false){async function o(p,c,h,l){if(!r)return true;let g=c.rules?.[h];if(!g)return L(p,`Operation "${h}" is not allowed for this repository`,403),false;try{return await g(l)?!0:(L(p,"Forbidden",403),!1)}catch(x){let k=n&&x instanceof Error?x.message:"Forbidden";return L(p,k,403),false}}async function s(p,c,h,l){if(!r)return l;let g=p.rules?.filter;if(!g)return l;let x=[];for(let k of l)try{await g({user:c,doc:k,params:h})&&x.push(k);}catch{}return x}function a(p){return p?.user??null}function d(p,c){return !p||!e[p]?(L(c,`Repository "${p}" not found`,404),null):e[p]}function i(p,c){if(!c)return;let h=p[c];if(typeof h!="string"||!h)return;let l=h.split("/").filter(Boolean),g=[];for(let x=1;x<l.length;x+=2)g.push(l[x]);return g.length>0?g:void 0}async function f(p,c){let h=`by${p.documentKey.charAt(0).toUpperCase()}${p.documentKey.slice(1)}`,l=p.repo.get[h];if(typeof l=="function")try{let x=await l(c);if(x)return x}catch{}return (await p.repo.query.by({where:[[p.documentKey,"==",c]],limit:1}))[0]??null}async function y(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;let g=a(p);if(!await o(c,l,"list",{user:g,query:p.query??{},params:h}))return;let x=[],k;try{let R=p.query??{},T=Math.min(Number(R.pageSize)||l.pageSize,100),C=R.cursor,O=R.direction?.toLowerCase()==="prev"?"prev":"next",A=R.orderBy,E=R.orderDir?.toLowerCase()==="desc"?"desc":"asc",$=R.select,D=$?$.split(",").map(Q=>Q.trim()):void 0,_;l.allowedIncludes&&R.includes&&(_=(typeof R.includes=="string"?R.includes.split(",").map(K=>K.trim()):Array.isArray(R.includes)?R.includes:[]).filter(K=>typeof K=="string"&&l.allowedIncludes.includes(K)),_?.length===0&&(_=void 0));let I=es(R,l.filterableFields);x=I.map(Q=>({field:Q.field,op:Q.op,value:String(Q.value??"")})),A&&(k={field:A,dir:E});let P={pageSize:T,direction:O};if(C)try{let Q=typeof C=="string"?JSON.parse(C):C;P.cursor=await fr(l,Q);}catch{}if(A){if(l.orderableFields&&!l.orderableFields.includes(A)){L(c,`Field not orderable: ${A}`,400);return}P.orderBy=[{field:A,direction:E}];}I.length>0&&(P.where=I.map(Q=>[Q.field,Q.op,Q.value])),D&&(P.select=D),_&&(P.include=_);let Z=await l.repo.query.paginate(P),ae={items:await s(l,a(p),h,Z.data),hasNextPage:Z.hasNextPage,hasPrevPage:Z.hasPrevPage,nextCursor:bt(Z.nextCursor),prevCursor:bt(Z.prevCursor)};Ne(c,ae,{pageSize:T,hasMore:Z.hasNextPage});}catch(R){en(c,R,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:x,sort:k},"Failed to fetch documents",n);}}async function u(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;let g=a(p);if(!await o(c,l,"list",{user:g,query:p.body??{},params:h}))return;let x=[],k;try{let R=p.body??{},T=Math.min(R.pageSize||l.pageSize,100),C=R.direction==="prev"?"prev":"next";R.where&&(x=R.where.map(D=>({field:String(D[0]),op:D[1],value:String(D[2]??"")}))),R.orderBy&&R.orderBy[0]&&(k={field:R.orderBy[0].field,dir:R.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:T,direction:C};if(R.cursor)try{let D=typeof R.cursor=="string"?JSON.parse(R.cursor):R.cursor;O.cursor=await fr(l,D);}catch{}if(l.allowedIncludes&&R.includes&&R.includes.length>0){let D=R.includes.filter(_=>typeof _=="string"?l.allowedIncludes.includes(_):typeof _=="object"&&_!==null&&"relation"in _&&typeof _.relation=="string"?l.allowedIncludes.includes(_.relation):!1);D.length>0&&(O.include=D);}if(R.where&&R.where.length>0){if(l.filterableFields){let D=new Set(l.filterableFields),_=R.where.filter(I=>!D.has(I[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(I=>I[0]).join(", ")}`,400);return}}O.where=R.where;}if(R.orWhere&&R.orWhere.length>0){if(l.filterableFields){let D=new Set(l.filterableFields),_=R.orWhere.filter(I=>!D.has(I[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(I=>I[0]).join(", ")}`,400);return}}O.orWhere=R.orWhere;}if(R.orWhereGroups&&R.orWhereGroups.length>0){if(l.filterableFields){let D=new Set(l.filterableFields);for(let _ of R.orWhereGroups){let I=_.filter(P=>!D.has(P[0]));if(I.length>0){L(c,`Fields not filterable: ${I.map(P=>P[0]).join(", ")}`,400);return}}}O.orWhereGroups=R.orWhereGroups;}if(R.orderBy&&R.orderBy.length>0){if(l.orderableFields){let D=new Set(l.orderableFields),_=R.orderBy.filter(I=>!D.has(I.field));if(_.length>0){L(c,`Fields not orderable: ${_.map(I=>I.field).join(", ")}`,400);return}}O.orderBy=R.orderBy;}R.select&&R.select.length>0&&(O.select=R.select);let A=await l.repo.query.paginate(O),$={items:await s(l,a(p),h,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:bt(A.nextCursor),prevCursor:bt(A.prevCursor)};Ne(c,$,{pageSize:T,hasMore:A.hasNextPage});}catch(R){en(c,R,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:x,sort:k},"Failed to query documents",n);}}async function m(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;let g=h.id;if(!g){L(c,"Document ID required",400);return}try{let x=await f(l,g);if(!x){L(c,"Document not found",404);return}let k=a(p);if(!await o(c,l,"get",{user:k,doc:x,params:h}))return;if(r&&l.rules?.filter)try{if(!await l.rules.filter({user:k,doc:x,params:h})){L(c,"Document not found",404);return}}catch{L(c,"Document not found",404);return}Ne(c,x);}catch(x){en(c,x,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:[{field:l.documentKey,op:"==",value:g}]},"Failed to fetch document",n);}}async function v(p,c){let h=p.params||{},l=d(h.repoName,c);if(l)try{let g=p.body??{},x=a(p);if(!await o(c,l,"create",{user:x,body:g,params:h}))return;let k=ur(l.schema,g,l.createFields,!1,l.systemKeys);if(!k.success){L(c,k.error,400);return}if(l.validate){let T=await l.validate(k.data,"create");if(T){L(c,T,400);return}}let R;if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let T={...k.data};l.createdKey&&(T[l.createdKey]=new Date);let C=l.parentKeys.filter(E=>!T[E]);if(C.length>0){L(c,`Missing parent key(s) for subcollection create: ${C.join(", ")}`,400);return}let O=l.parentKeys.map(E=>T[E]),A=T[l.documentKey]||Xo();R=await l.repo.set(...O,A,T);}else R=await l.repo.create(k.data);Ne(c,R,void 0,201);}catch(g){let x=n&&g instanceof Error?g.message:"Failed to create document";L(c,x,500);}}async function b(p,c,h){let l=p.params||{},g=d(l.repoName,c);if(!g)return;let x=l.id;if(!x){L(c,"Document ID required",400);return}try{let k=p.body??{},R=await f(g,x);if(!R){L(c,"Document not found",404);return}let T=a(p);if(!await o(c,g,"update",{user:T,doc:R,body:k,params:l}))return;let C=ur(g.schema,k,g.mutableFields,h,g.systemKeys);if(!C.success){L(c,C.error,400);return}if(g.validate){let E=await g.validate(C.data,"update");if(E){L(c,E,400);return}}let O=i(R,g.pathKey)??[x],A=await g.repo.update(...O,C.data);Ne(c,A);}catch(k){let R=n&&k instanceof Error?k.message:"Failed to update document";L(c,R,500);}}async function w(p,c){let h=p.params||{},l=d(h.repoName,c);if(!l)return;if(!l.allowDelete){L(c,"Delete not allowed for this repository",403);return}let g=h.id;if(!g){L(c,"Document ID required",400);return}try{let x=await f(l,g);if(!x){L(c,"Document not found",404);return}let k=a(p);if(!await o(c,l,"delete",{user:k,doc:x,params:h}))return;let R=i(x,l.pathKey)??[g];await l.repo.delete(...R),Ne(c,{deleted:!0});}catch(x){let k=n&&x instanceof Error?x.message:"Failed to delete document";L(c,k,500);}}function S(p,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:u,handleGet:m,handleCreate:v,handleUpdate:b,handleDelete:w,handleOptions:S}}function rn(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 se(e){return {$ref:`#/components/schemas/${e}`}}function Y(e){return {description:e,content:{"application/json":{schema:se("ErrorResponse")}}}}function Xe(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function mr(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 ts(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 ns(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 rs(){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 os(e,t,n,r,o){let s={},a=e.name,d=`${t}/${e.name}`,i=`${d}/{${e.documentKey}}`,f={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[d]={get:{operationId:`list${Se(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...ts(e),...ns(e)],responses:{200:mr(se(n)),500:Y("Internal server error")}},post:{operationId:`create${Se(e.name)}`,summary:`Create a ${le(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:se(r??n)}}},responses:{201:Xe("Document created",se(n)),400:Y("Validation error"),500:Y("Internal server error")}}},s[`${d}/query`]={post:{operationId:`query${Se(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:se("QueryRequestBody")}}},responses:{200:mr(se(n)),400:Y("Invalid query"),500:Y("Internal server error")}}};let y={};return y.get={operationId:`get${Se(le(e.name))}`,summary:`Get a single ${le(e.name)}`,tags:[a],parameters:[f],responses:{200:Xe("Document found",se(n)),404:Y("Document not found"),500:Y("Internal server error")}},y.put={operationId:`update${Se(le(e.name))}`,summary:`Update a ${le(e.name)} (full replace)`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:se(o??n)}}},responses:{200:Xe("Document updated",se(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},y.patch={operationId:`patch${Se(le(e.name))}`,summary:`Partially update a ${le(e.name)}`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:{allOf:[se(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Xe("Document patched",se(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},e.allowDelete&&(y.delete={operationId:`delete${Se(le(e.name))}`,summary:`Delete a ${le(e.name)}`,tags:[a],parameters:[f],responses:{200:Xe("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:Y("Document not found"),500:Y("Internal server error")}}),s[i]=y,s}function sn(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:d=false}=n,i=t==="/"?"":t.replace(/\/$/,""),f={},y={},u=[];f.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},f.QueryRequestBody=rs();for(let[w,S]of Object.entries(e)){let p=Se(le(w)),c=`${p}Create`,h=`${p}Update`;f[p]=rn(S.schema);let l=C=>{let O=C&&C.length>0?C:Object.keys(S.schema.shape),A={};for(let E of O){let $=E.split(".")[0];$&&S.schema.shape[$]&&!S.systemKeys.includes($)&&(A[$]=S.schema.shape[$]);}return A},g=null,x=l(S.createFields);Object.keys(x).length>0&&(f[c]=rn(zod.z.object(x)),g=c);let k=null,R=l(S.mutableFields);Object.keys(R).length>0&&(f[h]=rn(zod.z.object(R)),k=h);let T=os(S,i,p,g,k);Object.assign(y,T),u.push({name:w,description:`Operations on ${w} (collection: ${S.path})`});}let m={},v;return d==="basic"?(m.basicAuth={type:"http",scheme:"basic"},v=[{basicAuth:[]}]):d==="bearer"&&(m.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},v=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:y,components:{schemas:f,...Object.keys(m).length>0?{securitySchemes:m}:{}},...v?{security:v}:{},tags:u}}function Se(e){return e.charAt(0).toUpperCase()+e.slice(1)}function le(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 ss(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 as(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function gr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],verbose:d=false,httpsOptions:i}=e,f=t==="/"?"":t.replace(/\/$/,""),y={};for(let[h,l]of Object.entries(n)){let g=l.schema??l.repo.schema??null;if(!g)throw new Error(`[createCrudServer] Repository "${h}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let x,k,R,T;if(l.fieldsConfig){let A=l.fieldsConfig;x=[],k=[],R=[],T=[];for(let[
|
|
1157
|
+
</html>`}async function as(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function gr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],verbose:d=false,httpsOptions:i}=e,f=t==="/"?"":t.replace(/\/$/,""),y={};for(let[h,l]of Object.entries(n)){let g=l.schema??l.repo.schema??null;if(!g)throw new Error(`[createCrudServer] Repository "${h}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let x,k,R,T;if(l.fieldsConfig){let A=l.fieldsConfig;x=[],k=[],R=[],T=[];for(let[E,$]of Object.entries(A))for(let D of $)D==="filterable"?x.push(E):D==="orderable"?k.push(E):D==="mutable"?R.push(E):D==="create"&&T.push(E);k.length===0&&(k=x),x.length===0&&(x=void 0),k&&k.length===0&&(k=void 0),R.length===0&&(R=void 0),T.length===0&&(T=void 0);}let C=(()=>{let A=l.repo._parentKeys;return A&&A.length>0?A:void 0})();if(C&&T)for(let A of C)T.includes(A)||T.push(A);let O={name:h,path:l.path,repo:l.repo,schema:g,systemKeys:l.repo._systemKeys??[l.documentKey??"docId"],documentKey:l.documentKey??"docId",pathKey:l.repo._pathKey??void 0,isGroup:!!l.repo._isGroup,parentKeys:C,createdKey:l.repo._createdKey??void 0,pageSize:l.pageSize??25,filterableFields:x,orderableFields:k,mutableFields:R,createFields:T,allowDelete:l.allowDelete??false,allowedIncludes:l.allowedIncludes,validate:l.validate,rules:l.rules};y[h]=O;}let m=yr(y,f,d,!!s),v=e.openapi,b=v&&typeof v=="object"?v:{},w=null;function S(){if(!w){let h=s?ge(s)||typeof s=="function"?"bearer":"basic":false;w=sn(y,f,{...b,auth:b.auth??h});}return w}let p=new re;if(o!==false){let h=o===void 0?{csp:false}:o;p.use(Ge(h));}if(p.use((h,l,g)=>{l.set("Access-Control-Allow-Origin","*"),l.set("Access-Control-Allow-Credentials","true"),g();}),r&&p.use(async(h,l,g)=>{let x=h;if(String(x.headers?.["content-type"]??"").includes("application/json")){if(typeof x.body=="string")try{h.body=JSON.parse(x.body);}catch{}else if(Buffer.isBuffer(h.rawBody))try{let R=await as(x);h.body=JSON.parse(R);}catch{}}await g();}),s)if(ge(s)){for(let h of s.routes){let l=`${f}${h.path}`;h.method==="GET"?p.get(l,h.handler):p.post(l,h.handler);}p.use(s.middleware);}else if(typeof s=="function")p.use(s);else {let h=s.realm??"API",l="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");p.use((g,x,k)=>{if((g.headers?.authorization??"")!==l){x.status(401).set("WWW-Authenticate",`Basic realm="${h}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}k();});}for(let h of a)p.use(h);if(v!==false){let h=`${f}/__spec.json`,l=`${f}/__docs`;p.get(h,(g,x)=>{let k=S();x.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(k,null,2));}),p.get(l,(g,x)=>{let k=te(g,f)+"/__spec.json",R=ss(b.title??"CRUD API",k);x.status(200).set("Content-Type","text/html; charset=utf-8").send(R);});}p.use((h,l,g)=>{if(h.method==="OPTIONS"){m.handleOptions(h,l);return}g();}),p.get(`${f}/:repoName`,m.handleList),p.post(`${f}/:repoName/query`,m.handleQuery),p.get(`${f}/:repoName/:id`,m.handleGet),p.post(`${f}/:repoName`,m.handleCreate),p.put(`${f}/:repoName/:id`,(h,l)=>m.handleUpdate(h,l,false)),p.patch(`${f}/:repoName/:id`,(h,l)=>m.handleUpdate(h,l,true)),p.delete(`${f}/:repoName/:id`,m.handleDelete);let c=async(h,l)=>{await p.handle(h,l);};return c.spec=S,i&&(c.httpsOptions=i),c}function hr(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function br(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 xr(e,t={}){return {admin(n){let r=br(e,n.repos,"admin"),o=dr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return hr(o,t)},crud(n){let r=br(e,n.repos,"crud"),o=gr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return hr(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}),Hn(e,r)},history(n){return Tn(e,n)}}}function El(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function Pl(e,t){let n={...e};for(let r in t)t[r]&&(n[r]={...e[r],relationalKeys:t[r]});return n}var an=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]=$t(t,this.mapping[n],{});for(let n of Object.keys(this.mapping))this.allRepositories[n]=$t(t,this.mapping[n],this.allRepositories);}getRepository(t){return this.ensureInitialized(),this.allRepositories[t]}};function Dl(e,t){let n=new an(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=re;exports.RepositoryMapping=an;exports.applyPaginationQueryOptions=me;exports.buildAndExecuteQuery=ke;exports.buildRepositoryRelations=Pl;exports.coerceToDate=St;exports.createPaginationIterator=kt;exports.createRepositoryConfig=El;exports.createRepositoryMapping=Dl;exports.createServers=xr;exports.executePaginatedQuery=rt;exports.getDateHandling=Rt;exports.normalizeTimestamps=nt;exports.setDateHandling=Or;//# sourceMappingURL=index.cjs.map
|
|
1158
1158
|
//# sourceMappingURL=index.cjs.map
|